@dbx-tools/shared-core 0.9.36 → 0.9.38

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
@@ -2,6 +2,11 @@
2
2
 
3
3
  Browser-safe utility base for `@dbx-tools/*` packages.
4
4
 
5
+ This is the canonical owner for dependency-free cross-runtime utilities. Before
6
+ adding a local parser, coercion, hash, memoizer, logger, async primitive, or
7
+ object helper, check these modules and extend the owning utility when the rule
8
+ should be shared across the repository.
9
+
5
10
  Import this package for small, dependency-light helpers that can run in Node,
6
11
  browsers, workers, CLIs, and shared schema packages. Modules are exported as
7
12
  namespaces so call sites stay explicit:
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-core";
6
- export const PACKAGE_VERSION = "0.9.36";
6
+ export const PACKAGE_VERSION = "0.9.38";
7
7
  export * as asyncUtils from "./src/async-utils.ts";
8
8
  export * as brandUtils from "./src/brand-utils.ts";
9
9
  export * as environmentUtils from "./src/environment-utils.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-core";
2
- export declare const PACKAGE_VERSION = "0.9.36";
2
+ export declare const PACKAGE_VERSION = "0.9.38";
3
3
  export * as asyncUtils from "./src/async-utils.ts";
4
4
  export * as brandUtils from "./src/brand-utils.ts";
5
5
  export * as environmentUtils from "./src/environment-utils.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
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 const PACKAGE_IDENTIFIER = "@dbx-tools/shared-core";
5
- export const PACKAGE_VERSION = "0.9.36";
5
+ export const PACKAGE_VERSION = "0.9.38";
6
6
  export * as asyncUtils from "./src/async-utils.js";
7
7
  export * as brandUtils from "./src/brand-utils.js";
8
8
  export * as environmentUtils from "./src/environment-utils.js";
@@ -21,4 +21,4 @@ export * as stringUtils from "./src/string-utils.js";
21
21
  export * as token from "./src/token.js";
22
22
  export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, defaultBrandContext } from "./src/brand-utils.js";
23
23
  export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER } from "./src/token.js";
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBWS9KLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4zNlwiO1xuZXhwb3J0ICogYXMgYXN5bmNVdGlscyBmcm9tIFwiLi9zcmMvYXN5bmMtdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGJyYW5kVXRpbHMgZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBlbnZpcm9ubWVudFV0aWxzIGZyb20gXCIuL3NyYy9lbnZpcm9ubWVudC11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZXJyb3JVdGlscyBmcm9tIFwiLi9zcmMvZXJyb3ItdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGV4ZWN1dGlvbiBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBmdW5jdGlvblV0aWxzIGZyb20gXCIuL3NyYy9mdW5jdGlvbi11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgaGFzaCBmcm9tIFwiLi9zcmMvaGFzaC50c1wiO1xuZXhwb3J0ICogYXMgaHR0cCBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0ICogYXMganNvbiBmcm9tIFwiLi9zcmMvanNvbi50c1wiO1xuZXhwb3J0ICogYXMgbG9nIGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCAqIGFzIG5ldCBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgKiBhcyBvYmplY3QgZnJvbSBcIi4vc3JjL29iamVjdC50c1wiO1xuZXhwb3J0ICogYXMgcGF0dGVybiBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0ICogYXMgcHJlZGljYXRlIGZyb20gXCIuL3NyYy9wcmVkaWNhdGUudHNcIjtcbmV4cG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIHRva2VuIGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBDb25jdXJyZW50RXJyb3JNb2RlLCBNYXBDb25jdXJyZW50T3B0aW9ucywgUG9sbENvbnRleHQsIFBvbGxQcm9kdWNlciwgUG9sbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvYXN5bmMtdXRpbHMudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfQlJBTkRfQVNTRVRTLCBCcmFuZEFzc2V0U2V0U2NoZW1hLCBCcmFuZENvbG9yc1NjaGVtYSwgQnJhbmRWb2ljZVNjaGVtYSwgQnJhbmRDb250ZXh0U2NoZW1hLCBkZWZhdWx0QnJhbmRDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJyYW5kQ29udGV4dCwgQnJhbmRDb250ZXh0SW5wdXQsIEJyYW5kQXNzZXRTZXQgfSBmcm9tIFwiLi9zcmMvYnJhbmQtdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRXJyb3JDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2Vycm9yLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvblJlc3VsdCwgRXhlY3V0b3IsIEV4ZWN1dGlvbkZhaWx1cmUsIFJ1bk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1lbW9pemVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2Z1bmN0aW9uLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEhlYWRlckxpa2UgfSBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0IHR5cGUgeyBMb2dMZXZlbCwgTG9nZ2VyIH0gZnJvbSBcIi4vc3JjL2xvZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBVcmxMaWtlLCBJcFZlcnNpb24sIFBhcnNlZElwLCBDaWRyLCBVcmxCdWlsZGVyLCBQYXJzZUVtYWlsc09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcXVlbmNlLCBDb250YWluZXIsIENvbGxlY3Rpb24sIE9uZU9yTWFueSwgTmFtZUxpa2UsIE5vbkZ1bmN0aW9uS2V5cywgU2VyaWFsaXphYmxlUHJpbWl0aXZlLCBTZXJpYWxpemFibGVWYWx1ZSwgVG9OdW1iZXJPcHRpb25zLCBUb0RhdGVPcHRpb25zLCBUb0R1cmF0aW9uT3B0aW9ucywgRGVlcEVxdWFsQ29tcGFyYXRvciB9IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGF0dGVybk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0IHR5cGUgeyBQcmVkaWNhdGVGdW5jdGlvbiwgVHlwZVByZWRpY2F0ZUZ1bmN0aW9uLCBQcmVkaWNhdGVJbnB1dCwgUHJlZGljYXRlIH0gZnJvbSBcIi4vc3JjL3ByZWRpY2F0ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb2tlbml6ZU9wdGlvbnMsIEtleU9wdGlvbnMsIElkZW50aWZpZXJPcHRpb25zLCBEZWRlbnRPcHRpb25zLCBEZXNjcmlwdGlvbiB9IGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCB7IEFDQ0VTU19UT0tFTl9IRUFERVIsIFVTRVJfSURfSEVBREVSLCBVU0VSX0VNQUlMX0hFQURFUiB9IGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuIl19
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBWS9KLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4zOFwiO1xuZXhwb3J0ICogYXMgYXN5bmNVdGlscyBmcm9tIFwiLi9zcmMvYXN5bmMtdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGJyYW5kVXRpbHMgZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBlbnZpcm9ubWVudFV0aWxzIGZyb20gXCIuL3NyYy9lbnZpcm9ubWVudC11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZXJyb3JVdGlscyBmcm9tIFwiLi9zcmMvZXJyb3ItdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGV4ZWN1dGlvbiBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBmdW5jdGlvblV0aWxzIGZyb20gXCIuL3NyYy9mdW5jdGlvbi11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgaGFzaCBmcm9tIFwiLi9zcmMvaGFzaC50c1wiO1xuZXhwb3J0ICogYXMgaHR0cCBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0ICogYXMganNvbiBmcm9tIFwiLi9zcmMvanNvbi50c1wiO1xuZXhwb3J0ICogYXMgbG9nIGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCAqIGFzIG5ldCBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgKiBhcyBvYmplY3QgZnJvbSBcIi4vc3JjL29iamVjdC50c1wiO1xuZXhwb3J0ICogYXMgcGF0dGVybiBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0ICogYXMgcHJlZGljYXRlIGZyb20gXCIuL3NyYy9wcmVkaWNhdGUudHNcIjtcbmV4cG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIHRva2VuIGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBDb25jdXJyZW50RXJyb3JNb2RlLCBNYXBDb25jdXJyZW50T3B0aW9ucywgUG9sbENvbnRleHQsIFBvbGxQcm9kdWNlciwgUG9sbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvYXN5bmMtdXRpbHMudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfQlJBTkRfQVNTRVRTLCBCcmFuZEFzc2V0U2V0U2NoZW1hLCBCcmFuZENvbG9yc1NjaGVtYSwgQnJhbmRWb2ljZVNjaGVtYSwgQnJhbmRDb250ZXh0U2NoZW1hLCBkZWZhdWx0QnJhbmRDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJyYW5kQ29udGV4dCwgQnJhbmRDb250ZXh0SW5wdXQsIEJyYW5kQXNzZXRTZXQgfSBmcm9tIFwiLi9zcmMvYnJhbmQtdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRXJyb3JDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2Vycm9yLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvblJlc3VsdCwgRXhlY3V0b3IsIEV4ZWN1dGlvbkZhaWx1cmUsIFJ1bk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1lbW9pemVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2Z1bmN0aW9uLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEhlYWRlckxpa2UgfSBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0IHR5cGUgeyBMb2dMZXZlbCwgTG9nZ2VyIH0gZnJvbSBcIi4vc3JjL2xvZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBVcmxMaWtlLCBJcFZlcnNpb24sIFBhcnNlZElwLCBDaWRyLCBVcmxCdWlsZGVyLCBQYXJzZUVtYWlsc09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcXVlbmNlLCBDb250YWluZXIsIENvbGxlY3Rpb24sIE9uZU9yTWFueSwgTmFtZUxpa2UsIE5vbkZ1bmN0aW9uS2V5cywgU2VyaWFsaXphYmxlUHJpbWl0aXZlLCBTZXJpYWxpemFibGVWYWx1ZSwgVG9OdW1iZXJPcHRpb25zLCBUb0RhdGVPcHRpb25zLCBUb0R1cmF0aW9uT3B0aW9ucywgRGVlcEVxdWFsQ29tcGFyYXRvciB9IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGF0dGVybk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0IHR5cGUgeyBQcmVkaWNhdGVGdW5jdGlvbiwgVHlwZVByZWRpY2F0ZUZ1bmN0aW9uLCBQcmVkaWNhdGVJbnB1dCwgUHJlZGljYXRlIH0gZnJvbSBcIi4vc3JjL3ByZWRpY2F0ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb2tlbml6ZU9wdGlvbnMsIEtleU9wdGlvbnMsIElkZW50aWZpZXJPcHRpb25zLCBEZWRlbnRPcHRpb25zLCBEZXNjcmlwdGlvbiB9IGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCB7IEFDQ0VTU19UT0tFTl9IRUFERVIsIFVTRVJfSURfSEVBREVSLCBVU0VSX0VNQUlMX0hFQURFUiB9IGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuIl19
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Browser-safe function lifecycle helpers shared across dbx-tools packages.
3
+ *
4
+ * This module is the repository owner for zero-argument memoization, including
5
+ * in-flight promise sharing, TTL expiry, and rejection eviction. Reuse
6
+ * {@link memoize} instead of adding package-local once/cache wrappers; add a new
7
+ * primitive here when it is dependency-free and useful in both browser and
8
+ * server code.
9
+ *
10
+ * @module
11
+ */
1
12
  /** Cache lifetime controls for {@link memoize}; failures are always evicted. */
2
13
  export interface MemoizeOptions {
3
14
  /**
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Browser-safe function lifecycle helpers shared across dbx-tools packages.
3
+ *
4
+ * This module is the repository owner for zero-argument memoization, including
5
+ * in-flight promise sharing, TTL expiry, and rejection eviction. Reuse
6
+ * {@link memoize} instead of adding package-local once/cache wrappers; add a new
7
+ * primitive here when it is dependency-free and useful in both browser and
8
+ * server code.
9
+ *
10
+ * @module
11
+ */
1
12
  export function memoize(factory, options) {
2
13
  const ttlMs = options?.ttlMs ?? 0;
3
14
  let cache;
@@ -41,4 +52,4 @@ function isThenable(value) {
41
52
  }
42
53
  return false;
43
54
  }
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3Rpb24tdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNENBLE1BQU0sVUFBVSxPQUFPLENBQ3JCLE9BQWlDLEVBQ2pDLE9BQXdCO0lBRXhCLE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2xDLElBQUksS0FBK0QsQ0FBQztJQUNwRSxPQUFPLEdBQUcsRUFBRTtRQUNWLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hFLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hDLGtFQUFrRTtnQkFDbEUsZ0VBQWdFO2dCQUNoRSwrQ0FBK0M7Z0JBQy9DLE1BQU0sS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQ3RELEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2QsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUNmLEdBQUcsRUFBRTtvQkFDSCxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQ0QsMERBQTBEO2dCQUMxRCxHQUFHLEVBQUU7b0JBQ0gsSUFBSSxLQUFLLEtBQUssS0FBSzt3QkFBRSxLQUFLLEdBQUcsU0FBUyxDQUFDO2dCQUN6QyxDQUFDLENBQ0YsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDckIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxTQUFTLFVBQVUsQ0FBSSxLQUF5QjtJQUM5QyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuQixJQUFJLEtBQUssWUFBWSxPQUFPLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFDekIsTUFBTSxJQUFJLEtBQUs7WUFDZixPQUFRLEtBQXdCLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFDcEQsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQ2FjaGUgbGlmZXRpbWUgY29udHJvbHMgZm9yIHtAbGluayBtZW1vaXplfTsgZmFpbHVyZXMgYXJlIGFsd2F5cyBldmljdGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZW1vaXplT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lLXRvLWxpdmUgaW4gbWlsbGlzZWNvbmRzLiBUaGUgY2FjaGVkIHZhbHVlIGV4cGlyZXMgYHR0bE1zYCBhZnRlclxuICAgKiBpdCB3YXMgc3RvcmVkLCBzbyB0aGUgbmV4dCBjYWxsIHBhc3QgdGhhdCByZWNvbXB1dGVzOyBhIHJlamVjdGlvbiBpc1xuICAgKiBhbHNvIGV2aWN0ZWQgc28gYSBsYXRlciBjYWxsIHJldHJpZXMgcmF0aGVyIHRoYW4gcmVwbGF5aW5nIHRoZSBlcnJvci5cbiAgICogT21pdHRlZCBvciBgPD0gMGAgbWVhbnMgYSBzdWNjZXNzZnVsIHZhbHVlIGlzIGNhY2hlZCBmb3JldmVyICh0aGUgZGVmYXVsdCkuXG4gICAqIEVycm9ycyBhcmUgbmV2ZXIgY2FjaGVkIC0gc2VlIHtAbGluayBtZW1vaXplfS5cbiAgICpcbiAgICogVXNlIGZvciBwZXJpb2RpY2FsbHktcmVmcmVzaGVkIGRhdGEgKHB1Ymxpc2hlZCBJUCByYW5nZXMsIGZlYXR1cmVcbiAgICogZmxhZ3MsIGFueXRoaW5nIGZldGNoZWQgb25jZSBhbmQgcmV1c2VkIGFjcm9zcyByZXF1ZXN0cykuXG4gICAqL1xuICB0dGxNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSdW4gYSB6ZXJvLWFyZ3VtZW50IGZhY3Rvcnkgb25jZTsgbGF0ZXIgY2FsbHMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC5cbiAqIFRoZSBtZW1vaXplZCBmdW5jdGlvbiBtaXJyb3JzIHRoZSBmYWN0b3J5J3Mgc3luYyAvIGFzeW5jIG5hdHVyZTogYVxuICogc3luYyBmYWN0b3J5IHlpZWxkcyBhIHN5bmMgZ2V0dGVyIChgKCkgPT4gVGApLCBhbiBhc3luYyAvIHRoZW5hYmxlXG4gKiBmYWN0b3J5IHlpZWxkcyBhIHByb21pc2UtcmV0dXJuaW5nIGdldHRlciAoYCgpID0+IFByb21pc2U8VD5gKSB3aG9zZVxuICogY29uY3VycmVudCBjYWxsZXJzIHNoYXJlIHRoZSBvbmUgaW4tZmxpZ2h0IHByb21pc2UgdW50aWwgaXQgc2V0dGxlcy5cbiAqXG4gKiBFcnJvcnMgYXJlIG5ldmVyIGNhY2hlZDogYSBzeW5jIGZhY3RvcnkgdGhhdCB0aHJvd3MgcHJvcGFnYXRlcyB0aGVcbiAqIHRocm93LCBhbmQgYW4gYXN5bmMgZmFjdG9yeSB0aGF0IHJlamVjdHMgZXZpY3RzIHRoZSBjYWNoZWQgcHJvbWlzZSwgc29cbiAqIGluIGJvdGggY2FzZXMgdGhlIG5leHQgY2FsbCByZXRyaWVzLiBQYXNzIGB7IHR0bE1zIH1gIHRvIGFsc28gZXhwaXJlXG4gKiBhbmQgcmVjb21wdXRlIGEgc3VjY2Vzc2Z1bCB2YWx1ZSBhZnRlciBhIHdpbmRvdzsgd2l0aG91dCBhIFRUTCBhXG4gKiBzdWNjZXNzIGlzIGNhY2hlZCBmb3JldmVyLlxuICpcbiAqIEZvciBhbiBhc3luYyBmYWN0b3J5IHRoZSBUVEwgd2luZG93IHN0YXJ0cyB3aGVuIHRoZSBwcm9taXNlXG4gKiAqcmVzb2x2ZXMqLCBub3Qgd2hlbiBpdCB3YXMgY3JlYXRlZCAtIGEgc2xvdyBpbi1mbGlnaHQgcmVxdWVzdCBuZXZlclxuICogY291bnRzIGFzIGFscmVhZHktZXhwaXJlZCwgYW5kIGNvbmN1cnJlbnQgY2FsbGVycyBrZWVwIHNoYXJpbmcgdGhlIG9uZVxuICogcGVuZGluZyBwcm9taXNlIHVudGlsIGl0IHNldHRsZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJhbmdlcyA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZShmZXRjaElwUmFuZ2VzLCB7IHR0bE1zOiAyNCAqIDYwICogNjAgKiAxMDAwIH0pO1xuICogYXdhaXQgcmFuZ2VzKCk7IC8vIGZldGNoZXNcbiAqIGF3YWl0IHJhbmdlcygpOyAvLyBjYWNoZWQgdW50aWwgMjRoIGxhdGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplPFQ+KFxuICBmYWN0b3J5OiAoKSA9PiBQcm9taXNlTGlrZTxUPixcbiAgb3B0aW9ucz86IE1lbW9pemVPcHRpb25zLFxuKTogKCkgPT4gUHJvbWlzZTxUPjtcbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplPFQ+KGZhY3Rvcnk6ICgpID0+IFQsIG9wdGlvbnM/OiBNZW1vaXplT3B0aW9ucyk6ICgpID0+IFQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplPFQ+KFxuICBmYWN0b3J5OiAoKSA9PiBUIHwgUHJvbWlzZUxpa2U8VD4sXG4gIG9wdGlvbnM/OiBNZW1vaXplT3B0aW9ucyxcbik6ICgpID0+IFQgfCBQcm9taXNlPFQ+IHtcbiAgY29uc3QgdHRsTXMgPSBvcHRpb25zPy50dGxNcyA/PyAwO1xuICBsZXQgY2FjaGU6IHsgdmFsdWU6IFQgfCBQcm9taXNlPFQ+OyBleHBpcmVzQXQ6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmIChjYWNoZSA9PT0gdW5kZWZpbmVkIHx8ICh0dGxNcyA+IDAgJiYgRGF0ZS5ub3coKSA+PSBjYWNoZS5leHBpcmVzQXQpKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBmYWN0b3J5KCk7XG4gICAgICBpZiAoaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgLy8gYEluZmluaXR5YCBrZWVwcyB0aGUgZW50cnkgdW5leHBpcmVkIHdoaWxlIGluIGZsaWdodCAoc28gYSBzbG93XG4gICAgICAgIC8vIHJlcXVlc3QgaXNuJ3QgcmVmZXRjaGVkIGFuZCBjb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgaXQpOyB0aGVcbiAgICAgICAgLy8gVFRMIHdpbmRvdyBpcyBzdGFtcGVkIGZyb20gcmVzb2x1dGlvbiBiZWxvdy5cbiAgICAgICAgY29uc3QgZW50cnkgPSB7IHZhbHVlOiBwZW5kaW5nLCBleHBpcmVzQXQ6IEluZmluaXR5IH07XG4gICAgICAgIGNhY2hlID0gZW50cnk7XG4gICAgICAgIHZvaWQgcGVuZGluZy50aGVuKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGVudHJ5LmV4cGlyZXNBdCA9IERhdGUubm93KCkgKyB0dGxNcztcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIE5ldmVyIGNhY2hlIGEgcmVqZWN0aW9uOiBldmljdCBzbyBhIGxhdGVyIGNhbGwgcmV0cmllcy5cbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2FjaGUgPT09IGVudHJ5KSBjYWNoZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FjaGUgPSB7IHZhbHVlOiByZXN1bHQsIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bE1zIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYWNoZS52YWx1ZTtcbiAgfTtcbn1cblxuLyoqIER1Y2stdHlwZSBhbnkgdmFsdWUgd2l0aCBhIGNhbGxhYmxlIGAudGhlbmAgYXMgYSB0aGVuYWJsZS4gKi9cbmZ1bmN0aW9uIGlzVGhlbmFibGU8VD4odmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPik6IHZhbHVlIGlzIFByb21pc2VMaWtlPFQ+IHtcbiAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgXCJ0aGVuXCIgaW4gdmFsdWUgJiZcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgUHJvbWlzZUxpa2U8VD4pLnRoZW4gPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3Rpb24tdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQThDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixPQUFpQyxFQUNqQyxPQUF3QjtJQUV4QixNQUFNLEtBQUssR0FBRyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUNsQyxJQUFJLEtBQStELENBQUM7SUFDcEUsT0FBTyxHQUFHLEVBQUU7UUFDVixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN4RSxNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN2QixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QyxrRUFBa0U7Z0JBQ2xFLGdFQUFnRTtnQkFDaEUsK0NBQStDO2dCQUMvQyxNQUFNLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUN0RCxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUNkLEtBQUssT0FBTyxDQUFDLElBQUksQ0FDZixHQUFHLEVBQUU7b0JBQ0gsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO2dCQUN2QyxDQUFDO2dCQUNELDBEQUEwRDtnQkFDMUQsR0FBRyxFQUFFO29CQUNILElBQUksS0FBSyxLQUFLLEtBQUs7d0JBQUUsS0FBSyxHQUFHLFNBQVMsQ0FBQztnQkFDekMsQ0FBQyxDQUNGLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxpRUFBaUU7QUFDakUsU0FBUyxVQUFVLENBQUksS0FBeUI7SUFDOUMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxLQUFLLFlBQVksT0FBTyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQ3pCLE1BQU0sSUFBSSxLQUFLO1lBQ2YsT0FBUSxLQUF3QixDQUFDLElBQUksS0FBSyxVQUFVLEVBQ3BELENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLXNhZmUgZnVuY3Rpb24gbGlmZWN5Y2xlIGhlbHBlcnMgc2hhcmVkIGFjcm9zcyBkYngtdG9vbHMgcGFja2FnZXMuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgdGhlIHJlcG9zaXRvcnkgb3duZXIgZm9yIHplcm8tYXJndW1lbnQgbWVtb2l6YXRpb24sIGluY2x1ZGluZ1xuICogaW4tZmxpZ2h0IHByb21pc2Ugc2hhcmluZywgVFRMIGV4cGlyeSwgYW5kIHJlamVjdGlvbiBldmljdGlvbi4gUmV1c2VcbiAqIHtAbGluayBtZW1vaXplfSBpbnN0ZWFkIG9mIGFkZGluZyBwYWNrYWdlLWxvY2FsIG9uY2UvY2FjaGUgd3JhcHBlcnM7IGFkZCBhIG5ld1xuICogcHJpbWl0aXZlIGhlcmUgd2hlbiBpdCBpcyBkZXBlbmRlbmN5LWZyZWUgYW5kIHVzZWZ1bCBpbiBib3RoIGJyb3dzZXIgYW5kXG4gKiBzZXJ2ZXIgY29kZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLyoqIENhY2hlIGxpZmV0aW1lIGNvbnRyb2xzIGZvciB7QGxpbmsgbWVtb2l6ZX07IGZhaWx1cmVzIGFyZSBhbHdheXMgZXZpY3RlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb2l6ZU9wdGlvbnMge1xuICAvKipcbiAgICogVGltZS10by1saXZlIGluIG1pbGxpc2Vjb25kcy4gVGhlIGNhY2hlZCB2YWx1ZSBleHBpcmVzIGB0dGxNc2AgYWZ0ZXJcbiAgICogaXQgd2FzIHN0b3JlZCwgc28gdGhlIG5leHQgY2FsbCBwYXN0IHRoYXQgcmVjb21wdXRlczsgYSByZWplY3Rpb24gaXNcbiAgICogYWxzbyBldmljdGVkIHNvIGEgbGF0ZXIgY2FsbCByZXRyaWVzIHJhdGhlciB0aGFuIHJlcGxheWluZyB0aGUgZXJyb3IuXG4gICAqIE9taXR0ZWQgb3IgYDw9IDBgIG1lYW5zIGEgc3VjY2Vzc2Z1bCB2YWx1ZSBpcyBjYWNoZWQgZm9yZXZlciAodGhlIGRlZmF1bHQpLlxuICAgKiBFcnJvcnMgYXJlIG5ldmVyIGNhY2hlZCAtIHNlZSB7QGxpbmsgbWVtb2l6ZX0uXG4gICAqXG4gICAqIFVzZSBmb3IgcGVyaW9kaWNhbGx5LXJlZnJlc2hlZCBkYXRhIChwdWJsaXNoZWQgSVAgcmFuZ2VzLCBmZWF0dXJlXG4gICAqIGZsYWdzLCBhbnl0aGluZyBmZXRjaGVkIG9uY2UgYW5kIHJldXNlZCBhY3Jvc3MgcmVxdWVzdHMpLlxuICAgKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUnVuIGEgemVyby1hcmd1bWVudCBmYWN0b3J5IG9uY2U7IGxhdGVyIGNhbGxzIHJldHVybiB0aGUgc2FtZSByZXN1bHQuXG4gKiBUaGUgbWVtb2l6ZWQgZnVuY3Rpb24gbWlycm9ycyB0aGUgZmFjdG9yeSdzIHN5bmMgLyBhc3luYyBuYXR1cmU6IGFcbiAqIHN5bmMgZmFjdG9yeSB5aWVsZHMgYSBzeW5jIGdldHRlciAoYCgpID0+IFRgKSwgYW4gYXN5bmMgLyB0aGVuYWJsZVxuICogZmFjdG9yeSB5aWVsZHMgYSBwcm9taXNlLXJldHVybmluZyBnZXR0ZXIgKGAoKSA9PiBQcm9taXNlPFQ+YCkgd2hvc2VcbiAqIGNvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSB0aGUgb25lIGluLWZsaWdodCBwcm9taXNlIHVudGlsIGl0IHNldHRsZXMuXG4gKlxuICogRXJyb3JzIGFyZSBuZXZlciBjYWNoZWQ6IGEgc3luYyBmYWN0b3J5IHRoYXQgdGhyb3dzIHByb3BhZ2F0ZXMgdGhlXG4gKiB0aHJvdywgYW5kIGFuIGFzeW5jIGZhY3RvcnkgdGhhdCByZWplY3RzIGV2aWN0cyB0aGUgY2FjaGVkIHByb21pc2UsIHNvXG4gKiBpbiBib3RoIGNhc2VzIHRoZSBuZXh0IGNhbGwgcmV0cmllcy4gUGFzcyBgeyB0dGxNcyB9YCB0byBhbHNvIGV4cGlyZVxuICogYW5kIHJlY29tcHV0ZSBhIHN1Y2Nlc3NmdWwgdmFsdWUgYWZ0ZXIgYSB3aW5kb3c7IHdpdGhvdXQgYSBUVEwgYVxuICogc3VjY2VzcyBpcyBjYWNoZWQgZm9yZXZlci5cbiAqXG4gKiBGb3IgYW4gYXN5bmMgZmFjdG9yeSB0aGUgVFRMIHdpbmRvdyBzdGFydHMgd2hlbiB0aGUgcHJvbWlzZVxuICogKnJlc29sdmVzKiwgbm90IHdoZW4gaXQgd2FzIGNyZWF0ZWQgLSBhIHNsb3cgaW4tZmxpZ2h0IHJlcXVlc3QgbmV2ZXJcbiAqIGNvdW50cyBhcyBhbHJlYWR5LWV4cGlyZWQsIGFuZCBjb25jdXJyZW50IGNhbGxlcnMga2VlcCBzaGFyaW5nIHRoZSBvbmVcbiAqIHBlbmRpbmcgcHJvbWlzZSB1bnRpbCBpdCBzZXR0bGVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByYW5nZXMgPSBmdW5jdGlvblV0aWxzLm1lbW9pemUoZmV0Y2hJcFJhbmdlcywgeyB0dGxNczogMjQgKiA2MCAqIDYwICogMTAwMCB9KTtcbiAqIGF3YWl0IHJhbmdlcygpOyAvLyBmZXRjaGVzXG4gKiBhd2FpdCByYW5nZXMoKTsgLy8gY2FjaGVkIHVudGlsIDI0aCBsYXRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZTxUPihcbiAgZmFjdG9yeTogKCkgPT4gUHJvbWlzZUxpa2U8VD4sXG4gIG9wdGlvbnM/OiBNZW1vaXplT3B0aW9ucyxcbik6ICgpID0+IFByb21pc2U8VD47XG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZTxUPihmYWN0b3J5OiAoKSA9PiBULCBvcHRpb25zPzogTWVtb2l6ZU9wdGlvbnMpOiAoKSA9PiBUO1xuXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZTxUPihcbiAgZmFjdG9yeTogKCkgPT4gVCB8IFByb21pc2VMaWtlPFQ+LFxuICBvcHRpb25zPzogTWVtb2l6ZU9wdGlvbnMsXG4pOiAoKSA9PiBUIHwgUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHR0bE1zID0gb3B0aW9ucz8udHRsTXMgPz8gMDtcbiAgbGV0IGNhY2hlOiB7IHZhbHVlOiBUIHwgUHJvbWlzZTxUPjsgZXhwaXJlc0F0OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoY2FjaGUgPT09IHVuZGVmaW5lZCB8fCAodHRsTXMgPiAwICYmIERhdGUubm93KCkgPj0gY2FjaGUuZXhwaXJlc0F0KSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmFjdG9yeSgpO1xuICAgICAgaWYgKGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIC8vIGBJbmZpbml0eWAga2VlcHMgdGhlIGVudHJ5IHVuZXhwaXJlZCB3aGlsZSBpbiBmbGlnaHQgKHNvIGEgc2xvd1xuICAgICAgICAvLyByZXF1ZXN0IGlzbid0IHJlZmV0Y2hlZCBhbmQgY29uY3VycmVudCBjYWxsZXJzIHNoYXJlIGl0KTsgdGhlXG4gICAgICAgIC8vIFRUTCB3aW5kb3cgaXMgc3RhbXBlZCBmcm9tIHJlc29sdXRpb24gYmVsb3cuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0geyB2YWx1ZTogcGVuZGluZywgZXhwaXJlc0F0OiBJbmZpbml0eSB9O1xuICAgICAgICBjYWNoZSA9IGVudHJ5O1xuICAgICAgICB2b2lkIHBlbmRpbmcudGhlbihcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBlbnRyeS5leHBpcmVzQXQgPSBEYXRlLm5vdygpICsgdHRsTXM7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBOZXZlciBjYWNoZSBhIHJlamVjdGlvbjogZXZpY3Qgc28gYSBsYXRlciBjYWxsIHJldHJpZXMuXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNhY2hlID09PSBlbnRyeSkgY2FjaGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhY2hlID0geyB2YWx1ZTogcmVzdWx0LCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2FjaGUudmFsdWU7XG4gIH07XG59XG5cbi8qKiBEdWNrLXR5cGUgYW55IHZhbHVlIHdpdGggYSBjYWxsYWJsZSBgLnRoZW5gIGFzIGEgdGhlbmFibGUuICovXG5mdW5jdGlvbiBpc1RoZW5hYmxlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pOiB2YWx1ZSBpcyBQcm9taXNlTGlrZTxUPiB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIFwidGhlblwiIGluIHZhbHVlICYmXG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIFByb21pc2VMaWtlPFQ+KS50aGVuID09PSBcImZ1bmN0aW9uXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
package/lib/src/json.d.ts CHANGED
@@ -16,6 +16,9 @@
16
16
  * a zod schema when the payload has a contract; these only get you from `string`
17
17
  * to a safely typed starting point.
18
18
  *
19
+ * This is the repository-wide owner for non-throwing JSON parsing. Reuse these
20
+ * helpers instead of repeating local `try { JSON.parse(...) }` wrappers.
21
+ *
19
22
  * @module
20
23
  */
21
24
  /**
package/lib/src/json.js CHANGED
@@ -16,6 +16,9 @@
16
16
  * a zod schema when the payload has a contract; these only get you from `string`
17
17
  * to a safely typed starting point.
18
18
  *
19
+ * This is the repository-wide owner for non-throwing JSON parsing. Reuse these
20
+ * helpers instead of repeating local `try { JSON.parse(...) }` wrappers.
21
+ *
19
22
  * @module
20
23
  */
21
24
  import { isRecord } from "./object.js";
@@ -46,4 +49,4 @@ export function parseRecord(text) {
46
49
  const parsed = parse(text);
47
50
  return isRecord(parsed) ? parsed : undefined;
48
51
  }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWdCdkMsTUFBTSxVQUFVLEtBQUssQ0FBYyxJQUFhLEVBQUUsUUFBWTtJQUM1RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUMxRSxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFNLENBQUM7SUFDL0IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFhO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3Nlci1zYWZlIEpTT04gaGVscGVycyBmb3IgdGhlIHBhcnNlLXVudHJ1c3RlZC10ZXh0IGNhc2UuXG4gKlxuICogYEpTT04ucGFyc2VgIHRocm93cyBvbiBtYWxmb3JtZWQgaW5wdXQgYW5kIHJldHVybnMgYGFueWAsIHNvIGFsbW9zdCBldmVyeVxuICogY2FsbGVyIGluIHRoaXMgcmVwbyB3cmFwcGVkIGl0IGluIHRoZSBzYW1lIHRyeS9jYXRjaCBhbmQgdGhlbiByZS1uYXJyb3dlZCB0aGVcbiAqIHJlc3VsdCBieSBoYW5kLiB7QGxpbmsgcGFyc2V9IGNvbGxhcHNlcyB0aGUgdHJ5L2NhdGNoIChhIGJhZCBkb2N1bWVudCB5aWVsZHNcbiAqIHRoZSBmYWxsYmFjayBpbnN0ZWFkIG9mIHRocm93aW5nKSBhbmQge0BsaW5rIHBhcnNlUmVjb3JkfSBhZGRzIHRoZSBuYXJyb3dpbmdcbiAqIHRoYXQgdW50cnVzdGVkIEpTT04gYWxtb3N0IGFsd2F5cyBuZWVkcyBiZWZvcmUgaXQgY2FuIGJlIGluZGV4ZWQuXG4gKlxuICogVXNlIHRoZXNlIHdoZW4gdGhlIGRvY3VtZW50IGNvbWVzIGZyb20gT1VUU0lERSB0aGUgcHJvY2VzcyAtIGEgcmVxdWVzdCBib2R5LFxuICogYW4gZW52IHZhciwgYSBjb25maWcgZmlsZSwgYSBzdWJwcm9jZXNzJ3Mgc3Rkb3V0LCBhIHRoaXJkLXBhcnR5IEFQSS4gS2VlcFxuICogYmFyZSBgSlNPTi5wYXJzZWAgd2hlcmUgYSB0aHJvdyBpcyB0aGUgY29ycmVjdCBvdXRjb21lIChhbiBpbnRlcm5hbGx5XG4gKiBwcm9kdWNlZCBkb2N1bWVudCB0aGF0IG11c3QgYmUgd2VsbC1mb3JtZWQpLlxuICpcbiAqIFRoZXNlIGRlbGliZXJhdGVseSBkbyBOT1QgdmFsaWRhdGUgc2hhcGUgYmV5b25kIFwiaXMgaXQgYSByZWNvcmRcIi4gUmVhY2ggZm9yXG4gKiBhIHpvZCBzY2hlbWEgd2hlbiB0aGUgcGF5bG9hZCBoYXMgYSBjb250cmFjdDsgdGhlc2Ugb25seSBnZXQgeW91IGZyb20gYHN0cmluZ2BcbiAqIHRvIGEgc2FmZWx5IHR5cGVkIHN0YXJ0aW5nIHBvaW50LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBpc1JlY29yZCB9IGZyb20gXCIuL29iamVjdC50c1wiO1xuXG4vKipcbiAqIFBhcnNlIEpTT04gdGV4dCwgcmV0dXJuaW5nIGBmYWxsYmFja2AgKGRlZmF1bHQgYHVuZGVmaW5lZGApIGluc3RlYWQgb2ZcbiAqIHRocm93aW5nIHdoZW4gYHRleHRgIGlzIGFic2VudCBvciBtYWxmb3JtZWQuXG4gKlxuICogVGhlIHJldHVybiB0eXBlIGlzIGNhbGxlci1hc3NlcnRlZCwgZXhhY3RseSBsaWtlIGBKU09OLnBhcnNlYCAtIHRoaXMgb25seVxuICogcmVtb3ZlcyB0aGUgdHJ5L2NhdGNoLCBpdCBkb2VzIG5vdCB2YWxpZGF0ZS4gUHJlZmVyIHtAbGluayBwYXJzZVJlY29yZH0gb3IgYVxuICogc2NoZW1hIHdoZW4gdGhlIHJlc3VsdCBpcyBpbmRleGVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBjb25maWcgPSBqc29uLnBhcnNlPENvbmZpZz4oYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGY4XCIpKTtcbiAqIGNvbnN0IHRhZ3MgPSBqc29uLnBhcnNlKHByb2Nlc3MuZW52LlRBR1MsIFtdKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlPFQgPSB1bmtub3duPih0ZXh0OiB1bmtub3duLCBmYWxsYmFjazogVCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2U8VCA9IHVua25vd24+KHRleHQ6IHVua25vd24pOiBUIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlPFQgPSB1bmtub3duPih0ZXh0OiB1bmtub3duLCBmYWxsYmFjaz86IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB0ZXh0ICE9PSBcInN0cmluZ1wiIHx8IHRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpIGFzIFQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxsYmFjaztcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIEpTT04gdGV4dCB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgcmV0dXJuaW5nIGB1bmRlZmluZWRgIHdoZW5cbiAqIGl0IGlzIGFic2VudCwgbWFsZm9ybWVkLCBvciBwYXJzZXMgdG8gYSBub24tcmVjb3JkIChhbiBhcnJheSwgYSBiYXJlIHN0cmluZyxcbiAqIGBudWxsYCwgLi4uKS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gY2FzZSBmb3IgbWFuaWZlc3RzLCBlbnYtdmFyIGNvbmZpZyBibG9icywgYW5kIHVudHlwZWQgQVBJXG4gKiBwYXlsb2Fkczoge0BsaW5rIHBhcnNlfSBmb2xsb3dlZCBieSB7QGxpbmsgaXNSZWNvcmR9LCBzbyB0aGUgcmVzdWx0IGNhbiBiZVxuICogaW5kZXhlZCB3aXRob3V0IGFuIGBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgY2FzdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgbWFuaWZlc3QgPSBqc29uLnBhcnNlUmVjb3JkKGF3YWl0IHJlYWRGaWxlKFwicGFja2FnZS5qc29uXCIsIFwidXRmOFwiKSkgPz8ge307XG4gKiBjb25zdCBuYW1lID0gbWFuaWZlc3QubmFtZTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVjb3JkKHRleHQ6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlKHRleHQpO1xuICByZXR1cm4gaXNSZWNvcmQocGFyc2VkKSA/IHBhcnNlZCA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWdCdkMsTUFBTSxVQUFVLEtBQUssQ0FBYyxJQUFhLEVBQUUsUUFBWTtJQUM1RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUMxRSxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFNLENBQUM7SUFDL0IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFhO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3Nlci1zYWZlIEpTT04gaGVscGVycyBmb3IgdGhlIHBhcnNlLXVudHJ1c3RlZC10ZXh0IGNhc2UuXG4gKlxuICogYEpTT04ucGFyc2VgIHRocm93cyBvbiBtYWxmb3JtZWQgaW5wdXQgYW5kIHJldHVybnMgYGFueWAsIHNvIGFsbW9zdCBldmVyeVxuICogY2FsbGVyIGluIHRoaXMgcmVwbyB3cmFwcGVkIGl0IGluIHRoZSBzYW1lIHRyeS9jYXRjaCBhbmQgdGhlbiByZS1uYXJyb3dlZCB0aGVcbiAqIHJlc3VsdCBieSBoYW5kLiB7QGxpbmsgcGFyc2V9IGNvbGxhcHNlcyB0aGUgdHJ5L2NhdGNoIChhIGJhZCBkb2N1bWVudCB5aWVsZHNcbiAqIHRoZSBmYWxsYmFjayBpbnN0ZWFkIG9mIHRocm93aW5nKSBhbmQge0BsaW5rIHBhcnNlUmVjb3JkfSBhZGRzIHRoZSBuYXJyb3dpbmdcbiAqIHRoYXQgdW50cnVzdGVkIEpTT04gYWxtb3N0IGFsd2F5cyBuZWVkcyBiZWZvcmUgaXQgY2FuIGJlIGluZGV4ZWQuXG4gKlxuICogVXNlIHRoZXNlIHdoZW4gdGhlIGRvY3VtZW50IGNvbWVzIGZyb20gT1VUU0lERSB0aGUgcHJvY2VzcyAtIGEgcmVxdWVzdCBib2R5LFxuICogYW4gZW52IHZhciwgYSBjb25maWcgZmlsZSwgYSBzdWJwcm9jZXNzJ3Mgc3Rkb3V0LCBhIHRoaXJkLXBhcnR5IEFQSS4gS2VlcFxuICogYmFyZSBgSlNPTi5wYXJzZWAgd2hlcmUgYSB0aHJvdyBpcyB0aGUgY29ycmVjdCBvdXRjb21lIChhbiBpbnRlcm5hbGx5XG4gKiBwcm9kdWNlZCBkb2N1bWVudCB0aGF0IG11c3QgYmUgd2VsbC1mb3JtZWQpLlxuICpcbiAqIFRoZXNlIGRlbGliZXJhdGVseSBkbyBOT1QgdmFsaWRhdGUgc2hhcGUgYmV5b25kIFwiaXMgaXQgYSByZWNvcmRcIi4gUmVhY2ggZm9yXG4gKiBhIHpvZCBzY2hlbWEgd2hlbiB0aGUgcGF5bG9hZCBoYXMgYSBjb250cmFjdDsgdGhlc2Ugb25seSBnZXQgeW91IGZyb20gYHN0cmluZ2BcbiAqIHRvIGEgc2FmZWx5IHR5cGVkIHN0YXJ0aW5nIHBvaW50LlxuICpcbiAqIFRoaXMgaXMgdGhlIHJlcG9zaXRvcnktd2lkZSBvd25lciBmb3Igbm9uLXRocm93aW5nIEpTT04gcGFyc2luZy4gUmV1c2UgdGhlc2VcbiAqIGhlbHBlcnMgaW5zdGVhZCBvZiByZXBlYXRpbmcgbG9jYWwgYHRyeSB7IEpTT04ucGFyc2UoLi4uKSB9YCB3cmFwcGVycy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaXNSZWNvcmQgfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcblxuLyoqXG4gKiBQYXJzZSBKU09OIHRleHQsIHJldHVybmluZyBgZmFsbGJhY2tgIChkZWZhdWx0IGB1bmRlZmluZWRgKSBpbnN0ZWFkIG9mXG4gKiB0aHJvd2luZyB3aGVuIGB0ZXh0YCBpcyBhYnNlbnQgb3IgbWFsZm9ybWVkLlxuICpcbiAqIFRoZSByZXR1cm4gdHlwZSBpcyBjYWxsZXItYXNzZXJ0ZWQsIGV4YWN0bHkgbGlrZSBgSlNPTi5wYXJzZWAgLSB0aGlzIG9ubHlcbiAqIHJlbW92ZXMgdGhlIHRyeS9jYXRjaCwgaXQgZG9lcyBub3QgdmFsaWRhdGUuIFByZWZlciB7QGxpbmsgcGFyc2VSZWNvcmR9IG9yIGFcbiAqIHNjaGVtYSB3aGVuIHRoZSByZXN1bHQgaXMgaW5kZXhlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgY29uZmlnID0ganNvbi5wYXJzZTxDb25maWc+KGF3YWl0IHJlYWRGaWxlKHBhdGgsIFwidXRmOFwiKSk7XG4gKiBjb25zdCB0YWdzID0ganNvbi5wYXJzZShwcm9jZXNzLmVudi5UQUdTLCBbXSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZTxUID0gdW5rbm93bj4odGV4dDogdW5rbm93biwgZmFsbGJhY2s6IFQpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlPFQgPSB1bmtub3duPih0ZXh0OiB1bmtub3duKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZTxUID0gdW5rbm93bj4odGV4dDogdW5rbm93biwgZmFsbGJhY2s/OiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdGV4dCAhPT0gXCJzdHJpbmdcIiB8fCB0ZXh0LnRyaW0oKS5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFjaztcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KSBhcyBUO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBKU09OIHRleHQgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBhbiBvYmplY3QsIHJldHVybmluZyBgdW5kZWZpbmVkYCB3aGVuXG4gKiBpdCBpcyBhYnNlbnQsIG1hbGZvcm1lZCwgb3IgcGFyc2VzIHRvIGEgbm9uLXJlY29yZCAoYW4gYXJyYXksIGEgYmFyZSBzdHJpbmcsXG4gKiBgbnVsbGAsIC4uLikuXG4gKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGNhc2UgZm9yIG1hbmlmZXN0cywgZW52LXZhciBjb25maWcgYmxvYnMsIGFuZCB1bnR5cGVkIEFQSVxuICogcGF5bG9hZHM6IHtAbGluayBwYXJzZX0gZm9sbG93ZWQgYnkge0BsaW5rIGlzUmVjb3JkfSwgc28gdGhlIHJlc3VsdCBjYW4gYmVcbiAqIGluZGV4ZWQgd2l0aG91dCBhbiBgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIGNhc3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG1hbmlmZXN0ID0ganNvbi5wYXJzZVJlY29yZChhd2FpdCByZWFkRmlsZShcInBhY2thZ2UuanNvblwiLCBcInV0ZjhcIikpID8/IHt9O1xuICogY29uc3QgbmFtZSA9IG1hbmlmZXN0Lm5hbWU7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlY29yZCh0ZXh0OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZSh0ZXh0KTtcbiAgcmV0dXJuIGlzUmVjb3JkKHBhcnNlZCkgPyBwYXJzZWQgOiB1bmRlZmluZWQ7XG59XG4iXX0=
package/lib/src/log.d.ts CHANGED
@@ -2,6 +2,9 @@
2
2
  * Tagged, leveled logging for every runtime - the one logger the whole
3
3
  * monorepo shares.
4
4
  *
5
+ * Import this module instead of constructing package-local console wrappers so
6
+ * log levels, tags, formatting, and browser behavior remain consistent.
7
+ *
5
8
  * {@link logger} resolves a tagged {@link Logger} through a synchronous console
6
9
  * sink, then upgrades its server-side formatter when `node:util` resolves.
7
10
  * Keeping the sink dependency-free prevents browser bundlers from retaining an
package/lib/src/log.js CHANGED
@@ -2,6 +2,9 @@
2
2
  * Tagged, leveled logging for every runtime - the one logger the whole
3
3
  * monorepo shares.
4
4
  *
5
+ * Import this module instead of constructing package-local console wrappers so
6
+ * log levels, tags, formatting, and browser behavior remain consistent.
7
+ *
5
8
  * {@link logger} resolves a tagged {@link Logger} through a synchronous console
6
9
  * sink, then upgrades its server-side formatter when `node:util` resolves.
7
10
  * Keeping the sink dependency-free prevents browser bundlers from retaining an
@@ -328,4 +331,4 @@ export function logger(loggerName) {
328
331
  const name = extractLoggerName(loggerName);
329
332
  return createLogger(name);
330
333
  }
331
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHOzs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFpQixTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFjdkQsTUFBTSxhQUFhLEdBQUksVUFBd0MsQ0FBQyxPQUFPLENBQUM7QUFDeEUsTUFBTSxTQUFTLEdBQUksVUFBZ0MsQ0FBQyxHQUFHLENBQUM7QUFFeEQ7Ozs7O0dBS0c7QUFDSCw4REFBOEQ7QUFDOUQsTUFBTSxtQkFBbUIsR0FDdkIsYUFBYSxJQUFJLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEtBQUssVUFBVTtJQUNoRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU07SUFDdEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUVoQixNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBQy9ELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ3ZDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUNyQixDQUFDO0FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDekMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3ZCLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLE9BQU87SUFDL0IsUUFBUSxLQUFLLEVBQUUsQ0FBQztRQUNkLEtBQUssTUFBTTtZQUNULEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxPQUFPO1lBQzNCLE1BQU07UUFDUixLQUFL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RSxhQUF1QjtJQUN2RCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sYUFBYSxJQUFJLEtBQUssQ0FBQztJQUN2RCxPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFlO0lBQzVDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxNQUFNLGlCQUFpQixHQUFHLHdEQUF3RCxDQUFDO0FBRW5GOzs7OztHQUtHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxVQUF5QztJQUNsRSxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2xDLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxPQUFPLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxVQUF5QztJQUM5RCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUYWdnZWQsIGxldmVsZWQgbG9nZ2luZyBmb3IgZXZlcnkgcnVudGltZSAtIHRoZSBvbmUgbG9nZ2VyIHRoZSB3aG9sZVxuICogbW9ub3JlcG8gc2hhcmVzLlxuICpcbiAqIHtAbGluayBsb2dnZXJ9IHJlc29sdmVzIGEgdGFnZ2VkIHtAbGluayBMb2dnZXJ9IHRocm91Z2ggYSBzeW5jaHJvbm91cyBjb25zb2xlXG4gKiBzaW5rLCB0aGVuIHVwZ3JhZGVzIGl0cyBzZXJ2ZXItc2lkZSBmb3JtYXR0ZXIgd2hlbiBgbm9kZTp1dGlsYCByZXNvbHZlcy5cbiAqIEtlZXBpbmcgdGhlIHNpbmsgZGVwZW5kZW5jeS1mcmVlIHByZXZlbnRzIGJyb3dzZXIgYnVuZGxlcnMgZnJvbSByZXRhaW5pbmcgYW5cbiAqIG9wdGlvbmFsIGJhcmUgaW1wb3J0IHRoYXQgZG93bnN0cmVhbSBhcHBzIHdvdWxkIHN0aWxsIGhhdmUgdG8gaW5zdGFsbC5cbiAqIHtAbGluayBMb2dMZXZlbH0gZmlsdGVyaW5nIHJ1bnMgdGhyb3VnaCB7QGxpbmsgc2hvdWxkRW1pdH0gaW4gcGVyLWxldmVsXG4gKiB3cmFwcGVycyBhcm91bmQgdGhlIHBsYXRmb3JtIGNvbnNvbGUgb3Igc3RkZXJyIHNpbmsuXG4gKlxuICogVGhlIGNvbnNvbGUgZmFsbGJhY2sgd3JpdGVzIGZvcm1hdHRlZCBsaW5lcyB0byBgcHJvY2Vzcy5zdGRlcnJgIHdoZW4gaXQgaXNcbiAqIGF2YWlsYWJsZSAoQnVuIGBpbnNwZWN0YCBwZXIgYXJndW1lbnQgd2hlbiBgTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEYCBpc1xuICogdW5zZXQsIG90aGVyd2lzZSBgbm9kZTp1dGlsYCBgZm9ybWF0V2l0aE9wdGlvbnNgKSwgb3IgZGVsZWdhdGVzIHRvIGdsb2JhbFxuICogYGNvbnNvbGUuKmAgd2hlbiBzdGRlcnIgb3IgYG5vZGU6dXRpbGAgaXMgdW5hdmFpbGFibGUuIEJyb3dzZXIgaG9zdHMgb21pdFxuICogdGhlIGBMRVZFTGAgdGV4dCBwcmVmaXggKGRldnRvb2xzIHNob3cgc2V2ZXJpdHkpIGFuZCBrZWVwIG9ubHkgdGhlIGBbbmFtZV1gXG4gKiB0YWcuXG4gKlxuICogRW52IHRvZ2dsZXM6IGBMT0dfTEVWRUxgIChyZWFkIHBlciBjYWxsKSBhbmQgYExPR19CVU5fQ09OU09MRV9ESVNBQkxFRGBcbiAqIChyZWFkIG9uY2UgZHVyaW5nIGZhY3RvcnkgaW5pdCkuXG4gKlxuICogQnJvd3Nlci1zYWZlOiBgcHJvY2Vzc2AgLyBgQnVuYCAvIGB3aW5kb3dgIC8gYGRvY3VtZW50YCBhcmUgYWxsIHJlYWNoZWRcbiAqIHRocm91Z2ggYGdsb2JhbFRoaXNgIGFuZCBndWFyZGVkLCBhbmQgYG5vZGU6dXRpbGAgaXMgaW1wb3J0ZWQgT05MWSBvbiBhIGhvc3RcbiAqIHRoYXQgaGFzIGBwcm9jZXNzLnN0ZGVycmAgLSBuZXZlciBpbiBhIGJyb3dzZXIsIHdoZXJlIHRoZSBzcGVjaWZpZXIgaXNcbiAqIHVucmVzb2x2YWJsZSAtIHNvIHRoZSBtb2R1bGUgd29ya3MgaW4gYW55IHJ1bnRpbWUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiLi9mdW5jdGlvbi11dGlscy50c1wiO1xuaW1wb3J0IHsgdHlwZSBOYW1lTGlrZSwgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5cbi8qKiBgcHJvY2Vzc2Atc2hhcGVkIHZpZXcgb2ZmIGBnbG9iYWxUaGlzYCwgc28gbm8gbm9kZSB0eXBlcyBhcmUgbmVlZGVkLiAqL1xuaW50ZXJmYWNlIFByb2Nlc3NMaWtlIHtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgc3RkZXJyPzogeyB3cml0ZT86IChjaHVuazogc3RyaW5nKSA9PiB2b2lkOyBpc1RUWT86IHVua25vd24gfTtcbn1cblxuLyoqIGBCdW5gLXNoYXBlZCB2aWV3IG9mZiBgZ2xvYmFsVGhpc2AsIHNvIG5vIGBAdHlwZXMvYnVuYCBpcyBuZWVkZWQuICovXG5pbnRlcmZhY2UgQnVuTGlrZSB7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGluc3BlY3Q/OiAodmFsdWU6IHVua25vd24sIG9wdGlvbnM/OiB7IGNvbG9ycz86IGJvb2xlYW47IGRlcHRoPzogbnVtYmVyIH0pID0+IHN0cmluZztcbn1cblxuY29uc3QgZ2xvYmFsUHJvY2VzcyA9IChnbG9iYWxUaGlzIGFzIHsgcHJvY2Vzcz86IFByb2Nlc3NMaWtlIH0pLnByb2Nlc3M7XG5jb25zdCBnbG9iYWxCdW4gPSAoZ2xvYmFsVGhpcyBhcyB7IEJ1bj86IEJ1bkxpa2UgfSkuQnVuO1xuXG4vKipcbiAqIE5vZGUgYHByb2Nlc3Muc3RkZXJyYCB3aGVuIHdyaXRhYmxlLCBlbHNlIGB1bmRlZmluZWRgIChzdGFibGUgZm9yIHRoZVxuICogcHJvY2VzcykuIFR5cGVkIGxvb3NlbHkgKGBhbnlgKSBiZWNhdXNlIGl0IGlzIGhhbmRlZCB0byB0aGUgY29uc29sZSBzaW5rJ3NcbiAqIGAud3JpdGVgLCB3aGljaCBvdXIgc3RydWN0dXJhbCB7QGxpbmsgUHJvY2Vzc0xpa2V9IHNoYXBlIGRvZXMgbm90IHNhdGlzZnlcbiAqIG5vbWluYWxseS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGdsb2JhbFByb2Nlc3NTdGRFcnI6IGFueSA9XG4gIGdsb2JhbFByb2Nlc3MgJiYgdHlwZW9mIGdsb2JhbFByb2Nlc3Muc3RkZXJyPy53cml0ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyBnbG9iYWxQcm9jZXNzLnN0ZGVyclxuICAgIDogdW5kZWZpbmVkO1xuXG5jb25zdCBMT0dfTEVWRUxTID0gW1wiZGVidWdcIiwgXCJpbmZvXCIsIFwid2FyblwiLCBcImVycm9yXCJdIGFzIGNvbnN0O1xuY29uc3QgTE9HX0xFVkVMX1JBTksgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIExPR19MRVZFTFMubWFwKChsZXZlbCwgaW5kZXgpID0+IFtsZXZlbCwgaW5kZXhdKSxcbikgYXMgUmVjb3JkPExvZ0xldmVsLCBudW1iZXI+O1xuY29uc3QgTE9HX0xFVkVMX0NPTE9SUyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgTE9HX0xFVkVMUy5tYXAoKGxldmVsKSA9PiB7XG4gICAgbGV0IGNvbG9yID0gXCJcXHgxYls5MG1cIjsgLy8gZ3JheVxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgXCJpbmZvXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszNG1cIjsgLy8gYmx1ZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ3YXJuXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszM21cIjsgLy8geWVsbG93XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszMW1cIjsgLy8gcmVkXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gW2xldmVsLCBjb2xvcl07XG4gIH0pLFxuKSBhcyBSZWNvcmQ8TG9nTGV2ZWwsIHN0cmluZz47XG5jb25zdCBMT0dfTEVWRUxfQ09MT1JfUkVTRVQgPSBcIlxceDFiWzBtXCI7XG5jb25zdCBERUZBVUxUX0xFVkVMOiBMb2dMZXZlbCA9IFwiaW5mb1wiO1xuXG4vKipcbiAqIFN1cHBvcnRlZCBzZXZlcml0aWVzLCBsb3dlc3QgdG8gaGlnaGVzdDogYGRlYnVnYCwgYGluZm9gLCBgd2FybmAsIGBlcnJvcmAuXG4gKiBBIGNhbGwgYmVsb3cgdGhlIGFjdGl2ZSB0aHJlc2hvbGQgaXMgZGlzY2FyZGVkIGJlZm9yZSBhbnkgc3RyaW5nIHdvcmsgb3JcbiAqIHNpbmsgSS9PLlxuICpcbiAqIFRoZSB0aHJlc2hvbGQgY29tZXMgZnJvbSBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCBvbiBldmVyeSBjYWxsXG4gKiAoY2FzZS1pbnNlbnNpdGl2ZSwgZGVmYXVsdCBgaW5mb2Agd2hlbiB1bnNldCwgZW1wdHksIG9yIHVua25vd24pIHNvIHRlc3RcbiAqIHJ1bm5lcnMgYW5kIGVtYmVkZGVycyBjYW4gY2hhbmdlIHZlcmJvc2l0eSBhZnRlciBpbXBvcnQgd2l0aG91dCByZXN0YXJ0aW5nXG4gKiB0aGUgcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAodHlwZW9mIExPR19MRVZFTFMpW251bWJlcl07XG5cbi8qKlxuICogRGVwZW5kZW5jeS1mcmVlIGxldmVsZWQgbG9nZ2VyLiBTdGFuZGFyZCBtZXRob2RzIGhvbm9yIGBMT0dfTEVWRUxgOyBgc3RhcnRgXG4gKiBhbmQgYHN1Y2Nlc3NgIGFyZSBpbmZvcm1hdGlvbmFsIGFsaWFzZXMgd2l0aCBkaXN0aW5jdCBwcmVzZW50YXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIExvZ2dlciA9IHtcbiAgW0sgaW4gTG9nTGV2ZWxdOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG59ICYge1xuICAvKiogU3VjY2VzcyBtZXNzYWdlIGVtaXR0ZWQgYXQgYGluZm9gIGxldmVsLiAqL1xuICBzdWNjZXNzOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG4gIC8qKiBTdGFydCAvIGluLXByb2dyZXNzIG1lc3NhZ2UgZW1pdHRlZCBhdCBgaW5mb2AgbGV2ZWwuICovXG4gIHN0YXJ0OiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG59O1xuXG4vKiogYChuYW1lPykgPT4gTG9nZ2VyYCBzaW5rIGNvbnN0cnVjdG9yIHJldHVybmVkIGJ5IHRoZSBpbml0LXRpbWUgZmFjdG9yeSBjaGFpbi4gKi9cbnR5cGUgTG9nZ2VyRmFjdG9yeSA9IChuYW1lPzogc3RyaW5nKSA9PiBMb2dnZXI7XG5cbi8qKlxuICogQ29uc29sZSB7QGxpbmsgTG9nZ2VyRmFjdG9yeX07IGFsd2F5cyBzdWNjZWVkcy5cbiAqXG4gKiBXaGVuIGBwcm9jZXNzLnN0ZGVycmAgaXMgYXZhaWxhYmxlLCBmb3JtYXRzIGVhY2ggbGluZSBhbmQgd3JpdGVzIG9ubHkgdG9cbiAqIHN0ZGVyci4gQnVuIGBpbnNwZWN0YCBmb3JtYXRzIGVhY2ggYXJndW1lbnQgd2hlbiBlbmFibGVkOyBvdGhlcndpc2VcbiAqIGB1dGlsLmluc3BlY3RgIHdoZW4gYG5vZGU6dXRpbGAgbG9hZHMsIG9yIGEgYEpTT04uc3RyaW5naWZ5YCBmYWxsYmFjayB3aGVuXG4gKiBpdCBkb2VzIG5vdC4gV2hlbiBzdGRlcnIgaXMgdW5hdmFpbGFibGUgKGV2ZXJ5IGJyb3dzZXIpLCBiaW5kc1xuICoge0BsaW5rIGNyZWF0ZUZvcm1hdHRlcn0gcHJlZml4ZXMgaW50byBnbG9iYWwgYGNvbnNvbGUuKmAgY2FsbHMgYW5kIHNraXBzIHRoZVxuICogYG5vZGU6dXRpbGAgaW1wb3J0IGVudGlyZWx5LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyOiBhbnkpOiBQcm9taXNlPExvZ2dlckZhY3Rvcnk+IHtcbiAgLy8gSW5kaXJlY3Qgc3BlY2lmaWVyIHNvIHRoaXMgYnJvd3Nlci1zYWZlIG1vZHVsZSBkb2Vzbid0IHN0YXRpY2FsbHkgcHVsbCBpblxuICAvLyBub2RlIHR5cGVzOiBgbm9kZTp1dGlsYCBpcyBvcHRpb25hbCAodGhlIEpTT04gZmFsbGJhY2sgY292ZXJzIGl0cyBhYnNlbmNlKS5cbiAgY29uc3Qgbm9kZVV0aWwgPSBcIm5vZGU6dXRpbFwiO1xuICAvLyBHYXRlZCwgbm90IGp1c3QgY2F1Z2h0OiB0aGUgaW5kaXJlY3Qgc3BlY2lmaWVyIGRlZmVhdHMgYnVuZGxlciBhbmFseXNpcyBieVxuICAvLyBkZXNpZ24sIHNvIGEgY2xpZW50IGJ1aWxkIGVtaXRzIGEgbGl0ZXJhbCBgaW1wb3J0KFwibm9kZTp1dGlsXCIpYCB0aGF0IG5vXG4gIC8vIGJyb3dzZXIgY2FuIHJlc29sdmUsIGFuZCB0aGUgY2F1Z2h0IHJlamVjdGlvbiBzdGlsbCBzdXJmYWNlZCBhcyBhIGNvbnNvbGVcbiAgLy8gZXJyb3IuIGB1dGlsc2Agb25seSBmZWVkcyB0aGUgc3RkZXJyIGJyYW5jaCBvZiB0aGUgZW1pdHRlciBiZWxvdywgc28gbm9cbiAgLy8gc3RkZXJyIG1lYW5zIHRoZSBpbXBvcnQgaGFzIG5vdGhpbmcgdG8gc2VydmUgYW5kIGlzIHNraXBwZWQgb3V0cmlnaHQuXG4gIGNvbnN0IHV0aWxzOiB7IGluc3BlY3Q/OiBhbnkgfSB8IHVuZGVmaW5lZCA9XG4gICAgZ2xvYmFsUHJvY2Vzc1N0ZEVyciA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBhd2FpdCBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIG5vZGVVdGlsKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICByZXR1cm4gY29uc29sZUxvZ2dlckZhY3RvcnkoZ2xvYmFsUHJvY2Vzc1N0ZEVyciwgdXRpbHMpO1xufVxuXG4vKipcbiAqIFRoZSBzeW5jaHJvbm91cyBjb3JlIG9mIHtAbGluayBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeX0sIHNwbGl0IG91dCBzbyB0aGVcbiAqIHNhbWUgZW1pdHRlciBhbHNvIHNlcnZlcyBhcyB0aGUgYm9vdHN0cmFwIHNpbmsgYmVmb3JlIGFueSBhc3luYyBmYWN0b3J5IGhhc1xuICogcmVzb2x2ZWQuIGB1dGlsc2AgaXMgYG5vZGU6dXRpbGAgd2hlbiBpdCBsb2FkZWQ7IHdpdGhvdXQgaXQsIG9iamVjdCBhcmd1bWVudHNcbiAqIGZvcm1hdCB0aHJvdWdoIHRoZSBgSlNPTi5zdHJpbmdpZnlgIGZhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBjb25zb2xlTG9nZ2VyRmFjdG9yeShcbiAgZ2xvYmFsUHJvY2Vzc1N0ZEVycjogYW55LFxuICB1dGlscz86IHsgaW5zcGVjdD86IGFueSB9IHwgdW5kZWZpbmVkLFxuKTogTG9nZ2VyRmFjdG9yeSB7XG4gIGNvbnN0IGJ1bkluc3BlY3QgPVxuICAgIGdsb2JhbEJ1biAhPT0gdW5kZWZpbmVkICYmICF0b0Jvb2xlYW4oZ2xvYmFsQnVuLmVudj8uTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEKVxuICAgICAgPyBnbG9iYWxCdW4uaW5zcGVjdFxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc2V0Q29sb3JzUHJlZml4ID0gYnVuSW5zcGVjdCAhPT0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGluc3BlY3QgPSAoYXJnOiBhbnksIGNvbG9ycz86IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpIHx8ICh0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmIGFyZyAhPT0gbnVsbCkpIHtcbiAgICAgIGlmIChidW5JbnNwZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGJ1bkluc3BlY3QoYXJnLCB7XG4gICAgICAgICAgY29sb3JzOiBjb2xvcnMsXG4gICAgICAgICAgZGVwdGg6IHV0aWxzPy5pbnNwZWN0Py5kZWZhdWx0T3B0aW9ucz8uZGVwdGggPz8gdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodXRpbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdXRpbHMuaW5zcGVjdChhcmcsIHtcbiAgICAgICAgICAuLi51dGlscz8uaW5zcGVjdD8uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgY29sb3JzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZywgKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuICAgICAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGFyZyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZhY3RvcnkgPSAobmFtZT86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHByZWZpeEZvcm1hdHRlciA9IGNyZWF0ZUZvcm1hdHRlcihuYW1lLCBnbG9iYWxQcm9jZXNzU3RkRXJyLCByZXNldENvbG9yc1ByZWZpeCk7XG4gICAgY29uc3QgbG9nZ2VyID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgTE9HX0xFVkVMUy5tYXAoKGxldmVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcHJlZml4LCBjb2xvcnMsIHJlc2V0Q29sb3JzIH0gPSBwcmVmaXhGb3JtYXR0ZXIobGV2ZWwpO1xuICAgICAgICBjb25zdCBlbWl0dGVyID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgaWYgKCFzaG91bGRFbWl0KGxldmVsLCB0cnVlKSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChnbG9iYWxQcm9jZXNzU3RkRXJyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IHByZWZpeCA/IFtwcmVmaXhdIDogW107XG4gICAgICAgICAgICBtZXNzYWdlUGFydHMucHVzaCguLi5hcmdzLm1hcCgoYXJnKSA9PiBpbnNwZWN0KGFyZywgY29sb3JzKSkpO1xuICAgICAgICAgICAgaWYgKHJlc2V0Q29sb3JzKSBtZXNzYWdlUGFydHMucHVzaChMT0dfTEVWRUxfQ09MT1JfUkVTRVQpO1xuICAgICAgICAgICAgZ2xvYmFsUHJvY2Vzc1N0ZEVyci53cml0ZShtZXNzYWdlUGFydHMuam9pbihcIiBcIikgKyBcIlxcblwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxldmVsRm4gPSBjb25zb2xlW2xldmVsXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWxGbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgIGxldmVsRm4gPSBjb25zb2xlLmxvZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmVmaXgpIGxldmVsRm4gPSBsZXZlbEZuLmJpbmQoY29uc29sZSwgcHJlZml4KTtcbiAgICAgICAgICAgIGxldmVsRm4oLi4uYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gW2xldmVsLCBlbWl0dGVyXTtcbiAgICAgIH0pLFxuICAgICkgYXMgTG9nZ2VyO1xuICAgIC8vIENvbnZlbmllbmNlIGxldmVscyBzaGFyZSB0aGUgaW5mbyBzaW5rLlxuICAgIGxvZ2dlci5zdWNjZXNzID0gbG9nZ2VyLmluZm87XG4gICAgbG9nZ2VyLnN0YXJ0ID0gbG9nZ2VyLmluZm87XG4gICAgcmV0dXJuIGxvZ2dlcjtcbiAgfTtcbiAgY29uc3QgZGVmYXVsdEZhY3RvcnkgPSBtZW1vaXplKGZhY3RvcnkpO1xuICByZXR1cm4gKG5hbWU/OiBzdHJpbmcpID0+IChuYW1lID8gZmFjdG9yeShuYW1lKSA6IGRlZmF1bHRGYWN0b3J5KCkpO1xufVxuXG4vKipcbiAqIEZ1bGwgY29uc29sZSBzaW5rIHdpdGggb3B0aW9uYWwgYG5vZGU6dXRpbGAgaW5zcGVjdGlvbi4gTWVtb2l6ZWQgc29cbiAqIGNvbmN1cnJlbnQgYW5kIHJlcGVhdCBjYWxsZXJzIHNoYXJlIG9uZSBpbi1mbGlnaHQgcHJvbWlzZSBhbmQgc2V0dGxlZCByZXN1bHQuXG4gKi9cbmNvbnN0IHJlc29sdmVGYWN0b3J5ID0gbWVtb2l6ZShhc3luYyAoKTogUHJvbWlzZTxMb2dnZXJGYWN0b3J5PiA9PiB7XG4gIHJldHVybiBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyKTtcbn0pO1xuXG4vKipcbiAqIEFjdGl2ZSBmYWN0b3J5IHN0YXJ0cyBhcyBhIHN5bmMgY29uc29sZSBzaW5rIChubyBgYXdhaXRgLCBzbyB0aGlzIG1vZHVsZVxuICogZmluaXNoZXMgZXZhbHVhdGluZyBpbW1lZGlhdGVseSkgYW5kIHN3YXBzIHRvIHtAbGluayByZXNvbHZlRmFjdG9yeX0nc1xuICogcmVzdWx0IHdoZW4gc2VydmVyLXNpZGUgYXJndW1lbnQgaW5zcGVjdGlvbiBpcyByZWFkeS5cbiAqL1xubGV0IGFjdGl2ZUZhY3Rvcnk6IExvZ2dlckZhY3RvcnkgPSBjb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyKTtcbnZvaWQgcmVzb2x2ZUZhY3RvcnkoKS50aGVuKFxuICAoZmFjdG9yeSkgPT4ge1xuICAgIGFjdGl2ZUZhY3RvcnkgPSBmYWN0b3J5O1xuICB9LFxuICAoKSA9PiB7XG4gICAgLy8gS2VlcCB0aGUgc3luYyBjb25zb2xlIHNpbms7IG5ldmVyIGxlYXZlIGltcG9ydGVycyB3aXRob3V0IGEgZmFjdG9yeS5cbiAgfSxcbik7XG5cbi8qKlxuICogQnVpbGQgYSBsb2dnZXIgdGhhdCByZWJpbmRzIHdoZW4ge0BsaW5rIGFjdGl2ZUZhY3Rvcnl9IHVwZ3JhZGVzLiBDYWxsZXJzIHRoYXRcbiAqIGNhcHR1cmUgYGNvbnN0IGxvZyA9IGxvZ2dlcihcInhcIilgIGF0IG1vZHVsZSBzY29wZSBzdGlsbCBnZXQgdGhlIHVwZ3JhZGVkXG4gKiBmb3JtYXR0ZXIgb25jZSBpdCBhcnJpdmVzLCB3aXRob3V0IGV2ZXJ5IGNhbGwgc2l0ZSB3YWl0aW5nIG9uIGEgcHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTG9nZ2VyKG5hbWU/OiBzdHJpbmcpOiBMb2dnZXIge1xuICBsZXQgYm91bmQ6IHsgZmFjdG9yeTogTG9nZ2VyRmFjdG9yeTsgbG9nZ2VyOiBMb2dnZXIgfSB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2luayA9ICgpOiBMb2dnZXIgPT4ge1xuICAgIGlmIChib3VuZD8uZmFjdG9yeSAhPT0gYWN0aXZlRmFjdG9yeSkge1xuICAgICAgYm91bmQgPSB7IGZhY3Rvcnk6IGFjdGl2ZUZhY3RvcnksIGxvZ2dlcjogYWN0aXZlRmFjdG9yeShuYW1lKSB9O1xuICAgIH1cbiAgICByZXR1cm4gYm91bmQubG9nZ2VyO1xuICB9O1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5MT0dfTEVWRUxTLCBcInN1Y2Nlc3NcIiwgXCJzdGFydFwiXS5tYXAoKGxldmVsKSA9PiBbXG4gICAgICBsZXZlbCxcbiAgICAgICguLi5hcmdzOiBhbnlbXSkgPT4gc2luaygpW2xldmVsIGFzIGtleW9mIExvZ2dlcl0oLi4uYXJncyksXG4gICAgXSksXG4gICkgYXMgTG9nZ2VyO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgbGluZSBwcmVmaXggb2YgYExFVkVMIFtuYW1lXWAgb24gTm9kZS9CdW4gaG9zdHMsIG9yIGBbbmFtZV1gIGFsb25lXG4gKiBpbiBicm93c2VycyAoZWl0aGVyIHBhcnQgb21pdHRlZCB3aGVuIGFic2VudCkuIEFwcGxpZXMgcGVyLWxldmVsIEFOU0kgY29sb3JcbiAqIHdoZW4gYHN0cmVhbVN1cHBvcnRzQ29sb3JgIGlzIHRydWUgZm9yIHRoZSBnaXZlbiBzdGRlcnIgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGb3JtYXR0ZXIoXG4gIG5hbWU6IGFueSxcbiAgc3RyZWFtOiBhbnksXG4gIHJlc2V0Q29sb3JzUHJlZml4PzogYm9vbGVhbixcbik6IChsZXZlbD86IExvZ0xldmVsKSA9PiB7IHByZWZpeDogc3RyaW5nOyBjb2xvcnM6IGJvb2xlYW47IHJlc2V0Q29sb3JzOiBib29sZWFuIH0ge1xuICBjb25zdCBnbG9iID0gZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHVua25vd247IGRvY3VtZW50PzogdW5rbm93biB9O1xuICBjb25zdCBpc0Jyb3dzZXIgPSBnbG9iLndpbmRvdyAhPT0gdW5kZWZpbmVkICYmIGdsb2IuZG9jdW1lbnQgIT09IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3VwcG9ydHNDb2xvciA9ICFpc0Jyb3dzZXIgPyBzdHJlYW1TdXBwb3J0c0NvbG9yKHN0cmVhbSkgOiBmYWxzZTtcbiAgY29uc3QgbmFtZVByZWZpeCA9IG5hbWUgPyBcIltcIiArIG5hbWUgKyBcIl1cIiA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIChsZXZlbD86IExvZ0xldmVsKSA9PiB7XG4gICAgY29uc3QgY29sb3IgPSBzdXBwb3J0c0NvbG9yICYmIGxldmVsICE9PSB1bmRlZmluZWQgPyBMT0dfTEVWRUxfQ09MT1JTW2xldmVsXSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJlZml4ID0gWyFpc0Jyb3dzZXIgJiYgbGV2ZWwgPyBsZXZlbC50b1VwcGVyQ2FzZSgpIDogdW5kZWZpbmVkLCBuYW1lUHJlZml4XVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIGxldCByZXNldENvbG9ycyA9IGZhbHNlO1xuICAgIGlmIChjb2xvcikge1xuICAgICAgY29uc3QgYXBwbHlSZXNldENvbG9yc1ByZWZpeCA9IHJlc2V0Q29sb3JzUHJlZml4IHx8IFwiaW5mb1wiID09PSBsZXZlbDtcbiAgICAgIGlmICghYXBwbHlSZXNldENvbG9yc1ByZWZpeCkgcmVzZXRDb2xvcnMgPSB0cnVlO1xuICAgICAgcHJlZml4ID0gYXBwbHlSZXNldENvbG9yc1ByZWZpeCA/IGNvbG9yICsgcHJlZml4ICsgTE9HX0xFVkVMX0NPTE9SX1JFU0VUIDogY29sb3IgKyBwcmVmaXg7XG4gICAgfVxuICAgIHJldHVybiB7IHByZWZpeCwgY29sb3JzOiBjb2xvciA/IHRydWUgOiBmYWxzZSwgcmVzZXRDb2xvcnMgfTtcbiAgfTtcbn1cblxuLyoqIFRydWUgd2hlbiBgc3RyZWFtYCBpcyBhIFRUWSBhbmQgdGhlIHRlcm1pbmFsIGlzIG5vdCBgZHVtYmAuICovXG5mdW5jdGlvbiBzdHJlYW1TdXBwb3J0c0NvbG9yKHN0cmVhbT86IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGdsb2JhbFByb2Nlc3MgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygc3RyZWFtICE9PSBcIm9iamVjdFwiIHx8IHN0cmVhbSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB7IGlzVFRZIH0gPSBzdHJlYW0gYXMgeyBpc1RUWT86IHVua25vd24gfTtcbiAgaWYgKGlzVFRZICE9PSB0cnVlKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRlcm0gPSBnbG9iYWxQcm9jZXNzLmVudj8uVEVSTT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKFwiZHVtYlwiID09IHRlcm0pIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBQYXJzZSBhIHJhdyB2YWx1ZSBhcyB7QGxpbmsgTG9nTGV2ZWx9ICh0cmltbWVkLCBjYXNlLWluc2Vuc2l0aXZlKS4gKi9cbmZ1bmN0aW9uIHBhcnNlTG9nTGV2ZWwocmF3OiB1bmtub3duKTogTG9nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgdGV4dCA9IHR5cGVvZiByYXcgPT09IFwic3RyaW5nXCIgPyByYXcgOiBTdHJpbmcocmF3KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICBpZiAoaSA+IDApIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0ZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHRleHQgPT09IG5vcm1hbGl6ZWQpIGJyZWFrO1xuICAgICAgdGV4dCA9IG5vcm1hbGl6ZWQ7XG4gICAgfVxuICAgIGlmICghdGV4dCkge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh0ZXh0IGluIExPR19MRVZFTF9SQU5LKSB7XG4gICAgICByZXR1cm4gdGV4dCBhcyBMb2dMZXZlbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIEFjdGl2ZSB0aHJlc2hvbGQgZnJvbSBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCwgZGVmYXVsdCB7QGxpbmsgREVGQVVMVF9MRVZFTH0uICovXG5mdW5jdGlvbiBhY3RpdmVMZXZlbCgpOiBMb2dMZXZlbCB7XG4gIHJldHVybiBwYXJzZUxvZ0xldmVsKGdsb2JhbFByb2Nlc3M/LmVudj8uTE9HX0xFVkVMKSA/PyBERUZBVUxUX0xFVkVMO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYHJhd2AgbWVldHMgdGhlIGN1cnJlbnQgYExPR19MRVZFTGAgdGhyZXNob2xkLlxuICpcbiAqIFBhcnNlcyBgcmF3YCBhcyBhIHtAbGluayBMb2dMZXZlbH07IHdoZW4gcGFyc2luZyBmYWlscywgcmV0dXJuc1xuICogYGRlZmF1bHRSZXN1bHRgIGlmIHN1cHBsaWVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkRW1pdChyYXc6IHVua25vd24sIGRlZmF1bHRSZXN1bHQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxldmVsID0gcGFyc2VMb2dMZXZlbChyYXcpO1xuICBpZiAobGV2ZWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRSZXN1bHQgPz8gZmFsc2U7XG4gIHJldHVybiBMT0dfTEVWRUxfUkFOS1tsZXZlbF0gPj0gTE9HX0xFVkVMX1JBTktbYWN0aXZlTGV2ZWwoKV07XG59XG5cbi8qKlxuICogV2hldGhlciBhIGNhbGwgYXQgYGxldmVsYCB3b3VsZCBiZSBlbWl0dGVkIGF0IHRoZSBjdXJyZW50XG4gKiBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCB0aHJlc2hvbGQuIFVzZSBiZWZvcmUgYnVpbGRpbmcgZXhwZW5zaXZlIGRlYnVnXG4gKiBwYXlsb2Fkcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaWYgKGlzTGV2ZWxFbmFibGVkKFwiZGVidWdcIikpIHtcbiAqICAgbG9nLmRlYnVnKFwibW91bnRzOnJlc29sdmVyXCIsIHsgY29udHJpYnV0aW9uOiBhd2FpdCBoZWF2eVNuYXBzaG90KCkgfSk7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xldmVsRW5hYmxlZChsZXZlbDogTG9nTGV2ZWwpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNob3VsZEVtaXQobGV2ZWwpO1xufVxuXG5jb25zdCBMT0dHRVJfTkFNRV9SRUdFWCA9IC9eKD86W2Etel1bYS16MC05Ky4tXSo6XFwvXFwvKT8uKlxcLyhbXi8uXSspKD86XFwuW14vXSspPyQvaTtcblxuLyoqXG4gKiBEZXJpdmUgdGhlIHRhZyBzdHJpbmcgZnJvbSBhIGxvZ2dlciBuYW1lLCBwbHVnaW4sIG9yIHBhdGguIFNsYXNoLSBhbmRcbiAqIFVSTC1zaGFwZWQgc3RyaW5ncyB1c2UgdGhlIGxhc3QgcGF0aCBzZWdtZW50IChleHRlbnNpb24gc3RyaXBwZWQpOyBwbGFpblxuICogc3RyaW5ncyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLiBFbXB0eSBvciBtaXNzaW5nIG5hbWVzIC0+IGB1bmRlZmluZWRgXG4gKiAodW50YWdnZWQgc2luaykuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RMb2dnZXJOYW1lKGxvZ2dlck5hbWU6IE5hbWVMaWtlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFsb2dnZXJOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGxvZ2dlck5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtYXRjaCA9IGxvZ2dlck5hbWUubWF0Y2goTE9HR0VSX05BTUVfUkVHRVgpO1xuICAgIHJldHVybiBtYXRjaD8uWzFdID8/IGxvZ2dlck5hbWU7XG4gIH1cbiAgcmV0dXJuIGV4dHJhY3RMb2dnZXJOYW1lKGxvZ2dlck5hbWUubmFtZSk7XG59XG5cbi8qKlxuICogQnVpbGQgYSB0YWdnZWQgbG9nZ2VyIGZvciBhIHBsdWdpbiBvciBtb2R1bGUuXG4gKlxuICogVGhlIHRhZyBpcyBgW25hbWVdYCB3aGVuIGBsb2dnZXJOYW1lYCBpcyBhIG5vbi1lbXB0eSBzdHJpbmcsIGFcbiAqIHtAbGluayBOYW1lTGlrZX0gd2l0aCBgbmFtZWAsIG9yIGEgZmlsZSAvIFVSTCBwYXRoICh0aGUgYmFzZW5hbWUgd2l0aG91dFxuICogZXh0ZW5zaW9uIGlzIHVzZWQpLiBUaGUgY29uc29sZSBzaW5rIHByZXBlbmRzIGBMRVZFTCBbbmFtZV1gIG9uIE5vZGUvQnVuXG4gKiBob3N0cyBvciBgW25hbWVdYCBhbG9uZSBpbiBicm93c2VycyB2aWEge0BsaW5rIGNyZWF0ZUZvcm1hdHRlcn0uXG4gKlxuICogQ2FsbHMgYmVsb3cgYHByb2Nlc3MuZW52LkxPR19MRVZFTGAgYXJlIGRyb3BwZWQgYnkge0BsaW5rIHNob3VsZEVtaXR9IGJlZm9yZVxuICogdGhlIHNpbmsgZm9ybWF0cyBvciB3cml0ZXMgdGhlIGxpbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG4gKlxuICogY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImdlbmllL2NoYXRcIik7XG4gKiBsb2dnZXIuaW5mbyhcInN0YXJ0aW5nXCIpO1xuICogbG9nZ2VyLndhcm4oXCJtaXNzaW5nIG9wdGlvbmFsIGNvbmZpZ1wiLCB7IHJlYXNvbjogXCJubyBlbnYgdmFyXCIgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dnZXIobG9nZ2VyTmFtZTogTmFtZUxpa2UgfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBMb2dnZXIge1xuICBjb25zdCBuYW1lID0gZXh0cmFjdExvZ2dlck5hbWUobG9nZ2VyTmFtZSk7XG4gIHJldHVybiBjcmVhdGVMb2dnZXIobmFtZSk7XG59XG4iXX0=
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHOzs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFpQixTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFjdkQsTUFBTSxhQUFhLEdBQUksVUFBd0MsQ0FBQyxPQUFPLENBQUM7QUFDeEUsTUFBTSxTQUFTLEdBQUksVUFBZ0MsQ0FBQyxHQUFHLENBQUM7QUFFeEQ7Ozs7O0dBS0c7QUFDSCw4REFBOEQ7QUFDOUQsTUFBTSxtQkFBbUIsR0FDdkIsYUFBYSxJQUFJLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEtBQUssVUFBVTtJQUNoRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU07SUFDdEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUVoQixNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBQy9ELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ3ZDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUNyQixDQUFDO0FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDekMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3ZCLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLE9BQU87SUFDL0IsUUFBUSxLQUFLLEVBQUUsQ0FBQztRQUNkLEtBQUssTUFBTTtZQUNULEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxPQUFPO1lBQzNCLE1BQU07UUFDUixL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RUFBRSxhQUF1QjtJQUN2RCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sYUFBYSxJQUFJLEtBQUssQ0FBQztJQUN2RCxPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFlO0lBQzVDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxNQUFNLGlCQUFpQixHQUFHLHdEQUF3RCxDQUFDO0FBRW5GOzs7OztHQUtHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxVQUF5QztJQUNsRSxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2xDLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxPQUFPLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxVQUF5QztJQUM5RCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUYWdnZWQsIGxldmVsZWQgbG9nZ2luZyBmb3IgZXZlcnkgcnVudGltZSAtIHRoZSBvbmUgbG9nZ2VyIHRoZSB3aG9sZVxuICogbW9ub3JlcG8gc2hhcmVzLlxuICpcbiAqIEltcG9ydCB0aGlzIG1vZHVsZSBpbnN0ZWFkIG9mIGNvbnN0cnVjdGluZyBwYWNrYWdlLWxvY2FsIGNvbnNvbGUgd3JhcHBlcnMgc29cbiAqIGxvZyBsZXZlbHMsIHRhZ3MsIGZvcm1hdHRpbmcsIGFuZCBicm93c2VyIGJlaGF2aW9yIHJlbWFpbiBjb25zaXN0ZW50LlxuICpcbiAqIHtAbGluayBsb2dnZXJ9IHJlc29sdmVzIGEgdGFnZ2VkIHtAbGluayBMb2dnZXJ9IHRocm91Z2ggYSBzeW5jaHJvbm91cyBjb25zb2xlXG4gKiBzaW5rLCB0aGVuIHVwZ3JhZGVzIGl0cyBzZXJ2ZXItc2lkZSBmb3JtYXR0ZXIgd2hlbiBgbm9kZTp1dGlsYCByZXNvbHZlcy5cbiAqIEtlZXBpbmcgdGhlIHNpbmsgZGVwZW5kZW5jeS1mcmVlIHByZXZlbnRzIGJyb3dzZXIgYnVuZGxlcnMgZnJvbSByZXRhaW5pbmcgYW5cbiAqIG9wdGlvbmFsIGJhcmUgaW1wb3J0IHRoYXQgZG93bnN0cmVhbSBhcHBzIHdvdWxkIHN0aWxsIGhhdmUgdG8gaW5zdGFsbC5cbiAqIHtAbGluayBMb2dMZXZlbH0gZmlsdGVyaW5nIHJ1bnMgdGhyb3VnaCB7QGxpbmsgc2hvdWxkRW1pdH0gaW4gcGVyLWxldmVsXG4gKiB3cmFwcGVycyBhcm91bmQgdGhlIHBsYXRmb3JtIGNvbnNvbGUgb3Igc3RkZXJyIHNpbmsuXG4gKlxuICogVGhlIGNvbnNvbGUgZmFsbGJhY2sgd3JpdGVzIGZvcm1hdHRlZCBsaW5lcyB0byBgcHJvY2Vzcy5zdGRlcnJgIHdoZW4gaXQgaXNcbiAqIGF2YWlsYWJsZSAoQnVuIGBpbnNwZWN0YCBwZXIgYXJndW1lbnQgd2hlbiBgTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEYCBpc1xuICogdW5zZXQsIG90aGVyd2lzZSBgbm9kZTp1dGlsYCBgZm9ybWF0V2l0aE9wdGlvbnNgKSwgb3IgZGVsZWdhdGVzIHRvIGdsb2JhbFxuICogYGNvbnNvbGUuKmAgd2hlbiBzdGRlcnIgb3IgYG5vZGU6dXRpbGAgaXMgdW5hdmFpbGFibGUuIEJyb3dzZXIgaG9zdHMgb21pdFxuICogdGhlIGBMRVZFTGAgdGV4dCBwcmVmaXggKGRldnRvb2xzIHNob3cgc2V2ZXJpdHkpIGFuZCBrZWVwIG9ubHkgdGhlIGBbbmFtZV1gXG4gKiB0YWcuXG4gKlxuICogRW52IHRvZ2dsZXM6IGBMT0dfTEVWRUxgIChyZWFkIHBlciBjYWxsKSBhbmQgYExPR19CVU5fQ09OU09MRV9ESVNBQkxFRGBcbiAqIChyZWFkIG9uY2UgZHVyaW5nIGZhY3RvcnkgaW5pdCkuXG4gKlxuICogQnJvd3Nlci1zYWZlOiBgcHJvY2Vzc2AgLyBgQnVuYCAvIGB3aW5kb3dgIC8gYGRvY3VtZW50YCBhcmUgYWxsIHJlYWNoZWRcbiAqIHRocm91Z2ggYGdsb2JhbFRoaXNgIGFuZCBndWFyZGVkLCBhbmQgYG5vZGU6dXRpbGAgaXMgaW1wb3J0ZWQgT05MWSBvbiBhIGhvc3RcbiAqIHRoYXQgaGFzIGBwcm9jZXNzLnN0ZGVycmAgLSBuZXZlciBpbiBhIGJyb3dzZXIsIHdoZXJlIHRoZSBzcGVjaWZpZXIgaXNcbiAqIHVucmVzb2x2YWJsZSAtIHNvIHRoZSBtb2R1bGUgd29ya3MgaW4gYW55IHJ1bnRpbWUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiLi9mdW5jdGlvbi11dGlscy50c1wiO1xuaW1wb3J0IHsgdHlwZSBOYW1lTGlrZSwgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5cbi8qKiBgcHJvY2Vzc2Atc2hhcGVkIHZpZXcgb2ZmIGBnbG9iYWxUaGlzYCwgc28gbm8gbm9kZSB0eXBlcyBhcmUgbmVlZGVkLiAqL1xuaW50ZXJmYWNlIFByb2Nlc3NMaWtlIHtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgc3RkZXJyPzogeyB3cml0ZT86IChjaHVuazogc3RyaW5nKSA9PiB2b2lkOyBpc1RUWT86IHVua25vd24gfTtcbn1cblxuLyoqIGBCdW5gLXNoYXBlZCB2aWV3IG9mZiBgZ2xvYmFsVGhpc2AsIHNvIG5vIGBAdHlwZXMvYnVuYCBpcyBuZWVkZWQuICovXG5pbnRlcmZhY2UgQnVuTGlrZSB7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGluc3BlY3Q/OiAodmFsdWU6IHVua25vd24sIG9wdGlvbnM/OiB7IGNvbG9ycz86IGJvb2xlYW47IGRlcHRoPzogbnVtYmVyIH0pID0+IHN0cmluZztcbn1cblxuY29uc3QgZ2xvYmFsUHJvY2VzcyA9IChnbG9iYWxUaGlzIGFzIHsgcHJvY2Vzcz86IFByb2Nlc3NMaWtlIH0pLnByb2Nlc3M7XG5jb25zdCBnbG9iYWxCdW4gPSAoZ2xvYmFsVGhpcyBhcyB7IEJ1bj86IEJ1bkxpa2UgfSkuQnVuO1xuXG4vKipcbiAqIE5vZGUgYHByb2Nlc3Muc3RkZXJyYCB3aGVuIHdyaXRhYmxlLCBlbHNlIGB1bmRlZmluZWRgIChzdGFibGUgZm9yIHRoZVxuICogcHJvY2VzcykuIFR5cGVkIGxvb3NlbHkgKGBhbnlgKSBiZWNhdXNlIGl0IGlzIGhhbmRlZCB0byB0aGUgY29uc29sZSBzaW5rJ3NcbiAqIGAud3JpdGVgLCB3aGljaCBvdXIgc3RydWN0dXJhbCB7QGxpbmsgUHJvY2Vzc0xpa2V9IHNoYXBlIGRvZXMgbm90IHNhdGlzZnlcbiAqIG5vbWluYWxseS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGdsb2JhbFByb2Nlc3NTdGRFcnI6IGFueSA9XG4gIGdsb2JhbFByb2Nlc3MgJiYgdHlwZW9mIGdsb2JhbFByb2Nlc3Muc3RkZXJyPy53cml0ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyBnbG9iYWxQcm9jZXNzLnN0ZGVyclxuICAgIDogdW5kZWZpbmVkO1xuXG5jb25zdCBMT0dfTEVWRUxTID0gW1wiZGVidWdcIiwgXCJpbmZvXCIsIFwid2FyblwiLCBcImVycm9yXCJdIGFzIGNvbnN0O1xuY29uc3QgTE9HX0xFVkVMX1JBTksgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIExPR19MRVZFTFMubWFwKChsZXZlbCwgaW5kZXgpID0+IFtsZXZlbCwgaW5kZXhdKSxcbikgYXMgUmVjb3JkPExvZ0xldmVsLCBudW1iZXI+O1xuY29uc3QgTE9HX0xFVkVMX0NPTE9SUyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgTE9HX0xFVkVMUy5tYXAoKGxldmVsKSA9PiB7XG4gICAgbGV0IGNvbG9yID0gXCJcXHgxYls5MG1cIjsgLy8gZ3JheVxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgXCJpbmZvXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszNG1cIjsgLy8gYmx1ZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ3YXJuXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszM21cIjsgLy8geWVsbG93XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszMW1cIjsgLy8gcmVkXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gW2xldmVsLCBjb2xvcl07XG4gIH0pLFxuKSBhcyBSZWNvcmQ8TG9nTGV2ZWwsIHN0cmluZz47XG5jb25zdCBMT0dfTEVWRUxfQ09MT1JfUkVTRVQgPSBcIlxceDFiWzBtXCI7XG5jb25zdCBERUZBVUxUX0xFVkVMOiBMb2dMZXZlbCA9IFwiaW5mb1wiO1xuXG4vKipcbiAqIFN1cHBvcnRlZCBzZXZlcml0aWVzLCBsb3dlc3QgdG8gaGlnaGVzdDogYGRlYnVnYCwgYGluZm9gLCBgd2FybmAsIGBlcnJvcmAuXG4gKiBBIGNhbGwgYmVsb3cgdGhlIGFjdGl2ZSB0aHJlc2hvbGQgaXMgZGlzY2FyZGVkIGJlZm9yZSBhbnkgc3RyaW5nIHdvcmsgb3JcbiAqIHNpbmsgSS9PLlxuICpcbiAqIFRoZSB0aHJlc2hvbGQgY29tZXMgZnJvbSBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCBvbiBldmVyeSBjYWxsXG4gKiAoY2FzZS1pbnNlbnNpdGl2ZSwgZGVmYXVsdCBgaW5mb2Agd2hlbiB1bnNldCwgZW1wdHksIG9yIHVua25vd24pIHNvIHRlc3RcbiAqIHJ1bm5lcnMgYW5kIGVtYmVkZGVycyBjYW4gY2hhbmdlIHZlcmJvc2l0eSBhZnRlciBpbXBvcnQgd2l0aG91dCByZXN0YXJ0aW5nXG4gKiB0aGUgcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAodHlwZW9mIExPR19MRVZFTFMpW251bWJlcl07XG5cbi8qKlxuICogRGVwZW5kZW5jeS1mcmVlIGxldmVsZWQgbG9nZ2VyLiBTdGFuZGFyZCBtZXRob2RzIGhvbm9yIGBMT0dfTEVWRUxgOyBgc3RhcnRgXG4gKiBhbmQgYHN1Y2Nlc3NgIGFyZSBpbmZvcm1hdGlvbmFsIGFsaWFzZXMgd2l0aCBkaXN0aW5jdCBwcmVzZW50YXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIExvZ2dlciA9IHtcbiAgW0sgaW4gTG9nTGV2ZWxdOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG59ICYge1xuICAvKiogU3VjY2VzcyBtZXNzYWdlIGVtaXR0ZWQgYXQgYGluZm9gIGxldmVsLiAqL1xuICBzdWNjZXNzOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG4gIC8qKiBTdGFydCAvIGluLXByb2dyZXNzIG1lc3NhZ2UgZW1pdHRlZCBhdCBgaW5mb2AgbGV2ZWwuICovXG4gIHN0YXJ0OiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG59O1xuXG4vKiogYChuYW1lPykgPT4gTG9nZ2VyYCBzaW5rIGNvbnN0cnVjdG9yIHJldHVybmVkIGJ5IHRoZSBpbml0LXRpbWUgZmFjdG9yeSBjaGFpbi4gKi9cbnR5cGUgTG9nZ2VyRmFjdG9yeSA9IChuYW1lPzogc3RyaW5nKSA9PiBMb2dnZXI7XG5cbi8qKlxuICogQ29uc29sZSB7QGxpbmsgTG9nZ2VyRmFjdG9yeX07IGFsd2F5cyBzdWNjZWVkcy5cbiAqXG4gKiBXaGVuIGBwcm9jZXNzLnN0ZGVycmAgaXMgYXZhaWxhYmxlLCBmb3JtYXRzIGVhY2ggbGluZSBhbmQgd3JpdGVzIG9ubHkgdG9cbiAqIHN0ZGVyci4gQnVuIGBpbnNwZWN0YCBmb3JtYXRzIGVhY2ggYXJndW1lbnQgd2hlbiBlbmFibGVkOyBvdGhlcndpc2VcbiAqIGB1dGlsLmluc3BlY3RgIHdoZW4gYG5vZGU6dXRpbGAgbG9hZHMsIG9yIGEgYEpTT04uc3RyaW5naWZ5YCBmYWxsYmFjayB3aGVuXG4gKiBpdCBkb2VzIG5vdC4gV2hlbiBzdGRlcnIgaXMgdW5hdmFpbGFibGUgKGV2ZXJ5IGJyb3dzZXIpLCBiaW5kc1xuICoge0BsaW5rIGNyZWF0ZUZvcm1hdHRlcn0gcHJlZml4ZXMgaW50byBnbG9iYWwgYGNvbnNvbGUuKmAgY2FsbHMgYW5kIHNraXBzIHRoZVxuICogYG5vZGU6dXRpbGAgaW1wb3J0IGVudGlyZWx5LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyOiBhbnkpOiBQcm9taXNlPExvZ2dlckZhY3Rvcnk+IHtcbiAgLy8gSW5kaXJlY3Qgc3BlY2lmaWVyIHNvIHRoaXMgYnJvd3Nlci1zYWZlIG1vZHVsZSBkb2Vzbid0IHN0YXRpY2FsbHkgcHVsbCBpblxuICAvLyBub2RlIHR5cGVzOiBgbm9kZTp1dGlsYCBpcyBvcHRpb25hbCAodGhlIEpTT04gZmFsbGJhY2sgY292ZXJzIGl0cyBhYnNlbmNlKS5cbiAgY29uc3Qgbm9kZVV0aWwgPSBcIm5vZGU6dXRpbFwiO1xuICAvLyBHYXRlZCwgbm90IGp1c3QgY2F1Z2h0OiB0aGUgaW5kaXJlY3Qgc3BlY2lmaWVyIGRlZmVhdHMgYnVuZGxlciBhbmFseXNpcyBieVxuICAvLyBkZXNpZ24sIHNvIGEgY2xpZW50IGJ1aWxkIGVtaXRzIGEgbGl0ZXJhbCBgaW1wb3J0KFwibm9kZTp1dGlsXCIpYCB0aGF0IG5vXG4gIC8vIGJyb3dzZXIgY2FuIHJlc29sdmUsIGFuZCB0aGUgY2F1Z2h0IHJlamVjdGlvbiBzdGlsbCBzdXJmYWNlZCBhcyBhIGNvbnNvbGVcbiAgLy8gZXJyb3IuIGB1dGlsc2Agb25seSBmZWVkcyB0aGUgc3RkZXJyIGJyYW5jaCBvZiB0aGUgZW1pdHRlciBiZWxvdywgc28gbm9cbiAgLy8gc3RkZXJyIG1lYW5zIHRoZSBpbXBvcnQgaGFzIG5vdGhpbmcgdG8gc2VydmUgYW5kIGlzIHNraXBwZWQgb3V0cmlnaHQuXG4gIGNvbnN0IHV0aWxzOiB7IGluc3BlY3Q/OiBhbnkgfSB8IHVuZGVmaW5lZCA9XG4gICAgZ2xvYmFsUHJvY2Vzc1N0ZEVyciA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBhd2FpdCBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIG5vZGVVdGlsKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICByZXR1cm4gY29uc29sZUxvZ2dlckZhY3RvcnkoZ2xvYmFsUHJvY2Vzc1N0ZEVyciwgdXRpbHMpO1xufVxuXG4vKipcbiAqIFRoZSBzeW5jaHJvbm91cyBjb3JlIG9mIHtAbGluayBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeX0sIHNwbGl0IG91dCBzbyB0aGVcbiAqIHNhbWUgZW1pdHRlciBhbHNvIHNlcnZlcyBhcyB0aGUgYm9vdHN0cmFwIHNpbmsgYmVmb3JlIGFueSBhc3luYyBmYWN0b3J5IGhhc1xuICogcmVzb2x2ZWQuIGB1dGlsc2AgaXMgYG5vZGU6dXRpbGAgd2hlbiBpdCBsb2FkZWQ7IHdpdGhvdXQgaXQsIG9iamVjdCBhcmd1bWVudHNcbiAqIGZvcm1hdCB0aHJvdWdoIHRoZSBgSlNPTi5zdHJpbmdpZnlgIGZhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBjb25zb2xlTG9nZ2VyRmFjdG9yeShcbiAgZ2xvYmFsUHJvY2Vzc1N0ZEVycjogYW55LFxuICB1dGlscz86IHsgaW5zcGVjdD86IGFueSB9IHwgdW5kZWZpbmVkLFxuKTogTG9nZ2VyRmFjdG9yeSB7XG4gIGNvbnN0IGJ1bkluc3BlY3QgPVxuICAgIGdsb2JhbEJ1biAhPT0gdW5kZWZpbmVkICYmICF0b0Jvb2xlYW4oZ2xvYmFsQnVuLmVudj8uTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEKVxuICAgICAgPyBnbG9iYWxCdW4uaW5zcGVjdFxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc2V0Q29sb3JzUHJlZml4ID0gYnVuSW5zcGVjdCAhPT0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGluc3BlY3QgPSAoYXJnOiBhbnksIGNvbG9ycz86IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpIHx8ICh0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmIGFyZyAhPT0gbnVsbCkpIHtcbiAgICAgIGlmIChidW5JbnNwZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGJ1bkluc3BlY3QoYXJnLCB7XG4gICAgICAgICAgY29sb3JzOiBjb2xvcnMsXG4gICAgICAgICAgZGVwdGg6IHV0aWxzPy5pbnNwZWN0Py5kZWZhdWx0T3B0aW9ucz8uZGVwdGggPz8gdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodXRpbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdXRpbHMuaW5zcGVjdChhcmcsIHtcbiAgICAgICAgICAuLi51dGlscz8uaW5zcGVjdD8uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgY29sb3JzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZywgKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuICAgICAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGFyZyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZhY3RvcnkgPSAobmFtZT86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHByZWZpeEZvcm1hdHRlciA9IGNyZWF0ZUZvcm1hdHRlcihuYW1lLCBnbG9iYWxQcm9jZXNzU3RkRXJyLCByZXNldENvbG9yc1ByZWZpeCk7XG4gICAgY29uc3QgbG9nZ2VyID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgTE9HX0xFVkVMUy5tYXAoKGxldmVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcHJlZml4LCBjb2xvcnMsIHJlc2V0Q29sb3JzIH0gPSBwcmVmaXhGb3JtYXR0ZXIobGV2ZWwpO1xuICAgICAgICBjb25zdCBlbWl0dGVyID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgaWYgKCFzaG91bGRFbWl0KGxldmVsLCB0cnVlKSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChnbG9iYWxQcm9jZXNzU3RkRXJyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IHByZWZpeCA/IFtwcmVmaXhdIDogW107XG4gICAgICAgICAgICBtZXNzYWdlUGFydHMucHVzaCguLi5hcmdzLm1hcCgoYXJnKSA9PiBpbnNwZWN0KGFyZywgY29sb3JzKSkpO1xuICAgICAgICAgICAgaWYgKHJlc2V0Q29sb3JzKSBtZXNzYWdlUGFydHMucHVzaChMT0dfTEVWRUxfQ09MT1JfUkVTRVQpO1xuICAgICAgICAgICAgZ2xvYmFsUHJvY2Vzc1N0ZEVyci53cml0ZShtZXNzYWdlUGFydHMuam9pbihcIiBcIikgKyBcIlxcblwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxldmVsRm4gPSBjb25zb2xlW2xldmVsXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWxGbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgIGxldmVsRm4gPSBjb25zb2xlLmxvZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmVmaXgpIGxldmVsRm4gPSBsZXZlbEZuLmJpbmQoY29uc29sZSwgcHJlZml4KTtcbiAgICAgICAgICAgIGxldmVsRm4oLi4uYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gW2xldmVsLCBlbWl0dGVyXTtcbiAgICAgIH0pLFxuICAgICkgYXMgTG9nZ2VyO1xuICAgIC8vIENvbnZlbmllbmNlIGxldmVscyBzaGFyZSB0aGUgaW5mbyBzaW5rLlxuICAgIGxvZ2dlci5zdWNjZXNzID0gbG9nZ2VyLmluZm87XG4gICAgbG9nZ2VyLnN0YXJ0ID0gbG9nZ2VyLmluZm87XG4gICAgcmV0dXJuIGxvZ2dlcjtcbiAgfTtcbiAgY29uc3QgZGVmYXVsdEZhY3RvcnkgPSBtZW1vaXplKGZhY3RvcnkpO1xuICByZXR1cm4gKG5hbWU/OiBzdHJpbmcpID0+IChuYW1lID8gZmFjdG9yeShuYW1lKSA6IGRlZmF1bHRGYWN0b3J5KCkpO1xufVxuXG4vKipcbiAqIEZ1bGwgY29uc29sZSBzaW5rIHdpdGggb3B0aW9uYWwgYG5vZGU6dXRpbGAgaW5zcGVjdGlvbi4gTWVtb2l6ZWQgc29cbiAqIGNvbmN1cnJlbnQgYW5kIHJlcGVhdCBjYWxsZXJzIHNoYXJlIG9uZSBpbi1mbGlnaHQgcHJvbWlzZSBhbmQgc2V0dGxlZCByZXN1bHQuXG4gKi9cbmNvbnN0IHJlc29sdmVGYWN0b3J5ID0gbWVtb2l6ZShhc3luYyAoKTogUHJvbWlzZTxMb2dnZXJGYWN0b3J5PiA9PiB7XG4gIHJldHVybiBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyKTtcbn0pO1xuXG4vKipcbiAqIEFjdGl2ZSBmYWN0b3J5IHN0YXJ0cyBhcyBhIHN5bmMgY29uc29sZSBzaW5rIChubyBgYXdhaXRgLCBzbyB0aGlzIG1vZHVsZVxuICogZmluaXNoZXMgZXZhbHVhdGluZyBpbW1lZGlhdGVseSkgYW5kIHN3YXBzIHRvIHtAbGluayByZXNvbHZlRmFjdG9yeX0nc1xuICogcmVzdWx0IHdoZW4gc2VydmVyLXNpZGUgYXJndW1lbnQgaW5zcGVjdGlvbiBpcyByZWFkeS5cbiAqL1xubGV0IGFjdGl2ZUZhY3Rvcnk6IExvZ2dlckZhY3RvcnkgPSBjb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyKTtcbnZvaWQgcmVzb2x2ZUZhY3RvcnkoKS50aGVuKFxuICAoZmFjdG9yeSkgPT4ge1xuICAgIGFjdGl2ZUZhY3RvcnkgPSBmYWN0b3J5O1xuICB9LFxuICAoKSA9PiB7XG4gICAgLy8gS2VlcCB0aGUgc3luYyBjb25zb2xlIHNpbms7IG5ldmVyIGxlYXZlIGltcG9ydGVycyB3aXRob3V0IGEgZmFjdG9yeS5cbiAgfSxcbik7XG5cbi8qKlxuICogQnVpbGQgYSBsb2dnZXIgdGhhdCByZWJpbmRzIHdoZW4ge0BsaW5rIGFjdGl2ZUZhY3Rvcnl9IHVwZ3JhZGVzLiBDYWxsZXJzIHRoYXRcbiAqIGNhcHR1cmUgYGNvbnN0IGxvZyA9IGxvZ2dlcihcInhcIilgIGF0IG1vZHVsZSBzY29wZSBzdGlsbCBnZXQgdGhlIHVwZ3JhZGVkXG4gKiBmb3JtYXR0ZXIgb25jZSBpdCBhcnJpdmVzLCB3aXRob3V0IGV2ZXJ5IGNhbGwgc2l0ZSB3YWl0aW5nIG9uIGEgcHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTG9nZ2VyKG5hbWU/OiBzdHJpbmcpOiBMb2dnZXIge1xuICBsZXQgYm91bmQ6IHsgZmFjdG9yeTogTG9nZ2VyRmFjdG9yeTsgbG9nZ2VyOiBMb2dnZXIgfSB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2luayA9ICgpOiBMb2dnZXIgPT4ge1xuICAgIGlmIChib3VuZD8uZmFjdG9yeSAhPT0gYWN0aXZlRmFjdG9yeSkge1xuICAgICAgYm91bmQgPSB7IGZhY3Rvcnk6IGFjdGl2ZUZhY3RvcnksIGxvZ2dlcjogYWN0aXZlRmFjdG9yeShuYW1lKSB9O1xuICAgIH1cbiAgICByZXR1cm4gYm91bmQubG9nZ2VyO1xuICB9O1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5MT0dfTEVWRUxTLCBcInN1Y2Nlc3NcIiwgXCJzdGFydFwiXS5tYXAoKGxldmVsKSA9PiBbXG4gICAgICBsZXZlbCxcbiAgICAgICguLi5hcmdzOiBhbnlbXSkgPT4gc2luaygpW2xldmVsIGFzIGtleW9mIExvZ2dlcl0oLi4uYXJncyksXG4gICAgXSksXG4gICkgYXMgTG9nZ2VyO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgbGluZSBwcmVmaXggb2YgYExFVkVMIFtuYW1lXWAgb24gTm9kZS9CdW4gaG9zdHMsIG9yIGBbbmFtZV1gIGFsb25lXG4gKiBpbiBicm93c2VycyAoZWl0aGVyIHBhcnQgb21pdHRlZCB3aGVuIGFic2VudCkuIEFwcGxpZXMgcGVyLWxldmVsIEFOU0kgY29sb3JcbiAqIHdoZW4gYHN0cmVhbVN1cHBvcnRzQ29sb3JgIGlzIHRydWUgZm9yIHRoZSBnaXZlbiBzdGRlcnIgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGb3JtYXR0ZXIoXG4gIG5hbWU6IGFueSxcbiAgc3RyZWFtOiBhbnksXG4gIHJlc2V0Q29sb3JzUHJlZml4PzogYm9vbGVhbixcbik6IChsZXZlbD86IExvZ0xldmVsKSA9PiB7IHByZWZpeDogc3RyaW5nOyBjb2xvcnM6IGJvb2xlYW47IHJlc2V0Q29sb3JzOiBib29sZWFuIH0ge1xuICBjb25zdCBnbG9iID0gZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHVua25vd247IGRvY3VtZW50PzogdW5rbm93biB9O1xuICBjb25zdCBpc0Jyb3dzZXIgPSBnbG9iLndpbmRvdyAhPT0gdW5kZWZpbmVkICYmIGdsb2IuZG9jdW1lbnQgIT09IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3VwcG9ydHNDb2xvciA9ICFpc0Jyb3dzZXIgPyBzdHJlYW1TdXBwb3J0c0NvbG9yKHN0cmVhbSkgOiBmYWxzZTtcbiAgY29uc3QgbmFtZVByZWZpeCA9IG5hbWUgPyBcIltcIiArIG5hbWUgKyBcIl1cIiA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIChsZXZlbD86IExvZ0xldmVsKSA9PiB7XG4gICAgY29uc3QgY29sb3IgPSBzdXBwb3J0c0NvbG9yICYmIGxldmVsICE9PSB1bmRlZmluZWQgPyBMT0dfTEVWRUxfQ09MT1JTW2xldmVsXSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJlZml4ID0gWyFpc0Jyb3dzZXIgJiYgbGV2ZWwgPyBsZXZlbC50b1VwcGVyQ2FzZSgpIDogdW5kZWZpbmVkLCBuYW1lUHJlZml4XVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIGxldCByZXNldENvbG9ycyA9IGZhbHNlO1xuICAgIGlmIChjb2xvcikge1xuICAgICAgY29uc3QgYXBwbHlSZXNldENvbG9yc1ByZWZpeCA9IHJlc2V0Q29sb3JzUHJlZml4IHx8IFwiaW5mb1wiID09PSBsZXZlbDtcbiAgICAgIGlmICghYXBwbHlSZXNldENvbG9yc1ByZWZpeCkgcmVzZXRDb2xvcnMgPSB0cnVlO1xuICAgICAgcHJlZml4ID0gYXBwbHlSZXNldENvbG9yc1ByZWZpeCA/IGNvbG9yICsgcHJlZml4ICsgTE9HX0xFVkVMX0NPTE9SX1JFU0VUIDogY29sb3IgKyBwcmVmaXg7XG4gICAgfVxuICAgIHJldHVybiB7IHByZWZpeCwgY29sb3JzOiBjb2xvciA/IHRydWUgOiBmYWxzZSwgcmVzZXRDb2xvcnMgfTtcbiAgfTtcbn1cblxuLyoqIFRydWUgd2hlbiBgc3RyZWFtYCBpcyBhIFRUWSBhbmQgdGhlIHRlcm1pbmFsIGlzIG5vdCBgZHVtYmAuICovXG5mdW5jdGlvbiBzdHJlYW1TdXBwb3J0c0NvbG9yKHN0cmVhbT86IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGdsb2JhbFByb2Nlc3MgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygc3RyZWFtICE9PSBcIm9iamVjdFwiIHx8IHN0cmVhbSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB7IGlzVFRZIH0gPSBzdHJlYW0gYXMgeyBpc1RUWT86IHVua25vd24gfTtcbiAgaWYgKGlzVFRZICE9PSB0cnVlKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRlcm0gPSBnbG9iYWxQcm9jZXNzLmVudj8uVEVSTT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKFwiZHVtYlwiID09IHRlcm0pIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBQYXJzZSBhIHJhdyB2YWx1ZSBhcyB7QGxpbmsgTG9nTGV2ZWx9ICh0cmltbWVkLCBjYXNlLWluc2Vuc2l0aXZlKS4gKi9cbmZ1bmN0aW9uIHBhcnNlTG9nTGV2ZWwocmF3OiB1bmtub3duKTogTG9nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgdGV4dCA9IHR5cGVvZiByYXcgPT09IFwic3RyaW5nXCIgPyByYXcgOiBTdHJpbmcocmF3KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICBpZiAoaSA+IDApIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0ZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHRleHQgPT09IG5vcm1hbGl6ZWQpIGJyZWFrO1xuICAgICAgdGV4dCA9IG5vcm1hbGl6ZWQ7XG4gICAgfVxuICAgIGlmICghdGV4dCkge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh0ZXh0IGluIExPR19MRVZFTF9SQU5LKSB7XG4gICAgICByZXR1cm4gdGV4dCBhcyBMb2dMZXZlbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIEFjdGl2ZSB0aHJlc2hvbGQgZnJvbSBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCwgZGVmYXVsdCB7QGxpbmsgREVGQVVMVF9MRVZFTH0uICovXG5mdW5jdGlvbiBhY3RpdmVMZXZlbCgpOiBMb2dMZXZlbCB7XG4gIHJldHVybiBwYXJzZUxvZ0xldmVsKGdsb2JhbFByb2Nlc3M/LmVudj8uTE9HX0xFVkVMKSA/PyBERUZBVUxUX0xFVkVMO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYHJhd2AgbWVldHMgdGhlIGN1cnJlbnQgYExPR19MRVZFTGAgdGhyZXNob2xkLlxuICpcbiAqIFBhcnNlcyBgcmF3YCBhcyBhIHtAbGluayBMb2dMZXZlbH07IHdoZW4gcGFyc2luZyBmYWlscywgcmV0dXJuc1xuICogYGRlZmF1bHRSZXN1bHRgIGlmIHN1cHBsaWVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkRW1pdChyYXc6IHVua25vd24sIGRlZmF1bHRSZXN1bHQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxldmVsID0gcGFyc2VMb2dMZXZlbChyYXcpO1xuICBpZiAobGV2ZWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRSZXN1bHQgPz8gZmFsc2U7XG4gIHJldHVybiBMT0dfTEVWRUxfUkFOS1tsZXZlbF0gPj0gTE9HX0xFVkVMX1JBTktbYWN0aXZlTGV2ZWwoKV07XG59XG5cbi8qKlxuICogV2hldGhlciBhIGNhbGwgYXQgYGxldmVsYCB3b3VsZCBiZSBlbWl0dGVkIGF0IHRoZSBjdXJyZW50XG4gKiBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCB0aHJlc2hvbGQuIFVzZSBiZWZvcmUgYnVpbGRpbmcgZXhwZW5zaXZlIGRlYnVnXG4gKiBwYXlsb2Fkcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaWYgKGlzTGV2ZWxFbmFibGVkKFwiZGVidWdcIikpIHtcbiAqICAgbG9nLmRlYnVnKFwibW91bnRzOnJlc29sdmVyXCIsIHsgY29udHJpYnV0aW9uOiBhd2FpdCBoZWF2eVNuYXBzaG90KCkgfSk7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xldmVsRW5hYmxlZChsZXZlbDogTG9nTGV2ZWwpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNob3VsZEVtaXQobGV2ZWwpO1xufVxuXG5jb25zdCBMT0dHRVJfTkFNRV9SRUdFWCA9IC9eKD86W2Etel1bYS16MC05Ky4tXSo6XFwvXFwvKT8uKlxcLyhbXi8uXSspKD86XFwuW14vXSspPyQvaTtcblxuLyoqXG4gKiBEZXJpdmUgdGhlIHRhZyBzdHJpbmcgZnJvbSBhIGxvZ2dlciBuYW1lLCBwbHVnaW4sIG9yIHBhdGguIFNsYXNoLSBhbmRcbiAqIFVSTC1zaGFwZWQgc3RyaW5ncyB1c2UgdGhlIGxhc3QgcGF0aCBzZWdtZW50IChleHRlbnNpb24gc3RyaXBwZWQpOyBwbGFpblxuICogc3RyaW5ncyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLiBFbXB0eSBvciBtaXNzaW5nIG5hbWVzIC0+IGB1bmRlZmluZWRgXG4gKiAodW50YWdnZWQgc2luaykuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RMb2dnZXJOYW1lKGxvZ2dlck5hbWU6IE5hbWVMaWtlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFsb2dnZXJOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGxvZ2dlck5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtYXRjaCA9IGxvZ2dlck5hbWUubWF0Y2goTE9HR0VSX05BTUVfUkVHRVgpO1xuICAgIHJldHVybiBtYXRjaD8uWzFdID8/IGxvZ2dlck5hbWU7XG4gIH1cbiAgcmV0dXJuIGV4dHJhY3RMb2dnZXJOYW1lKGxvZ2dlck5hbWUubmFtZSk7XG59XG5cbi8qKlxuICogQnVpbGQgYSB0YWdnZWQgbG9nZ2VyIGZvciBhIHBsdWdpbiBvciBtb2R1bGUuXG4gKlxuICogVGhlIHRhZyBpcyBgW25hbWVdYCB3aGVuIGBsb2dnZXJOYW1lYCBpcyBhIG5vbi1lbXB0eSBzdHJpbmcsIGFcbiAqIHtAbGluayBOYW1lTGlrZX0gd2l0aCBgbmFtZWAsIG9yIGEgZmlsZSAvIFVSTCBwYXRoICh0aGUgYmFzZW5hbWUgd2l0aG91dFxuICogZXh0ZW5zaW9uIGlzIHVzZWQpLiBUaGUgY29uc29sZSBzaW5rIHByZXBlbmRzIGBMRVZFTCBbbmFtZV1gIG9uIE5vZGUvQnVuXG4gKiBob3N0cyBvciBgW25hbWVdYCBhbG9uZSBpbiBicm93c2VycyB2aWEge0BsaW5rIGNyZWF0ZUZvcm1hdHRlcn0uXG4gKlxuICogQ2FsbHMgYmVsb3cgYHByb2Nlc3MuZW52LkxPR19MRVZFTGAgYXJlIGRyb3BwZWQgYnkge0BsaW5rIHNob3VsZEVtaXR9IGJlZm9yZVxuICogdGhlIHNpbmsgZm9ybWF0cyBvciB3cml0ZXMgdGhlIGxpbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG4gKlxuICogY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImdlbmllL2NoYXRcIik7XG4gKiBsb2dnZXIuaW5mbyhcInN0YXJ0aW5nXCIpO1xuICogbG9nZ2VyLndhcm4oXCJtaXNzaW5nIG9wdGlvbmFsIGNvbmZpZ1wiLCB7IHJlYXNvbjogXCJubyBlbnYgdmFyXCIgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dnZXIobG9nZ2VyTmFtZTogTmFtZUxpa2UgfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBMb2dnZXIge1xuICBjb25zdCBuYW1lID0gZXh0cmFjdExvZ2dlck5hbWUobG9nZ2VyTmFtZSk7XG4gIHJldHVybiBjcmVhdGVMb2dnZXIobmFtZSk7XG59XG4iXX0=
package/lib/src/net.d.ts CHANGED
@@ -10,6 +10,8 @@
10
10
  * home for anything URL-, IP-, or email-shaped that also has to run in
11
11
  * a Vite / Webpack / esbuild client bundle. Node-only network helpers
12
12
  * (e.g. DNS resolution) belong in a node-tagged package, not here.
13
+ * Reuse this module for URL, IP/CIDR, and email parsing instead of introducing
14
+ * package-local normalizers with subtly different rules.
13
15
  *
14
16
  * @module
15
17
  */
package/lib/src/net.js CHANGED
@@ -10,6 +10,8 @@
10
10
  * home for anything URL-, IP-, or email-shaped that also has to run in
11
11
  * a Vite / Webpack / esbuild client bundle. Node-only network helpers
12
12
  * (e.g. DNS resolution) belong in a node-tagged package, not here.
13
+ * Reuse this module for URL, IP/CIDR, and email parsing instead of introducing
14
+ * package-local normalizers with subtly different rules.
13
15
  *
14
16
  * @module
15
17
  */
@@ -462,4 +464,4 @@ function hextetsToValue(hextets) {
462
464
  value = (value << 16n) | BigInt(hextet);
463
465
  return value;
464
466
  }
465
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25ldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUlILE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbkQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7QUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxpQ0FBaUMsQ0FBQztBQUM1RCxNQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQztBQUMzQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUVuQywrREFBK0Q7QUFDL0QsTUFBTSxPQUFPLEdBQXdDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkUsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDO0FBQy9CLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDO0FBRXpDLG9FQUFvRTtBQUNwRSxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQUN2QyxvRUFBb0U7QUFDcEUsTUFBTSxhQUFhLEdBQUcsNEJBQTRCLENBQUM7QUFvRG5EOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWUsU0FBUSxHQUFHO0lBQzlCLFlBQVksR0FBUTtRQUNsQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUEyQixHQUFNLEVBQUUsS0FBd0I7UUFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMzQixPQUFPLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLEdBQUcsWUFBbUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxHQUFHLFlBQW1DO1FBQ3BELE1BQU0sYUFBYSxHQUFhLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRixNQUFNLFFBQVEsR0FBRyxhQUFhO2FBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNoRCxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxXQUFXLENBQUMsSUFBWTtRQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksUUFBUSxJQUFJLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUM3QyxJQUFJLFFBQVEsSUFBSSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbEMsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUE4QkQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFlO0lBQ3hDLElBQUksS0FBSyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ2xFLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxTQUFTLEdBQUcsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUMvRCxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQixDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUNsRCxLQUFLLEdBQUcsR0FBRyxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM3QyxNQUFNLFlBQVksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUMsS0FBSyxHQUFHLEdBQUcsWUFBWSxHQUFHLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxHQUFHLEdBQUcsa0JBQWtCLE1BQU0sS0FBSyxFQUFFLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0MsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWMsRUFBRSxJQUFZO0lBQ3BELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxVQUFVO0lBQ2pCLG1FQUFtRTtJQUNuRSxpRUFBaUU7SUFDakUsTUFBTSxNQUFNLEdBQUksVUFBOEQsQ0FBQyxNQUFNLEVBQUUsUUFBUTtRQUM3RixFQUFFLE1BQU0sQ0FBQztJQUNYLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNoQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYTtJQUM3QixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFBQyxNQUFNLENBQUMsQ0FBQSxDQUFDO0lBQ1osQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQWlCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsS0FBb0QsRUFDcEQsVUFBOEIsRUFBRTtJQUVoQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyRCxNQUFNLEVBQUUsU0FBUyxHQUFHLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ3JELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFlLENBQUMsQ0FBQztJQUNqRSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQztJQUN6QixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzVCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLFNBQVM7UUFDeEMsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUN0RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE9BQU87Z0JBQUUsU0FBUztZQUN2QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQzVELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO29CQUFFLFNBQVM7Z0JBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQztZQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFhO0lBQ25DLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsbUVBQW1FO0FBQ25FLCtCQUErQjtBQUMvQixtRUFBbUU7QUFFbkU7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFhO0lBQ25DLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2Qix3RUFBd0U7UUFDeEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksSUFBSSxDQUFDO1lBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixPQUFPLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsT0FBTyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDOUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekMsSUFBSSxDQUFDLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNyQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxJQUFJLE1BQU0sR0FBRyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDL0IsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELE9BQU87UUFDTCxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU87UUFDbkIsSUFBSTtRQUNKLE1BQU07UUFDTixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLEVBQUU7S0FDMUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxFQUFxQixFQUFFLElBQW1CO0lBQ2pFLE1BQU0sUUFBUSxHQUFHLE9BQU8sRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDM0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxVQUFVLENBQUMsSUFBSSxDQUFDO0FBQ3JELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxFQUFxQixFQUNyQixLQUFrQjtJQUVsQixNQUFNLFFBQVEsR0FBRyxPQUFPLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzNELElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0IsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLE9BQU87WUFBRSxTQUFTO1FBQ2hELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3pELENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBYztJQUMzQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDO0lBQ3pDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEIsSUFBSSxJQUFJLEtBQUssV0FBVztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3RDLG9FQUFvRTtJQUNwRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4QyxPQUFPLFFBQVEsQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFZLEVBQUUsTUFBYztJQUMvQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsU0FBUyxTQUFTLENBQUMsS0FBYTtJQUM5QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2YsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxLQUFLLEdBQUcsR0FBRztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzdCLEtBQUssR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBYTtJQUM5QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFbkMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDO0lBQ3RDLElBQUksSUFBSSxLQUFLLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUUvQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksSUFBSSxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvQix1REFBdUQ7UUFDdkQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM5QyxJQUFJLE9BQU8sR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDN0IsT0FBTyxjQUFjLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ25DLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxJQUFJLElBQUksS0FBSyxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDekIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsa0RBQWtEO1lBQ2xELElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUN6QyxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsSUFBSSxFQUFFLEtBQUssSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLFNBQVMsY0FBYyxDQUFDLE9BQWlCO0lBQ3ZDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2YsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPO1FBQUUsS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBuZXR3b3JraW5nIGhlbHBlcnMgYnVpbHQgYXJvdW5kIHtAbGluayB1cmxCdWlsZGVyfTogYVxuICogdG9sZXJhbnQgYFVSTGAgY29lcmNpb24gKyBjaGFpbmFibGUgYnVpbGRlciB0aGF0IGdyYWNlZnVsbHkgaGFuZGxlc1xuICogcGFydGlhbCBpbnB1dHMgKGJhcmUgaG9zdHMsIHBhdGgtb25seSBzdHJpbmdzLCBgeyB1cmwgfWAgd3JhcHBlcnMpLFxuICogYSBzbWFsbCBJUHY0IC8gSVB2NiBhZGRyZXNzICsgQ0lEUiB0b29sa2l0IChwYXJzaW5nIGFuZCBtZW1iZXJzaGlwXG4gKiBsb29rdXBzKSwgYW5kIGVtYWlsLWFkZHJlc3MgcGFyc2luZyAoe0BsaW5rIHBhcnNlRW1haWxzfSAvXG4gKiB7QGxpbmsgaXNFbWFpbH0pIHRoYXQgbm9ybWFsaXplcyB0aGUgQ1NWIC8gc2luZ2xlLXN0cmluZyAvIGFycmF5XG4gKiBpbnB1dHMgZW1haWwgcmVjaXBpZW50IGFuZCBhbGxvdy1saXN0IGZpZWxkcyBhY2NlcHQgaW50byBhIGNsZWFuXG4gKiBgc3RyaW5nW11gLiBObyBub2RlLW9ubHkgaW1wb3J0cywgc28gdGhpcyBtb2R1bGUgaXMgdGhlIGNhbm9uaWNhbFxuICogaG9tZSBmb3IgYW55dGhpbmcgVVJMLSwgSVAtLCBvciBlbWFpbC1zaGFwZWQgdGhhdCBhbHNvIGhhcyB0byBydW4gaW5cbiAqIGEgVml0ZSAvIFdlYnBhY2sgLyBlc2J1aWxkIGNsaWVudCBidW5kbGUuIE5vZGUtb25seSBuZXR3b3JrIGhlbHBlcnNcbiAqIChlLmcuIEROUyByZXNvbHV0aW9uKSBiZWxvbmcgaW4gYSBub2RlLXRhZ2dlZCBwYWNrYWdlLCBub3QgaGVyZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBOb25GdW5jdGlvbktleXMgfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcblxuY29uc3QgTE9DQUxfSE9TVF9VUkwgPSBuZXcgVVJMKFwiaHR0cDovL2xvY2FsaG9zdFwiKTtcbmNvbnN0IFVSTF9TQ0hFTUVfREVGQVVMVCA9IFwiaHR0cHNcIjtcbmNvbnN0IFVSTF9TQ0hFTUVfUFJFRklYID0gL14oW0EtWmEtel1bQS1aYS16MC05Ky4tXSo6XFwvXFwvKS87XG5jb25zdCBVUkxfUEFUSF9TRUdNRU5UX1RSSU0gPSAvXlxcLyt8XFwvKyQvZztcbmNvbnN0IFVSTF9TQ0hFTUVfU0VQQVJBVE9SID0gXCI6Ly9cIjtcblxuLyoqIFRvdGFsIGJpdCB3aWR0aCBvZiBhbiBhZGRyZXNzIG9mIGVhY2gge0BsaW5rIElwVmVyc2lvbn0uICovXG5jb25zdCBJUF9CSVRTOiBSZWFkb25seTxSZWNvcmQ8SXBWZXJzaW9uLCBudW1iZXI+PiA9IHsgNDogMzIsIDY6IDEyOCB9O1xuY29uc3QgSVBWNF9PQ1RFVCA9IC9eXFxkezEsM30kLztcbmNvbnN0IElQVjZfSEVYVEVUID0gL15bMC05YS1mQS1GXXsxLDR9JC87XG5cbi8qKiBEZWxpbWl0ZXJzIGJldHdlZW4gYWRkcmVzc2VzIGluIGEgZnJlZS10ZXh0IC8gQ1NWIGVtYWlsIGxpc3QuICovXG5jb25zdCBFTUFJTF9MSVNUX1NFUEFSQVRPUiA9IC9bXFxzLDtdKy87XG4vKiogUHJhZ21hdGljIGBsb2NhbEBkb21haW4udGxkYCBzaGFwZSBjaGVjayAobm90IGZ1bGwgUkZDIDUzMjIpLiAqL1xuY29uc3QgRU1BSUxfQUREUkVTUyA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFR5cGVzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBbnl0aGluZyB7QGxpbmsgdXJsQnVpbGRlcn0gKGFuZCB7QGxpbmsgcGF0aE1hdGNofSkga25vdyBob3cgdG8gY29lcmNlXG4gKiBpbnRvIGEgVVJMOlxuICpcbiAqIC0gQSBzdHJpbmc6IGEgaG9zdCwgYSBmdWxsIFVSTCwgb3IgYSBwYXRoIC8gcXVlcnkgLyBoYXNoIGZyYWdtZW50LlxuICogLSBBIFdIQVRXRyBgVVJMYCBpbnN0YW5jZS5cbiAqIC0gQW55IG9iamVjdCB3aXRoIGEgYHVybGAgZmllbGQgKGUuZy4gYSBmZXRjaCBgUmVxdWVzdGAsIGEgRGF0YWJyaWNrc1xuICogICBgV29ya3NwYWNlQ2xpZW50YCBjb25maWcpLlxuICovXG5leHBvcnQgdHlwZSBVcmxMaWtlID0gc3RyaW5nIHwgVVJMIHwgeyB1cmw6IHN0cmluZyB9O1xuXG4vKiogSVAgcHJvdG9jb2wgZmFtaWx5OiBgNGAgZm9yIElQdjQsIGA2YCBmb3IgSVB2Ni4gKi9cbmV4cG9ydCB0eXBlIElwVmVyc2lvbiA9IDQgfCA2O1xuXG4vKipcbiAqIEEgcGFyc2VkIElQIGFkZHJlc3MuIGB2YWx1ZWAgaXMgdGhlIGFkZHJlc3MgYXMgYW4gdW5zaWduZWQgaW50ZWdlclxuICogKGEgMzItYml0IHJhbmdlIGZvciB2NCwgMTI4LWJpdCBmb3IgdjYpIGhlbGQgaW4gYSBgYmlnaW50YCBzbyBib3RoXG4gKiBmYW1pbGllcyBzaGFyZSBvbmUgY29tcGFyaXNvbiAvIG1hc2tpbmcgcGF0aC4gUHJvZHVjZSBvbmUgd2l0aFxuICoge0BsaW5rIHBhcnNlSXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZElwIHtcbiAgdmVyc2lvbjogSXBWZXJzaW9uO1xuICAvKiogVGhlIGFkZHJlc3MgYXMgYW4gdW5zaWduZWQgaW50ZWdlciAoYGJpZ2ludGAgZm9yIHVuaWZvcm0gdjQvdjYgbWF0aCkuICovXG4gIHZhbHVlOiBiaWdpbnQ7XG59XG5cbi8qKlxuICogQSBwYXJzZWQgQ0lEUiBibG9jayAoYDEwLjAuMC4wLzhgLCBgMjAwMTpkYjg6Oi8zMmApLiBgYmFzZWAgaXMgdGhlXG4gKiBuZXR3b3JrIGFkZHJlc3Mgd2l0aCBhbGwgaG9zdCBiaXRzIGNsZWFyZWQsIHNvIG1lbWJlcnNoaXAgaXMgYVxuICogc2luZ2xlIG1hc2tlZCBjb21wYXJlIChzZWUge0BsaW5rIGlwSW5DaWRyfSkuIFByb2R1Y2Ugb25lIHdpdGhcbiAqIHtAbGluayBwYXJzZUNpZHJ9LiBDYXJyaWVzIHRoZSBub3JtYWxpemVkIGBjaWRyYCBzdHJpbmcgZm9yIGxvZ2dpbmdcbiAqIGFuZCB0byBrZXkgYmFjayB0byBjYWxsZXItc2lkZSBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaWRyIHtcbiAgdmVyc2lvbjogSXBWZXJzaW9uO1xuICAvKiogTmV0d29yayBhZGRyZXNzIChob3N0IGJpdHMgemVyb2VkKSBhcyBhbiB1bnNpZ25lZCBgYmlnaW50YC4gKi9cbiAgYmFzZTogYmlnaW50O1xuICAvKiogUHJlZml4IGxlbmd0aCBpbiBiaXRzICh0aGUgbnVtYmVyIGFmdGVyIHRoZSBgL2ApLiAqL1xuICBwcmVmaXg6IG51bWJlcjtcbiAgLyoqIE5vcm1hbGl6ZWQgYDxhZGRyZXNzPi88cHJlZml4PmAgc3RyaW5nLiAqL1xuICBjaWRyOiBzdHJpbmc7XG59XG5cbi8qKiBTZXR0YWJsZSwgbm9uLW1ldGhvZCBgVVJMYCBwcm9wZXJ0aWVzIC0gdGhlIGtleXMge0BsaW5rIFVybEJ1aWxkZXIud2l0aH0gYWNjZXB0cy4gKi9cbnR5cGUgVXJsUHJvcGVydHlLZXkgPSBOb25GdW5jdGlvbktleXM8VXJsQnVpbGRlckltcGw+O1xuXG4vKipcbiAqIEEgYFVSTGAgc3ViY2xhc3Mgd2l0aCBjaGFpbmFibGUsIGNvcHktb24td3JpdGUgaGVscGVycy4gRXZlcnkgbXV0YXRpbmdcbiAqIG1ldGhvZCByZXR1cm5zIGEgZnJlc2ggYnVpbGRlciByYXRoZXIgdGhhbiBlZGl0aW5nIGluIHBsYWNlLCBzbyBhIGJhc2VcbiAqIGJ1aWxkZXIgY2FuIGJlIHNhZmVseSByZXVzZWQuIENvbnN0cnVjdCBvbmUgdmlhIHtAbGluayB1cmxCdWlsZGVyfS5cbiAqL1xuY2xhc3MgVXJsQnVpbGRlckltcGwgZXh0ZW5kcyBVUkwge1xuICBjb25zdHJ1Y3Rvcih1cmw6IFVSTCkge1xuICAgIHN1cGVyKHVybCk7XG4gIH1cblxuICAvKiogVGhlIHNjaGVtZSB3aXRob3V0IHRoZSB0cmFpbGluZyBjb2xvbiAoYGh0dHBzYCwgbm90IGBodHRwczpgKS4gKi9cbiAgZ2V0IHNjaGVtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3RvY29sLnNsaWNlKDAsIC0xKTtcbiAgfVxuXG4gIHNldCBzY2hlbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMucHJvdG9jb2wgPSB2YWx1ZSArIFwiOlwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNvcHkgd2l0aCBhIHNpbmdsZSBgVVJMYCBwcm9wZXJ0eSAoYHBhdGhuYW1lYCwgYHNlYXJjaGAsXG4gICAqIGBob3N0bmFtZWAsIGBzY2hlbWVgLCAuLi4pIHNldCB0byBgdmFsdWVgLCBsZWF2aW5nIHRoaXMgYnVpbGRlclxuICAgKiB1bnRvdWNoZWQuXG4gICAqL1xuICB3aXRoPEsgZXh0ZW5kcyBVcmxQcm9wZXJ0eUtleT4oa2V5OiBLLCB2YWx1ZTogVXJsQnVpbGRlckltcGxbS10pOiBVcmxCdWlsZGVyIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFVybEJ1aWxkZXJJbXBsKHRoaXMpO1xuICAgIChuZXh0IGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiBuZXcgVXJsQnVpbGRlckltcGwobmV4dCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgY29weSB3aXRoIGBwYXRoU2VnbWVudHNgIGFwcGVuZGVkIHRvIHRoZSBjdXJyZW50IHBhdGhuYW1lLlxuICAgKiBTZWdtZW50cyBtYXkgYmUgc3RyaW5ncyBvciBzdHJpbmcgYXJyYXlzOyBlYWNoIGlzIHRyaW1tZWQgb2ZcbiAgICogYm91bmRhcnkgc2xhc2hlcyBhbmQgYmxhbmtzIGFyZSBkcm9wcGVkIGJlZm9yZSBqb2luaW5nIHdpdGggYC9gLlxuICAgKi9cbiAgd2l0aFBhdGhBcHBlbmQoLi4ucGF0aFNlZ21lbnRzOiAoc3RyaW5nIHwgc3RyaW5nW10pW10pOiBVcmxCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy53aXRoUGF0aFJlcGxhY2UodGhpcy5wYXRobmFtZSwgLi4ucGF0aFNlZ21lbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjb3B5IHdob3NlIHBhdGhuYW1lIGlzIGBwYXRoU2VnbWVudHNgIGpvaW5lZCB3aXRoIGAvYCxcbiAgICogcmVwbGFjaW5nIGFueSBleGlzdGluZyBwYXRoLiBTZWdtZW50cyBtYXkgYmUgc3RyaW5ncyBvciBzdHJpbmdcbiAgICogYXJyYXlzOyBlYWNoIGlzIHRyaW1tZWQgb2YgYm91bmRhcnkgc2xhc2hlcyBhbmQgYmxhbmtzIGFyZSBkcm9wcGVkLlxuICAgKi9cbiAgd2l0aFBhdGhSZXBsYWNlKC4uLnBhdGhTZWdtZW50czogKHN0cmluZyB8IHN0cmluZ1tdKVtdKTogVXJsQnVpbGRlciB7XG4gICAgY29uc3QgcGF0aG5hbWVQYXJ0czogc3RyaW5nW10gPSBbLi4ucGF0aFNlZ21lbnRzXS5mbGF0TWFwKChwKSA9PiAoQXJyYXkuaXNBcnJheShwKSA/IHAgOiBbcF0pKTtcbiAgICBjb25zdCBwYXRobmFtZSA9IHBhdGhuYW1lUGFydHNcbiAgICAgIC5tYXAoKHApID0+IHAucmVwbGFjZShVUkxfUEFUSF9TRUdNRU5UX1RSSU0sIFwiXCIpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIvXCIpO1xuICAgIHJldHVybiB0aGlzLndpdGgoXCJwYXRobmFtZVwiLCBcIi9cIiArIHBhdGhuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0IHdoZXRoZXIgdGhpcyBVUkwncyBwYXRobmFtZSBpcyBgcGF0aGAgb3IgbGl2ZXMgYmVuZWF0aCBpdCxcbiAgICogbWF0Y2hpbmcgb24gc2VnbWVudCBib3VuZGFyaWVzIHNvIGAvYXBpYCBtYXRjaGVzIGAvYXBpYCBhbmRcbiAgICogYC9hcGkvY29vbGAgYnV0IG5vdCBgL2FwaWNvb2xgLiBBIG1pc3NpbmcgbGVhZGluZyBzbGFzaCBvbiBgcGF0aGBcbiAgICogaXMgdG9sZXJhdGVkOyBxdWVyeSBhbmQgaGFzaCBhcmUgaWdub3JlZCAodGhleSBhcmVuJ3QgcGFydCBvZlxuICAgKiBgcGF0aG5hbWVgKS4gTWF0Y2hpbmcgaXMgZXhhY3Qgb3RoZXJ3aXNlIC0gdHJhaWxpbmcgc2xhc2hlcyBhcmVcbiAgICogbm90IG5vcm1hbGl6ZWQgYW5kIGAvYCBtYXRjaGVzIG9ubHkgdGhlIHJvb3QuXG4gICAqL1xuICBwYXRoTWF0Y2hlcyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWU7XG4gICAgaWYgKHBhdGhuYW1lID09IHBhdGgpIHJldHVybiB0cnVlO1xuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKFwiL1wiKSkgcGF0aCA9IFwiL1wiICsgcGF0aDtcbiAgICBpZiAocGF0aG5hbWUgPT0gcGF0aCkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHBhdGhuYW1lLnN0YXJ0c1dpdGgocGF0aCArIFwiL1wiKTtcbiAgfVxufVxuXG4vKiogUHVibGljIHR5cGUgZm9yIHRoZSB7QGxpbmsgdXJsQnVpbGRlcn0gcmV0dXJuIHZhbHVlLiAqL1xuZXhwb3J0IHR5cGUgVXJsQnVpbGRlciA9IFVybEJ1aWxkZXJJbXBsO1xuXG4vKiogV2l0aCBubyBhcmd1bWVudCwgcmVzb2x2ZXMgdG8gdGhlIGJhc2Ugb3JpZ2luIChuZXZlciBgbnVsbGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybEJ1aWxkZXIoKTogVXJsQnVpbGRlcjtcblxuLyoqXG4gKiBDb2VyY2UgYSB7QGxpbmsgVXJsTGlrZX0gaW50byBhIGNoYWluYWJsZSB7QGxpbmsgVXJsQnVpbGRlcn0sIG9yIGBudWxsYFxuICogd2hlbiB0aGUgaW5wdXQgY2Fubm90IGJlIHBhcnNlZCBpbnRvIGEgVVJMLiBOZXZlciB0aHJvd3MuXG4gKlxuICogLSBBIGBVUkxgIGluc3RhbmNlIG9yIGB7IHVybCB9YCB3cmFwcGVyIGlzIGFkb3B0ZWQgYXMtaXMuXG4gKiAtIEEgYmFyZSBob3N0bmFtZSAoYFwiZXhhbXBsZS5jb21cImApIGlzIHVwZ3JhZGVkIHRvIGBodHRwczovL2A7IGFuXG4gKiAgIGV4cGxpY2l0IHNjaGVtZSBpcyBwcmVzZXJ2ZWQuXG4gKiAtIEEgcGF0aCAvIHF1ZXJ5IC8gaGFzaCBmcmFnbWVudCAoYFwiL2FwaVwiYCwgYFwiP3E9MVwiYCwgYFwiI3hcImApIGlzXG4gKiAgIHJlc29sdmVkIGFnYWluc3Qge0BsaW5rIGRlZmF1bHRVcmx9ICh0aGUgYnJvd3NlciBvcmlnaW4sIGVsc2VcbiAqICAgYGh0dHA6Ly9sb2NhbGhvc3RgKS5cbiAqIC0gQW4gZW1wdHkgLyBibGFuayBzdHJpbmcgb3Igb21pdHRlZCBpbnB1dCByZXNvbHZlcyB0byB0aGUgYmFzZVxuICogICBvcmlnaW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIHVybEJ1aWxkZXIoXCJleGFtcGxlLmNvbVwiKTsgICAgICAgICAgLy8gaHR0cHM6Ly9leGFtcGxlLmNvbS9cbiAqIHVybEJ1aWxkZXIoXCJodHRwOi8veC9wYXRoXCIpOyAgICAgICAgLy8gaHR0cDovL3gvcGF0aFxuICogdXJsQnVpbGRlcihcIi9hcGkvdjJcIik7ICAgICAgICAgICAgICAvLyBodHRwOi8vbG9jYWxob3N0L2FwaS92MlxuICogdXJsQnVpbGRlcih7IHVybDogXCJodHRwOi8veVwiIH0pOyAgICAvLyBodHRwOi8veS9cbiAqIHVybEJ1aWxkZXIoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9sb2NhbGhvc3QvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmxCdWlsZGVyKGlucHV0PzogVXJsTGlrZSk6IFVybEJ1aWxkZXIgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiB1cmxCdWlsZGVyKGlucHV0PzogVXJsTGlrZSk6IFVybEJ1aWxkZXIgfCB1bmRlZmluZWQge1xuICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBVUkwpIHtcbiAgICByZXR1cm4gbmV3IFVybEJ1aWxkZXJJbXBsKGlucHV0KTtcbiAgfVxuICBpZiAoaW5wdXQgIT09IG51bGwgJiYgdHlwZW9mIGlucHV0ID09PSBcIm9iamVjdFwiICYmIFwidXJsXCIgaW4gaW5wdXQpIHtcbiAgICBpbnB1dCA9IGlucHV0LnVybDtcbiAgfVxuICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgaW5wdXQgPSBpbnB1dC50cmltKCk7XG4gIH1cbiAgaWYgKGlucHV0KSB7XG4gICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXCIvXCIpIHx8IGlucHV0LnN0YXJ0c1dpdGgoXCI/XCIpIHx8IGlucHV0LnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICBjb25zdCBqb2luZWRVcmwgPSBkZWZhdWx0VXJsKCkudG9TdHJpbmcoKS5zbGljZSgwLCAtMSkgKyBpbnB1dDtcbiAgICAgIHJldHVybiB1cmxCdWlsZGVyKGpvaW5lZFVybCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dC5zdGFydHNXaXRoKFVSTF9TQ0hFTUVfU0VQQVJBVE9SKSkge1xuICAgICAgaW5wdXQgPSBgJHtVUkxfU0NIRU1FX0RFRkFVTFR9JHtpbnB1dH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKFVSTF9TQ0hFTUVfUFJFRklYKTtcbiAgICAgIGNvbnN0IHNjaGVtZVByZWZpeCA9IG1hdGNoPy5bMV07XG4gICAgICBpZiAoc2NoZW1lUHJlZml4KSB7XG4gICAgICAgIGNvbnN0IHJlc3QgPSBpbnB1dC5zbGljZShzY2hlbWVQcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgaW5wdXQgPSBgJHtzY2hlbWVQcmVmaXh9JHtyZXN0IHx8IGRlZmF1bHRVcmwoKS5ob3N0bmFtZX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXQgPSBgJHtVUkxfU0NIRU1FX0RFRkFVTFR9Oi8vJHtpbnB1dH1gO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdXJsQnVpbGRlcihkZWZhdWx0VXJsKCkpO1xuICB9XG4gIGNvbnN0IHVybCA9IHBhcnNlVXJsKGlucHV0KTtcbiAgcmV0dXJuIHVybCA/IHVybEJ1aWxkZXIodXJsKSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb252ZW5pZW5jZSB3cmFwcGVyIG92ZXIge0BsaW5rIFVybEJ1aWxkZXIucGF0aE1hdGNoZXN9OiBjb2VyY2VcbiAqIGBpbnB1dGAgdmlhIHtAbGluayB1cmxCdWlsZGVyfSBhbmQgdGVzdCBpdHMgcGF0aG5hbWUgYWdhaW5zdCBgcGF0aGAuXG4gKiBSZXR1cm5zIGBmYWxzZWAgZm9yIGlucHV0IHRoYXQgY2FuJ3QgYmUgcGFyc2VkIGludG8gYSBVUkwuXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhdGhNYXRjaChcIi9hcGkvY29vbD9xPTFcIiwgXCIvYXBpXCIpOyAgICAgIC8vIHRydWVcbiAqIHBhdGhNYXRjaChcIi9hcGljb29sXCIsIFwiL2FwaVwiKTsgICAgICAgICAgIC8vIGZhbHNlXG4gKiBwYXRoTWF0Y2goXCJodHRwczovL2hvc3QvYXBpXCIsIFwiL2FwaVwiKTsgICAvLyB0cnVlXG4gKiBwYXRoTWF0Y2gocmVxdWVzdCwgXCIvYXBpL3YyXCIpOyAgICAgICAgICAgLy8gZmV0Y2ggUmVxdWVzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aE1hdGNoKGlucHV0OiBVcmxMaWtlLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdXJsYiA9IHVybEJ1aWxkZXIoaW5wdXQpO1xuICBpZiAoIXVybGIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHVybGIucGF0aE1hdGNoZXMocGF0aCk7XG59XG5cbi8qKlxuICogQmFzZSBvcmlnaW4gZm9yIHJlc29sdmluZyBwYXRoLW9ubHkgaW5wdXRzLiBJbiBhIGJyb3dzZXIgdGhpcyBpcyB0aGVcbiAqIGN1cnJlbnQgcGFnZSdzIG9yaWdpbiAoYHdpbmRvdy5sb2NhdGlvbi5vcmlnaW5gKSwgc28gYHVybEJ1aWxkZXIoXCIvYXBpXCIpYFxuICogcmVmbGVjdHMgd2hlcmUgdGhlIGFwcCBpcyBhY3R1YWxseSBzZXJ2ZWQgZnJvbTsgb24gdGhlIHNlcnZlciAvIGluXG4gKiB0ZXN0cyAobm8gYHdpbmRvd2AsIG9yIGFuIG9wYXF1ZSBgXCJudWxsXCJgIG9yaWdpbikgaXQgZmFsbHMgYmFjayB0b1xuICogYGh0dHA6Ly9sb2NhbGhvc3RgLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0VXJsKCk6IFVSTCB7XG4gIC8vIFJlYWNoIGB3aW5kb3dgIHZpYSBgZ2xvYmFsVGhpc2Agc28gdGhpcyBjb21waWxlcyB3aXRob3V0IHRoZSBET01cbiAgLy8gbGliIChpdCdzIGB1bmRlZmluZWRgIG9uIHRoZSBzZXJ2ZXIgLyBpbiB3b3JrZXJzIHdpdGhvdXQgb25lKS5cbiAgY29uc3Qgb3JpZ2luID0gKGdsb2JhbFRoaXMgYXMgeyB3aW5kb3c/OiB7IGxvY2F0aW9uPzogeyBvcmlnaW4/OiBzdHJpbmcgfSB9IH0pLndpbmRvdz8ubG9jYXRpb25cbiAgICA/Lm9yaWdpbjtcbiAgaWYgKG9yaWdpbiAmJiBvcmlnaW4gIT09IFwibnVsbFwiKSB7XG4gICAgY29uc3Qgb3JpZ2luVXJsID0gcGFyc2VVcmwob3JpZ2luKTtcbiAgICBpZiAob3JpZ2luVXJsKSB7XG4gICAgICByZXR1cm4gb3JpZ2luVXJsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IFVSTChMT0NBTF9IT1NUX1VSTCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVXJsKGlucHV0OiBzdHJpbmcpOiBVUkwgfCBudWxsIHtcbiAgaWYgKGlucHV0ICYmIGlucHV0LmluY2x1ZGVzKFVSTF9TQ0hFTUVfU0VQQVJBVE9SKSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IFVSTChpbnB1dCk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEVtYWlsIGFkZHJlc3Nlc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgcGFyc2VFbWFpbHN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUVtYWlsc09wdGlvbnMge1xuICAvKiogTG93ZXItY2FzZSBldmVyeSBhZGRyZXNzICh1c2VmdWwgZm9yIGFsbG93LWxpc3RzIC8gbWF0Y2hpbmcpLiBPZmYgYnkgZGVmYXVsdC4gKi9cbiAgbG93ZXJjYXNlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERyb3AgbGF0ZXIgY2FzZS1pbnNlbnNpdGl2ZSBkdXBsaWNhdGVzLCBrZWVwaW5nIGZpcnN0LXNlZW4gY2FzaW5nLlxuICAgKiBPbiBieSBkZWZhdWx0IC0gYSByZWNpcGllbnQgb3IgcGF0dGVybiBsaXN0IHJhcmVseSB3YW50cyByZXBlYXRzLlxuICAgKi9cbiAgZGVkdXBlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIHNoYXBlcyBhbiBlbWFpbCBhZGRyZXNzIGZpZWxkIGFjY2VwdHMgLSBhIHNpbmdsZSBzdHJpbmcsXG4gKiBhIGNvbW1hIC8gc2VtaWNvbG9uIC8gd2hpdGVzcGFjZSBzZXBhcmF0ZWQgbGlzdCwgYW4gYXJyYXkgb2YgZWl0aGVyLFxuICogb3Igbm90aGluZyAtIGludG8gYSBjbGVhbiBgc3RyaW5nW11gLiBFYWNoIGVudHJ5IGlzIHNwbGl0IG9uIHRoZSBsaXN0XG4gKiBzZXBhcmF0b3JzLCB0cmltbWVkLCBhbmQgZGUtZW1wdGllZDsgYmxhbmtzIGFuZCBub24tc3RyaW5nIGFycmF5XG4gKiBtZW1iZXJzIGFyZSBkcm9wcGVkLiBCeSBkZWZhdWx0IGR1cGxpY2F0ZXMgYXJlIHJlbW92ZWRcbiAqIGNhc2UtaW5zZW5zaXRpdmVseSAoZmlyc3Qtc2VlbiBjYXNpbmcgd2lucykgYW5kIGNhc2luZyBpcyBvdGhlcndpc2VcbiAqIHByZXNlcnZlZDsgcGFzcyBgbG93ZXJjYXNlYCB0byBmb2xkIGV2ZXJ5dGhpbmcgdG8gbG93ZXIgY2FzZSAoZS5nLiBmb3JcbiAqIGFuIGFsbG93LWxpc3QpLiBUaGlzIGlzIHRoZSBvbmUgcGxhY2UgcmVjaXBpZW50IGxpc3RzLCBDQy9CQ0MgaW5wdXRzLFxuICogYW5kIHNlbmRlciBhbGxvdy1saXN0cyBhY3Jvc3MgdGhlIHJlcG8gYWdyZWUgb24gaG93IGZyZWUtdGV4dCBlbWFpbFxuICogaW5wdXQgaXMgcmVhZC4gTmV2ZXIgdGhyb3dzOyBkb2VzIG5vdCB2YWxpZGF0ZSAtIHBhaXIgd2l0aFxuICoge0BsaW5rIGlzRW1haWx9IHdoZW4geW91IG5lZWQgdG8gcmVqZWN0IG1hbGZvcm1lZCBhZGRyZXNzZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlRW1haWxzKFwiYUB4LmNvbSwgYkB5LmNvbTsgYUB4LmNvbVwiKTsgLy8gW1wiYUB4LmNvbVwiLCBcImJAeS5jb21cIl1cbiAqIHBhcnNlRW1haWxzKFtcIkFAeC5jb21cIiwgXCIgYkB5LmNvbSBcIl0pOyAgICAgIC8vIFtcIkFAeC5jb21cIiwgXCJiQHkuY29tXCJdXG4gKiBwYXJzZUVtYWlscyhcIipAY29ycC5jb21cIiwgeyBsb3dlcmNhc2U6IHRydWUgfSk7IC8vIFtcIipAY29ycC5jb21cIl1cbiAqIHBhcnNlRW1haWxzKHVuZGVmaW5lZCk7ICAgICAgICAgICAgICAgICAgICAgLy8gW11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRW1haWxzKFxuICBpbnB1dDogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBQYXJzZUVtYWlsc09wdGlvbnMgPSB7fSxcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgY29uc3QgeyBsb3dlcmNhc2UgPSBmYWxzZSwgZGVkdXBlID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW50cmllcyA9IEFycmF5LmlzQXJyYXkoaW5wdXQpID8gaW5wdXQgOiBbaW5wdXQgYXMgc3RyaW5nXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgZW50cnkuc3BsaXQoRU1BSUxfTElTVF9TRVBBUkFUT1IpKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gdG9rZW4udHJpbSgpO1xuICAgICAgaWYgKCF0cmltbWVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBsb3dlcmNhc2UgPyB0cmltbWVkLnRvTG93ZXJDYXNlKCkgOiB0cmltbWVkO1xuICAgICAgaWYgKGRlZHVwZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBhZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICAgIG91dC5wdXNoKGFkZHJlc3MpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFByYWdtYXRpYyBgbG9jYWxAZG9tYWluLnRsZGAgc2hhcGUgY2hlY2s6IG5vbi1lbXB0eSBsb2NhbCBhbmQgZG9tYWluXG4gKiBwYXJ0cyBhcm91bmQgYSBzaW5nbGUgYEBgLCB3aXRoIGEgZG90dGVkIGRvbWFpbiBhbmQgbm8gd2hpdGVzcGFjZS5cbiAqIERlbGliZXJhdGVseSBsb29zZSAobm90IGZ1bGwgUkZDIDUzMjIpIC0gZW5vdWdoIHRvIGNhdGNoIG9idmlvdXMgdHlwb3NcbiAqIGFuZCBnaXZlIENMSSAvIGZvcm0gZmVlZGJhY2ssIG5vdCB0byBnYXRlIGRlbGl2ZXJ5LiBUcmltcyBmaXJzdC4gVGhpc1xuICogaXMgYSBwdXJlbHkgc3ludGFjdGljIHRlc3QsIHNvIGEgd2lsZGNhcmQgYWxsb3ctbGlzdCBwYXR0ZXJuIGxpa2VcbiAqIGAqQGV4YW1wbGUuY29tYCBwYXNzZXM7IGRpc3Rpbmd1aXNoaW5nIGEgcGF0dGVybiBmcm9tIGEgcmVhbCBhZGRyZXNzXG4gKiBpcyB0aGUgc2VuZGVyIHBvbGljeSdzIGpvYiwgbm90IHRoaXMgdmFsaWRhdG9yJ3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlzRW1haWwoXCJhbGljZUBleGFtcGxlLmNvbVwiKTsgLy8gdHJ1ZVxuICogaXNFbWFpbChcIm5vcGVcIik7ICAgICAgICAgICAgICAvLyBmYWxzZSAobm8gQClcbiAqIGlzRW1haWwoXCJub0Bkb21haW5cIik7ICAgICAgICAgLy8gZmFsc2UgKG5vIGRvdHRlZCBkb21haW4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VtYWlsKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVNQUlMX0FERFJFU1MudGVzdCh2YWx1ZS50cmltKCkpO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIElQIGFkZHJlc3NlcyBhbmQgQ0lEUiBibG9ja3Ncbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFBhcnNlIGFuIElQdjQgKGBcIjEuMi4zLjRcImApIG9yIElQdjYgKGBcIjIwMDE6ZGI4OjoxXCJgLFxuICogYFwiOjpmZmZmOjEuMi4zLjRcImAsIGBcIjo6MVwiYCkgYWRkcmVzcyBpbnRvIGEge0BsaW5rIFBhcnNlZElwfSwgb3JcbiAqIGBudWxsYCB3aGVuIHRoZSBpbnB1dCBpc24ndCBhIHZhbGlkIGxpdGVyYWwuIE5ldmVyIHRocm93cy4gU3Vycm91bmRpbmdcbiAqIHdoaXRlc3BhY2UsIGBbLi4uXWAgYnJhY2tldHMgYXJvdW5kIGFuIElQdjYgbGl0ZXJhbCwgYW5kIGFuIElQdjYgem9uZVxuICogaWQgKGBmZTgwOjoxJWV0aDBgKSBhcmUgYWxsIHRvbGVyYXRlZC4gVGhlIGB2YWx1ZWAgaXMgcmV0dXJuZWQgYXMgYVxuICogYGJpZ2ludGAgc28gdjQgYW5kIHY2IHNoYXJlIG9uZSBjb21wYXJpc29uIHBhdGguXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlSXAoXCIxMC4wLjAuMVwiKTsgICAgICAgIC8vIHsgdmVyc2lvbjogNCwgdmFsdWU6IDE2Nzc3MjE2MW4gfVxuICogcGFyc2VJcChcIjIwMDE6ZGI4OjoxXCIpOyAgICAgLy8geyB2ZXJzaW9uOiA2LCB2YWx1ZTogLi4uIH1cbiAqIHBhcnNlSXAoXCJub3QtYW4taXBcIik7ICAgICAgIC8vIG51bGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSXAoaW5wdXQ6IHN0cmluZyk6IFBhcnNlZElwIHwgbnVsbCB7XG4gIGxldCB0ZXh0ID0gaW5wdXQudHJpbSgpO1xuICBpZiAodGV4dC5zdGFydHNXaXRoKFwiW1wiKSAmJiB0ZXh0LmVuZHNXaXRoKFwiXVwiKSkgdGV4dCA9IHRleHQuc2xpY2UoMSwgLTEpO1xuICBpZiAodGV4dC5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICAvLyBEcm9wIGFuIElQdjYgem9uZSBpZCAoYGZlODA6OjElZXRoMGApIC0gaXQgaXNuJ3QgcGFydCBvZiB0aGUgYWRkcmVzcy5cbiAgICBjb25zdCB6b25lID0gdGV4dC5pbmRleE9mKFwiJVwiKTtcbiAgICBpZiAoem9uZSA+PSAwKSB0ZXh0ID0gdGV4dC5zbGljZSgwLCB6b25lKTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSXB2Nih0ZXh0KTtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyBudWxsIDogeyB2ZXJzaW9uOiA2LCB2YWx1ZSB9O1xuICB9XG4gIGNvbnN0IHZhbHVlID0gcGFyc2VJcHY0KHRleHQpO1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyBudWxsIDogeyB2ZXJzaW9uOiA0LCB2YWx1ZSB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGEgQ0lEUiBibG9jayAoYFwiMTAuMC4wLjAvOFwiYCwgYFwiMjAwMTpkYjg6Oi8zMlwiYCkgaW50byBhXG4gKiB7QGxpbmsgQ2lkcn0gd2l0aCBob3N0IGJpdHMgY2xlYXJlZCBmcm9tIGBiYXNlYCwgb3IgYG51bGxgIHdoZW4gdGhlXG4gKiBpbnB1dCBpc24ndCBhIHZhbGlkIGJsb2NrIChiYWQgYWRkcmVzcywgbWlzc2luZyAvIG91dC1vZi1yYW5nZVxuICogcHJlZml4KS4gTmV2ZXIgdGhyb3dzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBwYXJzZUNpZHIoXCIxMC4wLjAuMC84XCIpPy5iYXNlOyAgIC8vIDE2Nzc3MjE2MG4gKDEwLjAuMC4wKVxuICogcGFyc2VDaWRyKFwiMTAuMS4yLjMvOFwiKT8uYmFzZTsgICAvLyAxNjc3NzIxNjBuIChob3N0IGJpdHMgZHJvcHBlZClcbiAqIHBhcnNlQ2lkcihcIjEwLjAuMC4wLzQwXCIpOyAgICAgICAgLy8gbnVsbCAocHJlZml4ID4gMzIgZm9yIHY0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDaWRyKGlucHV0OiBzdHJpbmcpOiBDaWRyIHwgbnVsbCB7XG4gIGNvbnN0IHRleHQgPSBpbnB1dC50cmltKCk7XG4gIGNvbnN0IHNsYXNoID0gdGV4dC5sYXN0SW5kZXhPZihcIi9cIik7XG4gIGlmIChzbGFzaCA8IDApIHJldHVybiBudWxsO1xuICBjb25zdCBwcmVmaXhUZXh0ID0gdGV4dC5zbGljZShzbGFzaCArIDEpO1xuICBpZiAoIUlQVjRfT0NURVQudGVzdChwcmVmaXhUZXh0KSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGlwID0gcGFyc2VJcCh0ZXh0LnNsaWNlKDAsIHNsYXNoKSk7XG4gIGlmICghaXApIHJldHVybiBudWxsO1xuICBjb25zdCBwcmVmaXggPSBOdW1iZXIocHJlZml4VGV4dCk7XG4gIGNvbnN0IGJpdHMgPSBJUF9CSVRTW2lwLnZlcnNpb25dO1xuICBpZiAocHJlZml4ID4gYml0cykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGJhc2UgPSBpcC52YWx1ZSAmIG5ldHdvcmtNYXNrKGJpdHMsIHByZWZpeCk7XG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogaXAudmVyc2lvbixcbiAgICBiYXNlLFxuICAgIHByZWZpeCxcbiAgICBjaWRyOiBgJHt0ZXh0LnNsaWNlKDAsIHNsYXNoKX0vJHtwcmVmaXh9YCxcbiAgfTtcbn1cblxuLyoqXG4gKiBUZXN0IHdoZXRoZXIgYGlwYCBmYWxscyBpbnNpZGUgYGNpZHJgLiBCb3RoIGFyZ3VtZW50cyBhY2NlcHQgZWl0aGVyXG4gKiBhIHN0cmluZyAocGFyc2VkIG9uIHRoZSBmbHkgdmlhIHtAbGluayBwYXJzZUlwfSAvIHtAbGluayBwYXJzZUNpZHJ9KVxuICogb3IgYW4gYWxyZWFkeS1wYXJzZWQgdmFsdWUgLSBwYXNzIHBhcnNlZCB2YWx1ZXMgaW4gaG90IGxvb3BzIHRvIHNraXBcbiAqIHJlLXBhcnNpbmcuIFJldHVybnMgYGZhbHNlYCBmb3IgdW5wYXJzZWFibGUgaW5wdXQgb3IgYSB2ZXJzaW9uXG4gKiBtaXNtYXRjaCAoYW4gSVB2NCBhZGRyZXNzIGlzIG5ldmVyIGluc2lkZSBhbiBJUHY2IGJsb2NrKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaXBJbkNpZHIoXCIxMC4xLjIuM1wiLCBcIjEwLjAuMC4wLzhcIik7ICAgLy8gdHJ1ZVxuICogaXBJbkNpZHIoXCIxMS4wLjAuMVwiLCBcIjEwLjAuMC4wLzhcIik7ICAgLy8gZmFsc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlwSW5DaWRyKGlwOiBzdHJpbmcgfCBQYXJzZWRJcCwgY2lkcjogc3RyaW5nIHwgQ2lkcik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZWRJcCA9IHR5cGVvZiBpcCA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlSXAoaXApIDogaXA7XG4gIGNvbnN0IHBhcnNlZENpZHIgPSB0eXBlb2YgY2lkciA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlQ2lkcihjaWRyKSA6IGNpZHI7XG4gIGlmICghcGFyc2VkSXAgfHwgIXBhcnNlZENpZHIgfHwgcGFyc2VkSXAudmVyc2lvbiAhPT0gcGFyc2VkQ2lkci52ZXJzaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IG1hc2sgPSBuZXR3b3JrTWFzayhJUF9CSVRTW3BhcnNlZENpZHIudmVyc2lvbl0sIHBhcnNlZENpZHIucHJlZml4KTtcbiAgcmV0dXJuIChwYXJzZWRJcC52YWx1ZSAmIG1hc2spID09PSBwYXJzZWRDaWRyLmJhc2U7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBmaXJzdCBDSURSIGluIGBjaWRyc2AgdGhhdCBjb250YWlucyBgaXBgLCBvciBgbnVsbGAgd2hlblxuICogbm9uZSBtYXRjaC4gYGNpZHJzYCBob2xkcyBwcmUtcGFyc2VkIHtAbGluayBDaWRyfSB2YWx1ZXMgKG9yIGFueVxuICogb2JqZWN0IGV4dGVuZGluZyBpdCksIHNvIGNhbGxlcnMgY2FuIGNhcnJ5IHNpZGUgbWV0YWRhdGEgb24gZWFjaFxuICogZW50cnkgKGUuZy4gYSByZWdpb24gdGFnKSBhbmQgcmVhZCBpdCBzdHJhaWdodCBvZmYgdGhlIHJldHVybmVkXG4gKiBtYXRjaC4gTGluZWFyIHNjYW47IHBhcnNlIHRoZSBhZGRyZXNzIG9uY2UgYnkgcGFzc2luZyBhXG4gKiB7QGxpbmsgUGFyc2VkSXB9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByYW5nZXMgPSBbXCIxMC4wLjAuMC84XCIsIFwiMTkyLjE2OC4wLjAvMTZcIl1cbiAqICAgLm1hcChwYXJzZUNpZHIpXG4gKiAgIC5maWx0ZXIoKGMpOiBjIGlzIENpZHIgPT4gYyAhPT0gbnVsbCk7XG4gKiBmaW5kQ29udGFpbmluZ0NpZHIoXCIxMC4xLjIuM1wiLCByYW5nZXMpPy5jaWRyOyAvLyBcIjEwLjAuMC4wLzhcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbnRhaW5pbmdDaWRyPFQgZXh0ZW5kcyBDaWRyPihcbiAgaXA6IHN0cmluZyB8IFBhcnNlZElwLFxuICBjaWRyczogSXRlcmFibGU8VD4sXG4pOiBUIHwgbnVsbCB7XG4gIGNvbnN0IHBhcnNlZElwID0gdHlwZW9mIGlwID09PSBcInN0cmluZ1wiID8gcGFyc2VJcChpcCkgOiBpcDtcbiAgaWYgKCFwYXJzZWRJcCkgcmV0dXJuIG51bGw7XG4gIGZvciAoY29uc3QgY2lkciBvZiBjaWRycykge1xuICAgIGlmIChjaWRyLnZlcnNpb24gIT09IHBhcnNlZElwLnZlcnNpb24pIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1hc2sgPSBuZXR3b3JrTWFzayhJUF9CSVRTW2NpZHIudmVyc2lvbl0sIGNpZHIucHJlZml4KTtcbiAgICBpZiAoKHBhcnNlZElwLnZhbHVlICYgbWFzaykgPT09IGNpZHIuYmFzZSkgcmV0dXJuIGNpZHI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogV2hldGhlciBgaW5wdXRgJ3MgaG9zdCBpcyBhIGxvb3BiYWNrIGFkZHJlc3MgLSBgbG9jYWxob3N0YCwgYW4gSVB2NFxuICogYDEyNy4wLjAuMC84YCBhZGRyZXNzLCBvciBJUHY2IGA6OjFgIC0gaS5lLiBhIHNlcnZpY2UgcnVubmluZyBvbiB0aGlzXG4gKiBtYWNoaW5lIChlLmcuIGEgbG9jYWwgcmVnaXN0cnkpLiBBY2NlcHRzIGFueXRoaW5nIHtAbGluayB1cmxCdWlsZGVyfVxuICogY29lcmNlcyAoYSBVUkwgc3RyaW5nLCBgVVJMYCwgb3IgYHsgdXJsIH1gKTsgcmV0dXJucyBgZmFsc2VgIHdoZW4gdGhlXG4gKiBpbnB1dCBoYXMgbm8gcmVzb2x2YWJsZSBob3N0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpc0xvb3BiYWNrSG9zdChcImh0dHA6Ly9sb2NhbGhvc3Q6NDg3M1wiKTsgLy8gdHJ1ZVxuICogaXNMb29wYmFja0hvc3QoXCJodHRwOi8vMTI3LjAuMC4xXCIpOyAgICAgICAvLyB0cnVlXG4gKiBpc0xvb3BiYWNrSG9zdChcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnXCIpOyAvLyBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMb29wYmFja0hvc3QoaW5wdXQ6IFVybExpa2UpOiBib29sZWFuIHtcbiAgY29uc3QgaG9zdCA9IHVybEJ1aWxkZXIoaW5wdXQpPy5ob3N0bmFtZTtcbiAgaWYgKCFob3N0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChob3N0ID09PSBcImxvY2FsaG9zdFwiKSByZXR1cm4gdHJ1ZTtcbiAgLy8gYFVSTGAgYnJhY2tldHMgYW4gSVB2NiBob3N0IChgWzo6MV1gKTsgc3RyaXAgdGhlbSBiZWZvcmUgcGFyc2luZy5cbiAgY29uc3QgaXAgPSBob3N0LnJlcGxhY2UoL15cXFt8XFxdJC9nLCBcIlwiKTtcbiAgcmV0dXJuIGlwSW5DaWRyKGlwLCBcIjEyNy4wLjAuMC84XCIpIHx8IGlwSW5DaWRyKGlwLCBcIjo6MS8xMjhcIik7XG59XG5cbi8qKlxuICogTmV0d29yayBtYXNrIGZvciBgcHJlZml4YCBsZWFkaW5nIGJpdHMgb2YgYSBgYml0c2Atd2lkZSBhZGRyZXNzIGFzIGFcbiAqIGBiaWdpbnRgOiB0aGUgdG9wIGBwcmVmaXhgIGJpdHMgc2V0LCB0aGUgbG93IGhvc3QgYml0cyBjbGVhcmVkLlxuICogYHByZWZpeCA9PT0gMGAgeWllbGRzIGAwbmAgKG1hdGNoZXMgZXZlcnl0aGluZyk7IGBwcmVmaXggPT09IGJpdHNgXG4gKiB5aWVsZHMgdGhlIGFsbC1vbmVzIG1hc2sgKG1hdGNoZXMgYSBzaW5nbGUgYWRkcmVzcykuXG4gKi9cbmZ1bmN0aW9uIG5ldHdvcmtNYXNrKGJpdHM6IG51bWJlciwgcHJlZml4OiBudW1iZXIpOiBiaWdpbnQge1xuICBjb25zdCBob3N0Qml0cyA9IEJpZ0ludChiaXRzIC0gcHJlZml4KTtcbiAgY29uc3QgZnVsbCA9ICgxbiA8PCBCaWdJbnQoYml0cykpIC0gMW47XG4gIHJldHVybiBmdWxsIF4gKCgxbiA8PCBob3N0Qml0cykgLSAxbik7XG59XG5cbi8qKiBQYXJzZSBhIGRvdHRlZC1xdWFkIElQdjQgbGl0ZXJhbCBpbnRvIGEgMzItYml0IHZhbHVlLCBlbHNlIGBudWxsYC4gKi9cbmZ1bmN0aW9uIHBhcnNlSXB2NChpbnB1dDogc3RyaW5nKTogYmlnaW50IHwgbnVsbCB7XG4gIGNvbnN0IHBhcnRzID0gaW5wdXQuc3BsaXQoXCIuXCIpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgbGV0IHZhbHVlID0gMG47XG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmICghSVBWNF9PQ1RFVC50ZXN0KHBhcnQpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBvY3RldCA9IE51bWJlcihwYXJ0KTtcbiAgICBpZiAob2N0ZXQgPiAyNTUpIHJldHVybiBudWxsO1xuICAgIHZhbHVlID0gKHZhbHVlIDw8IDhuKSB8IEJpZ0ludChvY3RldCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuIElQdjYgbGl0ZXJhbCBpbnRvIGEgMTI4LWJpdCB2YWx1ZSwgZWxzZSBgbnVsbGAuIEhhbmRsZXMgYDo6YFxuICogemVyby1jb21wcmVzc2lvbiAoYXQgbW9zdCBvbmNlKSBhbmQgYSB0cmFpbGluZyBlbWJlZGRlZCBJUHY0IGdyb3VwXG4gKiAoYDo6ZmZmZjoxLjIuMy40YCkuIFRoZSB6b25lIGlkLCBpZiBhbnksIGlzIGV4cGVjdGVkIHRvIGJlIHN0cmlwcGVkXG4gKiBieSB7QGxpbmsgcGFyc2VJcH0gYmVmb3JlIHRoaXMgaXMgY2FsbGVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUlwdjYoaW5wdXQ6IHN0cmluZyk6IGJpZ2ludCB8IG51bGwge1xuICBjb25zdCBoYWx2ZXMgPSBpbnB1dC5zcGxpdChcIjo6XCIpO1xuICBpZiAoaGFsdmVzLmxlbmd0aCA+IDIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGhlYWQgPSBwYXJzZUhleHRldHMoaGFsdmVzWzBdISk7XG4gIGlmIChoZWFkID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICBpZiAoaGFsdmVzLmxlbmd0aCA9PT0gMikge1xuICAgIGNvbnN0IHRhaWwgPSBwYXJzZUhleHRldHMoaGFsdmVzWzFdISk7XG4gICAgaWYgKHRhaWwgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIC8vIFwiOjpcIiBtdXN0IHN0YW5kIGluIGZvciBhdCBsZWFzdCBvbmUgYWxsLXplcm8gaGV4dGV0LlxuICAgIGNvbnN0IG1pc3NpbmcgPSA4IC0gaGVhZC5sZW5ndGggLSB0YWlsLmxlbmd0aDtcbiAgICBpZiAobWlzc2luZyA8IDEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBoZXh0ZXRzVG9WYWx1ZShbLi4uaGVhZCwgLi4uQXJyYXkobWlzc2luZykuZmlsbCgwKSwgLi4udGFpbF0pO1xuICB9XG5cbiAgaWYgKGhlYWQubGVuZ3RoICE9PSA4KSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGhleHRldHNUb1ZhbHVlKGhlYWQpO1xufVxuXG4vKipcbiAqIFBhcnNlIG9uZSBjb2xvbi1zZXBhcmF0ZWQgcnVuIG9mIElQdjYgaGV4dGV0cywgZXhwYW5kaW5nIGEgdHJhaWxpbmdcbiAqIGVtYmVkZGVkIElQdjQgZ3JvdXAgaW50byBpdHMgdHdvIGhleHRldHMuIEFuIGVtcHR5IHN0cmluZyB5aWVsZHMgYW5cbiAqIGVtcHR5IGxpc3QgKHRoZSBzaWRlIG9mIGEgbGVhZGluZyAvIHRyYWlsaW5nIGA6OmApLlxuICovXG5mdW5jdGlvbiBwYXJzZUhleHRldHMocGFydDogc3RyaW5nKTogbnVtYmVyW10gfCBudWxsIHtcbiAgaWYgKHBhcnQgPT09IFwiXCIpIHJldHVybiBbXTtcbiAgY29uc3QgdG9rZW5zID0gcGFydC5zcGxpdChcIjpcIik7XG4gIGNvbnN0IGhleHRldHM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaV0hO1xuICAgIGlmICh0b2tlbi5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIC8vIEEgZG90dGVkLXF1YWQgaXMgb25seSBsZWdhbCBhcyB0aGUgZmluYWwgZ3JvdXAuXG4gICAgICBpZiAoaSAhPT0gdG9rZW5zLmxlbmd0aCAtIDEpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgdjQgPSBwYXJzZUlwdjQodG9rZW4pO1xuICAgICAgaWYgKHY0ID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgIGhleHRldHMucHVzaChOdW1iZXIoKHY0ID4+IDE2bikgJiAweGZmZmZuKSwgTnVtYmVyKHY0ICYgMHhmZmZmbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIUlQVjZfSEVYVEVULnRlc3QodG9rZW4pKSByZXR1cm4gbnVsbDtcbiAgICAgIGhleHRldHMucHVzaChwYXJzZUludCh0b2tlbiwgMTYpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhleHRldHM7XG59XG5cbi8qKiBGb2xkIGV4YWN0bHkgOCBoZXh0ZXRzIGludG8gYSBzaW5nbGUgMTI4LWJpdCBgYmlnaW50YCwgZWxzZSBgbnVsbGAuICovXG5mdW5jdGlvbiBoZXh0ZXRzVG9WYWx1ZShoZXh0ZXRzOiBudW1iZXJbXSk6IGJpZ2ludCB8IG51bGwge1xuICBpZiAoaGV4dGV0cy5sZW5ndGggIT09IDgpIHJldHVybiBudWxsO1xuICBsZXQgdmFsdWUgPSAwbjtcbiAgZm9yIChjb25zdCBoZXh0ZXQgb2YgaGV4dGV0cykgdmFsdWUgPSAodmFsdWUgPDwgMTZuKSB8IEJpZ0ludChoZXh0ZXQpO1xuICByZXR1cm4gdmFsdWU7XG59XG4iXX0=
467
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25ldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUlILE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbkQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7QUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxpQ0FBaUMsQ0FBQztBQUM1RCxNQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQztBQUMzQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUVuQywrREFBK0Q7QUFDL0QsTUFBTSxPQUFPLEdBQXdDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkUsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDO0FBQy9CLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDO0FBRXpDLG9FQUFvRTtBQUNwRSxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQUN2QyxvRUFBb0U7QUFDcEUsTUFBTSxhQUFhLEdBQUcsNEJBQTRCLENBQUM7QUFvRG5EOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWUsU0FBUSxHQUFHO0lBQzlCLFlBQVksR0FBUTtRQUNsQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUEyQixHQUFNLEVBQUUsS0FBd0I7UUFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMzQixPQUFPLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLEdBQUcsWUFBbUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxHQUFHLFlBQW1DO1FBQ3BELE1BQU0sYUFBYSxHQUFhLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRixNQUFNLFFBQVEsR0FBRyxhQUFhO2FBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNoRCxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxXQUFXLENBQUMsSUFBWTtRQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksUUFBUSxJQUFJLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUM3QyxJQUFJLFFBQVEsSUFBSSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbEMsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUE4QkQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFlO0lBQ3hDLElBQUksS0FBSyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ2xFLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxTQUFTLEdBQUcsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUMvRCxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQixDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUNsRCxLQUFLLEdBQUcsR0FBRyxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM3QyxNQUFNLFlBQVksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUMsS0FBSyxHQUFHLEdBQUcsWUFBWSxHQUFHLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxHQUFHLEdBQUcsa0JBQWtCLE1BQU0sS0FBSyxFQUFFLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0MsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWMsRUFBRSxJQUFZO0lBQ3BELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxVQUFVO0lBQ2pCLG1FQUFtRTtJQUNuRSxpRUFBaUU7SUFDakUsTUFBTSxNQUFNLEdBQUksVUFBOEQsQ0FBQyxNQUFNLEVBQUUsUUFBUTtRQUM3RixFQUFFLE1BQU0sQ0FBQztJQUNYLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNoQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYTtJQUM3QixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFBQyxNQUFNLENBQUMsQ0FBQSxDQUFDO0lBQ1osQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQWlCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsS0FBb0QsRUFDcEQsVUFBOEIsRUFBRTtJQUVoQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyRCxNQUFNLEVBQUUsU0FBUyxHQUFHLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ3JELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFlLENBQUMsQ0FBQztJQUNqRSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQztJQUN6QixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzVCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLFNBQVM7UUFDeEMsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUN0RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE9BQU87Z0JBQUUsU0FBUztZQUN2QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQzVELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO29CQUFFLFNBQVM7Z0JBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQztZQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFhO0lBQ25DLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsbUVBQW1FO0FBQ25FLCtCQUErQjtBQUMvQixtRUFBbUU7QUFFbkU7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFhO0lBQ25DLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2Qix3RUFBd0U7UUFDeEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksSUFBSSxDQUFDO1lBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixPQUFPLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsT0FBTyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDOUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekMsSUFBSSxDQUFDLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNyQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxJQUFJLE1BQU0sR0FBRyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDL0IsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELE9BQU87UUFDTCxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU87UUFDbkIsSUFBSTtRQUNKLE1BQU07UUFDTixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLEVBQUU7S0FDMUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxFQUFxQixFQUFFLElBQW1CO0lBQ2pFLE1BQU0sUUFBUSxHQUFHLE9BQU8sRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDM0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxVQUFVLENBQUMsSUFBSSxDQUFDO0FBQ3JELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxFQUFxQixFQUNyQixLQUFrQjtJQUVsQixNQUFNLFFBQVEsR0FBRyxPQUFPLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzNELElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0IsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLE9BQU87WUFBRSxTQUFTO1FBQ2hELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3pELENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBYztJQUMzQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDO0lBQ3pDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEIsSUFBSSxJQUFJLEtBQUssV0FBVztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3RDLG9FQUFvRTtJQUNwRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4QyxPQUFPLFFBQVEsQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFZLEVBQUUsTUFBYztJQUMvQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsU0FBUyxTQUFTLENBQUMsS0FBYTtJQUM5QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2YsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxLQUFLLEdBQUcsR0FBRztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzdCLEtBQUssR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBYTtJQUM5QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFbkMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDO0lBQ3RDLElBQUksSUFBSSxLQUFLLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUUvQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksSUFBSSxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvQix1REFBdUQ7UUFDdkQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM5QyxJQUFJLE9BQU8sR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDN0IsT0FBTyxjQUFjLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ25DLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxJQUFJLElBQUksS0FBSyxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDekIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsa0RBQWtEO1lBQ2xELElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUN6QyxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsSUFBSSxFQUFFLEtBQUssSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLFNBQVMsY0FBYyxDQUFDLE9BQWlCO0lBQ3ZDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2YsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPO1FBQUUsS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBuZXR3b3JraW5nIGhlbHBlcnMgYnVpbHQgYXJvdW5kIHtAbGluayB1cmxCdWlsZGVyfTogYVxuICogdG9sZXJhbnQgYFVSTGAgY29lcmNpb24gKyBjaGFpbmFibGUgYnVpbGRlciB0aGF0IGdyYWNlZnVsbHkgaGFuZGxlc1xuICogcGFydGlhbCBpbnB1dHMgKGJhcmUgaG9zdHMsIHBhdGgtb25seSBzdHJpbmdzLCBgeyB1cmwgfWAgd3JhcHBlcnMpLFxuICogYSBzbWFsbCBJUHY0IC8gSVB2NiBhZGRyZXNzICsgQ0lEUiB0b29sa2l0IChwYXJzaW5nIGFuZCBtZW1iZXJzaGlwXG4gKiBsb29rdXBzKSwgYW5kIGVtYWlsLWFkZHJlc3MgcGFyc2luZyAoe0BsaW5rIHBhcnNlRW1haWxzfSAvXG4gKiB7QGxpbmsgaXNFbWFpbH0pIHRoYXQgbm9ybWFsaXplcyB0aGUgQ1NWIC8gc2luZ2xlLXN0cmluZyAvIGFycmF5XG4gKiBpbnB1dHMgZW1haWwgcmVjaXBpZW50IGFuZCBhbGxvdy1saXN0IGZpZWxkcyBhY2NlcHQgaW50byBhIGNsZWFuXG4gKiBgc3RyaW5nW11gLiBObyBub2RlLW9ubHkgaW1wb3J0cywgc28gdGhpcyBtb2R1bGUgaXMgdGhlIGNhbm9uaWNhbFxuICogaG9tZSBmb3IgYW55dGhpbmcgVVJMLSwgSVAtLCBvciBlbWFpbC1zaGFwZWQgdGhhdCBhbHNvIGhhcyB0byBydW4gaW5cbiAqIGEgVml0ZSAvIFdlYnBhY2sgLyBlc2J1aWxkIGNsaWVudCBidW5kbGUuIE5vZGUtb25seSBuZXR3b3JrIGhlbHBlcnNcbiAqIChlLmcuIEROUyByZXNvbHV0aW9uKSBiZWxvbmcgaW4gYSBub2RlLXRhZ2dlZCBwYWNrYWdlLCBub3QgaGVyZS5cbiAqIFJldXNlIHRoaXMgbW9kdWxlIGZvciBVUkwsIElQL0NJRFIsIGFuZCBlbWFpbCBwYXJzaW5nIGluc3RlYWQgb2YgaW50cm9kdWNpbmdcbiAqIHBhY2thZ2UtbG9jYWwgbm9ybWFsaXplcnMgd2l0aCBzdWJ0bHkgZGlmZmVyZW50IHJ1bGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE5vbkZ1bmN0aW9uS2V5cyB9IGZyb20gXCIuL29iamVjdC50c1wiO1xuXG5jb25zdCBMT0NBTF9IT1NUX1VSTCA9IG5ldyBVUkwoXCJodHRwOi8vbG9jYWxob3N0XCIpO1xuY29uc3QgVVJMX1NDSEVNRV9ERUZBVUxUID0gXCJodHRwc1wiO1xuY29uc3QgVVJMX1NDSEVNRV9QUkVGSVggPSAvXihbQS1aYS16XVtBLVphLXowLTkrLi1dKjpcXC9cXC8pLztcbmNvbnN0IFVSTF9QQVRIX1NFR01FTlRfVFJJTSA9IC9eXFwvK3xcXC8rJC9nO1xuY29uc3QgVVJMX1NDSEVNRV9TRVBBUkFUT1IgPSBcIjovL1wiO1xuXG4vKiogVG90YWwgYml0IHdpZHRoIG9mIGFuIGFkZHJlc3Mgb2YgZWFjaCB7QGxpbmsgSXBWZXJzaW9ufS4gKi9cbmNvbnN0IElQX0JJVFM6IFJlYWRvbmx5PFJlY29yZDxJcFZlcnNpb24sIG51bWJlcj4+ID0geyA0OiAzMiwgNjogMTI4IH07XG5jb25zdCBJUFY0X09DVEVUID0gL15cXGR7MSwzfSQvO1xuY29uc3QgSVBWNl9IRVhURVQgPSAvXlswLTlhLWZBLUZdezEsNH0kLztcblxuLyoqIERlbGltaXRlcnMgYmV0d2VlbiBhZGRyZXNzZXMgaW4gYSBmcmVlLXRleHQgLyBDU1YgZW1haWwgbGlzdC4gKi9cbmNvbnN0IEVNQUlMX0xJU1RfU0VQQVJBVE9SID0gL1tcXHMsO10rLztcbi8qKiBQcmFnbWF0aWMgYGxvY2FsQGRvbWFpbi50bGRgIHNoYXBlIGNoZWNrIChub3QgZnVsbCBSRkMgNTMyMikuICovXG5jb25zdCBFTUFJTF9BRERSRVNTID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC87XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gVHlwZXNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEFueXRoaW5nIHtAbGluayB1cmxCdWlsZGVyfSAoYW5kIHtAbGluayBwYXRoTWF0Y2h9KSBrbm93IGhvdyB0byBjb2VyY2VcbiAqIGludG8gYSBVUkw6XG4gKlxuICogLSBBIHN0cmluZzogYSBob3N0LCBhIGZ1bGwgVVJMLCBvciBhIHBhdGggLyBxdWVyeSAvIGhhc2ggZnJhZ21lbnQuXG4gKiAtIEEgV0hBVFdHIGBVUkxgIGluc3RhbmNlLlxuICogLSBBbnkgb2JqZWN0IHdpdGggYSBgdXJsYCBmaWVsZCAoZS5nLiBhIGZldGNoIGBSZXF1ZXN0YCwgYSBEYXRhYnJpY2tzXG4gKiAgIGBXb3Jrc3BhY2VDbGllbnRgIGNvbmZpZykuXG4gKi9cbmV4cG9ydCB0eXBlIFVybExpa2UgPSBzdHJpbmcgfCBVUkwgfCB7IHVybDogc3RyaW5nIH07XG5cbi8qKiBJUCBwcm90b2NvbCBmYW1pbHk6IGA0YCBmb3IgSVB2NCwgYDZgIGZvciBJUHY2LiAqL1xuZXhwb3J0IHR5cGUgSXBWZXJzaW9uID0gNCB8IDY7XG5cbi8qKlxuICogQSBwYXJzZWQgSVAgYWRkcmVzcy4gYHZhbHVlYCBpcyB0aGUgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyXG4gKiAoYSAzMi1iaXQgcmFuZ2UgZm9yIHY0LCAxMjgtYml0IGZvciB2NikgaGVsZCBpbiBhIGBiaWdpbnRgIHNvIGJvdGhcbiAqIGZhbWlsaWVzIHNoYXJlIG9uZSBjb21wYXJpc29uIC8gbWFza2luZyBwYXRoLiBQcm9kdWNlIG9uZSB3aXRoXG4gKiB7QGxpbmsgcGFyc2VJcH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkSXAge1xuICB2ZXJzaW9uOiBJcFZlcnNpb247XG4gIC8qKiBUaGUgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIChgYmlnaW50YCBmb3IgdW5pZm9ybSB2NC92NiBtYXRoKS4gKi9cbiAgdmFsdWU6IGJpZ2ludDtcbn1cblxuLyoqXG4gKiBBIHBhcnNlZCBDSURSIGJsb2NrIChgMTAuMC4wLjAvOGAsIGAyMDAxOmRiODo6LzMyYCkuIGBiYXNlYCBpcyB0aGVcbiAqIG5ldHdvcmsgYWRkcmVzcyB3aXRoIGFsbCBob3N0IGJpdHMgY2xlYXJlZCwgc28gbWVtYmVyc2hpcCBpcyBhXG4gKiBzaW5nbGUgbWFza2VkIGNvbXBhcmUgKHNlZSB7QGxpbmsgaXBJbkNpZHJ9KS4gUHJvZHVjZSBvbmUgd2l0aFxuICoge0BsaW5rIHBhcnNlQ2lkcn0uIENhcnJpZXMgdGhlIG5vcm1hbGl6ZWQgYGNpZHJgIHN0cmluZyBmb3IgbG9nZ2luZ1xuICogYW5kIHRvIGtleSBiYWNrIHRvIGNhbGxlci1zaWRlIG1ldGFkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENpZHIge1xuICB2ZXJzaW9uOiBJcFZlcnNpb247XG4gIC8qKiBOZXR3b3JrIGFkZHJlc3MgKGhvc3QgYml0cyB6ZXJvZWQpIGFzIGFuIHVuc2lnbmVkIGBiaWdpbnRgLiAqL1xuICBiYXNlOiBiaWdpbnQ7XG4gIC8qKiBQcmVmaXggbGVuZ3RoIGluIGJpdHMgKHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGAvYCkuICovXG4gIHByZWZpeDogbnVtYmVyO1xuICAvKiogTm9ybWFsaXplZCBgPGFkZHJlc3M+LzxwcmVmaXg+YCBzdHJpbmcuICovXG4gIGNpZHI6IHN0cmluZztcbn1cblxuLyoqIFNldHRhYmxlLCBub24tbWV0aG9kIGBVUkxgIHByb3BlcnRpZXMgLSB0aGUga2V5cyB7QGxpbmsgVXJsQnVpbGRlci53aXRofSBhY2NlcHRzLiAqL1xudHlwZSBVcmxQcm9wZXJ0eUtleSA9IE5vbkZ1bmN0aW9uS2V5czxVcmxCdWlsZGVySW1wbD47XG5cbi8qKlxuICogQSBgVVJMYCBzdWJjbGFzcyB3aXRoIGNoYWluYWJsZSwgY29weS1vbi13cml0ZSBoZWxwZXJzLiBFdmVyeSBtdXRhdGluZ1xuICogbWV0aG9kIHJldHVybnMgYSBmcmVzaCBidWlsZGVyIHJhdGhlciB0aGFuIGVkaXRpbmcgaW4gcGxhY2UsIHNvIGEgYmFzZVxuICogYnVpbGRlciBjYW4gYmUgc2FmZWx5IHJldXNlZC4gQ29uc3RydWN0IG9uZSB2aWEge0BsaW5rIHVybEJ1aWxkZXJ9LlxuICovXG5jbGFzcyBVcmxCdWlsZGVySW1wbCBleHRlbmRzIFVSTCB7XG4gIGNvbnN0cnVjdG9yKHVybDogVVJMKSB7XG4gICAgc3VwZXIodXJsKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2NoZW1lIHdpdGhvdXQgdGhlIHRyYWlsaW5nIGNvbG9uIChgaHR0cHNgLCBub3QgYGh0dHBzOmApLiAqL1xuICBnZXQgc2NoZW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2wuc2xpY2UoMCwgLTEpO1xuICB9XG5cbiAgc2V0IHNjaGVtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wcm90b2NvbCA9IHZhbHVlICsgXCI6XCI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgY29weSB3aXRoIGEgc2luZ2xlIGBVUkxgIHByb3BlcnR5IChgcGF0aG5hbWVgLCBgc2VhcmNoYCxcbiAgICogYGhvc3RuYW1lYCwgYHNjaGVtZWAsIC4uLikgc2V0IHRvIGB2YWx1ZWAsIGxlYXZpbmcgdGhpcyBidWlsZGVyXG4gICAqIHVudG91Y2hlZC5cbiAgICovXG4gIHdpdGg8SyBleHRlbmRzIFVybFByb3BlcnR5S2V5PihrZXk6IEssIHZhbHVlOiBVcmxCdWlsZGVySW1wbFtLXSk6IFVybEJ1aWxkZXIge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgVXJsQnVpbGRlckltcGwodGhpcyk7XG4gICAgKG5leHQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIG5ldyBVcmxCdWlsZGVySW1wbChuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjb3B5IHdpdGggYHBhdGhTZWdtZW50c2AgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgcGF0aG5hbWUuXG4gICAqIFNlZ21lbnRzIG1heSBiZSBzdHJpbmdzIG9yIHN0cmluZyBhcnJheXM7IGVhY2ggaXMgdHJpbW1lZCBvZlxuICAgKiBib3VuZGFyeSBzbGFzaGVzIGFuZCBibGFua3MgYXJlIGRyb3BwZWQgYmVmb3JlIGpvaW5pbmcgd2l0aCBgL2AuXG4gICAqL1xuICB3aXRoUGF0aEFwcGVuZCguLi5wYXRoU2VnbWVudHM6IChzdHJpbmcgfCBzdHJpbmdbXSlbXSk6IFVybEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLndpdGhQYXRoUmVwbGFjZSh0aGlzLnBhdGhuYW1lLCAuLi5wYXRoU2VnbWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNvcHkgd2hvc2UgcGF0aG5hbWUgaXMgYHBhdGhTZWdtZW50c2Agam9pbmVkIHdpdGggYC9gLFxuICAgKiByZXBsYWNpbmcgYW55IGV4aXN0aW5nIHBhdGguIFNlZ21lbnRzIG1heSBiZSBzdHJpbmdzIG9yIHN0cmluZ1xuICAgKiBhcnJheXM7IGVhY2ggaXMgdHJpbW1lZCBvZiBib3VuZGFyeSBzbGFzaGVzIGFuZCBibGFua3MgYXJlIGRyb3BwZWQuXG4gICAqL1xuICB3aXRoUGF0aFJlcGxhY2UoLi4ucGF0aFNlZ21lbnRzOiAoc3RyaW5nIHwgc3RyaW5nW10pW10pOiBVcmxCdWlsZGVyIHtcbiAgICBjb25zdCBwYXRobmFtZVBhcnRzOiBzdHJpbmdbXSA9IFsuLi5wYXRoU2VnbWVudHNdLmZsYXRNYXAoKHApID0+IChBcnJheS5pc0FycmF5KHApID8gcCA6IFtwXSkpO1xuICAgIGNvbnN0IHBhdGhuYW1lID0gcGF0aG5hbWVQYXJ0c1xuICAgICAgLm1hcCgocCkgPT4gcC5yZXBsYWNlKFVSTF9QQVRIX1NFR01FTlRfVFJJTSwgXCJcIikpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbihcIi9cIik7XG4gICAgcmV0dXJuIHRoaXMud2l0aChcInBhdGhuYW1lXCIsIFwiL1wiICsgcGF0aG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3Qgd2hldGhlciB0aGlzIFVSTCdzIHBhdGhuYW1lIGlzIGBwYXRoYCBvciBsaXZlcyBiZW5lYXRoIGl0LFxuICAgKiBtYXRjaGluZyBvbiBzZWdtZW50IGJvdW5kYXJpZXMgc28gYC9hcGlgIG1hdGNoZXMgYC9hcGlgIGFuZFxuICAgKiBgL2FwaS9jb29sYCBidXQgbm90IGAvYXBpY29vbGAuIEEgbWlzc2luZyBsZWFkaW5nIHNsYXNoIG9uIGBwYXRoYFxuICAgKiBpcyB0b2xlcmF0ZWQ7IHF1ZXJ5IGFuZCBoYXNoIGFyZSBpZ25vcmVkICh0aGV5IGFyZW4ndCBwYXJ0IG9mXG4gICAqIGBwYXRobmFtZWApLiBNYXRjaGluZyBpcyBleGFjdCBvdGhlcndpc2UgLSB0cmFpbGluZyBzbGFzaGVzIGFyZVxuICAgKiBub3Qgbm9ybWFsaXplZCBhbmQgYC9gIG1hdGNoZXMgb25seSB0aGUgcm9vdC5cbiAgICovXG4gIHBhdGhNYXRjaGVzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZTtcbiAgICBpZiAocGF0aG5hbWUgPT0gcGF0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSBwYXRoID0gXCIvXCIgKyBwYXRoO1xuICAgIGlmIChwYXRobmFtZSA9PSBwYXRoKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gcGF0aG5hbWUuc3RhcnRzV2l0aChwYXRoICsgXCIvXCIpO1xuICB9XG59XG5cbi8qKiBQdWJsaWMgdHlwZSBmb3IgdGhlIHtAbGluayB1cmxCdWlsZGVyfSByZXR1cm4gdmFsdWUuICovXG5leHBvcnQgdHlwZSBVcmxCdWlsZGVyID0gVXJsQnVpbGRlckltcGw7XG5cbi8qKiBXaXRoIG5vIGFyZ3VtZW50LCByZXNvbHZlcyB0byB0aGUgYmFzZSBvcmlnaW4gKG5ldmVyIGBudWxsYCkuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsQnVpbGRlcigpOiBVcmxCdWlsZGVyO1xuXG4vKipcbiAqIENvZXJjZSBhIHtAbGluayBVcmxMaWtlfSBpbnRvIGEgY2hhaW5hYmxlIHtAbGluayBVcmxCdWlsZGVyfSwgb3IgYG51bGxgXG4gKiB3aGVuIHRoZSBpbnB1dCBjYW5ub3QgYmUgcGFyc2VkIGludG8gYSBVUkwuIE5ldmVyIHRocm93cy5cbiAqXG4gKiAtIEEgYFVSTGAgaW5zdGFuY2Ugb3IgYHsgdXJsIH1gIHdyYXBwZXIgaXMgYWRvcHRlZCBhcy1pcy5cbiAqIC0gQSBiYXJlIGhvc3RuYW1lIChgXCJleGFtcGxlLmNvbVwiYCkgaXMgdXBncmFkZWQgdG8gYGh0dHBzOi8vYDsgYW5cbiAqICAgZXhwbGljaXQgc2NoZW1lIGlzIHByZXNlcnZlZC5cbiAqIC0gQSBwYXRoIC8gcXVlcnkgLyBoYXNoIGZyYWdtZW50IChgXCIvYXBpXCJgLCBgXCI/cT0xXCJgLCBgXCIjeFwiYCkgaXNcbiAqICAgcmVzb2x2ZWQgYWdhaW5zdCB7QGxpbmsgZGVmYXVsdFVybH0gKHRoZSBicm93c2VyIG9yaWdpbiwgZWxzZVxuICogICBgaHR0cDovL2xvY2FsaG9zdGApLlxuICogLSBBbiBlbXB0eSAvIGJsYW5rIHN0cmluZyBvciBvbWl0dGVkIGlucHV0IHJlc29sdmVzIHRvIHRoZSBiYXNlXG4gKiAgIG9yaWdpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogdXJsQnVpbGRlcihcImV4YW1wbGUuY29tXCIpOyAgICAgICAgICAvLyBodHRwczovL2V4YW1wbGUuY29tL1xuICogdXJsQnVpbGRlcihcImh0dHA6Ly94L3BhdGhcIik7ICAgICAgICAvLyBodHRwOi8veC9wYXRoXG4gKiB1cmxCdWlsZGVyKFwiL2FwaS92MlwiKTsgICAgICAgICAgICAgIC8vIGh0dHA6Ly9sb2NhbGhvc3QvYXBpL3YyXG4gKiB1cmxCdWlsZGVyKHsgdXJsOiBcImh0dHA6Ly95XCIgfSk7ICAgIC8vIGh0dHA6Ly95L1xuICogdXJsQnVpbGRlcigpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL2xvY2FsaG9zdC9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybEJ1aWxkZXIoaW5wdXQ/OiBVcmxMaWtlKTogVXJsQnVpbGRlciB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIHVybEJ1aWxkZXIoaW5wdXQ/OiBVcmxMaWtlKTogVXJsQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHJldHVybiBuZXcgVXJsQnVpbGRlckltcGwoaW5wdXQpO1xuICB9XG4gIGlmIChpbnB1dCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgXCJ1cmxcIiBpbiBpbnB1dCkge1xuICAgIGlucHV0ID0gaW5wdXQudXJsO1xuICB9XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpbnB1dCA9IGlucHV0LnRyaW0oKTtcbiAgfVxuICBpZiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcIi9cIikgfHwgaW5wdXQuc3RhcnRzV2l0aChcIj9cIikgfHwgaW5wdXQuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgIGNvbnN0IGpvaW5lZFVybCA9IGRlZmF1bHRVcmwoKS50b1N0cmluZygpLnNsaWNlKDAsIC0xKSArIGlucHV0O1xuICAgICAgcmV0dXJuIHVybEJ1aWxkZXIoam9pbmVkVXJsKTtcbiAgICB9IGVsc2UgaWYgKGlucHV0LnN0YXJ0c1dpdGgoVVJMX1NDSEVNRV9TRVBBUkFUT1IpKSB7XG4gICAgICBpbnB1dCA9IGAke1VSTF9TQ0hFTUVfREVGQVVMVH0ke2lucHV0fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goVVJMX1NDSEVNRV9QUkVGSVgpO1xuICAgICAgY29uc3Qgc2NoZW1lUHJlZml4ID0gbWF0Y2g/LlsxXTtcbiAgICAgIGlmIChzY2hlbWVQcmVmaXgpIHtcbiAgICAgICAgY29uc3QgcmVzdCA9IGlucHV0LnNsaWNlKHNjaGVtZVByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpbnB1dCA9IGAke3NjaGVtZVByZWZpeH0ke3Jlc3QgfHwgZGVmYXVsdFVybCgpLmhvc3RuYW1lfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dCA9IGAke1VSTF9TQ0hFTUVfREVGQVVMVH06Ly8ke2lucHV0fWA7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB1cmxCdWlsZGVyKGRlZmF1bHRVcmwoKSk7XG4gIH1cbiAgY29uc3QgdXJsID0gcGFyc2VVcmwoaW5wdXQpO1xuICByZXR1cm4gdXJsID8gdXJsQnVpbGRlcih1cmwpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgb3ZlciB7QGxpbmsgVXJsQnVpbGRlci5wYXRoTWF0Y2hlc306IGNvZXJjZVxuICogYGlucHV0YCB2aWEge0BsaW5rIHVybEJ1aWxkZXJ9IGFuZCB0ZXN0IGl0cyBwYXRobmFtZSBhZ2FpbnN0IGBwYXRoYC5cbiAqIFJldHVybnMgYGZhbHNlYCBmb3IgaW5wdXQgdGhhdCBjYW4ndCBiZSBwYXJzZWQgaW50byBhIFVSTC5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGF0aE1hdGNoKFwiL2FwaS9jb29sP3E9MVwiLCBcIi9hcGlcIik7ICAgICAgLy8gdHJ1ZVxuICogcGF0aE1hdGNoKFwiL2FwaWNvb2xcIiwgXCIvYXBpXCIpOyAgICAgICAgICAgLy8gZmFsc2VcbiAqIHBhdGhNYXRjaChcImh0dHBzOi8vaG9zdC9hcGlcIiwgXCIvYXBpXCIpOyAgIC8vIHRydWVcbiAqIHBhdGhNYXRjaChyZXF1ZXN0LCBcIi9hcGkvdjJcIik7ICAgICAgICAgICAvLyBmZXRjaCBSZXF1ZXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRoTWF0Y2goaW5wdXQ6IFVybExpa2UsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB1cmxiID0gdXJsQnVpbGRlcihpbnB1dCk7XG4gIGlmICghdXJsYikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdXJsYi5wYXRoTWF0Y2hlcyhwYXRoKTtcbn1cblxuLyoqXG4gKiBCYXNlIG9yaWdpbiBmb3IgcmVzb2x2aW5nIHBhdGgtb25seSBpbnB1dHMuIEluIGEgYnJvd3NlciB0aGlzIGlzIHRoZVxuICogY3VycmVudCBwYWdlJ3Mgb3JpZ2luIChgd2luZG93LmxvY2F0aW9uLm9yaWdpbmApLCBzbyBgdXJsQnVpbGRlcihcIi9hcGlcIilgXG4gKiByZWZsZWN0cyB3aGVyZSB0aGUgYXBwIGlzIGFjdHVhbGx5IHNlcnZlZCBmcm9tOyBvbiB0aGUgc2VydmVyIC8gaW5cbiAqIHRlc3RzIChubyBgd2luZG93YCwgb3IgYW4gb3BhcXVlIGBcIm51bGxcImAgb3JpZ2luKSBpdCBmYWxscyBiYWNrIHRvXG4gKiBgaHR0cDovL2xvY2FsaG9zdGAuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRVcmwoKTogVVJMIHtcbiAgLy8gUmVhY2ggYHdpbmRvd2AgdmlhIGBnbG9iYWxUaGlzYCBzbyB0aGlzIGNvbXBpbGVzIHdpdGhvdXQgdGhlIERPTVxuICAvLyBsaWIgKGl0J3MgYHVuZGVmaW5lZGAgb24gdGhlIHNlcnZlciAvIGluIHdvcmtlcnMgd2l0aG91dCBvbmUpLlxuICBjb25zdCBvcmlnaW4gPSAoZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHsgbG9jYXRpb24/OiB7IG9yaWdpbj86IHN0cmluZyB9IH0gfSkud2luZG93Py5sb2NhdGlvblxuICAgID8ub3JpZ2luO1xuICBpZiAob3JpZ2luICYmIG9yaWdpbiAhPT0gXCJudWxsXCIpIHtcbiAgICBjb25zdCBvcmlnaW5VcmwgPSBwYXJzZVVybChvcmlnaW4pO1xuICAgIGlmIChvcmlnaW5VcmwpIHtcbiAgICAgIHJldHVybiBvcmlnaW5Vcmw7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgVVJMKExPQ0FMX0hPU1RfVVJMKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VVcmwoaW5wdXQ6IHN0cmluZyk6IFVSTCB8IG51bGwge1xuICBpZiAoaW5wdXQgJiYgaW5wdXQuaW5jbHVkZXMoVVJMX1NDSEVNRV9TRVBBUkFUT1IpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgVVJMKGlucHV0KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRW1haWwgYWRkcmVzc2VzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBwYXJzZUVtYWlsc30uICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlRW1haWxzT3B0aW9ucyB7XG4gIC8qKiBMb3dlci1jYXNlIGV2ZXJ5IGFkZHJlc3MgKHVzZWZ1bCBmb3IgYWxsb3ctbGlzdHMgLyBtYXRjaGluZykuIE9mZiBieSBkZWZhdWx0LiAqL1xuICBsb3dlcmNhc2U/OiBib29sZWFuO1xuICAvKipcbiAgICogRHJvcCBsYXRlciBjYXNlLWluc2Vuc2l0aXZlIGR1cGxpY2F0ZXMsIGtlZXBpbmcgZmlyc3Qtc2VlbiBjYXNpbmcuXG4gICAqIE9uIGJ5IGRlZmF1bHQgLSBhIHJlY2lwaWVudCBvciBwYXR0ZXJuIGxpc3QgcmFyZWx5IHdhbnRzIHJlcGVhdHMuXG4gICAqL1xuICBkZWR1cGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgc2hhcGVzIGFuIGVtYWlsIGFkZHJlc3MgZmllbGQgYWNjZXB0cyAtIGEgc2luZ2xlIHN0cmluZyxcbiAqIGEgY29tbWEgLyBzZW1pY29sb24gLyB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBsaXN0LCBhbiBhcnJheSBvZiBlaXRoZXIsXG4gKiBvciBub3RoaW5nIC0gaW50byBhIGNsZWFuIGBzdHJpbmdbXWAuIEVhY2ggZW50cnkgaXMgc3BsaXQgb24gdGhlIGxpc3RcbiAqIHNlcGFyYXRvcnMsIHRyaW1tZWQsIGFuZCBkZS1lbXB0aWVkOyBibGFua3MgYW5kIG5vbi1zdHJpbmcgYXJyYXlcbiAqIG1lbWJlcnMgYXJlIGRyb3BwZWQuIEJ5IGRlZmF1bHQgZHVwbGljYXRlcyBhcmUgcmVtb3ZlZFxuICogY2FzZS1pbnNlbnNpdGl2ZWx5IChmaXJzdC1zZWVuIGNhc2luZyB3aW5zKSBhbmQgY2FzaW5nIGlzIG90aGVyd2lzZVxuICogcHJlc2VydmVkOyBwYXNzIGBsb3dlcmNhc2VgIHRvIGZvbGQgZXZlcnl0aGluZyB0byBsb3dlciBjYXNlIChlLmcuIGZvclxuICogYW4gYWxsb3ctbGlzdCkuIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSByZWNpcGllbnQgbGlzdHMsIENDL0JDQyBpbnB1dHMsXG4gKiBhbmQgc2VuZGVyIGFsbG93LWxpc3RzIGFjcm9zcyB0aGUgcmVwbyBhZ3JlZSBvbiBob3cgZnJlZS10ZXh0IGVtYWlsXG4gKiBpbnB1dCBpcyByZWFkLiBOZXZlciB0aHJvd3M7IGRvZXMgbm90IHZhbGlkYXRlIC0gcGFpciB3aXRoXG4gKiB7QGxpbmsgaXNFbWFpbH0gd2hlbiB5b3UgbmVlZCB0byByZWplY3QgbWFsZm9ybWVkIGFkZHJlc3Nlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGFyc2VFbWFpbHMoXCJhQHguY29tLCBiQHkuY29tOyBhQHguY29tXCIpOyAvLyBbXCJhQHguY29tXCIsIFwiYkB5LmNvbVwiXVxuICogcGFyc2VFbWFpbHMoW1wiQUB4LmNvbVwiLCBcIiBiQHkuY29tIFwiXSk7ICAgICAgLy8gW1wiQUB4LmNvbVwiLCBcImJAeS5jb21cIl1cbiAqIHBhcnNlRW1haWxzKFwiKkBjb3JwLmNvbVwiLCB7IGxvd2VyY2FzZTogdHJ1ZSB9KTsgLy8gW1wiKkBjb3JwLmNvbVwiXVxuICogcGFyc2VFbWFpbHModW5kZWZpbmVkKTsgICAgICAgICAgICAgICAgICAgICAvLyBbXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFbWFpbHMoXG4gIGlucHV0OiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IFBhcnNlRW1haWxzT3B0aW9ucyA9IHt9LFxuKTogc3RyaW5nW10ge1xuICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICBjb25zdCB7IGxvd2VyY2FzZSA9IGZhbHNlLCBkZWR1cGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbnRyaWVzID0gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dCBhcyBzdHJpbmddO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBlbnRyeS5zcGxpdChFTUFJTF9MSVNUX1NFUEFSQVRPUikpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSB0b2tlbi50cmltKCk7XG4gICAgICBpZiAoIXRyaW1tZWQpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGxvd2VyY2FzZSA/IHRyaW1tZWQudG9Mb3dlckNhc2UoKSA6IHRyaW1tZWQ7XG4gICAgICBpZiAoZGVkdXBlKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goYWRkcmVzcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUHJhZ21hdGljIGBsb2NhbEBkb21haW4udGxkYCBzaGFwZSBjaGVjazogbm9uLWVtcHR5IGxvY2FsIGFuZCBkb21haW5cbiAqIHBhcnRzIGFyb3VuZCBhIHNpbmdsZSBgQGAsIHdpdGggYSBkb3R0ZWQgZG9tYWluIGFuZCBubyB3aGl0ZXNwYWNlLlxuICogRGVsaWJlcmF0ZWx5IGxvb3NlIChub3QgZnVsbCBSRkMgNTMyMikgLSBlbm91Z2ggdG8gY2F0Y2ggb2J2aW91cyB0eXBvc1xuICogYW5kIGdpdmUgQ0xJIC8gZm9ybSBmZWVkYmFjaywgbm90IHRvIGdhdGUgZGVsaXZlcnkuIFRyaW1zIGZpcnN0LiBUaGlzXG4gKiBpcyBhIHB1cmVseSBzeW50YWN0aWMgdGVzdCwgc28gYSB3aWxkY2FyZCBhbGxvdy1saXN0IHBhdHRlcm4gbGlrZVxuICogYCpAZXhhbXBsZS5jb21gIHBhc3NlczsgZGlzdGluZ3Vpc2hpbmcgYSBwYXR0ZXJuIGZyb20gYSByZWFsIGFkZHJlc3NcbiAqIGlzIHRoZSBzZW5kZXIgcG9saWN5J3Mgam9iLCBub3QgdGhpcyB2YWxpZGF0b3Incy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaXNFbWFpbChcImFsaWNlQGV4YW1wbGUuY29tXCIpOyAvLyB0cnVlXG4gKiBpc0VtYWlsKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIGZhbHNlIChubyBAKVxuICogaXNFbWFpbChcIm5vQGRvbWFpblwiKTsgICAgICAgICAvLyBmYWxzZSAobm8gZG90dGVkIGRvbWFpbilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1haWwodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU1BSUxfQUREUkVTUy50ZXN0KHZhbHVlLnRyaW0oKSk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSVAgYWRkcmVzc2VzIGFuZCBDSURSIGJsb2Nrc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUGFyc2UgYW4gSVB2NCAoYFwiMS4yLjMuNFwiYCkgb3IgSVB2NiAoYFwiMjAwMTpkYjg6OjFcImAsXG4gKiBgXCI6OmZmZmY6MS4yLjMuNFwiYCwgYFwiOjoxXCJgKSBhZGRyZXNzIGludG8gYSB7QGxpbmsgUGFyc2VkSXB9LCBvclxuICogYG51bGxgIHdoZW4gdGhlIGlucHV0IGlzbid0IGEgdmFsaWQgbGl0ZXJhbC4gTmV2ZXIgdGhyb3dzLiBTdXJyb3VuZGluZ1xuICogd2hpdGVzcGFjZSwgYFsuLi5dYCBicmFja2V0cyBhcm91bmQgYW4gSVB2NiBsaXRlcmFsLCBhbmQgYW4gSVB2NiB6b25lXG4gKiBpZCAoYGZlODA6OjElZXRoMGApIGFyZSBhbGwgdG9sZXJhdGVkLiBUaGUgYHZhbHVlYCBpcyByZXR1cm5lZCBhcyBhXG4gKiBgYmlnaW50YCBzbyB2NCBhbmQgdjYgc2hhcmUgb25lIGNvbXBhcmlzb24gcGF0aC5cbiAqXG4gKiBAZXhhbXBsZVxuICogcGFyc2VJcChcIjEwLjAuMC4xXCIpOyAgICAgICAgLy8geyB2ZXJzaW9uOiA0LCB2YWx1ZTogMTY3NzcyMTYxbiB9XG4gKiBwYXJzZUlwKFwiMjAwMTpkYjg6OjFcIik7ICAgICAvLyB7IHZlcnNpb246IDYsIHZhbHVlOiAuLi4gfVxuICogcGFyc2VJcChcIm5vdC1hbi1pcFwiKTsgICAgICAgLy8gbnVsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJcChpbnB1dDogc3RyaW5nKTogUGFyc2VkSXAgfCBudWxsIHtcbiAgbGV0IHRleHQgPSBpbnB1dC50cmltKCk7XG4gIGlmICh0ZXh0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHRleHQuZW5kc1dpdGgoXCJdXCIpKSB0ZXh0ID0gdGV4dC5zbGljZSgxLCAtMSk7XG4gIGlmICh0ZXh0LmluY2x1ZGVzKFwiOlwiKSkge1xuICAgIC8vIERyb3AgYW4gSVB2NiB6b25lIGlkIChgZmU4MDo6MSVldGgwYCkgLSBpdCBpc24ndCBwYXJ0IG9mIHRoZSBhZGRyZXNzLlxuICAgIGNvbnN0IHpvbmUgPSB0ZXh0LmluZGV4T2YoXCIlXCIpO1xuICAgIGlmICh6b25lID49IDApIHRleHQgPSB0ZXh0LnNsaWNlKDAsIHpvbmUpO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJcHY2KHRleHQpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB7IHZlcnNpb246IDYsIHZhbHVlIH07XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBwYXJzZUlwdjQodGV4dCk7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB7IHZlcnNpb246IDQsIHZhbHVlIH07XG59XG5cbi8qKlxuICogUGFyc2UgYSBDSURSIGJsb2NrIChgXCIxMC4wLjAuMC84XCJgLCBgXCIyMDAxOmRiODo6LzMyXCJgKSBpbnRvIGFcbiAqIHtAbGluayBDaWRyfSB3aXRoIGhvc3QgYml0cyBjbGVhcmVkIGZyb20gYGJhc2VgLCBvciBgbnVsbGAgd2hlbiB0aGVcbiAqIGlucHV0IGlzbid0IGEgdmFsaWQgYmxvY2sgKGJhZCBhZGRyZXNzLCBtaXNzaW5nIC8gb3V0LW9mLXJhbmdlXG4gKiBwcmVmaXgpLiBOZXZlciB0aHJvd3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlQ2lkcihcIjEwLjAuMC4wLzhcIik/LmJhc2U7ICAgLy8gMTY3NzcyMTYwbiAoMTAuMC4wLjApXG4gKiBwYXJzZUNpZHIoXCIxMC4xLjIuMy84XCIpPy5iYXNlOyAgIC8vIDE2Nzc3MjE2MG4gKGhvc3QgYml0cyBkcm9wcGVkKVxuICogcGFyc2VDaWRyKFwiMTAuMC4wLjAvNDBcIik7ICAgICAgICAvLyBudWxsIChwcmVmaXggPiAzMiBmb3IgdjQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNpZHIoaW5wdXQ6IHN0cmluZyk6IENpZHIgfCBudWxsIHtcbiAgY29uc3QgdGV4dCA9IGlucHV0LnRyaW0oKTtcbiAgY29uc3Qgc2xhc2ggPSB0ZXh0Lmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgaWYgKHNsYXNoIDwgMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByZWZpeFRleHQgPSB0ZXh0LnNsaWNlKHNsYXNoICsgMSk7XG4gIGlmICghSVBWNF9PQ1RFVC50ZXN0KHByZWZpeFRleHQpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaXAgPSBwYXJzZUlwKHRleHQuc2xpY2UoMCwgc2xhc2gpKTtcbiAgaWYgKCFpcCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHByZWZpeCA9IE51bWJlcihwcmVmaXhUZXh0KTtcbiAgY29uc3QgYml0cyA9IElQX0JJVFNbaXAudmVyc2lvbl07XG4gIGlmIChwcmVmaXggPiBiaXRzKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYmFzZSA9IGlwLnZhbHVlICYgbmV0d29ya01hc2soYml0cywgcHJlZml4KTtcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBpcC52ZXJzaW9uLFxuICAgIGJhc2UsXG4gICAgcHJlZml4LFxuICAgIGNpZHI6IGAke3RleHQuc2xpY2UoMCwgc2xhc2gpfS8ke3ByZWZpeH1gLFxuICB9O1xufVxuXG4vKipcbiAqIFRlc3Qgd2hldGhlciBgaXBgIGZhbGxzIGluc2lkZSBgY2lkcmAuIEJvdGggYXJndW1lbnRzIGFjY2VwdCBlaXRoZXJcbiAqIGEgc3RyaW5nIChwYXJzZWQgb24gdGhlIGZseSB2aWEge0BsaW5rIHBhcnNlSXB9IC8ge0BsaW5rIHBhcnNlQ2lkcn0pXG4gKiBvciBhbiBhbHJlYWR5LXBhcnNlZCB2YWx1ZSAtIHBhc3MgcGFyc2VkIHZhbHVlcyBpbiBob3QgbG9vcHMgdG8gc2tpcFxuICogcmUtcGFyc2luZy4gUmV0dXJucyBgZmFsc2VgIGZvciB1bnBhcnNlYWJsZSBpbnB1dCBvciBhIHZlcnNpb25cbiAqIG1pc21hdGNoIChhbiBJUHY0IGFkZHJlc3MgaXMgbmV2ZXIgaW5zaWRlIGFuIElQdjYgYmxvY2spLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpcEluQ2lkcihcIjEwLjEuMi4zXCIsIFwiMTAuMC4wLjAvOFwiKTsgICAvLyB0cnVlXG4gKiBpcEluQ2lkcihcIjExLjAuMC4xXCIsIFwiMTAuMC4wLjAvOFwiKTsgICAvLyBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXBJbkNpZHIoaXA6IHN0cmluZyB8IFBhcnNlZElwLCBjaWRyOiBzdHJpbmcgfCBDaWRyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlZElwID0gdHlwZW9mIGlwID09PSBcInN0cmluZ1wiID8gcGFyc2VJcChpcCkgOiBpcDtcbiAgY29uc3QgcGFyc2VkQ2lkciA9IHR5cGVvZiBjaWRyID09PSBcInN0cmluZ1wiID8gcGFyc2VDaWRyKGNpZHIpIDogY2lkcjtcbiAgaWYgKCFwYXJzZWRJcCB8fCAhcGFyc2VkQ2lkciB8fCBwYXJzZWRJcC52ZXJzaW9uICE9PSBwYXJzZWRDaWRyLnZlcnNpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgbWFzayA9IG5ldHdvcmtNYXNrKElQX0JJVFNbcGFyc2VkQ2lkci52ZXJzaW9uXSwgcGFyc2VkQ2lkci5wcmVmaXgpO1xuICByZXR1cm4gKHBhcnNlZElwLnZhbHVlICYgbWFzaykgPT09IHBhcnNlZENpZHIuYmFzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGZpcnN0IENJRFIgaW4gYGNpZHJzYCB0aGF0IGNvbnRhaW5zIGBpcGAsIG9yIGBudWxsYCB3aGVuXG4gKiBub25lIG1hdGNoLiBgY2lkcnNgIGhvbGRzIHByZS1wYXJzZWQge0BsaW5rIENpZHJ9IHZhbHVlcyAob3IgYW55XG4gKiBvYmplY3QgZXh0ZW5kaW5nIGl0KSwgc28gY2FsbGVycyBjYW4gY2Fycnkgc2lkZSBtZXRhZGF0YSBvbiBlYWNoXG4gKiBlbnRyeSAoZS5nLiBhIHJlZ2lvbiB0YWcpIGFuZCByZWFkIGl0IHN0cmFpZ2h0IG9mZiB0aGUgcmV0dXJuZWRcbiAqIG1hdGNoLiBMaW5lYXIgc2NhbjsgcGFyc2UgdGhlIGFkZHJlc3Mgb25jZSBieSBwYXNzaW5nIGFcbiAqIHtAbGluayBQYXJzZWRJcH0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJhbmdlcyA9IFtcIjEwLjAuMC4wLzhcIiwgXCIxOTIuMTY4LjAuMC8xNlwiXVxuICogICAubWFwKHBhcnNlQ2lkcilcbiAqICAgLmZpbHRlcigoYyk6IGMgaXMgQ2lkciA9PiBjICE9PSBudWxsKTtcbiAqIGZpbmRDb250YWluaW5nQ2lkcihcIjEwLjEuMi4zXCIsIHJhbmdlcyk/LmNpZHI7IC8vIFwiMTAuMC4wLjAvOFwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29udGFpbmluZ0NpZHI8VCBleHRlbmRzIENpZHI+KFxuICBpcDogc3RyaW5nIHwgUGFyc2VkSXAsXG4gIGNpZHJzOiBJdGVyYWJsZTxUPixcbik6IFQgfCBudWxsIHtcbiAgY29uc3QgcGFyc2VkSXAgPSB0eXBlb2YgaXAgPT09IFwic3RyaW5nXCIgPyBwYXJzZUlwKGlwKSA6IGlwO1xuICBpZiAoIXBhcnNlZElwKSByZXR1cm4gbnVsbDtcbiAgZm9yIChjb25zdCBjaWRyIG9mIGNpZHJzKSB7XG4gICAgaWYgKGNpZHIudmVyc2lvbiAhPT0gcGFyc2VkSXAudmVyc2lvbikgY29udGludWU7XG4gICAgY29uc3QgbWFzayA9IG5ldHdvcmtNYXNrKElQX0JJVFNbY2lkci52ZXJzaW9uXSwgY2lkci5wcmVmaXgpO1xuICAgIGlmICgocGFyc2VkSXAudmFsdWUgJiBtYXNrKSA9PT0gY2lkci5iYXNlKSByZXR1cm4gY2lkcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBpbnB1dGAncyBob3N0IGlzIGEgbG9vcGJhY2sgYWRkcmVzcyAtIGBsb2NhbGhvc3RgLCBhbiBJUHY0XG4gKiBgMTI3LjAuMC4wLzhgIGFkZHJlc3MsIG9yIElQdjYgYDo6MWAgLSBpLmUuIGEgc2VydmljZSBydW5uaW5nIG9uIHRoaXNcbiAqIG1hY2hpbmUgKGUuZy4gYSBsb2NhbCByZWdpc3RyeSkuIEFjY2VwdHMgYW55dGhpbmcge0BsaW5rIHVybEJ1aWxkZXJ9XG4gKiBjb2VyY2VzIChhIFVSTCBzdHJpbmcsIGBVUkxgLCBvciBgeyB1cmwgfWApOyByZXR1cm5zIGBmYWxzZWAgd2hlbiB0aGVcbiAqIGlucHV0IGhhcyBubyByZXNvbHZhYmxlIGhvc3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlzTG9vcGJhY2tIb3N0KFwiaHR0cDovL2xvY2FsaG9zdDo0ODczXCIpOyAvLyB0cnVlXG4gKiBpc0xvb3BiYWNrSG9zdChcImh0dHA6Ly8xMjcuMC4wLjFcIik7ICAgICAgIC8vIHRydWVcbiAqIGlzTG9vcGJhY2tIb3N0KFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmdcIik7IC8vIGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvb3BiYWNrSG9zdChpbnB1dDogVXJsTGlrZSk6IGJvb2xlYW4ge1xuICBjb25zdCBob3N0ID0gdXJsQnVpbGRlcihpbnB1dCk/Lmhvc3RuYW1lO1xuICBpZiAoIWhvc3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKGhvc3QgPT09IFwibG9jYWxob3N0XCIpIHJldHVybiB0cnVlO1xuICAvLyBgVVJMYCBicmFja2V0cyBhbiBJUHY2IGhvc3QgKGBbOjoxXWApOyBzdHJpcCB0aGVtIGJlZm9yZSBwYXJzaW5nLlxuICBjb25zdCBpcCA9IGhvc3QucmVwbGFjZSgvXlxcW3xcXF0kL2csIFwiXCIpO1xuICByZXR1cm4gaXBJbkNpZHIoaXAsIFwiMTI3LjAuMC4wLzhcIikgfHwgaXBJbkNpZHIoaXAsIFwiOjoxLzEyOFwiKTtcbn1cblxuLyoqXG4gKiBOZXR3b3JrIG1hc2sgZm9yIGBwcmVmaXhgIGxlYWRpbmcgYml0cyBvZiBhIGBiaXRzYC13aWRlIGFkZHJlc3MgYXMgYVxuICogYGJpZ2ludGA6IHRoZSB0b3AgYHByZWZpeGAgYml0cyBzZXQsIHRoZSBsb3cgaG9zdCBiaXRzIGNsZWFyZWQuXG4gKiBgcHJlZml4ID09PSAwYCB5aWVsZHMgYDBuYCAobWF0Y2hlcyBldmVyeXRoaW5nKTsgYHByZWZpeCA9PT0gYml0c2BcbiAqIHlpZWxkcyB0aGUgYWxsLW9uZXMgbWFzayAobWF0Y2hlcyBhIHNpbmdsZSBhZGRyZXNzKS5cbiAqL1xuZnVuY3Rpb24gbmV0d29ya01hc2soYml0czogbnVtYmVyLCBwcmVmaXg6IG51bWJlcik6IGJpZ2ludCB7XG4gIGNvbnN0IGhvc3RCaXRzID0gQmlnSW50KGJpdHMgLSBwcmVmaXgpO1xuICBjb25zdCBmdWxsID0gKDFuIDw8IEJpZ0ludChiaXRzKSkgLSAxbjtcbiAgcmV0dXJuIGZ1bGwgXiAoKDFuIDw8IGhvc3RCaXRzKSAtIDFuKTtcbn1cblxuLyoqIFBhcnNlIGEgZG90dGVkLXF1YWQgSVB2NCBsaXRlcmFsIGludG8gYSAzMi1iaXQgdmFsdWUsIGVsc2UgYG51bGxgLiAqL1xuZnVuY3Rpb24gcGFyc2VJcHY0KGlucHV0OiBzdHJpbmcpOiBiaWdpbnQgfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSBpbnB1dC5zcGxpdChcIi5cIik7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICBsZXQgdmFsdWUgPSAwbjtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgaWYgKCFJUFY0X09DVEVULnRlc3QocGFydCkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9jdGV0ID0gTnVtYmVyKHBhcnQpO1xuICAgIGlmIChvY3RldCA+IDI1NSkgcmV0dXJuIG51bGw7XG4gICAgdmFsdWUgPSAodmFsdWUgPDwgOG4pIHwgQmlnSW50KG9jdGV0KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogUGFyc2UgYW4gSVB2NiBsaXRlcmFsIGludG8gYSAxMjgtYml0IHZhbHVlLCBlbHNlIGBudWxsYC4gSGFuZGxlcyBgOjpgXG4gKiB6ZXJvLWNvbXByZXNzaW9uIChhdCBtb3N0IG9uY2UpIGFuZCBhIHRyYWlsaW5nIGVtYmVkZGVkIElQdjQgZ3JvdXBcbiAqIChgOjpmZmZmOjEuMi4zLjRgKS4gVGhlIHpvbmUgaWQsIGlmIGFueSwgaXMgZXhwZWN0ZWQgdG8gYmUgc3RyaXBwZWRcbiAqIGJ5IHtAbGluayBwYXJzZUlwfSBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSXB2NihpbnB1dDogc3RyaW5nKTogYmlnaW50IHwgbnVsbCB7XG4gIGNvbnN0IGhhbHZlcyA9IGlucHV0LnNwbGl0KFwiOjpcIik7XG4gIGlmIChoYWx2ZXMubGVuZ3RoID4gMikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgaGVhZCA9IHBhcnNlSGV4dGV0cyhoYWx2ZXNbMF0hKTtcbiAgaWYgKGhlYWQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIGlmIChoYWx2ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgdGFpbCA9IHBhcnNlSGV4dGV0cyhoYWx2ZXNbMV0hKTtcbiAgICBpZiAodGFpbCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgLy8gXCI6OlwiIG11c3Qgc3RhbmQgaW4gZm9yIGF0IGxlYXN0IG9uZSBhbGwtemVybyBoZXh0ZXQuXG4gICAgY29uc3QgbWlzc2luZyA9IDggLSBoZWFkLmxlbmd0aCAtIHRhaWwubGVuZ3RoO1xuICAgIGlmIChtaXNzaW5nIDwgMSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGhleHRldHNUb1ZhbHVlKFsuLi5oZWFkLCAuLi5BcnJheShtaXNzaW5nKS5maWxsKDApLCAuLi50YWlsXSk7XG4gIH1cblxuICBpZiAoaGVhZC5sZW5ndGggIT09IDgpIHJldHVybiBudWxsO1xuICByZXR1cm4gaGV4dGV0c1RvVmFsdWUoaGVhZCk7XG59XG5cbi8qKlxuICogUGFyc2Ugb25lIGNvbG9uLXNlcGFyYXRlZCBydW4gb2YgSVB2NiBoZXh0ZXRzLCBleHBhbmRpbmcgYSB0cmFpbGluZ1xuICogZW1iZWRkZWQgSVB2NCBncm91cCBpbnRvIGl0cyB0d28gaGV4dGV0cy4gQW4gZW1wdHkgc3RyaW5nIHlpZWxkcyBhblxuICogZW1wdHkgbGlzdCAodGhlIHNpZGUgb2YgYSBsZWFkaW5nIC8gdHJhaWxpbmcgYDo6YCkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGV4dGV0cyhwYXJ0OiBzdHJpbmcpOiBudW1iZXJbXSB8IG51bGwge1xuICBpZiAocGFydCA9PT0gXCJcIikgcmV0dXJuIFtdO1xuICBjb25zdCB0b2tlbnMgPSBwYXJ0LnNwbGl0KFwiOlwiKTtcbiAgY29uc3QgaGV4dGV0czogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpXSE7XG4gICAgaWYgKHRva2VuLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgLy8gQSBkb3R0ZWQtcXVhZCBpcyBvbmx5IGxlZ2FsIGFzIHRoZSBmaW5hbCBncm91cC5cbiAgICAgIGlmIChpICE9PSB0b2tlbnMubGVuZ3RoIC0gMSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCB2NCA9IHBhcnNlSXB2NCh0b2tlbik7XG4gICAgICBpZiAodjQgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgaGV4dGV0cy5wdXNoKE51bWJlcigodjQgPj4gMTZuKSAmIDB4ZmZmZm4pLCBOdW1iZXIodjQgJiAweGZmZmZuKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghSVBWNl9IRVhURVQudGVzdCh0b2tlbikpIHJldHVybiBudWxsO1xuICAgICAgaGV4dGV0cy5wdXNoKHBhcnNlSW50KHRva2VuLCAxNikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGV4dGV0cztcbn1cblxuLyoqIEZvbGQgZXhhY3RseSA4IGhleHRldHMgaW50byBhIHNpbmdsZSAxMjgtYml0IGBiaWdpbnRgLCBlbHNlIGBudWxsYC4gKi9cbmZ1bmN0aW9uIGhleHRldHNUb1ZhbHVlKGhleHRldHM6IG51bWJlcltdKTogYmlnaW50IHwgbnVsbCB7XG4gIGlmIChoZXh0ZXRzLmxlbmd0aCAhPT0gOCkgcmV0dXJuIG51bGw7XG4gIGxldCB2YWx1ZSA9IDBuO1xuICBmb3IgKGNvbnN0IGhleHRldCBvZiBoZXh0ZXRzKSB2YWx1ZSA9ICh2YWx1ZSA8PCAxNm4pIHwgQmlnSW50KGhleHRldCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbiJdfQ==
@@ -1,5 +1,8 @@
1
1
  /**
2
- * Dependency-free object + iterable utilities.
2
+ * Dependency-free object + iterable utilities and the canonical repository
3
+ * owner for stable identity, loose scalar coercion, record guards, sequences,
4
+ * and common object transforms. Reuse these helpers across packages instead of
5
+ * adding local equivalents with different edge-case behavior.
3
6
  *
4
7
  * Value guards / coercions / shape types: {@link isRecord} narrows parsed JSON
5
8
  * to a record, {@link toNumber} coerces a hand-typed numeral, {@link toBoolean}