@dbx-tools/search 0.9.119 → 0.9.120

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/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/search";
6
- export const PACKAGE_VERSION = "0.9.119";
6
+ export const PACKAGE_VERSION = "0.9.120";
7
7
  export * as client from "./src/client.ts";
8
8
  export * as config from "./src/config.ts";
9
9
  export * as indexOptions from "./src/index-options.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/search";
2
- export declare const PACKAGE_VERSION = "0.9.119";
2
+ export declare const PACKAGE_VERSION = "0.9.120";
3
3
  export * as client from "./src/client.ts";
4
4
  export * as config from "./src/config.ts";
5
5
  export * as indexOptions from "./src/index-options.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/search";
5
- export const PACKAGE_VERSION = "0.9.119";
5
+ export const PACKAGE_VERSION = "0.9.120";
6
6
  export * as client from "./src/client.js";
7
7
  export * as config from "./src/config.js";
8
8
  export * as indexOptions from "./src/index-options.js";
@@ -20,4 +20,4 @@ export { LakebaseSearchBackend } from "./src/lakebase.js";
20
20
  export { LakebaseAiSearchPlugin, lakebaseAiSearch } from "./src/lakebase-plugin.js";
21
21
  export { SearchPlugin, search } from "./src/plugin.js";
22
22
  export { SEARCH_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION, ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION, searchToolSchema, universalSearchToolSchema, searchResultSchema, createIndexToolSchema, indexInfoSchema, syncIndexToolSchema } from "./src/schema.js";
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5SyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQ0FBaUMsRUFBRSw4QkFBOEIsRUFBRSw2QkFBNkIsRUFBRSwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTE5XCI7XG5leHBvcnQgKiBhcyBjbGllbnQgZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIGluZGV4T3B0aW9ucyBmcm9tIFwiLi9zcmMvaW5kZXgtb3B0aW9ucy50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2UgZnJvbSBcIi4vc3JjL2xha2ViYXNlLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZVBsdWdpbiBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBuYXRpdmUgZnJvbSBcIi4vc3JjL25hdGl2ZS50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHF1ZXJ5IGZyb20gXCIuL3NyYy9xdWVyeS50c1wiO1xuZXhwb3J0ICogYXMgcnVudGltZSBmcm9tIFwiLi9zcmMvcnVudGltZS50c1wiO1xuZXhwb3J0ICogYXMgc2NoZW1hIGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2wgZnJvbSBcIi4vc3JjL3Rvb2wudHNcIjtcbmV4cG9ydCB7IFNlYXJjaEluZGV4LCBTZWFyY2hDbGllbnQgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaFJlYWRCYWNrZW5kLCBTZWFyY2hPcHRpb25zLCBVbml2ZXJzYWxTZWFyY2hPcHRpb25zLCBJbmRleEluZm8sIENyZWF0ZUluZGV4T3B0aW9ucywgRW5zdXJlRW5kcG9pbnRPcHRpb25zLCBQcm92aXNpb25PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0IHsgSU5ERVhfRU5WLCBEQVRBQlJJQ0tTX0lOREVYX0VOViwgRU5EUE9JTlRfRU5WLCBERUZBVUxUX01PREUsIERFRkFVTFRfUEFHRV9TSVpFLCBERUZBVUxUX1RJTUVPVVRfTVMsIERFRkFVTFRfQkFTRV9QQVRILCBTRUFSQ0hfQ09ORklHX1NDSEVNQSB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VhcmNoSW5kZXhDb25maWcsIFNlYXJjaFBsdWdpbkNvbmZpZywgRW5zdXJlT25TZXR1cENvbmZpZywgUmVzb2x2ZWRJbmRleENvbmZpZywgUmVzb2x2ZWRTZWFyY2hDb25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VTZWFyY2hPcHRpb25zLCBMYWtlYmFzZVNlYXJjaFBvb2wsIExha2ViYXNlUHJvdmlzaW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS50c1wiO1xuZXhwb3J0IHsgTGFrZWJhc2VBaVNlYXJjaFBsdWdpbiwgbGFrZWJhc2VBaVNlYXJjaCB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VBaVNlYXJjaEluZGV4Q29uZmlnLCBMYWtlYmFzZUFpU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXBsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBBaVNlYXJjaFByb3ZpZGVyIH0gZnJvbSBcIi4vc3JjL25hdGl2ZS50c1wiO1xuZXhwb3J0IHsgU2VhcmNoUGx1Z2luLCBzZWFyY2ggfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaFJ1bnRpbWVPcHRpb25zLCBTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vc3JjL3J1bnRpbWUudHNcIjtcbmV4cG9ydCB7IFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLCBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTiwgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sIFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTiwgc2VhcmNoVG9vbFNjaGVtYSwgdW5pdmVyc2FsU2VhcmNoVG9vbFNjaGVtYSwgc2VhcmNoUmVzdWx0U2NoZW1hLCBjcmVhdGVJbmRleFRvb2xTY2hlbWEsIGluZGV4SW5mb1NjaGVtYSwgc3luY0luZGV4VG9vbFNjaGVtYSB9IGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VhcmNoVG9vbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdG9vbC50c1wiO1xuIl19
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5SyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQ0FBaUMsRUFBRSw4QkFBOEIsRUFBRSw2QkFBNkIsRUFBRSwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTIwXCI7XG5leHBvcnQgKiBhcyBjbGllbnQgZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIGluZGV4T3B0aW9ucyBmcm9tIFwiLi9zcmMvaW5kZXgtb3B0aW9ucy50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2UgZnJvbSBcIi4vc3JjL2xha2ViYXNlLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZVBsdWdpbiBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBuYXRpdmUgZnJvbSBcIi4vc3JjL25hdGl2ZS50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHF1ZXJ5IGZyb20gXCIuL3NyYy9xdWVyeS50c1wiO1xuZXhwb3J0ICogYXMgcnVudGltZSBmcm9tIFwiLi9zcmMvcnVudGltZS50c1wiO1xuZXhwb3J0ICogYXMgc2NoZW1hIGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2wgZnJvbSBcIi4vc3JjL3Rvb2wudHNcIjtcbmV4cG9ydCB7IFNlYXJjaEluZGV4LCBTZWFyY2hDbGllbnQgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaFJlYWRCYWNrZW5kLCBTZWFyY2hPcHRpb25zLCBVbml2ZXJzYWxTZWFyY2hPcHRpb25zLCBJbmRleEluZm8sIENyZWF0ZUluZGV4T3B0aW9ucywgRW5zdXJlRW5kcG9pbnRPcHRpb25zLCBQcm92aXNpb25PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0IHsgSU5ERVhfRU5WLCBEQVRBQlJJQ0tTX0lOREVYX0VOViwgRU5EUE9JTlRfRU5WLCBERUZBVUxUX01PREUsIERFRkFVTFRfUEFHRV9TSVpFLCBERUZBVUxUX1RJTUVPVVRfTVMsIERFRkFVTFRfQkFTRV9QQVRILCBTRUFSQ0hfQ09ORklHX1NDSEVNQSB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VhcmNoSW5kZXhDb25maWcsIFNlYXJjaFBsdWdpbkNvbmZpZywgRW5zdXJlT25TZXR1cENvbmZpZywgUmVzb2x2ZWRJbmRleENvbmZpZywgUmVzb2x2ZWRTZWFyY2hDb25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VTZWFyY2hPcHRpb25zLCBMYWtlYmFzZVNlYXJjaFBvb2wsIExha2ViYXNlUHJvdmlzaW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS50c1wiO1xuZXhwb3J0IHsgTGFrZWJhc2VBaVNlYXJjaFBsdWdpbiwgbGFrZWJhc2VBaVNlYXJjaCB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VBaVNlYXJjaEluZGV4Q29uZmlnLCBMYWtlYmFzZUFpU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXBsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBBaVNlYXJjaFByb3ZpZGVyIH0gZnJvbSBcIi4vc3JjL25hdGl2ZS50c1wiO1xuZXhwb3J0IHsgU2VhcmNoUGx1Z2luLCBzZWFyY2ggfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaFJ1bnRpbWVPcHRpb25zLCBTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vc3JjL3J1bnRpbWUudHNcIjtcbmV4cG9ydCB7IFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLCBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTiwgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sIFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTiwgc2VhcmNoVG9vbFNjaGVtYSwgdW5pdmVyc2FsU2VhcmNoVG9vbFNjaGVtYSwgc2VhcmNoUmVzdWx0U2NoZW1hLCBjcmVhdGVJbmRleFRvb2xTY2hlbWEsIGluZGV4SW5mb1NjaGVtYSwgc3luY0luZGV4VG9vbFNjaGVtYSB9IGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VhcmNoVG9vbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdG9vbC50c1wiO1xuIl19
@@ -19,7 +19,7 @@
19
19
  * @module
20
20
  */
21
21
  import { appkit } from "@dbx-tools/appkit";
22
- import type { SearchDocument, SearchMode, SearchRequest, SearchResult, UpsertResult } from "@dbx-tools/shared-search";
22
+ import type { IndexInfo, SearchDocument, SearchMode, SearchRequest, SearchResult, UpsertResult } from "@dbx-tools/shared-search";
23
23
  import { type ResolvedSearchConfig } from "./config.ts";
24
24
  type WorkspaceClientLike = ReturnType<appkit.WorkspaceClientLike["toLegacyWorkspaceClient"]>;
25
25
  /** Query backend used when AppKit owns the Vector Search execution path. */
@@ -86,16 +86,7 @@ export declare class SearchIndex {
86
86
  ensure(options?: CreateIndexOptions): Promise<IndexInfo>;
87
87
  }
88
88
  /** A resolved live index definition. */
89
- export interface IndexInfo {
90
- name: string;
91
- endpoint?: string;
92
- primaryKey?: string;
93
- columns: string[];
94
- ready: boolean;
95
- rowCount?: number;
96
- /** True for a DIRECT_ACCESS index (you supply vectors; queries embed client-side). */
97
- directAccess?: boolean;
98
- }
89
+ export type { IndexInfo };
99
90
  /**
100
91
  * Options for {@link SearchClient.createIndex} / {@link SearchClient.ensureIndex}.
101
92
  * The goal is the same as the rest of the client: name a source table and a
@@ -281,4 +272,3 @@ export declare class SearchClient {
281
272
  }
282
273
  /** Construct a {@link SearchClient} from a resolved config. */
283
274
  export declare function createSearchClient(config?: ResolvedSearchConfig, workspaceClientFactory?: () => WorkspaceClientLike, readBackend?: SearchReadBackend): SearchClient;
284
- export {};
package/lib/src/client.js CHANGED
@@ -532,4 +532,4 @@ function defaultAppKitWorkspaceClient() {
532
532
  export function createSearchClient(config, workspaceClientFactory, readBackend) {
533
533
  return new SearchClient(config, workspaceClientFactory, readBackend);
534
534
  }
535
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBU3JELE9BQU8sRUFDTCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixnQkFBZ0IsR0FFakIsTUFBTSxhQUFhLENBQUM7QUFHckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQTBDM0M7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBRVg7SUFDUTtJQUZuQixZQUNXLElBQVksRUFDSixNQUFvQjtRQUQ1QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ0osV0FBTSxHQUFOLE1BQU0sQ0FBYztJQUNwQyxDQUFDO0lBRUosMERBQTBEO0lBQzFELE1BQU0sQ0FBQyxLQUFhLEVBQUUsT0FBdUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsTUFBYyxF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b24gY2xpZW50LiBSZWFkcyBkZWxlZ2F0ZSB0byB0aGUgcmVnaXN0ZXJlZCBBcHBLaXQtY29tcGF0aWJsZVxuICogYGFpU2VhcmNoYCBwcm92aWRlcjsgdGhpcyBtb2R1bGUgb3ducyBmZWRlcmF0ZWQgZmFuLW91dCBhbmQgdGhlIFZlY3RvciBTZWFyY2hcbiAqIGxpZmVjeWNsZSBBUElzIEFwcEtpdCBkb2VzIG5vdCBleHBvc2UuXG4gKlxuICogYGNsaWVudC5zZWFyY2gocXVlcnksIG9wdHMpYCBzZWFyY2hlcyB0aGUgZGVmYXVsdCBpbmRleDsgYGNsaWVudC5pbmRleChuYW1lKWBcbiAqIHJldHVybnMgYSBoYW5kbGUgYm91bmQgdG8gb25lIGluZGV4OyBgY2xpZW50LnVuaXZlcnNhbFNlYXJjaChxdWVyeSlgIGZhbnMgYVxuICogcXVlcnkgYWNyb3NzIHNldmVyYWwgaW5kZXhlcyBhbmQgbWVyZ2VzIHRoZSByZXN1bHRzIChNZWlsaXNlYXJjaCdzIGZlZGVyYXRlZFxuICogLyBtdWx0aS1zZWFyY2gsIHRoZSBcInVuaXZlcnNhbCBzZWFyY2hcIiB0aGUgY2FsbGVyIGFza2VkIGZvcikuIEV2ZXJ5dGhpbmcgaXNcbiAqIGFzeW5jIGFuZCBjYW5jZWxsYWJsZSBhbmQgcmV0dXJucyB0aGUgYnJvd3Nlci1zYWZlIHNoYXBlcyBmcm9tXG4gKiBgQGRieC10b29scy9zaGFyZWQtc2VhcmNoYC4gTGlmZWN5Y2xlIG1ldGhvZHMgY3Jvc3MgQXBwS2l0J3MgZXhwbGljaXQgbGVnYWN5XG4gKiBjbGllbnQgaGFuZG9mZiBiZWNhdXNlIHRoZSBwdWJsaWMgZmFjYWRlIGRvZXMgbm90IHlldCBleHBvc2UgaW5kZXggY3JlYXRpb24sXG4gKiBzeW5jLCBvciBkZWxldGlvbi5cbiAqXG4gKiBBdXRvY29tcGxldGUgaXMganVzdCBhIHNlYXJjaCB3aXRoIGEgc21hbGwgYGxpbWl0YCBhbmQgdGhlIHJhdyBxdWVyeSB0ZXh0IC1cbiAqIGh5YnJpZCBtb2RlIGFscmVhZHkgcHJlZml4LW1hdGNoZXMsIHNvIG5vIHNlcGFyYXRlIGVuZHBvaW50IGlzIG5lZWRlZDsgdGhlXG4gKiB7QGxpbmsgU2VhcmNoSW5kZXguYXV0b2NvbXBsZXRlfSBoZWxwZXIgaXMgYSB0aGluLCBzZWxmLWRvY3VtZW50aW5nIGFsaWFzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBFeGVjdXRpb25FcnJvciwgZ2V0RXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbFwiO1xuaW1wb3J0IHsgYXBwa2l0LCBkYXRhYnJpY2tzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBpbnZva2UsIHJlc29sdmUgYXMgbW9kZWxSZXNvbHZlLCBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywganNvbiwgbG9nLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFNlYXJjaERvY3VtZW50LFxuICBTZWFyY2hIaXQsXG4gIFNlYXJjaE1vZGUsXG4gIFNlYXJjaFJlcXVlc3QsXG4gIFNlYXJjaFJlc3VsdCxcbiAgVXBzZXJ0UmVzdWx0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX01PREUsXG4gIERFRkFVTFRfUEFHRV9TSVpFLFxuICBERUZBVUxUX1RJTUVPVVRfTVMsXG4gIHJlc29sdmVJbmRleE5hbWUsXG4gIHR5cGUgUmVzb2x2ZWRTZWFyY2hDb25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuXG50eXBlIFdvcmtzcGFjZUNsaWVudExpa2UgPSBSZXR1cm5UeXBlPGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlW1widG9MZWdhY3lXb3Jrc3BhY2VDbGllbnRcIl0+O1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInNlYXJjaC9jbGllbnRcIik7XG5cbi8qKiBRdWVyeSBiYWNrZW5kIHVzZWQgd2hlbiBBcHBLaXQgb3ducyB0aGUgVmVjdG9yIFNlYXJjaCBleGVjdXRpb24gcGF0aC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUmVhZEJhY2tlbmQge1xuICAvKiogV2hldGhlciBWZWN0b3IgU2VhcmNoIGxpZmVjeWNsZSBtZXRob2RzIGFyZSB2YWxpZCBmb3IgdGhpcyBwcm92aWRlci4gKi9cbiAgc3VwcG9ydHNMaWZlY3ljbGU6IGJvb2xlYW47XG4gIHNlYXJjaChpbmRleDogc3RyaW5nLCBxdWVyeTogc3RyaW5nLCBvcHRpb25zPzogU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8U2VhcmNoUmVzdWx0PjtcbiAgYWRkRG9jdW1lbnRzPyhcbiAgICBpbmRleDogc3RyaW5nLFxuICAgIGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+O1xufVxuXG4vKiogT3B0aW9ucyBhY2NlcHRlZCBieSBhIHNpbmdsZS1pbmRleCBzZWFyY2guICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAvKiogTWF4aW11bSBoaXRzIHRvIHJldHVybi4gRGVmYXVsdHMgdG8gdGhlIGNvbmZpZ3VyZWQgcGFnZSBzaXplLiAqL1xuICBsaW1pdD86IG51bWJlcjtcbiAgLyoqIE1hdGNoIG1vZGUuIERlZmF1bHRzIHRvIHRoZSBjb25maWd1cmVkIG1vZGUgKGh5YnJpZCkuICovXG4gIG1vZGU/OiBTZWFyY2hNb2RlO1xuICAvKiogQ29sdW1ucyB0byByZXR1cm4gcGVyIGhpdC4gRGVmYXVsdHMgdG8gdGhlIGluZGV4J3MgY29uZmlndXJlZCBjb2x1bW5zLiAqL1xuICBjb2x1bW5zPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBBcHBLaXQgQUkgU2VhcmNoIHNjYWxhci9hcnJheSBmaWx0ZXJzLiAqL1xuICBmaWx0ZXI/OiBTZWFyY2hSZXF1ZXN0W1wiZmlsdGVyXCJdO1xuICAvKiogRHJvcCBoaXRzIGJlbG93IHRoaXMgc2NvcmUuICovXG4gIHNjb3JlVGhyZXNob2xkPzogbnVtYmVyO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgYSB1bml2ZXJzYWwgKGZlZGVyYXRlZCkgc2VhcmNoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbml2ZXJzYWxTZWFyY2hPcHRpb25zIHtcbiAgLyoqIEluZGV4ZXMgdG8gc2VhcmNoLiBEZWZhdWx0cyB0byBldmVyeSBrbm93biBpbmRleC4gKi9cbiAgaW5kZXhlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogTWF4aW11bSBoaXRzIHBlciBpbmRleCBiZWZvcmUgbWVyZ2luZy4gKi9cbiAgbGltaXQ/OiBudW1iZXI7XG4gIC8qKiBNYXRjaCBtb2RlLiAqL1xuICBtb2RlPzogU2VhcmNoTW9kZTtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogQSBoYW5kbGUgYm91bmQgdG8gb25lIGluZGV4LiBNb2RlbGVkIG9uIE1laWxpc2VhcmNoJ3MgYGNsaWVudC5pbmRleCh1aWQpYDpcbiAqIGBzZWFyY2hgIC8gYGF1dG9jb21wbGV0ZWAgcmVhZCwgYGFkZERvY3VtZW50c2AgLyBgZGVsZXRlRG9jdW1lbnRzYCB3cml0ZSAodG9cbiAqIGEgZGlyZWN0LWFjY2VzcyBpbmRleCksIGFuZCBgaW5mb2AgZmV0Y2hlcyB0aGUgbGl2ZSBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoSW5kZXgge1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFNlYXJjaENsaWVudCxcbiAgKSB7fVxuXG4gIC8qKiBTZWFyY2ggdGhpcyBpbmRleC4gU2VlIHtAbGluayBTZWFyY2hDbGllbnQuc2VhcmNofS4gKi9cbiAgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM/OiBTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VhcmNoKHF1ZXJ5LCB7IC4uLm9wdGlvbnMsIGluZGV4OiB0aGlzLm5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXV0b2NvbXBsZXRlIGFnYWluc3QgdGhpcyBpbmRleDogYSBzZWFyY2ggd2l0aCBhIHNtYWxsIGRlZmF1bHQgYGxpbWl0YCBhbmRcbiAgICogdGhlIHJhdyBwcmVmaXggYXMgdGhlIHF1ZXJ5LiBIeWJyaWQgbW9kZSBhbHJlYWR5IGhhbmRsZXMgcHJlZml4ZXMsIHNvIHRoaXNcbiAgICogaXMgYSBzZWxmLWRvY3VtZW50aW5nIGFsaWFzIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgY29kZSBwYXRoLlxuICAgKi9cbiAgYXV0b2NvbXBsZXRlKHByZWZpeDogc3RyaW5nLCBvcHRpb25zPzogU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoKHByZWZpeCwgeyBsaW1pdDogNSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBpbiB0aGlzIChkaXJlY3QtYWNjZXNzKSBpbmRleC4gKi9cbiAgYWRkRG9jdW1lbnRzKGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5hZGREb2N1bWVudHModGhpcy5uYW1lLCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRGVsZXRlIGRvY3VtZW50cyBmcm9tIHRoaXMgKGRpcmVjdC1hY2Nlc3MpIGluZGV4IGJ5IHByaW1hcnkga2V5LiAqL1xuICBkZWxldGVEb2N1bWVudHMoaWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZURvY3VtZW50cyh0aGlzLm5hbWUsIGlkcywgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCB0aGlzIGluZGV4J3MgbGl2ZSBkZWZpbml0aW9uIChwcmltYXJ5IGtleSwgY29sdW1ucywgcmVhZGluZXNzKS4gKi9cbiAgaW5mbyhzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldEluZGV4KHRoaXMubmFtZSwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyIGEgc3luYyBvZiB0aGlzIChEZWx0YSBTeW5jKSBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG4gIHN5bmMoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc3luY0luZGV4KHRoaXMubmFtZSwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgdGhpcyBpbmRleC4gKi9cbiAgZGVsZXRlKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZUluZGV4KHRoaXMubmFtZSwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgdGhpcyBpbmRleCBpZiBpdCBkb2VzIG5vdCBleGlzdCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZXhpc3Rpbmcgb25lLiAqL1xuICBlbnN1cmUob3B0aW9ucz86IENyZWF0ZUluZGV4T3B0aW9ucyk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmVuc3VyZUluZGV4KHRoaXMubmFtZSwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqIEEgcmVzb2x2ZWQgbGl2ZSBpbmRleCBkZWZpbml0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRleEluZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICBjb2x1bW5zOiBzdHJpbmdbXTtcbiAgcmVhZHk6IGJvb2xlYW47XG4gIHJvd0NvdW50PzogbnVtYmVyO1xuICAvKiogVHJ1ZSBmb3IgYSBESVJFQ1RfQUNDRVNTIGluZGV4ICh5b3Ugc3VwcGx5IHZlY3RvcnM7IHF1ZXJpZXMgZW1iZWQgY2xpZW50LXNpZGUpLiAqL1xuICBkaXJlY3RBY2Nlc3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBTZWFyY2hDbGllbnQuY3JlYXRlSW5kZXh9IC8ge0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVJbmRleH0uXG4gKiBUaGUgZ29hbCBpcyB0aGUgc2FtZSBhcyB0aGUgcmVzdCBvZiB0aGUgY2xpZW50OiBuYW1lIGEgc291cmNlIHRhYmxlIGFuZCBhXG4gKiB0ZXh0IGNvbHVtbiwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSAtIHRoZSBlbmRwb2ludCwgdGhlIGVtYmVkZGluZyBtb2RlbCwgdGhlXG4gKiBpbmRleCB0eXBlLCB0aGUgc3luYyBtb2RlIC0gaGFzIGEgc2Vuc2libGUgZGVmYXVsdCB0aGF0IGluZmVycyBmcm9tIHRoZVxuICogd29ya3NwYWNlLCBvdmVycmlkYWJsZSB3aGVuIGEgZGVwbG95bWVudCBuZWVkcyB0byBnbyBkZWVwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlSW5kZXhPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNvdXJjZSBEZWx0YSB0YWJsZSAoY2F0YWxvZy5zY2hlbWEudGFibGUpIGZvciBhIERlbHRhIFN5bmMgaW5kZXguIFByb3ZpZGVcbiAgICogdGhpcyBmb3IgdGhlIGNvbW1vbiBjYXNlOiBEYXRhYnJpY2tzIGNvbXB1dGVzIGFuZCBzeW5jcyBlbWJlZGRpbmdzIGZyb20gaXQuXG4gICAqIE9taXQgaXQgKGFuZCBwYXNzIHtAbGluayBlbWJlZGRpbmdEaW1lbnNpb259KSB0byBjcmVhdGUgYSBkaXJlY3QtYWNjZXNzXG4gICAqIGluZGV4IHlvdSB3cml0ZSB2ZWN0b3JzIHRvIHlvdXJzZWxmLlxuICAgKi9cbiAgc291cmNlVGFibGU/OiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5LWtleSBjb2x1bW4uIERlZmF1bHRzIHRvIGBpZGAuICovXG4gIHByaW1hcnlLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBjb2x1bW4gZW1iZWRkaW5ncyBhcmUgY29tcHV0ZWQgZnJvbSAoRGVsdGEgU3luYykuIERlZmF1bHRzIHRvIHRoZVxuICAgKiBmaXJzdCBvZiBgdGV4dGAgLyBgY29udGVudGAgLyBgYm9keWAgcHJlc2VudCwgZWxzZSB0aGUgY2FsbGVyIG11c3Qgc2V0IGl0LlxuICAgKi9cbiAgZW1iZWRkaW5nU291cmNlQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogRW1iZWRkaW5nIG1vZGVsIGVuZHBvaW50LiBBIGxvb3NlIG5hbWUgaXMgZnV6enktbWF0Y2hlZDsgd2hlbiBvbWl0dGVkIHRoZVxuICAgKiBiZXN0IGVtYmVkZGluZyBlbmRwb2ludCBpbiB0aGUgd29ya3NwYWNlIGlzIGNob3NlbiAoe0BsaW5rIHJlc29sdmVFbWJlZGRpbmdNb2RlbH0pLlxuICAgKi9cbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IHRvIGhvc3QgdGhlIGluZGV4IG9uLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgYGVuZHBvaW50YC4gKi9cbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgZW1iZWRkaW5nIHZlY3RvciBkaW1lbnNpb24gKHNlbGYtbWFuYWdlZCB2ZWN0b3JzLCBubyBzb3VyY2UgdGFibGUpLiAqL1xuICBlbWJlZGRpbmdEaW1lbnNpb24/OiBudW1iZXI7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgY29sdW1uIHRoZSB2ZWN0b3IgaXMgc3RvcmVkIGluLiBEZWZhdWx0cyB0byBgZW1iZWRkaW5nYC4gKi9cbiAgZW1iZWRkaW5nVmVjdG9yQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbHVtbi1uYW1lIC0+IHR5cGUgbWFwIHVzZWQgdG8gYnVpbGQgYSBkaXJlY3QtYWNjZXNzIGluZGV4J3NcbiAgICogYHNjaGVtYV9qc29uYCAodHlwZXM6IGBzdHJpbmdgLCBgaW50YCwgYGxvbmdgLCBgZmxvYXRgLCBgZG91YmxlYCxcbiAgICogYGJvb2xlYW5gLCBgZGF0ZWAsIGB0aW1lc3RhbXBgKS4gTXVzdCBpbmNsdWRlIHRoZSBwcmltYXJ5IGtleSBhbmQgYW55XG4gICAqIGNvbHVtbnMgeW91IHVwc2VydC4gRGVmYXVsdHMgdG8gYHsgaWQ6IFwic3RyaW5nXCIsIHRleHQ6IFwic3RyaW5nXCIgfWAuIFRoZVxuICAgKiBlbWJlZGRpbmcgdmVjdG9yIGNvbHVtbiBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgc2NoZW1hPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFN5bmMgbW9kZSBmb3IgYSBEZWx0YSBTeW5jIGluZGV4LiBgVFJJR0dFUkVEYCAoZGVmYXVsdCkgc3luY3Mgb24gZGVtYW5kOyBgQ09OVElOVU9VU2Aga2VlcHMgZnJlc2guICovXG4gIHBpcGVsaW5lVHlwZT86IFwiVFJJR0dFUkVEXCIgfCBcIkNPTlRJTlVPVVNcIjtcbiAgLyoqIEV4dHJhIGNvbHVtbnMgdG8gc3luYyBhbG9uZ3NpZGUgdGhlIGVtYmVkZGluZyBzb3VyY2UgKERlbHRhIFN5bmMpLiAqL1xuICBjb2x1bW5zVG9TeW5jPzogc3RyaW5nW107XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVFbmRwb2ludH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEVuc3VyZUVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBXYWl0IGZvciB0aGUgZW5kcG9pbnQgdG8gY29tZSBvbmxpbmUgYmVmb3JlIHJldHVybmluZy4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHdhaXQ/OiBib29sZWFuO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU2VhcmNoQ2xpZW50LnByb3Zpc2lvbn0gLSBhIG9uZS1jYWxsIFwibWFrZSB0aGlzIGluZGV4IHJlYWxcbiAqIGFuZCBzZWFyY2hhYmxlXCIgdXNlZCBhdCBib290IG9yIGluIGEgc2VlZCBzY3JpcHQuIEl0IGVuc3VyZXMgdGhlIGVuZHBvaW50LFxuICogZW5zdXJlcyB0aGUgaW5kZXgsIGFuZCAob3B0aW9uYWxseSkgc2VlZHMgZG9jdW1lbnRzIHdoZW4gdGhlIGluZGV4IGlzIGVtcHR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvbk9wdGlvbnMgZXh0ZW5kcyBDcmVhdGVJbmRleE9wdGlvbnMge1xuICAvKiogRG9jdW1lbnRzIHRvIHNlZWQgd2hlbiB0aGUgaW5kZXggaGFzIG5vIHJvd3MgeWV0LiBTa2lwcGVkIGlmIGl0IGFscmVhZHkgaGFzIGRhdGEuICovXG4gIHNlZWQ/OiBTZWFyY2hEb2N1bWVudFtdO1xuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIGVuZHBvaW50IEFORCBpbmRleCB0byBjb21lIG9ubGluZSBiZWZvcmUgcmV0dXJuaW5nIChuZWVkZWRcbiAgICogYmVmb3JlIHNlZWRpbmcpLiBEZWZhdWx0cyB0byB0cnVlLiBFbmRwb2ludCBjcmVhdGlvbiBjYW4gdGFrZSBtYW55IG1pbnV0ZXMuXG4gICAqL1xuICB3YWl0PzogYm9vbGVhbjtcbiAgLyoqIEhvdyBsb25nIHRvIHdhaXQgZm9yIHJlYWRpbmVzcyBiZWZvcmUgZ2l2aW5nIHVwLiBEZWZhdWx0cyB0byAyMCBtaW51dGVzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIEFJIFNlYXJjaCBjbGllbnQuIENvbnN0cnVjdCBpdCB3aXRoIHtAbGluayBjcmVhdGVTZWFyY2hDbGllbnR9ICh3aGljaFxuICogcmVhZHMgYSByZXNvbHZlZCBjb25maWcpIG9yIGRpcmVjdGx5IGZvciBvbmUtb2ZmIHVzZS4gQWxsIHJlYWRzIHJlc29sdmUgdGhlXG4gKiBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUmVzb2x2ZWRTZWFyY2hDb25maWcgPSB7XG4gICAgICBpbmRleGVzOiBbXSxcbiAgICAgIHBhZ2VTaXplOiBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgIG1vZGU6IERFRkFVTFRfTU9ERSxcbiAgICAgIGJhc2VQYXRoOiBcIi9hcGkvc2VhcmNoXCIsXG4gICAgICB0aW1lb3V0TXM6IERFRkFVTFRfVElNRU9VVF9NUyxcbiAgICAgIGFsbG93V3JpdGU6IGZhbHNlLFxuICAgIH0sXG4gICAgcHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2VDbGllbnRGYWN0b3J5OiAoKSA9PiBXb3Jrc3BhY2VDbGllbnRMaWtlID0gZGVmYXVsdFdvcmtzcGFjZUNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWRCYWNrZW5kPzogU2VhcmNoUmVhZEJhY2tlbmQsXG4gICkge31cblxuICAvKiogQSBoYW5kbGUgYm91bmQgdG8gb25lIGluZGV4IChieSBmdWxsIFVDIG5hbWUgb3IgY29uZmlndXJlZCBhbGlhcykuICovXG4gIGluZGV4KHJlZmVyZW5jZTogc3RyaW5nKTogU2VhcmNoSW5kZXgge1xuICAgIGNvbnN0IG5hbWUgPSByZXNvbHZlSW5kZXhOYW1lKHRoaXMuY29uZmlnLCByZWZlcmVuY2UpID8/IHJlZmVyZW5jZTtcbiAgICByZXR1cm4gbmV3IFNlYXJjaEluZGV4KG5hbWUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBvbmUgaW5kZXguIGBpbmRleGAgbWF5IGJlIGEgZnVsbCBVQyBuYW1lLCBhIGNvbmZpZ3VyZWQgYWxpYXMsIG9yXG4gICAqIG9taXR0ZWQgdG8gdXNlIHRoZSBkZWZhdWx0IGluZGV4LiBSZXR1cm5zIGhpdHMgc29ydGVkIG1vc3QtcmVsZXZhbnQtZmlyc3QuXG4gICAqL1xuICBhc3luYyBzZWFyY2goXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBTZWFyY2hPcHRpb25zICYgeyBpbmRleD86IHN0cmluZyB9ID0ge30sXG4gICk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgY29uc3QgdGV4dCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lID0gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgb3B0aW9ucy5pbmRleCk7XG4gICAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gaW5kZXggY29uZmlndXJlZDsgc2V0IGEgZGVmYXVsdCBpbmRleCBvciBwYXNzIG9uZVwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcInNlYXJjaFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnJlYWRCYWNrZW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIFwic2VhcmNoOiBubyBBSSBTZWFyY2ggcHJvdmlkZXIgcmVnaXN0ZXJlZDsgYWRkIGFpU2VhcmNoKCkgb3IgbGFrZWJhc2VBaVNlYXJjaCgpXCIsXG4gICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb246IFwic2VhcmNoXCIgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVhZEJhY2tlbmQuc2VhcmNoKG5hbWUsIHRleHQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBsaW1pdDogb3B0aW9ucy5saW1pdCA/PyB0aGlzLmNvbmZpZy5wYWdlU2l6ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW4gYSBxdWVyeSBhY3Jvc3Mgc2V2ZXJhbCBpbmRleGVzIGFuZCBtZXJnZSB0aGUgaGl0cywgc29ydGVkIGJ5IHNjb3JlIC1cbiAgICogdGhlIFwidW5pdmVyc2FsIHNlYXJjaFwiIGEgc2luZ2xlIGJveCBvdmVyIG1hbnkgY29sbGVjdGlvbnMgbmVlZHMuIEVhY2hcbiAgICogaW5kZXggaXMgc2VhcmNoZWQgY29uY3VycmVudGx5OyBhbiBpbmRleCB0aGF0IGVycm9ycyBpcyBsb2dnZWQgYW5kIHNraXBwZWRcbiAgICogc28gb25lIGJhZCBpbmRleCBkb2VzIG5vdCBzaW5rIHRoZSB3aG9sZSBzZWFyY2guXG4gICAqL1xuICBhc3luYyB1bml2ZXJzYWxTZWFyY2goXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBVbml2ZXJzYWxTZWFyY2hPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgY29uc3QgdGV4dCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lcyA9XG4gICAgICBvcHRpb25zLmluZGV4ZXMgJiYgb3B0aW9ucy5pbmRleGVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBvcHRpb25zLmluZGV4ZXMubWFwKChyZWYpID0+IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZikgPz8gcmVmKVxuICAgICAgICA6IHRoaXMuY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLm5hbWUpO1xuICAgIGNvbnN0IHBlckluZGV4ID0gb3B0aW9ucy5saW1pdCA/PyB0aGlzLmNvbmZpZy5wYWdlU2l6ZTtcblxuICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBuYW1lcy5tYXAoYXN5bmMgKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZWFyY2godGV4dCwge1xuICAgICAgICAgIGluZGV4OiBuYW1lLFxuICAgICAgICAgIGxpbWl0OiBwZXJJbmRleCxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5tb2RlID8geyBtb2RlOiBvcHRpb25zLm1vZGUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQuaGl0cy5tYXAoKGhpdCk6IFNlYXJjaEhpdCA9PiAoeyAuLi5oaXQsIGluZGV4OiBuYW1lIH0pKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBoaXRzID0gc2V0dGxlZFxuICAgICAgLmZsYXRNYXAoKG91dGNvbWUsIGkpID0+IHtcbiAgICAgICAgaWYgKG91dGNvbWUuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSByZXR1cm4gb3V0Y29tZS52YWx1ZTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ1bml2ZXJzYWwtaW5kZXgtZmFpbGVkXCIsIHsgaW5kZXg6IG5hbWVzW2ldIH0pO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcblxuICAgIHJldHVybiB7IHF1ZXJ5OiB0ZXh0LCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGluZGV4IHJlZmVyZW5jZSAoZnVsbCBVQyBuYW1lIG9yIGNvbmZpZ3VyZWQgYWxpYXMpIHRvIHRoZSBuYW1lXG4gICAqIHRoZSBBUEkgZXhwZWN0cywgZmFpbGluZyBmYXN0IHdoZW4gaXQgcmVzb2x2ZXMgdG8gbm90aGluZy4gV2l0aG91dCB0aGlzIGFcbiAgICogYmxhbmsgcmVmZXJlbmNlIC0gd2hhdCBhbiBvbWl0dGVkIGBpbmRleGAgYmVjb21lcyB3aGVuIG5vIGRlZmF1bHQgaXNcbiAgICogY29uZmlndXJlZCAtIHJlYWNoZXMgdGhlIFNESyBhcyBhbiBlbXB0eSBgaW5kZXhfbmFtZWAsIHdoaWNoIGJ1aWxkcyBhXG4gICAqIFVSTCB3aXRoIHRoZSBuYW1lIHNlZ21lbnQgbWlzc2luZyBhbmQgY29tZXMgYmFjayBhcyBhIGNvbmZ1c2luZ1xuICAgKiBgRU5EUE9JTlRfTk9UX0ZPVU5EYCBpbnN0ZWFkIG9mIG5hbWluZyB0aGUgcmVhbCBwcm9ibGVtLlxuICAgKi9cbiAgcHJpdmF0ZSByZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZTogc3RyaW5nLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmZXJlbmNlKSA/PyByZWZlcmVuY2UpO1xuICAgIGlmIChuYW1lID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIGBzZWFyY2g6IG5vIGluZGV4IGNvbmZpZ3VyZWQ7IHNldCBhIGRlZmF1bHQgaW5kZXggb3IgcGFzcyBvbmUgdG8gJHtvcGVyYXRpb259YCxcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIC8qKiBSZWplY3QgVmVjdG9yIFNlYXJjaCBsaWZlY3ljbGUgY2FsbHMgYWdhaW5zdCBhIG5vbi1WZWN0b3IgcHJvdmlkZXIuICovXG4gIHByaXZhdGUgcmVxdWlyZUxpZmVjeWNsZShvcGVyYXRpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRCYWNrZW5kICYmICF0aGlzLnJlYWRCYWNrZW5kLnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoYHNlYXJjaDogdGhlIHJlZ2lzdGVyZWQgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCAke29wZXJhdGlvbn1gLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogRmV0Y2ggYW4gaW5kZXgncyBsaXZlIGRlZmluaXRpb24uICovXG4gIGFzeW5jIGdldEluZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiZ2V0SW5kZXhcIik7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiZ2V0SW5kZXhcIik7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJnZXRJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5nZXRJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBjb25zdCBkaXJlY3RBY2Nlc3MgPSBpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWMgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzcGVjID0gaW5kZXguZGVsdGFfc3luY19pbmRleF9zcGVjID8/IGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYztcbiAgICAvLyBEZWx0YSBTeW5jIHN1cmZhY2VzIGl0cyBlbWJlZGRpbmcgc291cmNlIGNvbHVtbnMgZGlyZWN0bHk7IGEgZGlyZWN0LWFjY2Vzc1xuICAgIC8vIGluZGV4IGNhcnJpZXMgaXRzIGNvbHVtbnMgaW4gc2NoZW1hX2pzb24gKG1pbnVzIHRoZSB2ZWN0b3IgY29sdW1uKS5cbiAgICBsZXQgY29sdW1ucyA9IChzcGVjPy5lbWJlZGRpbmdfc291cmNlX2NvbHVtbnMgPz8gW10pLm1hcCgoYykgPT4gYy5uYW1lID8/IFwiXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBzY2hlbWFKc29uID0gaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjPy5zY2hlbWFfanNvbjtcbiAgICBpZiAoZGlyZWN0QWNjZXNzICYmIHNjaGVtYUpzb24pIHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGpzb24ucGFyc2VSZWNvcmQoc2NoZW1hSnNvbikgPz8ge307XG4gICAgICBjb25zdCB2ZWN0b3JOYW1lcyA9IG5ldyBTZXQoXG4gICAgICAgIChpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM/LmVtYmVkZGluZ192ZWN0b3JfY29sdW1ucyA/PyBbXSlcbiAgICAgICAgICAubWFwKChjKSA9PiBjLm5hbWUpXG4gICAgICAgICAgLmZpbHRlcigobik6IG4gaXMgc3RyaW5nID0+IEJvb2xlYW4obikpLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbnMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcigoYykgPT4gIXZlY3Rvck5hbWVzLmhhcyhjKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBpbmRleC5uYW1lID8/IG5hbWUsXG4gICAgICAuLi4oaW5kZXguZW5kcG9pbnRfbmFtZSA/IHsgZW5kcG9pbnQ6IGluZGV4LmVuZHBvaW50X25hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihpbmRleC5wcmltYXJ5X2tleSA/IHsgcHJpbWFyeUtleTogaW5kZXgucHJpbWFyeV9rZXkgfSA6IHt9KSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICByZWFkeTogaW5kZXguc3RhdHVzPy5yZWFkeSA/PyBmYWxzZSxcbiAgICAgIC4uLihpbmRleC5zdGF0dXM/LmluZGV4ZWRfcm93X2NvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHJvd0NvdW50OiBpbmRleC5zdGF0dXMuaW5kZXhlZF9yb3dfY291bnQgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihkaXJlY3RBY2Nlc3MgPyB7IGRpcmVjdEFjY2VzczogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gYSBkaXJlY3QtYWNjZXNzIGluZGV4LiAqL1xuICBhc3luYyBhZGREb2N1bWVudHMoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImFkZERvY3VtZW50c1wiKTtcbiAgICBpZiAodGhpcy5yZWFkQmFja2VuZD8uYWRkRG9jdW1lbnRzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQmFja2VuZC5hZGREb2N1bWVudHMobmFtZSwgZG9jdW1lbnRzLCBzaWduYWwpO1xuICAgIH1cbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJhZGREb2N1bWVudHNcIik7XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiYWRkRG9jdW1lbnRzXCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLnVwc2VydERhdGFWZWN0b3JJbmRleChcbiAgICAgICAgeyBpbmRleF9uYW1lOiBuYW1lLCBpbnB1dHNfanNvbjogSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnRzKSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiB7IGluZGV4OiBuYW1lLCBjb3VudDogZG9jdW1lbnRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqIERlbGV0ZSBkb2N1bWVudHMgZnJvbSBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggYnkgcHJpbWFyeSBrZXkuICovXG4gIGFzeW5jIGRlbGV0ZURvY3VtZW50cyhcbiAgICByZWZlcmVuY2U6IHN0cmluZyxcbiAgICBpZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiZGVsZXRlRG9jdW1lbnRzXCIpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImRlbGV0ZURvY3VtZW50c1wiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJkZWxldGVEb2N1bWVudHNcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuZGVsZXRlRGF0YVZlY3RvckluZGV4KFxuICAgICAgICB7IGluZGV4X25hbWU6IG5hbWUsIHByaW1hcnlfa2V5czogaWRzLm1hcChTdHJpbmcpIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIHsgaW5kZXg6IG5hbWUsIGNvdW50OiBpZHMubGVuZ3RoIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhbiBlbWJlZGRpbmcgZW5kcG9pbnQgaWQgZm9yIGNyZWF0aW5nIGEgRGVsdGEgU3luYyBpbmRleC4gUmV1c2VzXG4gICAqIHRoZSBtb2RlbCByZXNvbHZlcjogYSBjb25maWd1cmVkIC8gcGFzc2VkIG5hbWUgaXMgZnV6enktbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBsaXZlIGNhdGFsb2d1ZSwgb3RoZXJ3aXNlIHRoZSBoaWdoZXN0LXJhbmtlZCBlbWJlZGRpbmcgZW5kcG9pbnQgaXMgY2hvc2VuLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZUVtYmVkZGluZ01vZGVsKHJlcXVlc3RlZD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBleHBsaWNpdCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVxdWVzdGVkID8/IHRoaXMuY29uZmlnLmVtYmVkZGluZ01vZGVsKTtcbiAgICAvLyBBbiBleHBsaWNpdCBuYW1lIHRoYXQgYWxyZWFkeSBsb29rcyBsaWtlIGFuIGVuZHBvaW50IGlkIChubyB3aGl0ZXNwYWNlKVxuICAgIC8vIGlzIHVzZWQgdmVyYmF0aW0gLSBubyBuZWVkIHRvIGZldGNoIGFuZCBmdXp6eS1tYXRjaCB0aGUgbGl2ZSBjYXRhbG9ndWUuXG4gICAgLy8gQSBnZW51aW5lbHkgbG9vc2UgbmFtZSAoZS5nLiBcImd0ZSBsYXJnZVwiKSBzdGlsbCByZXNvbHZlcyBhZ2FpbnN0IGl0LlxuICAgIGlmIChleHBsaWNpdCAmJiAhL1xccy8udGVzdChleHBsaWNpdCkpIHJldHVybiBleHBsaWNpdDtcbiAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgY29uc3QgY2xpZW50ID0gZGVmYXVsdEFwcEtpdFdvcmtzcGFjZUNsaWVudCgpO1xuICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbW9kZWxDYXRhbG9nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCk7XG4gICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IHsgbW9kZWxJZCB9ID0gbW9kZWxSZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHtcbiAgICAgIC4uLihleHBsaWNpdCA/IHsgZXhwbGljaXQgfSA6IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobW9kZWxJZCk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWQgdGV4dCB2aWEgYSBEYXRhYnJpY2tzIGVtYmVkZGluZyBzZXJ2aW5nIGVuZHBvaW50LCByZXR1cm5pbmcgb25lXG4gICAqIHZlY3RvciBwZXIgaW5wdXQuIFVzZWQgdG8gc2VlZCBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggYW5kIHRvIHR1cm4gYSBzZWFyY2hcbiAgICogcXVlcnkgaW50byBhIHF1ZXJ5IHZlY3RvciAtIERhdGFicmlja3Mgb25seSBtYW5hZ2VzIGVtYmVkZGluZ3MgZm9yIERlbHRhXG4gICAqIFN5bmMgaW5kZXhlcywgc28gYSBkaXJlY3QtYWNjZXNzIGluZGV4IChubyBEZWx0YSB0YWJsZSwgbm8gd2FyZWhvdXNlKSBuZWVkc1xuICAgKiB0aGUgY2xpZW50IHRvIGVtYmVkIG9uIHdyaXRlIGFuZCBvbiBxdWVyeS4gVGhlIGVuZHBvaW50IGlzIHJlc29sdmVkIHRoZVxuICAgKiBzYW1lIHdheSBhcyBmb3IgaW5kZXggY3JlYXRpb24gd2hlbiBub3QgbmFtZWQuXG4gICAqL1xuICBhc3luYyBlbWJlZCh0ZXh0czogc3RyaW5nW10sIG1vZGVsPzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8bnVtYmVyW11bXT4ge1xuICAgIGlmICh0ZXh0cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBlbmRwb2ludCA9IGF3YWl0IHRoaXMucmVzb2x2ZUVtYmVkZGluZ01vZGVsKG1vZGVsLCBzaWduYWwpO1xuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsIHRvIGVtYmVkIHRleHRcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcImVtYmVkXCIsIHNpZ25hbCwgYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHVybCA9IGludm9rZS5pbnZvY2F0aW9uc1VybChob3N0LCBlbmRwb2ludCk7XG4gICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGNsaWVudCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLmhlYWRlcnMsIFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5wdXQ6IHRleHRzIH0pLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgICAgYHNlYXJjaDogZW1iZWRkaW5nIGVuZHBvaW50ICR7ZW5kcG9pbnR9IGZhaWxlZCAoJHtyZXNwb25zZS5zdGF0dXN9KWAsXG4gICAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRhdGE/OiBBcnJheTx7IGVtYmVkZGluZzogbnVtYmVyW10gfT4gfTtcbiAgICAgIGNvbnN0IHZlY3RvcnMgPSAoYm9keS5kYXRhID8/IFtdKS5tYXAoKHJvdykgPT4gcm93LmVtYmVkZGluZyk7XG4gICAgICBpZiAodmVjdG9ycy5sZW5ndGggIT09IHRleHRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGVtYmVkZGluZyByZXNwb25zZSBkaWQgbm90IG1hdGNoIHRoZSBpbnB1dCBjb3VudFwiLCB7XG4gICAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW1iZWRcIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2ZWN0b3JzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSB2ZWN0b3IgZGltZW5zaW9uIGEgbW9kZWwgcHJvZHVjZXMgKGVtYmVkcyBhIHByb2JlIHN0cmluZyBvbmNlKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbWJlZGRpbmdEaW1lbnNpb24obW9kZWw/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBbdmVjdG9yXSA9IGF3YWl0IHRoaXMuZW1iZWQoW1wiZGltZW5zaW9uIHByb2JlXCJdLCBtb2RlbCwgc2lnbmFsKTtcbiAgICBpZiAoIXZlY3RvciB8fCB2ZWN0b3IubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGVtYmVkZGluZyBkaW1lbnNpb25cIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZlY3Rvci5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEFJIFNlYXJjaCBpbmRleCB3aXRoIGFzIGxpdHRsZSBjZXJlbW9ueSBhcyBwb3NzaWJsZS4gVHdvIHNoYXBlczpcbiAgICpcbiAgICogICAtICoqRGVsdGEgU3luYyoqICh0aGUgZGVmYXVsdCk6IHBhc3MgYHNvdXJjZVRhYmxlYDsgRGF0YWJyaWNrcyBjb21wdXRlc1xuICAgKiAgICAgZW1iZWRkaW5ncyBmcm9tIHRoZSB0ZXh0IGNvbHVtbiBhbmQga2VlcHMgdGhlIGluZGV4IHN5bmNlZC4gVGhlXG4gICAqICAgICBlbWJlZGRpbmcgbW9kZWwgaXMgcmVzb2x2ZWQgYXV0b21hdGljYWxseSB3aGVuIG5vdCBuYW1lZC5cbiAgICogICAtICoqRGlyZWN0IEFjY2VzcyoqOiBvbWl0IGBzb3VyY2VUYWJsZWAgYW5kIHBhc3MgYGVtYmVkZGluZ0RpbWVuc2lvbmA7XG4gICAqICAgICB5b3Ugd3JpdGUgdmVjdG9ycyB5b3Vyc2VsZiB2aWEge0BsaW5rIGFkZERvY3VtZW50c30uXG4gICAqXG4gICAqIEV2ZXJ5dGhpbmcgZWxzZSBpbmZlcnM6IHRoZSBlbmRwb2ludCBmcm9tIHRoZSBwbHVnaW4gY29uZmlnLCB0aGUgcHJpbWFyeVxuICAgKiBrZXkgKGBpZGApLCB0aGUgdGV4dCBjb2x1bW4gKGB0ZXh0YCAvIGBjb250ZW50YCAvIGBib2R5YCksIGFuZCB0aGUgdmVjdG9yXG4gICAqIGNvbHVtbiAoYGVtYmVkZGluZ2ApLiBSZXR1cm5zIHRoZSBjcmVhdGVkIGluZGV4J3Mge0BsaW5rIEluZGV4SW5mb30uXG4gICAqL1xuICBhc3luYyBjcmVhdGVJbmRleChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJjcmVhdGVJbmRleFwiKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogbm8gVmVjdG9yIFNlYXJjaCBlbmRwb2ludCBjb25maWd1cmVkOyBwYXNzIGBlbmRwb2ludGAgb3Igc2V0IGl0IG9uIHRoZSBwbHVnaW5cIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBvcHRpb25zLnByaW1hcnlLZXkgPz8gXCJpZFwiO1xuICAgIGNvbnN0IGRpcmVjdCA9ICFvcHRpb25zLnNvdXJjZVRhYmxlO1xuICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiO1xuICAgIGNvbnN0IHZlY3RvckNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nVmVjdG9yQ29sdW1uID8/IFwiZW1iZWRkaW5nXCI7XG5cbiAgICAvLyBEZWx0YSBTeW5jIGxldHMgRGF0YWJyaWNrcyBlbWJlZCBhIHNvdXJjZSBjb2x1bW4sIHNvIGl0IG5lZWRzIGFuIGVtYmVkZGluZ1xuICAgIC8vIG1vZGVsLiBBIGRpcmVjdC1hY2Nlc3MgaW5kZXggc3RvcmVzIHZlY3RvcnMgWU9VIHN1cHBseSAoRGF0YWJyaWNrcyBvbmx5XG4gICAgLy8gc3VwcG9ydHMgbWFuYWdlZCBlbWJlZGRpbmdzIG9uIERlbHRhIFN5bmMpLCBzbyBpdCBuZWVkcyBhIGRpbWVuc2lvbjsgd2VcbiAgICAvLyByZXNvbHZlIG9uZSBmcm9tIHRoZSBlbWJlZGRpbmcgbW9kZWwgd2hlbiBub3QgZ2l2ZW4gc28gYSBkaXJlY3QtYWNjZXNzXG4gICAgLy8gaW5kZXggc3RpbGwgd29ya3Mgd2l0aCB6ZXJvIGV4dHJhIGNvbmZpZyAoZW1iZWQgdmlhIGBlbWJlZCgpYCBvbiBzZWVkICtcbiAgICAvLyBxdWVyeSAtIHNlZSBgcHJvdmlzaW9uYCAvIGBzZWFyY2hgKS5cbiAgICBjb25zdCBlbWJlZGRpbmdNb2RlbCA9XG4gICAgICAoYXdhaXQgdGhpcy5yZXNvbHZlRW1iZWRkaW5nTW9kZWwob3B0aW9ucy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKSA/PyB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbWJlZGRpbmdNb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsOyBwYXNzIGBlbWJlZGRpbmdNb2RlbGBcIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRpbWVuc2lvbiA9XG4gICAgICBvcHRpb25zLmVtYmVkZGluZ0RpbWVuc2lvbiA/PyAoYXdhaXQgdGhpcy5lbWJlZGRpbmdEaW1lbnNpb24oZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKSk7XG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsXG4gICAgICBbc291cmNlQ29sdW1uXTogXCJzdHJpbmdcIixcbiAgICAgIC4uLihvcHRpb25zLnNjaGVtYSA/PyB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IGRpcmVjdFNwZWMgPSB7XG4gICAgICBkaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM6IHtcbiAgICAgICAgZW1iZWRkaW5nX3ZlY3Rvcl9jb2x1bW5zOiBbeyBuYW1lOiB2ZWN0b3JDb2x1bW4sIGVtYmVkZGluZ19kaW1lbnNpb246IGRpbWVuc2lvbiB9XSxcbiAgICAgICAgc2NoZW1hX2pzb246IEpTT04uc3RyaW5naWZ5KHsgLi4uc2NoZW1hLCBbdmVjdG9yQ29sdW1uXTogYGFycmF5PGZsb2F0PmAgfSksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJjcmVhdGVJbmRleFwiLCBvcHRpb25zLnNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmNyZWF0ZUluZGV4KFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBlbmRwb2ludF9uYW1lOiBlbmRwb2ludCxcbiAgICAgICAgICBwcmltYXJ5X2tleTogcHJpbWFyeUtleSxcbiAgICAgICAgICBpbmRleF90eXBlOiBkaXJlY3QgPyBcIkRJUkVDVF9BQ0NFU1NcIiA6IFwiREVMVEFfU1lOQ1wiLFxuICAgICAgICAgIC4uLihkaXJlY3RcbiAgICAgICAgICAgID8gZGlyZWN0U3BlY1xuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgZGVsdGFfc3luY19pbmRleF9zcGVjOiB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2VfdGFibGU6IG9wdGlvbnMuc291cmNlVGFibGUsXG4gICAgICAgICAgICAgICAgICBwaXBlbGluZV90eXBlOiBvcHRpb25zLnBpcGVsaW5lVHlwZSA/PyBcIlRSSUdHRVJFRFwiLFxuICAgICAgICAgICAgICAgICAgZW1iZWRkaW5nX3NvdXJjZV9jb2x1bW5zOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogc291cmNlQ29sdW1uLCBlbWJlZGRpbmdfbW9kZWxfZW5kcG9pbnRfbmFtZTogZW1iZWRkaW5nTW9kZWwgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5jb2x1bW5zVG9TeW5jICYmIG9wdGlvbnMuY29sdW1uc1RvU3luYy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8geyBjb2x1bW5zX3RvX3N5bmM6IG9wdGlvbnMuY29sdW1uc1RvU3luYyB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtY3JlYXRlZFwiLCB7XG4gICAgICBpbmRleDogbmFtZSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgdHlwZTogZGlyZWN0ID8gXCJESVJFQ1RfQUNDRVNTXCIgOiBcIkRFTFRBX1NZTkNcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBpbmRleCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBvdGhlcndpc2UgcmV0dXJuIHRoZVxuICAgKiBleGlzdGluZyBvbmUuIElkZW1wb3RlbnQgLSBzYWZlIHRvIGNhbGwgb24gZXZlcnkgYm9vdCB0byBndWFyYW50ZWUgYW5cbiAgICogaW5kZXggaXMgcHJlc2VudC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUluZGV4KG5hbWU6IHN0cmluZywgb3B0aW9uczogQ3JlYXRlSW5kZXhPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImVuc3VyZUluZGV4XCIpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVJbmRleChuYW1lLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGFuIGluZGV4IGV4aXN0cywgaXMgb25saW5lLCBhbmQgKG9wdGlvbmFsbHkpIGhvbGRzIHNlZWQgZGF0YSAtIHRoZVxuICAgKiBcIndpcmUgdXAgYSByZWFsIGluZGV4IG9uIGJvb3RcIiBwYXRoLiBJZGVtcG90ZW50IGFuZCBjaGVhcCB0byBjYWxsIGV2ZXJ5XG4gICAqIGJvb3Q6IGl0IGNyZWF0ZXMgdGhlIGVuZHBvaW50IGFuZCBpbmRleCBvbmx5IGlmIG1pc3NpbmcsIHdhaXRzIGZvciB0aGVtIHRvXG4gICAqIGNvbWUgb25saW5lLCBhbmQgc2VlZHMgZG9jdW1lbnRzIE9OTFkgd2hlbiB0aGUgaW5kZXggaXMgc3RpbGwgZW1wdHkuXG4gICAqXG4gICAqIEZvciB0aGUgZGVtby9kdW1teS1kYXRhIGNhc2UgdGhpcyBuZWVkcyBubyBEZWx0YSB0YWJsZSBhbmQgbm8gd2FyZWhvdXNlOlxuICAgKiB0aGUgZGVmYXVsdCBpcyBhIE1BTkFHRUQgZGlyZWN0LWFjY2VzcyBpbmRleCAoRGF0YWJyaWNrcyBlbWJlZHMgdGhlIGB0ZXh0YFxuICAgKiBjb2x1bW4gb24gd3JpdGUgYW5kIHF1ZXJ5KSwgc28gc2VlZGluZyBpcyBqdXN0IGFuIGBhZGREb2N1bWVudHNgIG9mIHBsYWluXG4gICAqIHJvd3MgYW5kIHNlYXJjaC1ieS10ZXh0IHdvcmtzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgcHJvdmlzaW9uKG5hbWU6IHN0cmluZywgb3B0aW9uczogUHJvdmlzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJwcm92aXNpb25cIik7XG4gICAgY29uc3Qgd2FpdCA9IG9wdGlvbnMud2FpdCA/PyB0cnVlO1xuICAgIGNvbnN0IHRpbWVvdXRNcyA9IG9wdGlvbnMudGltZW91dE1zID8/IDIwICogNjAgKiAxMDAwO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludCA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoZW5kcG9pbnQpIGF3YWl0IHRoaXMuZW5zdXJlRW5kcG9pbnQoZW5kcG9pbnQsIHsgd2FpdCwgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCB9KTtcblxuICAgIGNvbnN0IHsgc2VlZDogX3NlZWQsIHdhaXQ6IF93YWl0LCB0aW1lb3V0TXM6IF90aW1lb3V0TXMsIC4uLmNyZWF0ZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KG5hbWUsIGNyZWF0ZU9wdGlvbnMpO1xuXG4gICAgaWYgKHdhaXQgJiYgIWluZm8ucmVhZHkpIGluZm8gPSBhd2FpdCB0aGlzLndhaXRGb3JJbmRleFJlYWR5KG5hbWUsIHRpbWVvdXRNcywgb3B0aW9ucy5zaWduYWwpO1xuXG4gICAgY29uc3Qgc2VlZCA9IG9wdGlvbnMuc2VlZCA/PyBbXTtcbiAgICBpZiAoc2VlZC5sZW5ndGggPiAwICYmIChpbmZvLnJvd0NvdW50ID8/IDApID09PSAwKSB7XG4gICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSBvcHRpb25zLmVtYmVkZGluZ1NvdXJjZUNvbHVtbiA/PyBcInRleHRcIjtcbiAgICAgIGNvbnN0IHZlY3RvckNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nVmVjdG9yQ29sdW1uID8/IFwiZW1iZWRkaW5nXCI7XG4gICAgICAvLyBEaXJlY3QtYWNjZXNzIGluZGV4ZXMgc3RvcmUgdmVjdG9ycyB3ZSBzdXBwbHksIHNvIGVtYmVkIHRoZSB0ZXh0IGNvbHVtblxuICAgICAgLy8gZm9yIGFueSBzZWVkIHJvdyB0aGF0IGRpZCBub3QgYWxyZWFkeSBjYXJyeSBhIHZlY3Rvci5cbiAgICAgIGNvbnN0IG5lZWRFbWJlZCA9IHNlZWQuc29tZSgoZG9jKSA9PiBkb2NbdmVjdG9yQ29sdW1uXSA9PT0gdW5kZWZpbmVkKTtcbiAgICAgIGxldCByb3dzID0gc2VlZDtcbiAgICAgIGlmIChuZWVkRW1iZWQpIHtcbiAgICAgICAgY29uc3QgdGV4dHMgPSBzZWVkLm1hcCgoZG9jKSA9PiBzdHJpbmdVdGlscy50cmltVG9FbXB0eShTdHJpbmcoZG9jW3NvdXJjZUNvbHVtbl0gPz8gXCJcIikpKTtcbiAgICAgICAgY29uc3QgdmVjdG9ycyA9IGF3YWl0IHRoaXMuZW1iZWQodGV4dHMsIG9wdGlvbnMuZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgcm93cyA9IHNlZWQubWFwKChkb2MsIGkpID0+XG4gICAgICAgICAgZG9jW3ZlY3RvckNvbHVtbl0gPT09IHVuZGVmaW5lZCA/IHsgLi4uZG9jLCBbdmVjdG9yQ29sdW1uXTogdmVjdG9yc1tpXSB9IDogZG9jLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGREb2N1bWVudHMobmFtZSwgcm93cywgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJpbmRleC1zZWVkZWRcIiwgeyBpbmRleDogbmFtZSwgY291bnQ6IHJvd3MubGVuZ3RoIH0pO1xuICAgICAgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgb3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfVxuXG4gIC8qKiBQb2xsIGFuIGluZGV4IHVudGlsIGl0IHJlcG9ydHMgcmVhZHksIG9yIHRocm93IGFmdGVyIHtAbGluayB0aW1lb3V0TXN9LiAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JJbmRleFJlYWR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0aW1lb3V0TXM6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TXM7XG4gICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgd2hpbGUgKCFpbmZvLnJlYWR5KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgc2VhcmNoOiBpbmRleCAke25hbWV9IGRpZCBub3QgY29tZSBvbmxpbmUgaW4gdGltZWAsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJwcm92aXNpb25cIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGFzeW5jVXRpbHMuc2xlZXAoNTAwMCwgc2lnbmFsKTtcbiAgICAgIGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgYSBzeW5jIG9mIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG4gIGFzeW5jIHN5bmNJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJzeW5jSW5kZXhcIik7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwic3luY0luZGV4XCIpO1xuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcInN5bmNJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5zeW5jSW5kZXgoeyBpbmRleF9uYW1lOiBuYW1lIH0sIGNvbnRleHQpLFxuICAgICk7XG4gICAgbG9nZ2VyLmluZm8oXCJpbmRleC1zeW5jZWRcIiwgeyBpbmRleDogbmFtZSB9KTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYW4gaW5kZXguICovXG4gIGFzeW5jIGRlbGV0ZUluZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImRlbGV0ZUluZGV4XCIpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImRlbGV0ZUluZGV4XCIpO1xuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImRlbGV0ZUluZGV4XCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmRlbGV0ZUluZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtZGVsZXRlZFwiLCB7IGluZGV4OiBuYW1lIH0pO1xuICB9XG5cbiAgLyoqIExpc3QgdGhlIGluZGV4ZXMgaG9zdGVkIG9uIGEgVmVjdG9yIFNlYXJjaCBlbmRwb2ludCAobmFtZSArIHR5cGUgb25seSkuICovXG4gIGFzeW5jIGxpc3RJbmRleGVzKGVuZHBvaW50Pzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJsaXN0SW5kZXhlc1wiKTtcbiAgICBjb25zdCBlbmRwb2ludE5hbWUgPSBlbmRwb2ludCA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBlbmRwb2ludCBjb25maWd1cmVkIHRvIGxpc3QgaW5kZXhlc1wiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImxpc3RJbmRleGVzXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53aXRoQ2xpZW50KFwibGlzdEluZGV4ZXNcIiwgc2lnbmFsLCBhc3luYyAoY2xpZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgaW5kZXggb2YgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMubGlzdEluZGV4ZXMoXG4gICAgICAgIHsgZW5kcG9pbnRfbmFtZTogZW5kcG9pbnROYW1lIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApKSB7XG4gICAgICAgIGlmIChpbmRleC5uYW1lKSBuYW1lcy5wdXNoKGluZGV4Lm5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hbWVzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgZXhpc3RzLCBjcmVhdGluZyBhIGBTVEFOREFSRGAgb25lIHdoZW4gaXRcbiAgICogZG9lcyBub3QuIE9wdGlvbmFsbHkgd2FpdCBmb3IgaXQgdG8gY29tZSBvbmxpbmUuIElkZW1wb3RlbnQuXG4gICAqL1xuICBhc3luYyBlbnN1cmVFbmRwb2ludChuYW1lPzogc3RyaW5nLCBvcHRpb25zOiBFbnN1cmVFbmRwb2ludE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImVuc3VyZUVuZHBvaW50XCIpO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gbmFtZSA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IG5vIGVuZHBvaW50IG5hbWUgdG8gZW5zdXJlXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW5zdXJlRW5kcG9pbnRcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImVuc3VyZUVuZHBvaW50XCIsIG9wdGlvbnMuc2lnbmFsLCBhc3luYyAoY2xpZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGllbnQudmVjdG9yU2VhcmNoRW5kcG9pbnRzLmdldEVuZHBvaW50KHsgZW5kcG9pbnRfbmFtZTogZW5kcG9pbnQgfSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCB3YWl0ZXIgPSBhd2FpdCBjbGllbnQudmVjdG9yU2VhcmNoRW5kcG9pbnRzLmNyZWF0ZUVuZHBvaW50KFxuICAgICAgICAgIHsgbmFtZTogZW5kcG9pbnQsIGVuZHBvaW50X3R5cGU6IFwiU1RBTkRBUkRcIiB9LFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiZW5kcG9pbnQtY3JlYXRlZFwiLCB7IGVuZHBvaW50IH0pO1xuICAgICAgICBpZiAob3B0aW9ucy53YWl0KSBhd2FpdCB3YWl0ZXIud2FpdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHdvcmtzcGFjZSBjbGllbnQgYW5kIHJ1biBvbmUgY2FsbCB1bmRlciBhIGJvdW5kZWQgdGltZW91dC4gVGhlXG4gICAqIGNhbGxlcidzIHNpZ25hbCAoaWYgYW55KSBhbmQgYSB0aW1lb3V0IGFyZSBtZXJnZWQgaW50byBvbmUgU0RLIGBDb250ZXh0YFxuICAgKiB2aWEge0BsaW5rIGFwcGtpdC5kYXRhYnJpY2tzLnRvQ29udGV4dH0sIHNvIGVpdGhlciB1bndpbmRzIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQ2xpZW50PFQ+KFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gICAgZm46IChjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsIGNvbnRleHQ/OiBDb250ZXh0KSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLndvcmtzcGFjZUNsaWVudEZhY3RvcnkoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRoaXMuY29uZmlnLnRpbWVvdXRNcyk7XG4gICAgY29uc3QgY29udGV4dCA9IGRhdGFicmlja3MudG9Db250ZXh0KGNvbnRyb2xsZXIsIHNpZ25hbCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbihjbGllbnQsIGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgRXhlY3V0aW9uRXJyb3IuY2FuY2VsZWQoKTtcbiAgICAgIGxvZ2dlci53YXJuKFwiZXhlY3V0aW9uLWZhaWxlZFwiLCB7IG9wZXJhdGlvbiB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIFRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgY29udGV4dCwgb3IgYSBzZXJ2aWNlLXByaW5jaXBhbCBjbGllbnQuICovXG5mdW5jdGlvbiBkZWZhdWx0V29ya3NwYWNlQ2xpZW50KCk6IFdvcmtzcGFjZUNsaWVudExpa2Uge1xuICByZXR1cm4gZGVmYXVsdEFwcEtpdFdvcmtzcGFjZUNsaWVudCgpLnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCk7XG59XG5cbi8qKiBBcHBLaXQgd29ya3NwYWNlLWNsaWVudCBmYWNhZGUgZnJvbSB0aGUgYWN0aXZlIHJlcXVlc3Qgb3Igc2VydmljZSBjb250ZXh0LiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFwcEtpdFdvcmtzcGFjZUNsaWVudCgpOiBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZSB7XG4gIGNvbnN0IGN0eCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGlmIChjdHg/LmNsaWVudCkgcmV0dXJuIGN0eC5jbGllbnQ7XG4gIC8vIE91dHNpZGUgYSByZXF1ZXN0IHNjb3BlIChhIHNjcmlwdCwgYSB0ZXN0KTogYSBmcmVzaCBlbnYtYXV0aCBjbGllbnQuXG4gIHJldHVybiBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xufVxuXG4vKiogQ29uc3RydWN0IGEge0BsaW5rIFNlYXJjaENsaWVudH0gZnJvbSBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWFyY2hDbGllbnQoXG4gIGNvbmZpZz86IFJlc29sdmVkU2VhcmNoQ29uZmlnLFxuICB3b3Jrc3BhY2VDbGllbnRGYWN0b3J5PzogKCkgPT4gV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgcmVhZEJhY2tlbmQ/OiBTZWFyY2hSZWFkQmFja2VuZCxcbik6IFNlYXJjaENsaWVudCB7XG4gIHJldHVybiBuZXcgU2VhcmNoQ2xpZW50KGNvbmZpZywgd29ya3NwYWNlQ2xpZW50RmFjdG9yeSwgcmVhZEJhY2tlbmQpO1xufVxuIl19
535
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBVXJELE9BQU8sRUFDTCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixnQkFBZ0IsR0FFakIsTUFBTSxhQUFhLENBQUM7QUFHckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQTBDM0M7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBRVg7SUFDUTtJQUZuQixZQUNXLElBQVksRUFDSixNQUFvQjtRQUQ1QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ0osV0FBTSxHQUFOLE1BQU0sQ0FBYztJQUNwQyxDQUFDO0lBRUosMERBQTBEO0lBQzFELE1BQU0sQ0FBQyxLQUFhLEVBQUUsT0FBdUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsTUFBYyxF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b24gY2xpZW50LiBSZWFkcyBkZWxlZ2F0ZSB0byB0aGUgcmVnaXN0ZXJlZCBBcHBLaXQtY29tcGF0aWJsZVxuICogYGFpU2VhcmNoYCBwcm92aWRlcjsgdGhpcyBtb2R1bGUgb3ducyBmZWRlcmF0ZWQgZmFuLW91dCBhbmQgdGhlIFZlY3RvciBTZWFyY2hcbiAqIGxpZmVjeWNsZSBBUElzIEFwcEtpdCBkb2VzIG5vdCBleHBvc2UuXG4gKlxuICogYGNsaWVudC5zZWFyY2gocXVlcnksIG9wdHMpYCBzZWFyY2hlcyB0aGUgZGVmYXVsdCBpbmRleDsgYGNsaWVudC5pbmRleChuYW1lKWBcbiAqIHJldHVybnMgYSBoYW5kbGUgYm91bmQgdG8gb25lIGluZGV4OyBgY2xpZW50LnVuaXZlcnNhbFNlYXJjaChxdWVyeSlgIGZhbnMgYVxuICogcXVlcnkgYWNyb3NzIHNldmVyYWwgaW5kZXhlcyBhbmQgbWVyZ2VzIHRoZSByZXN1bHRzIChNZWlsaXNlYXJjaCdzIGZlZGVyYXRlZFxuICogLyBtdWx0aS1zZWFyY2gsIHRoZSBcInVuaXZlcnNhbCBzZWFyY2hcIiB0aGUgY2FsbGVyIGFza2VkIGZvcikuIEV2ZXJ5dGhpbmcgaXNcbiAqIGFzeW5jIGFuZCBjYW5jZWxsYWJsZSBhbmQgcmV0dXJucyB0aGUgYnJvd3Nlci1zYWZlIHNoYXBlcyBmcm9tXG4gKiBgQGRieC10b29scy9zaGFyZWQtc2VhcmNoYC4gTGlmZWN5Y2xlIG1ldGhvZHMgY3Jvc3MgQXBwS2l0J3MgZXhwbGljaXQgbGVnYWN5XG4gKiBjbGllbnQgaGFuZG9mZiBiZWNhdXNlIHRoZSBwdWJsaWMgZmFjYWRlIGRvZXMgbm90IHlldCBleHBvc2UgaW5kZXggY3JlYXRpb24sXG4gKiBzeW5jLCBvciBkZWxldGlvbi5cbiAqXG4gKiBBdXRvY29tcGxldGUgaXMganVzdCBhIHNlYXJjaCB3aXRoIGEgc21hbGwgYGxpbWl0YCBhbmQgdGhlIHJhdyBxdWVyeSB0ZXh0IC1cbiAqIGh5YnJpZCBtb2RlIGFscmVhZHkgcHJlZml4LW1hdGNoZXMsIHNvIG5vIHNlcGFyYXRlIGVuZHBvaW50IGlzIG5lZWRlZDsgdGhlXG4gKiB7QGxpbmsgU2VhcmNoSW5kZXguYXV0b2NvbXBsZXRlfSBoZWxwZXIgaXMgYSB0aGluLCBzZWxmLWRvY3VtZW50aW5nIGFsaWFzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBFeGVjdXRpb25FcnJvciwgZ2V0RXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbFwiO1xuaW1wb3J0IHsgYXBwa2l0LCBkYXRhYnJpY2tzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBpbnZva2UsIHJlc29sdmUgYXMgbW9kZWxSZXNvbHZlLCBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywganNvbiwgbG9nLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEluZGV4SW5mbyxcbiAgU2VhcmNoRG9jdW1lbnQsXG4gIFNlYXJjaEhpdCxcbiAgU2VhcmNoTW9kZSxcbiAgU2VhcmNoUmVxdWVzdCxcbiAgU2VhcmNoUmVzdWx0LFxuICBVcHNlcnRSZXN1bHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfTU9ERSxcbiAgREVGQVVMVF9QQUdFX1NJWkUsXG4gIERFRkFVTFRfVElNRU9VVF9NUyxcbiAgcmVzb2x2ZUluZGV4TmFtZSxcbiAgdHlwZSBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbnR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IFJldHVyblR5cGU8YXBwa2l0LldvcmtzcGFjZUNsaWVudExpa2VbXCJ0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudFwiXT47XG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwic2VhcmNoL2NsaWVudFwiKTtcblxuLyoqIFF1ZXJ5IGJhY2tlbmQgdXNlZCB3aGVuIEFwcEtpdCBvd25zIHRoZSBWZWN0b3IgU2VhcmNoIGV4ZWN1dGlvbiBwYXRoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZWFkQmFja2VuZCB7XG4gIC8qKiBXaGV0aGVyIFZlY3RvciBTZWFyY2ggbGlmZWN5Y2xlIG1ldGhvZHMgYXJlIHZhbGlkIGZvciB0aGlzIHByb3ZpZGVyLiAqL1xuICBzdXBwb3J0c0xpZmVjeWNsZTogYm9vbGVhbjtcbiAgc2VhcmNoKGluZGV4OiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM/OiBTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xuICBhZGREb2N1bWVudHM/KFxuICAgIGluZGV4OiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD47XG59XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGEgc2luZ2xlLWluZGV4IHNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIGhpdHMgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBwYWdlIHNpemUuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogTWF0Y2ggbW9kZS4gRGVmYXVsdHMgdG8gdGhlIGNvbmZpZ3VyZWQgbW9kZSAoaHlicmlkKS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBDb2x1bW5zIHRvIHJldHVybiBwZXIgaGl0LiBEZWZhdWx0cyB0byB0aGUgaW5kZXgncyBjb25maWd1cmVkIGNvbHVtbnMuICovXG4gIGNvbHVtbnM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIEFwcEtpdCBBSSBTZWFyY2ggc2NhbGFyL2FycmF5IGZpbHRlcnMuICovXG4gIGZpbHRlcj86IFNlYXJjaFJlcXVlc3RbXCJmaWx0ZXJcIl07XG4gIC8qKiBEcm9wIGhpdHMgYmVsb3cgdGhpcyBzY29yZS4gKi9cbiAgc2NvcmVUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogT3B0aW9ucyBhY2NlcHRlZCBieSBhIHVuaXZlcnNhbCAoZmVkZXJhdGVkKSBzZWFyY2guICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMge1xuICAvKiogSW5kZXhlcyB0byBzZWFyY2guIERlZmF1bHRzIHRvIGV2ZXJ5IGtub3duIGluZGV4LiAqL1xuICBpbmRleGVzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBNYXhpbXVtIGhpdHMgcGVyIGluZGV4IGJlZm9yZSBtZXJnaW5nLiAqL1xuICBsaW1pdD86IG51bWJlcjtcbiAgLyoqIE1hdGNoIG1vZGUuICovXG4gIG1vZGU/OiBTZWFyY2hNb2RlO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZSBib3VuZCB0byBvbmUgaW5kZXguIE1vZGVsZWQgb24gTWVpbGlzZWFyY2gncyBgY2xpZW50LmluZGV4KHVpZClgOlxuICogYHNlYXJjaGAgLyBgYXV0b2NvbXBsZXRlYCByZWFkLCBgYWRkRG9jdW1lbnRzYCAvIGBkZWxldGVEb2N1bWVudHNgIHdyaXRlICh0b1xuICogYSBkaXJlY3QtYWNjZXNzIGluZGV4KSwgYW5kIGBpbmZvYCBmZXRjaGVzIHRoZSBsaXZlIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hJbmRleCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogU2VhcmNoQ2xpZW50LFxuICApIHt9XG5cbiAgLyoqIFNlYXJjaCB0aGlzIGluZGV4LiBTZWUge0BsaW5rIFNlYXJjaENsaWVudC5zZWFyY2h9LiAqL1xuICBzZWFyY2gocXVlcnk6IHN0cmluZywgb3B0aW9ucz86IFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZWFyY2gocXVlcnksIHsgLi4ub3B0aW9ucywgaW5kZXg6IHRoaXMubmFtZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRvY29tcGxldGUgYWdhaW5zdCB0aGlzIGluZGV4OiBhIHNlYXJjaCB3aXRoIGEgc21hbGwgZGVmYXVsdCBgbGltaXRgIGFuZFxuICAgKiB0aGUgcmF3IHByZWZpeCBhcyB0aGUgcXVlcnkuIEh5YnJpZCBtb2RlIGFscmVhZHkgaGFuZGxlcyBwcmVmaXhlcywgc28gdGhpc1xuICAgKiBpcyBhIHNlbGYtZG9jdW1lbnRpbmcgYWxpYXMgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBjb2RlIHBhdGguXG4gICAqL1xuICBhdXRvY29tcGxldGUocHJlZml4OiBzdHJpbmcsIG9wdGlvbnM/OiBTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2gocHJlZml4LCB7IGxpbWl0OiA1LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIHRoaXMgKGRpcmVjdC1hY2Nlc3MpIGluZGV4LiAqL1xuICBhZGREb2N1bWVudHMoZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmFkZERvY3VtZW50cyh0aGlzLm5hbWUsIGRvY3VtZW50cywgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZG9jdW1lbnRzIGZyb20gdGhpcyAoZGlyZWN0LWFjY2VzcykgaW5kZXggYnkgcHJpbWFyeSBrZXkuICovXG4gIGRlbGV0ZURvY3VtZW50cyhpZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlRG9jdW1lbnRzKHRoaXMubmFtZSwgaWRzLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIEZldGNoIHRoaXMgaW5kZXgncyBsaXZlIGRlZmluaXRpb24gKHByaW1hcnkga2V5LCBjb2x1bW5zLCByZWFkaW5lc3MpLiAqL1xuICBpbmZvKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0SW5kZXgodGhpcy5uYW1lLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgYSBzeW5jIG9mIHRoaXMgKERlbHRhIFN5bmMpIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZS4gKi9cbiAgc3luYyhzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zeW5jSW5kZXgodGhpcy5uYW1lLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSB0aGlzIGluZGV4LiAqL1xuICBkZWxldGUoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlSW5kZXgodGhpcy5uYW1lLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSB0aGlzIGluZGV4IGlmIGl0IGRvZXMgbm90IGV4aXN0LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBleGlzdGluZyBvbmUuICovXG4gIGVuc3VyZShvcHRpb25zPzogQ3JlYXRlSW5kZXhPcHRpb25zKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZW5zdXJlSW5kZXgodGhpcy5uYW1lLCBvcHRpb25zKTtcbiAgfVxufVxuXG4vKiogQSByZXNvbHZlZCBsaXZlIGluZGV4IGRlZmluaXRpb24uICovXG5leHBvcnQgdHlwZSB7IEluZGV4SW5mbyB9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBTZWFyY2hDbGllbnQuY3JlYXRlSW5kZXh9IC8ge0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVJbmRleH0uXG4gKiBUaGUgZ29hbCBpcyB0aGUgc2FtZSBhcyB0aGUgcmVzdCBvZiB0aGUgY2xpZW50OiBuYW1lIGEgc291cmNlIHRhYmxlIGFuZCBhXG4gKiB0ZXh0IGNvbHVtbiwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSAtIHRoZSBlbmRwb2ludCwgdGhlIGVtYmVkZGluZyBtb2RlbCwgdGhlXG4gKiBpbmRleCB0eXBlLCB0aGUgc3luYyBtb2RlIC0gaGFzIGEgc2Vuc2libGUgZGVmYXVsdCB0aGF0IGluZmVycyBmcm9tIHRoZVxuICogd29ya3NwYWNlLCBvdmVycmlkYWJsZSB3aGVuIGEgZGVwbG95bWVudCBuZWVkcyB0byBnbyBkZWVwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlSW5kZXhPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNvdXJjZSBEZWx0YSB0YWJsZSAoY2F0YWxvZy5zY2hlbWEudGFibGUpIGZvciBhIERlbHRhIFN5bmMgaW5kZXguIFByb3ZpZGVcbiAgICogdGhpcyBmb3IgdGhlIGNvbW1vbiBjYXNlOiBEYXRhYnJpY2tzIGNvbXB1dGVzIGFuZCBzeW5jcyBlbWJlZGRpbmdzIGZyb20gaXQuXG4gICAqIE9taXQgaXQgKGFuZCBwYXNzIHtAbGluayBlbWJlZGRpbmdEaW1lbnNpb259KSB0byBjcmVhdGUgYSBkaXJlY3QtYWNjZXNzXG4gICAqIGluZGV4IHlvdSB3cml0ZSB2ZWN0b3JzIHRvIHlvdXJzZWxmLlxuICAgKi9cbiAgc291cmNlVGFibGU/OiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5LWtleSBjb2x1bW4uIERlZmF1bHRzIHRvIGBpZGAuICovXG4gIHByaW1hcnlLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBjb2x1bW4gZW1iZWRkaW5ncyBhcmUgY29tcHV0ZWQgZnJvbSAoRGVsdGEgU3luYykuIERlZmF1bHRzIHRvIHRoZVxuICAgKiBmaXJzdCBvZiBgdGV4dGAgLyBgY29udGVudGAgLyBgYm9keWAgcHJlc2VudCwgZWxzZSB0aGUgY2FsbGVyIG11c3Qgc2V0IGl0LlxuICAgKi9cbiAgZW1iZWRkaW5nU291cmNlQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogRW1iZWRkaW5nIG1vZGVsIGVuZHBvaW50LiBBIGxvb3NlIG5hbWUgaXMgZnV6enktbWF0Y2hlZDsgd2hlbiBvbWl0dGVkIHRoZVxuICAgKiBiZXN0IGVtYmVkZGluZyBlbmRwb2ludCBpbiB0aGUgd29ya3NwYWNlIGlzIGNob3NlbiAoe0BsaW5rIHJlc29sdmVFbWJlZGRpbmdNb2RlbH0pLlxuICAgKi9cbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IHRvIGhvc3QgdGhlIGluZGV4IG9uLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgYGVuZHBvaW50YC4gKi9cbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgZW1iZWRkaW5nIHZlY3RvciBkaW1lbnNpb24gKHNlbGYtbWFuYWdlZCB2ZWN0b3JzLCBubyBzb3VyY2UgdGFibGUpLiAqL1xuICBlbWJlZGRpbmdEaW1lbnNpb24/OiBudW1iZXI7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgY29sdW1uIHRoZSB2ZWN0b3IgaXMgc3RvcmVkIGluLiBEZWZhdWx0cyB0byBgZW1iZWRkaW5nYC4gKi9cbiAgZW1iZWRkaW5nVmVjdG9yQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbHVtbi1uYW1lIC0+IHR5cGUgbWFwIHVzZWQgdG8gYnVpbGQgYSBkaXJlY3QtYWNjZXNzIGluZGV4J3NcbiAgICogYHNjaGVtYV9qc29uYCAodHlwZXM6IGBzdHJpbmdgLCBgaW50YCwgYGxvbmdgLCBgZmxvYXRgLCBgZG91YmxlYCxcbiAgICogYGJvb2xlYW5gLCBgZGF0ZWAsIGB0aW1lc3RhbXBgKS4gTXVzdCBpbmNsdWRlIHRoZSBwcmltYXJ5IGtleSBhbmQgYW55XG4gICAqIGNvbHVtbnMgeW91IHVwc2VydC4gRGVmYXVsdHMgdG8gYHsgaWQ6IFwic3RyaW5nXCIsIHRleHQ6IFwic3RyaW5nXCIgfWAuIFRoZVxuICAgKiBlbWJlZGRpbmcgdmVjdG9yIGNvbHVtbiBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgc2NoZW1hPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFN5bmMgbW9kZSBmb3IgYSBEZWx0YSBTeW5jIGluZGV4LiBgVFJJR0dFUkVEYCAoZGVmYXVsdCkgc3luY3Mgb24gZGVtYW5kOyBgQ09OVElOVU9VU2Aga2VlcHMgZnJlc2guICovXG4gIHBpcGVsaW5lVHlwZT86IFwiVFJJR0dFUkVEXCIgfCBcIkNPTlRJTlVPVVNcIjtcbiAgLyoqIEV4dHJhIGNvbHVtbnMgdG8gc3luYyBhbG9uZ3NpZGUgdGhlIGVtYmVkZGluZyBzb3VyY2UgKERlbHRhIFN5bmMpLiAqL1xuICBjb2x1bW5zVG9TeW5jPzogc3RyaW5nW107XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVFbmRwb2ludH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEVuc3VyZUVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBXYWl0IGZvciB0aGUgZW5kcG9pbnQgdG8gY29tZSBvbmxpbmUgYmVmb3JlIHJldHVybmluZy4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHdhaXQ/OiBib29sZWFuO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU2VhcmNoQ2xpZW50LnByb3Zpc2lvbn0gLSBhIG9uZS1jYWxsIFwibWFrZSB0aGlzIGluZGV4IHJlYWxcbiAqIGFuZCBzZWFyY2hhYmxlXCIgdXNlZCBhdCBib290IG9yIGluIGEgc2VlZCBzY3JpcHQuIEl0IGVuc3VyZXMgdGhlIGVuZHBvaW50LFxuICogZW5zdXJlcyB0aGUgaW5kZXgsIGFuZCAob3B0aW9uYWxseSkgc2VlZHMgZG9jdW1lbnRzIHdoZW4gdGhlIGluZGV4IGlzIGVtcHR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvbk9wdGlvbnMgZXh0ZW5kcyBDcmVhdGVJbmRleE9wdGlvbnMge1xuICAvKiogRG9jdW1lbnRzIHRvIHNlZWQgd2hlbiB0aGUgaW5kZXggaGFzIG5vIHJvd3MgeWV0LiBTa2lwcGVkIGlmIGl0IGFscmVhZHkgaGFzIGRhdGEuICovXG4gIHNlZWQ/OiBTZWFyY2hEb2N1bWVudFtdO1xuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIGVuZHBvaW50IEFORCBpbmRleCB0byBjb21lIG9ubGluZSBiZWZvcmUgcmV0dXJuaW5nIChuZWVkZWRcbiAgICogYmVmb3JlIHNlZWRpbmcpLiBEZWZhdWx0cyB0byB0cnVlLiBFbmRwb2ludCBjcmVhdGlvbiBjYW4gdGFrZSBtYW55IG1pbnV0ZXMuXG4gICAqL1xuICB3YWl0PzogYm9vbGVhbjtcbiAgLyoqIEhvdyBsb25nIHRvIHdhaXQgZm9yIHJlYWRpbmVzcyBiZWZvcmUgZ2l2aW5nIHVwLiBEZWZhdWx0cyB0byAyMCBtaW51dGVzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIEFJIFNlYXJjaCBjbGllbnQuIENvbnN0cnVjdCBpdCB3aXRoIHtAbGluayBjcmVhdGVTZWFyY2hDbGllbnR9ICh3aGljaFxuICogcmVhZHMgYSByZXNvbHZlZCBjb25maWcpIG9yIGRpcmVjdGx5IGZvciBvbmUtb2ZmIHVzZS4gQWxsIHJlYWRzIHJlc29sdmUgdGhlXG4gKiBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUmVzb2x2ZWRTZWFyY2hDb25maWcgPSB7XG4gICAgICBpbmRleGVzOiBbXSxcbiAgICAgIHBhZ2VTaXplOiBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgIG1vZGU6IERFRkFVTFRfTU9ERSxcbiAgICAgIGJhc2VQYXRoOiBcIi9hcGkvc2VhcmNoXCIsXG4gICAgICB0aW1lb3V0TXM6IERFRkFVTFRfVElNRU9VVF9NUyxcbiAgICAgIGFsbG93V3JpdGU6IGZhbHNlLFxuICAgIH0sXG4gICAgcHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2VDbGllbnRGYWN0b3J5OiAoKSA9PiBXb3Jrc3BhY2VDbGllbnRMaWtlID0gZGVmYXVsdFdvcmtzcGFjZUNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWRCYWNrZW5kPzogU2VhcmNoUmVhZEJhY2tlbmQsXG4gICkge31cblxuICAvKiogQSBoYW5kbGUgYm91bmQgdG8gb25lIGluZGV4IChieSBmdWxsIFVDIG5hbWUgb3IgY29uZmlndXJlZCBhbGlhcykuICovXG4gIGluZGV4KHJlZmVyZW5jZTogc3RyaW5nKTogU2VhcmNoSW5kZXgge1xuICAgIGNvbnN0IG5hbWUgPSByZXNvbHZlSW5kZXhOYW1lKHRoaXMuY29uZmlnLCByZWZlcmVuY2UpID8/IHJlZmVyZW5jZTtcbiAgICByZXR1cm4gbmV3IFNlYXJjaEluZGV4KG5hbWUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBvbmUgaW5kZXguIGBpbmRleGAgbWF5IGJlIGEgZnVsbCBVQyBuYW1lLCBhIGNvbmZpZ3VyZWQgYWxpYXMsIG9yXG4gICAqIG9taXR0ZWQgdG8gdXNlIHRoZSBkZWZhdWx0IGluZGV4LiBSZXR1cm5zIGhpdHMgc29ydGVkIG1vc3QtcmVsZXZhbnQtZmlyc3QuXG4gICAqL1xuICBhc3luYyBzZWFyY2goXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBTZWFyY2hPcHRpb25zICYgeyBpbmRleD86IHN0cmluZyB9ID0ge30sXG4gICk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgY29uc3QgdGV4dCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lID0gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgb3B0aW9ucy5pbmRleCk7XG4gICAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gaW5kZXggY29uZmlndXJlZDsgc2V0IGEgZGVmYXVsdCBpbmRleCBvciBwYXNzIG9uZVwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcInNlYXJjaFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnJlYWRCYWNrZW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIFwic2VhcmNoOiBubyBBSSBTZWFyY2ggcHJvdmlkZXIgcmVnaXN0ZXJlZDsgYWRkIGFpU2VhcmNoKCkgb3IgbGFrZWJhc2VBaVNlYXJjaCgpXCIsXG4gICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb246IFwic2VhcmNoXCIgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVhZEJhY2tlbmQuc2VhcmNoKG5hbWUsIHRleHQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBsaW1pdDogb3B0aW9ucy5saW1pdCA/PyB0aGlzLmNvbmZpZy5wYWdlU2l6ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW4gYSBxdWVyeSBhY3Jvc3Mgc2V2ZXJhbCBpbmRleGVzIGFuZCBtZXJnZSB0aGUgaGl0cywgc29ydGVkIGJ5IHNjb3JlIC1cbiAgICogdGhlIFwidW5pdmVyc2FsIHNlYXJjaFwiIGEgc2luZ2xlIGJveCBvdmVyIG1hbnkgY29sbGVjdGlvbnMgbmVlZHMuIEVhY2hcbiAgICogaW5kZXggaXMgc2VhcmNoZWQgY29uY3VycmVudGx5OyBhbiBpbmRleCB0aGF0IGVycm9ycyBpcyBsb2dnZWQgYW5kIHNraXBwZWRcbiAgICogc28gb25lIGJhZCBpbmRleCBkb2VzIG5vdCBzaW5rIHRoZSB3aG9sZSBzZWFyY2guXG4gICAqL1xuICBhc3luYyB1bml2ZXJzYWxTZWFyY2goXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBVbml2ZXJzYWxTZWFyY2hPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgY29uc3QgdGV4dCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lcyA9XG4gICAgICBvcHRpb25zLmluZGV4ZXMgJiYgb3B0aW9ucy5pbmRleGVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBvcHRpb25zLmluZGV4ZXMubWFwKChyZWYpID0+IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZikgPz8gcmVmKVxuICAgICAgICA6IHRoaXMuY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLm5hbWUpO1xuICAgIGNvbnN0IHBlckluZGV4ID0gb3B0aW9ucy5saW1pdCA/PyB0aGlzLmNvbmZpZy5wYWdlU2l6ZTtcblxuICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBuYW1lcy5tYXAoYXN5bmMgKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZWFyY2godGV4dCwge1xuICAgICAgICAgIGluZGV4OiBuYW1lLFxuICAgICAgICAgIGxpbWl0OiBwZXJJbmRleCxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5tb2RlID8geyBtb2RlOiBvcHRpb25zLm1vZGUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQuaGl0cy5tYXAoKGhpdCk6IFNlYXJjaEhpdCA9PiAoeyAuLi5oaXQsIGluZGV4OiBuYW1lIH0pKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBoaXRzID0gc2V0dGxlZFxuICAgICAgLmZsYXRNYXAoKG91dGNvbWUsIGkpID0+IHtcbiAgICAgICAgaWYgKG91dGNvbWUuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSByZXR1cm4gb3V0Y29tZS52YWx1ZTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ1bml2ZXJzYWwtaW5kZXgtZmFpbGVkXCIsIHsgaW5kZXg6IG5hbWVzW2ldIH0pO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcblxuICAgIHJldHVybiB7IHF1ZXJ5OiB0ZXh0LCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGluZGV4IHJlZmVyZW5jZSAoZnVsbCBVQyBuYW1lIG9yIGNvbmZpZ3VyZWQgYWxpYXMpIHRvIHRoZSBuYW1lXG4gICAqIHRoZSBBUEkgZXhwZWN0cywgZmFpbGluZyBmYXN0IHdoZW4gaXQgcmVzb2x2ZXMgdG8gbm90aGluZy4gV2l0aG91dCB0aGlzIGFcbiAgICogYmxhbmsgcmVmZXJlbmNlIC0gd2hhdCBhbiBvbWl0dGVkIGBpbmRleGAgYmVjb21lcyB3aGVuIG5vIGRlZmF1bHQgaXNcbiAgICogY29uZmlndXJlZCAtIHJlYWNoZXMgdGhlIFNESyBhcyBhbiBlbXB0eSBgaW5kZXhfbmFtZWAsIHdoaWNoIGJ1aWxkcyBhXG4gICAqIFVSTCB3aXRoIHRoZSBuYW1lIHNlZ21lbnQgbWlzc2luZyBhbmQgY29tZXMgYmFjayBhcyBhIGNvbmZ1c2luZ1xuICAgKiBgRU5EUE9JTlRfTk9UX0ZPVU5EYCBpbnN0ZWFkIG9mIG5hbWluZyB0aGUgcmVhbCBwcm9ibGVtLlxuICAgKi9cbiAgcHJpdmF0ZSByZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZTogc3RyaW5nLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmZXJlbmNlKSA/PyByZWZlcmVuY2UpO1xuICAgIGlmIChuYW1lID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIGBzZWFyY2g6IG5vIGluZGV4IGNvbmZpZ3VyZWQ7IHNldCBhIGRlZmF1bHQgaW5kZXggb3IgcGFzcyBvbmUgdG8gJHtvcGVyYXRpb259YCxcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIC8qKiBSZWplY3QgVmVjdG9yIFNlYXJjaCBsaWZlY3ljbGUgY2FsbHMgYWdhaW5zdCBhIG5vbi1WZWN0b3IgcHJvdmlkZXIuICovXG4gIHByaXZhdGUgcmVxdWlyZUxpZmVjeWNsZShvcGVyYXRpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRCYWNrZW5kICYmICF0aGlzLnJlYWRCYWNrZW5kLnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoYHNlYXJjaDogdGhlIHJlZ2lzdGVyZWQgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCAke29wZXJhdGlvbn1gLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogRmV0Y2ggYW4gaW5kZXgncyBsaXZlIGRlZmluaXRpb24uICovXG4gIGFzeW5jIGdldEluZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiZ2V0SW5kZXhcIik7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiZ2V0SW5kZXhcIik7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJnZXRJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5nZXRJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBjb25zdCBkaXJlY3RBY2Nlc3MgPSBpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWMgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzcGVjID0gaW5kZXguZGVsdGFfc3luY19pbmRleF9zcGVjID8/IGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYztcbiAgICAvLyBEZWx0YSBTeW5jIHN1cmZhY2VzIGl0cyBlbWJlZGRpbmcgc291cmNlIGNvbHVtbnMgZGlyZWN0bHk7IGEgZGlyZWN0LWFjY2Vzc1xuICAgIC8vIGluZGV4IGNhcnJpZXMgaXRzIGNvbHVtbnMgaW4gc2NoZW1hX2pzb24gKG1pbnVzIHRoZSB2ZWN0b3IgY29sdW1uKS5cbiAgICBsZXQgY29sdW1ucyA9IChzcGVjPy5lbWJlZGRpbmdfc291cmNlX2NvbHVtbnMgPz8gW10pLm1hcCgoYykgPT4gYy5uYW1lID8/IFwiXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBzY2hlbWFKc29uID0gaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjPy5zY2hlbWFfanNvbjtcbiAgICBpZiAoZGlyZWN0QWNjZXNzICYmIHNjaGVtYUpzb24pIHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGpzb24ucGFyc2VSZWNvcmQoc2NoZW1hSnNvbikgPz8ge307XG4gICAgICBjb25zdCB2ZWN0b3JOYW1lcyA9IG5ldyBTZXQoXG4gICAgICAgIChpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM/LmVtYmVkZGluZ192ZWN0b3JfY29sdW1ucyA/PyBbXSlcbiAgICAgICAgICAubWFwKChjKSA9PiBjLm5hbWUpXG4gICAgICAgICAgLmZpbHRlcigobik6IG4gaXMgc3RyaW5nID0+IEJvb2xlYW4obikpLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbnMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcigoYykgPT4gIXZlY3Rvck5hbWVzLmhhcyhjKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBpbmRleC5uYW1lID8/IG5hbWUsXG4gICAgICAuLi4oaW5kZXguZW5kcG9pbnRfbmFtZSA/IHsgZW5kcG9pbnQ6IGluZGV4LmVuZHBvaW50X25hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihpbmRleC5wcmltYXJ5X2tleSA/IHsgcHJpbWFyeUtleTogaW5kZXgucHJpbWFyeV9rZXkgfSA6IHt9KSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICByZWFkeTogaW5kZXguc3RhdHVzPy5yZWFkeSA/PyBmYWxzZSxcbiAgICAgIC4uLihpbmRleC5zdGF0dXM/LmluZGV4ZWRfcm93X2NvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHJvd0NvdW50OiBpbmRleC5zdGF0dXMuaW5kZXhlZF9yb3dfY291bnQgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihkaXJlY3RBY2Nlc3MgPyB7IGRpcmVjdEFjY2VzczogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gYSBkaXJlY3QtYWNjZXNzIGluZGV4LiAqL1xuICBhc3luYyBhZGREb2N1bWVudHMoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImFkZERvY3VtZW50c1wiKTtcbiAgICBpZiAodGhpcy5yZWFkQmFja2VuZD8uYWRkRG9jdW1lbnRzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQmFja2VuZC5hZGREb2N1bWVudHMobmFtZSwgZG9jdW1lbnRzLCBzaWduYWwpO1xuICAgIH1cbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJhZGREb2N1bWVudHNcIik7XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiYWRkRG9jdW1lbnRzXCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLnVwc2VydERhdGFWZWN0b3JJbmRleChcbiAgICAgICAgeyBpbmRleF9uYW1lOiBuYW1lLCBpbnB1dHNfanNvbjogSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnRzKSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiB7IGluZGV4OiBuYW1lLCBjb3VudDogZG9jdW1lbnRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqIERlbGV0ZSBkb2N1bWVudHMgZnJvbSBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggYnkgcHJpbWFyeSBrZXkuICovXG4gIGFzeW5jIGRlbGV0ZURvY3VtZW50cyhcbiAgICByZWZlcmVuY2U6IHN0cmluZyxcbiAgICBpZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiZGVsZXRlRG9jdW1lbnRzXCIpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImRlbGV0ZURvY3VtZW50c1wiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJkZWxldGVEb2N1bWVudHNcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuZGVsZXRlRGF0YVZlY3RvckluZGV4KFxuICAgICAgICB7IGluZGV4X25hbWU6IG5hbWUsIHByaW1hcnlfa2V5czogaWRzLm1hcChTdHJpbmcpIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIHsgaW5kZXg6IG5hbWUsIGNvdW50OiBpZHMubGVuZ3RoIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhbiBlbWJlZGRpbmcgZW5kcG9pbnQgaWQgZm9yIGNyZWF0aW5nIGEgRGVsdGEgU3luYyBpbmRleC4gUmV1c2VzXG4gICAqIHRoZSBtb2RlbCByZXNvbHZlcjogYSBjb25maWd1cmVkIC8gcGFzc2VkIG5hbWUgaXMgZnV6enktbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBsaXZlIGNhdGFsb2d1ZSwgb3RoZXJ3aXNlIHRoZSBoaWdoZXN0LXJhbmtlZCBlbWJlZGRpbmcgZW5kcG9pbnQgaXMgY2hvc2VuLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZUVtYmVkZGluZ01vZGVsKHJlcXVlc3RlZD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBleHBsaWNpdCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVxdWVzdGVkID8/IHRoaXMuY29uZmlnLmVtYmVkZGluZ01vZGVsKTtcbiAgICAvLyBBbiBleHBsaWNpdCBuYW1lIHRoYXQgYWxyZWFkeSBsb29rcyBsaWtlIGFuIGVuZHBvaW50IGlkIChubyB3aGl0ZXNwYWNlKVxuICAgIC8vIGlzIHVzZWQgdmVyYmF0aW0gLSBubyBuZWVkIHRvIGZldGNoIGFuZCBmdXp6eS1tYXRjaCB0aGUgbGl2ZSBjYXRhbG9ndWUuXG4gICAgLy8gQSBnZW51aW5lbHkgbG9vc2UgbmFtZSAoZS5nLiBcImd0ZSBsYXJnZVwiKSBzdGlsbCByZXNvbHZlcyBhZ2FpbnN0IGl0LlxuICAgIGlmIChleHBsaWNpdCAmJiAhL1xccy8udGVzdChleHBsaWNpdCkpIHJldHVybiBleHBsaWNpdDtcbiAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgY29uc3QgY2xpZW50ID0gZGVmYXVsdEFwcEtpdFdvcmtzcGFjZUNsaWVudCgpO1xuICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbW9kZWxDYXRhbG9nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCk7XG4gICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IHsgbW9kZWxJZCB9ID0gbW9kZWxSZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHtcbiAgICAgIC4uLihleHBsaWNpdCA/IHsgZXhwbGljaXQgfSA6IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobW9kZWxJZCk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWQgdGV4dCB2aWEgYSBEYXRhYnJpY2tzIGVtYmVkZGluZyBzZXJ2aW5nIGVuZHBvaW50LCByZXR1cm5pbmcgb25lXG4gICAqIHZlY3RvciBwZXIgaW5wdXQuIFVzZWQgdG8gc2VlZCBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggYW5kIHRvIHR1cm4gYSBzZWFyY2hcbiAgICogcXVlcnkgaW50byBhIHF1ZXJ5IHZlY3RvciAtIERhdGFicmlja3Mgb25seSBtYW5hZ2VzIGVtYmVkZGluZ3MgZm9yIERlbHRhXG4gICAqIFN5bmMgaW5kZXhlcywgc28gYSBkaXJlY3QtYWNjZXNzIGluZGV4IChubyBEZWx0YSB0YWJsZSwgbm8gd2FyZWhvdXNlKSBuZWVkc1xuICAgKiB0aGUgY2xpZW50IHRvIGVtYmVkIG9uIHdyaXRlIGFuZCBvbiBxdWVyeS4gVGhlIGVuZHBvaW50IGlzIHJlc29sdmVkIHRoZVxuICAgKiBzYW1lIHdheSBhcyBmb3IgaW5kZXggY3JlYXRpb24gd2hlbiBub3QgbmFtZWQuXG4gICAqL1xuICBhc3luYyBlbWJlZCh0ZXh0czogc3RyaW5nW10sIG1vZGVsPzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8bnVtYmVyW11bXT4ge1xuICAgIGlmICh0ZXh0cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBlbmRwb2ludCA9IGF3YWl0IHRoaXMucmVzb2x2ZUVtYmVkZGluZ01vZGVsKG1vZGVsLCBzaWduYWwpO1xuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsIHRvIGVtYmVkIHRleHRcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcImVtYmVkXCIsIHNpZ25hbCwgYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHVybCA9IGludm9rZS5pbnZvY2F0aW9uc1VybChob3N0LCBlbmRwb2ludCk7XG4gICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGNsaWVudCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLmhlYWRlcnMsIFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5wdXQ6IHRleHRzIH0pLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgICAgYHNlYXJjaDogZW1iZWRkaW5nIGVuZHBvaW50ICR7ZW5kcG9pbnR9IGZhaWxlZCAoJHtyZXNwb25zZS5zdGF0dXN9KWAsXG4gICAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRhdGE/OiBBcnJheTx7IGVtYmVkZGluZzogbnVtYmVyW10gfT4gfTtcbiAgICAgIGNvbnN0IHZlY3RvcnMgPSAoYm9keS5kYXRhID8/IFtdKS5tYXAoKHJvdykgPT4gcm93LmVtYmVkZGluZyk7XG4gICAgICBpZiAodmVjdG9ycy5sZW5ndGggIT09IHRleHRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGVtYmVkZGluZyByZXNwb25zZSBkaWQgbm90IG1hdGNoIHRoZSBpbnB1dCBjb3VudFwiLCB7XG4gICAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW1iZWRcIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2ZWN0b3JzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSB2ZWN0b3IgZGltZW5zaW9uIGEgbW9kZWwgcHJvZHVjZXMgKGVtYmVkcyBhIHByb2JlIHN0cmluZyBvbmNlKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbWJlZGRpbmdEaW1lbnNpb24obW9kZWw/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBbdmVjdG9yXSA9IGF3YWl0IHRoaXMuZW1iZWQoW1wiZGltZW5zaW9uIHByb2JlXCJdLCBtb2RlbCwgc2lnbmFsKTtcbiAgICBpZiAoIXZlY3RvciB8fCB2ZWN0b3IubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGVtYmVkZGluZyBkaW1lbnNpb25cIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZlY3Rvci5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEFJIFNlYXJjaCBpbmRleCB3aXRoIGFzIGxpdHRsZSBjZXJlbW9ueSBhcyBwb3NzaWJsZS4gVHdvIHNoYXBlczpcbiAgICpcbiAgICogICAtICoqRGVsdGEgU3luYyoqICh0aGUgZGVmYXVsdCk6IHBhc3MgYHNvdXJjZVRhYmxlYDsgRGF0YWJyaWNrcyBjb21wdXRlc1xuICAgKiAgICAgZW1iZWRkaW5ncyBmcm9tIHRoZSB0ZXh0IGNvbHVtbiBhbmQga2VlcHMgdGhlIGluZGV4IHN5bmNlZC4gVGhlXG4gICAqICAgICBlbWJlZGRpbmcgbW9kZWwgaXMgcmVzb2x2ZWQgYXV0b21hdGljYWxseSB3aGVuIG5vdCBuYW1lZC5cbiAgICogICAtICoqRGlyZWN0IEFjY2VzcyoqOiBvbWl0IGBzb3VyY2VUYWJsZWAgYW5kIHBhc3MgYGVtYmVkZGluZ0RpbWVuc2lvbmA7XG4gICAqICAgICB5b3Ugd3JpdGUgdmVjdG9ycyB5b3Vyc2VsZiB2aWEge0BsaW5rIGFkZERvY3VtZW50c30uXG4gICAqXG4gICAqIEV2ZXJ5dGhpbmcgZWxzZSBpbmZlcnM6IHRoZSBlbmRwb2ludCBmcm9tIHRoZSBwbHVnaW4gY29uZmlnLCB0aGUgcHJpbWFyeVxuICAgKiBrZXkgKGBpZGApLCB0aGUgdGV4dCBjb2x1bW4gKGB0ZXh0YCAvIGBjb250ZW50YCAvIGBib2R5YCksIGFuZCB0aGUgdmVjdG9yXG4gICAqIGNvbHVtbiAoYGVtYmVkZGluZ2ApLiBSZXR1cm5zIHRoZSBjcmVhdGVkIGluZGV4J3Mge0BsaW5rIEluZGV4SW5mb30uXG4gICAqL1xuICBhc3luYyBjcmVhdGVJbmRleChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJjcmVhdGVJbmRleFwiKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogbm8gVmVjdG9yIFNlYXJjaCBlbmRwb2ludCBjb25maWd1cmVkOyBwYXNzIGBlbmRwb2ludGAgb3Igc2V0IGl0IG9uIHRoZSBwbHVnaW5cIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBvcHRpb25zLnByaW1hcnlLZXkgPz8gXCJpZFwiO1xuICAgIGNvbnN0IGRpcmVjdCA9ICFvcHRpb25zLnNvdXJjZVRhYmxlO1xuICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiO1xuICAgIGNvbnN0IHZlY3RvckNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nVmVjdG9yQ29sdW1uID8/IFwiZW1iZWRkaW5nXCI7XG5cbiAgICAvLyBEZWx0YSBTeW5jIGxldHMgRGF0YWJyaWNrcyBlbWJlZCBhIHNvdXJjZSBjb2x1bW4sIHNvIGl0IG5lZWRzIGFuIGVtYmVkZGluZ1xuICAgIC8vIG1vZGVsLiBBIGRpcmVjdC1hY2Nlc3MgaW5kZXggc3RvcmVzIHZlY3RvcnMgWU9VIHN1cHBseSAoRGF0YWJyaWNrcyBvbmx5XG4gICAgLy8gc3VwcG9ydHMgbWFuYWdlZCBlbWJlZGRpbmdzIG9uIERlbHRhIFN5bmMpLCBzbyBpdCBuZWVkcyBhIGRpbWVuc2lvbjsgd2VcbiAgICAvLyByZXNvbHZlIG9uZSBmcm9tIHRoZSBlbWJlZGRpbmcgbW9kZWwgd2hlbiBub3QgZ2l2ZW4gc28gYSBkaXJlY3QtYWNjZXNzXG4gICAgLy8gaW5kZXggc3RpbGwgd29ya3Mgd2l0aCB6ZXJvIGV4dHJhIGNvbmZpZyAoZW1iZWQgdmlhIGBlbWJlZCgpYCBvbiBzZWVkICtcbiAgICAvLyBxdWVyeSAtIHNlZSBgcHJvdmlzaW9uYCAvIGBzZWFyY2hgKS5cbiAgICBjb25zdCBlbWJlZGRpbmdNb2RlbCA9XG4gICAgICAoYXdhaXQgdGhpcy5yZXNvbHZlRW1iZWRkaW5nTW9kZWwob3B0aW9ucy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKSA/PyB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbWJlZGRpbmdNb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsOyBwYXNzIGBlbWJlZGRpbmdNb2RlbGBcIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRpbWVuc2lvbiA9XG4gICAgICBvcHRpb25zLmVtYmVkZGluZ0RpbWVuc2lvbiA/PyAoYXdhaXQgdGhpcy5lbWJlZGRpbmdEaW1lbnNpb24oZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKSk7XG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsXG4gICAgICBbc291cmNlQ29sdW1uXTogXCJzdHJpbmdcIixcbiAgICAgIC4uLihvcHRpb25zLnNjaGVtYSA/PyB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IGRpcmVjdFNwZWMgPSB7XG4gICAgICBkaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM6IHtcbiAgICAgICAgZW1iZWRkaW5nX3ZlY3Rvcl9jb2x1bW5zOiBbeyBuYW1lOiB2ZWN0b3JDb2x1bW4sIGVtYmVkZGluZ19kaW1lbnNpb246IGRpbWVuc2lvbiB9XSxcbiAgICAgICAgc2NoZW1hX2pzb246IEpTT04uc3RyaW5naWZ5KHsgLi4uc2NoZW1hLCBbdmVjdG9yQ29sdW1uXTogYGFycmF5PGZsb2F0PmAgfSksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJjcmVhdGVJbmRleFwiLCBvcHRpb25zLnNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmNyZWF0ZUluZGV4KFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBlbmRwb2ludF9uYW1lOiBlbmRwb2ludCxcbiAgICAgICAgICBwcmltYXJ5X2tleTogcHJpbWFyeUtleSxcbiAgICAgICAgICBpbmRleF90eXBlOiBkaXJlY3QgPyBcIkRJUkVDVF9BQ0NFU1NcIiA6IFwiREVMVEFfU1lOQ1wiLFxuICAgICAgICAgIC4uLihkaXJlY3RcbiAgICAgICAgICAgID8gZGlyZWN0U3BlY1xuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgZGVsdGFfc3luY19pbmRleF9zcGVjOiB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2VfdGFibGU6IG9wdGlvbnMuc291cmNlVGFibGUsXG4gICAgICAgICAgICAgICAgICBwaXBlbGluZV90eXBlOiBvcHRpb25zLnBpcGVsaW5lVHlwZSA/PyBcIlRSSUdHRVJFRFwiLFxuICAgICAgICAgICAgICAgICAgZW1iZWRkaW5nX3NvdXJjZV9jb2x1bW5zOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogc291cmNlQ29sdW1uLCBlbWJlZGRpbmdfbW9kZWxfZW5kcG9pbnRfbmFtZTogZW1iZWRkaW5nTW9kZWwgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5jb2x1bW5zVG9TeW5jICYmIG9wdGlvbnMuY29sdW1uc1RvU3luYy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8geyBjb2x1bW5zX3RvX3N5bmM6IG9wdGlvbnMuY29sdW1uc1RvU3luYyB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtY3JlYXRlZFwiLCB7XG4gICAgICBpbmRleDogbmFtZSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgdHlwZTogZGlyZWN0ID8gXCJESVJFQ1RfQUNDRVNTXCIgOiBcIkRFTFRBX1NZTkNcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBpbmRleCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBvdGhlcndpc2UgcmV0dXJuIHRoZVxuICAgKiBleGlzdGluZyBvbmUuIElkZW1wb3RlbnQgLSBzYWZlIHRvIGNhbGwgb24gZXZlcnkgYm9vdCB0byBndWFyYW50ZWUgYW5cbiAgICogaW5kZXggaXMgcHJlc2VudC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUluZGV4KG5hbWU6IHN0cmluZywgb3B0aW9uczogQ3JlYXRlSW5kZXhPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImVuc3VyZUluZGV4XCIpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVJbmRleChuYW1lLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGFuIGluZGV4IGV4aXN0cywgaXMgb25saW5lLCBhbmQgKG9wdGlvbmFsbHkpIGhvbGRzIHNlZWQgZGF0YSAtIHRoZVxuICAgKiBcIndpcmUgdXAgYSByZWFsIGluZGV4IG9uIGJvb3RcIiBwYXRoLiBJZGVtcG90ZW50IGFuZCBjaGVhcCB0byBjYWxsIGV2ZXJ5XG4gICAqIGJvb3Q6IGl0IGNyZWF0ZXMgdGhlIGVuZHBvaW50IGFuZCBpbmRleCBvbmx5IGlmIG1pc3NpbmcsIHdhaXRzIGZvciB0aGVtIHRvXG4gICAqIGNvbWUgb25saW5lLCBhbmQgc2VlZHMgZG9jdW1lbnRzIE9OTFkgd2hlbiB0aGUgaW5kZXggaXMgc3RpbGwgZW1wdHkuXG4gICAqXG4gICAqIEZvciB0aGUgZGVtby9kdW1teS1kYXRhIGNhc2UgdGhpcyBuZWVkcyBubyBEZWx0YSB0YWJsZSBhbmQgbm8gd2FyZWhvdXNlOlxuICAgKiB0aGUgZGVmYXVsdCBpcyBhIE1BTkFHRUQgZGlyZWN0LWFjY2VzcyBpbmRleCAoRGF0YWJyaWNrcyBlbWJlZHMgdGhlIGB0ZXh0YFxuICAgKiBjb2x1bW4gb24gd3JpdGUgYW5kIHF1ZXJ5KSwgc28gc2VlZGluZyBpcyBqdXN0IGFuIGBhZGREb2N1bWVudHNgIG9mIHBsYWluXG4gICAqIHJvd3MgYW5kIHNlYXJjaC1ieS10ZXh0IHdvcmtzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgcHJvdmlzaW9uKG5hbWU6IHN0cmluZywgb3B0aW9uczogUHJvdmlzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJwcm92aXNpb25cIik7XG4gICAgY29uc3Qgd2FpdCA9IG9wdGlvbnMud2FpdCA/PyB0cnVlO1xuICAgIGNvbnN0IHRpbWVvdXRNcyA9IG9wdGlvbnMudGltZW91dE1zID8/IDIwICogNjAgKiAxMDAwO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludCA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoZW5kcG9pbnQpIGF3YWl0IHRoaXMuZW5zdXJlRW5kcG9pbnQoZW5kcG9pbnQsIHsgd2FpdCwgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCB9KTtcblxuICAgIGNvbnN0IHsgc2VlZDogX3NlZWQsIHdhaXQ6IF93YWl0LCB0aW1lb3V0TXM6IF90aW1lb3V0TXMsIC4uLmNyZWF0ZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KG5hbWUsIGNyZWF0ZU9wdGlvbnMpO1xuXG4gICAgaWYgKHdhaXQgJiYgIWluZm8ucmVhZHkpIGluZm8gPSBhd2FpdCB0aGlzLndhaXRGb3JJbmRleFJlYWR5KG5hbWUsIHRpbWVvdXRNcywgb3B0aW9ucy5zaWduYWwpO1xuXG4gICAgY29uc3Qgc2VlZCA9IG9wdGlvbnMuc2VlZCA/PyBbXTtcbiAgICBpZiAoc2VlZC5sZW5ndGggPiAwICYmIChpbmZvLnJvd0NvdW50ID8/IDApID09PSAwKSB7XG4gICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSBvcHRpb25zLmVtYmVkZGluZ1NvdXJjZUNvbHVtbiA/PyBcInRleHRcIjtcbiAgICAgIGNvbnN0IHZlY3RvckNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nVmVjdG9yQ29sdW1uID8/IFwiZW1iZWRkaW5nXCI7XG4gICAgICAvLyBEaXJlY3QtYWNjZXNzIGluZGV4ZXMgc3RvcmUgdmVjdG9ycyB3ZSBzdXBwbHksIHNvIGVtYmVkIHRoZSB0ZXh0IGNvbHVtblxuICAgICAgLy8gZm9yIGFueSBzZWVkIHJvdyB0aGF0IGRpZCBub3QgYWxyZWFkeSBjYXJyeSBhIHZlY3Rvci5cbiAgICAgIGNvbnN0IG5lZWRFbWJlZCA9IHNlZWQuc29tZSgoZG9jKSA9PiBkb2NbdmVjdG9yQ29sdW1uXSA9PT0gdW5kZWZpbmVkKTtcbiAgICAgIGxldCByb3dzID0gc2VlZDtcbiAgICAgIGlmIChuZWVkRW1iZWQpIHtcbiAgICAgICAgY29uc3QgdGV4dHMgPSBzZWVkLm1hcCgoZG9jKSA9PiBzdHJpbmdVdGlscy50cmltVG9FbXB0eShTdHJpbmcoZG9jW3NvdXJjZUNvbHVtbl0gPz8gXCJcIikpKTtcbiAgICAgICAgY29uc3QgdmVjdG9ycyA9IGF3YWl0IHRoaXMuZW1iZWQodGV4dHMsIG9wdGlvbnMuZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgcm93cyA9IHNlZWQubWFwKChkb2MsIGkpID0+XG4gICAgICAgICAgZG9jW3ZlY3RvckNvbHVtbl0gPT09IHVuZGVmaW5lZCA/IHsgLi4uZG9jLCBbdmVjdG9yQ29sdW1uXTogdmVjdG9yc1tpXSB9IDogZG9jLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGREb2N1bWVudHMobmFtZSwgcm93cywgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJpbmRleC1zZWVkZWRcIiwgeyBpbmRleDogbmFtZSwgY291bnQ6IHJvd3MubGVuZ3RoIH0pO1xuICAgICAgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgb3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfVxuXG4gIC8qKiBQb2xsIGFuIGluZGV4IHVudGlsIGl0IHJlcG9ydHMgcmVhZHksIG9yIHRocm93IGFmdGVyIHtAbGluayB0aW1lb3V0TXN9LiAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JJbmRleFJlYWR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0aW1lb3V0TXM6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TXM7XG4gICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgd2hpbGUgKCFpbmZvLnJlYWR5KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgc2VhcmNoOiBpbmRleCAke25hbWV9IGRpZCBub3QgY29tZSBvbmxpbmUgaW4gdGltZWAsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJwcm92aXNpb25cIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGFzeW5jVXRpbHMuc2xlZXAoNTAwMCwgc2lnbmFsKTtcbiAgICAgIGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgYSBzeW5jIG9mIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG4gIGFzeW5jIHN5bmNJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJzeW5jSW5kZXhcIik7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwic3luY0luZGV4XCIpO1xuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcInN5bmNJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5zeW5jSW5kZXgoeyBpbmRleF9uYW1lOiBuYW1lIH0sIGNvbnRleHQpLFxuICAgICk7XG4gICAgbG9nZ2VyLmluZm8oXCJpbmRleC1zeW5jZWRcIiwgeyBpbmRleDogbmFtZSB9KTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYW4gaW5kZXguICovXG4gIGFzeW5jIGRlbGV0ZUluZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImRlbGV0ZUluZGV4XCIpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImRlbGV0ZUluZGV4XCIpO1xuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImRlbGV0ZUluZGV4XCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmRlbGV0ZUluZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtZGVsZXRlZFwiLCB7IGluZGV4OiBuYW1lIH0pO1xuICB9XG5cbiAgLyoqIExpc3QgdGhlIGluZGV4ZXMgaG9zdGVkIG9uIGEgVmVjdG9yIFNlYXJjaCBlbmRwb2ludCAobmFtZSArIHR5cGUgb25seSkuICovXG4gIGFzeW5jIGxpc3RJbmRleGVzKGVuZHBvaW50Pzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJsaXN0SW5kZXhlc1wiKTtcbiAgICBjb25zdCBlbmRwb2ludE5hbWUgPSBlbmRwb2ludCA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBlbmRwb2ludCBjb25maWd1cmVkIHRvIGxpc3QgaW5kZXhlc1wiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImxpc3RJbmRleGVzXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53aXRoQ2xpZW50KFwibGlzdEluZGV4ZXNcIiwgc2lnbmFsLCBhc3luYyAoY2xpZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgaW5kZXggb2YgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMubGlzdEluZGV4ZXMoXG4gICAgICAgIHsgZW5kcG9pbnRfbmFtZTogZW5kcG9pbnROYW1lIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApKSB7XG4gICAgICAgIGlmIChpbmRleC5uYW1lKSBuYW1lcy5wdXNoKGluZGV4Lm5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hbWVzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgZXhpc3RzLCBjcmVhdGluZyBhIGBTVEFOREFSRGAgb25lIHdoZW4gaXRcbiAgICogZG9lcyBub3QuIE9wdGlvbmFsbHkgd2FpdCBmb3IgaXQgdG8gY29tZSBvbmxpbmUuIElkZW1wb3RlbnQuXG4gICAqL1xuICBhc3luYyBlbnN1cmVFbmRwb2ludChuYW1lPzogc3RyaW5nLCBvcHRpb25zOiBFbnN1cmVFbmRwb2ludE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImVuc3VyZUVuZHBvaW50XCIpO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gbmFtZSA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IG5vIGVuZHBvaW50IG5hbWUgdG8gZW5zdXJlXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW5zdXJlRW5kcG9pbnRcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImVuc3VyZUVuZHBvaW50XCIsIG9wdGlvbnMuc2lnbmFsLCBhc3luYyAoY2xpZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGllbnQudmVjdG9yU2VhcmNoRW5kcG9pbnRzLmdldEVuZHBvaW50KHsgZW5kcG9pbnRfbmFtZTogZW5kcG9pbnQgfSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCB3YWl0ZXIgPSBhd2FpdCBjbGllbnQudmVjdG9yU2VhcmNoRW5kcG9pbnRzLmNyZWF0ZUVuZHBvaW50KFxuICAgICAgICAgIHsgbmFtZTogZW5kcG9pbnQsIGVuZHBvaW50X3R5cGU6IFwiU1RBTkRBUkRcIiB9LFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiZW5kcG9pbnQtY3JlYXRlZFwiLCB7IGVuZHBvaW50IH0pO1xuICAgICAgICBpZiAob3B0aW9ucy53YWl0KSBhd2FpdCB3YWl0ZXIud2FpdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHdvcmtzcGFjZSBjbGllbnQgYW5kIHJ1biBvbmUgY2FsbCB1bmRlciBhIGJvdW5kZWQgdGltZW91dC4gVGhlXG4gICAqIGNhbGxlcidzIHNpZ25hbCAoaWYgYW55KSBhbmQgYSB0aW1lb3V0IGFyZSBtZXJnZWQgaW50byBvbmUgU0RLIGBDb250ZXh0YFxuICAgKiB2aWEge0BsaW5rIGFwcGtpdC5kYXRhYnJpY2tzLnRvQ29udGV4dH0sIHNvIGVpdGhlciB1bndpbmRzIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQ2xpZW50PFQ+KFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gICAgZm46IChjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsIGNvbnRleHQ/OiBDb250ZXh0KSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLndvcmtzcGFjZUNsaWVudEZhY3RvcnkoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRoaXMuY29uZmlnLnRpbWVvdXRNcyk7XG4gICAgY29uc3QgY29udGV4dCA9IGRhdGFicmlja3MudG9Db250ZXh0KGNvbnRyb2xsZXIsIHNpZ25hbCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbihjbGllbnQsIGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgRXhlY3V0aW9uRXJyb3IuY2FuY2VsZWQoKTtcbiAgICAgIGxvZ2dlci53YXJuKFwiZXhlY3V0aW9uLWZhaWxlZFwiLCB7IG9wZXJhdGlvbiB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIFRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgY29udGV4dCwgb3IgYSBzZXJ2aWNlLXByaW5jaXBhbCBjbGllbnQuICovXG5mdW5jdGlvbiBkZWZhdWx0V29ya3NwYWNlQ2xpZW50KCk6IFdvcmtzcGFjZUNsaWVudExpa2Uge1xuICByZXR1cm4gZGVmYXVsdEFwcEtpdFdvcmtzcGFjZUNsaWVudCgpLnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCk7XG59XG5cbi8qKiBBcHBLaXQgd29ya3NwYWNlLWNsaWVudCBmYWNhZGUgZnJvbSB0aGUgYWN0aXZlIHJlcXVlc3Qgb3Igc2VydmljZSBjb250ZXh0LiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFwcEtpdFdvcmtzcGFjZUNsaWVudCgpOiBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZSB7XG4gIGNvbnN0IGN0eCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGlmIChjdHg/LmNsaWVudCkgcmV0dXJuIGN0eC5jbGllbnQ7XG4gIC8vIE91dHNpZGUgYSByZXF1ZXN0IHNjb3BlIChhIHNjcmlwdCwgYSB0ZXN0KTogYSBmcmVzaCBlbnYtYXV0aCBjbGllbnQuXG4gIHJldHVybiBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xufVxuXG4vKiogQ29uc3RydWN0IGEge0BsaW5rIFNlYXJjaENsaWVudH0gZnJvbSBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWFyY2hDbGllbnQoXG4gIGNvbmZpZz86IFJlc29sdmVkU2VhcmNoQ29uZmlnLFxuICB3b3Jrc3BhY2VDbGllbnRGYWN0b3J5PzogKCkgPT4gV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgcmVhZEJhY2tlbmQ/OiBTZWFyY2hSZWFkQmFja2VuZCxcbik6IFNlYXJjaENsaWVudCB7XG4gIHJldHVybiBuZXcgU2VhcmNoQ2xpZW50KGNvbmZpZywgd29ya3NwYWNlQ2xpZW50RmFjdG9yeSwgcmVhZEJhY2tlbmQpO1xufVxuIl19
@@ -38,7 +38,8 @@ export declare class LakebaseAiSearchPlugin extends Plugin<LakebaseAiSearchConfi
38
38
  };
39
39
  };
40
40
  protected config: LakebaseAiSearchConfig;
41
- private backend;
41
+ private servicePrincipalBackend;
42
+ private userBackend;
42
43
  setup(): Promise<void>;
43
44
  injectRoutes(router: IAppRouter): void;
44
45
  /** Query one configured Lakebase full-text index using AppKit's response shape. */
@@ -44,22 +44,27 @@ export class LakebaseAiSearchPlugin extends Plugin {
44
44
  resources: { required: [], optional: [] },
45
45
  config: { schema: CONFIG_SCHEMA },
46
46
  };
47
- backend;
47
+ servicePrincipalBackend;
48
+ userBackend;
48
49
  async setup() {
49
50
  const indexes = this.indexes();
50
51
  for (const index of indexes)
51
52
  this.validateAuth(index);
52
- const lake = pluginRegistry.require(this.context, lakebase, this);
53
- this.backend = new LakebaseSearchBackend({ managedPool: () => lake.exports().pool }, stringUtils.trimToNull(this.config.schema) ?? "public");
54
- for (const index of indexes) {
55
- await this.backend.provision(index.indexName, {
56
- textColumn: index.config.textColumn ?? "text",
57
- ...(index.config.documents ? { seed: index.config.documents } : {}),
53
+ this.context?.onLifecycle("setup:complete", async () => {
54
+ const lake = pluginRegistry.require(this.context, lakebase, this);
55
+ const schema = stringUtils.trimToNull(this.config.schema) ?? "public";
56
+ this.servicePrincipalBackend = new LakebaseSearchBackend(lake.exports().pool, schema);
57
+ this.userBackend = new LakebaseSearchBackend({ managedPool: () => lake.exports().pool }, schema);
58
+ for (const index of indexes) {
59
+ await this.servicePrincipalBackend.provision(index.indexName, {
60
+ textColumn: index.config.textColumn ?? "text",
61
+ ...(index.config.documents ? { seed: index.config.documents } : {}),
62
+ });
63
+ }
64
+ logger.info("ready", {
65
+ indexes: this.indexes().map((index) => index.alias),
66
+ schema,
58
67
  });
59
- }
60
- logger.info("ready", {
61
- indexes: this.indexes().map((index) => index.alias),
62
- schema: stringUtils.trimToNull(this.config.schema) ?? "public",
63
68
  });
64
69
  }
65
70
  injectRoutes(router) {
@@ -129,7 +134,7 @@ export class LakebaseAiSearchPlugin extends Plugin {
129
134
  }
130
135
  const index = this.resolveIndex(alias);
131
136
  const startedAt = performance.now();
132
- const result = await this.requireBackend().search(index.indexName, request.queryText, {
137
+ const result = await this.requireBackend(index).search(index.indexName, request.queryText, {
133
138
  limit: request.numResults ?? index.config.numResults ?? 20,
134
139
  ...(request.filters ? { filter: request.filters } : {}),
135
140
  });
@@ -151,7 +156,7 @@ export class LakebaseAiSearchPlugin extends Plugin {
151
156
  throw new ValidationError("Lakebase AI Search writes are disabled");
152
157
  }
153
158
  const index = this.resolveIndex(alias);
154
- return this.requireBackend().addDocuments(index.indexName, documents.filter(object.isRecord), index.config.textColumn ?? "text");
159
+ return this.requireBackend(index).addDocuments(index.indexName, documents.filter(object.isRecord), index.config.textColumn ?? "text");
155
160
  }
156
161
  clientConfig() {
157
162
  return {
@@ -170,8 +175,9 @@ export class LakebaseAiSearchPlugin extends Plugin {
170
175
  };
171
176
  }
172
177
  async shutdown() {
173
- await this.backend?.close();
174
- this.backend = undefined;
178
+ await Promise.all([this.servicePrincipalBackend?.close(), this.userBackend?.close()]);
179
+ this.servicePrincipalBackend = undefined;
180
+ this.userBackend = undefined;
175
181
  }
176
182
  indexes() {
177
183
  return Object.entries(this.config.indexes ?? {}).map(([alias, config]) => ({
@@ -195,10 +201,13 @@ export class LakebaseAiSearchPlugin extends Plugin {
195
201
  routeRuntime(index, req) {
196
202
  return index.config.auth === "on-behalf-of-user" ? this.asUser(req) : this;
197
203
  }
198
- requireBackend() {
199
- if (!this.backend)
204
+ requireBackend(index) {
205
+ const backend = index.config.auth === "on-behalf-of-user"
206
+ ? this.userBackend
207
+ : this.servicePrincipalBackend;
208
+ if (!backend)
200
209
  throw new ValidationError("Lakebase AI Search is not initialized");
201
- return this.backend;
210
+ return backend;
202
211
  }
203
212
  project(data, columns) {
204
213
  if (!columns?.length)
@@ -208,4 +217,4 @@ export class LakebaseAiSearchPlugin extends Plugin {
208
217
  }
209
218
  /** AppKit-compatible Lakebase AI Search provider. */
210
219
  export const lakebaseAiSearch = toPlugin(LakebaseAiSearchPlugin);
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xha2ViYXNlLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLGVBQWUsR0FJaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQXNCcEQsTUFBTSxhQUFhLEdBQWdCO0lBQ2pDLElBQUksRUFBRSxRQUFRO0lBQ2QsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDO0lBQ3JCLFVBQVUsRUFBRTtRQUNWLE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxRQUFRO1lBQ2Qsb0JBQW9CLEVBQUU7Z0JBQ3BCLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO29CQUM3QixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRTtvQkFDckQsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtvQkFDOUIsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQ2xDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLEVBQUU7b0JBQzFELFVBQVUsRUFBRSxFQUFF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a2VkIGJ5IExha2ViYXNlIGZ1bGwtdGV4dCBzZWFyY2guXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGxha2ViYXNlLFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIHR5cGUgQmFzZVBsdWdpbkNvbmZpZyxcbiAgdHlwZSBJQXBwUm91dGVyLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEluZGV4Q29uZmlnLCBTZWFyY2hSZXF1ZXN0LCBTZWFyY2hSZXNwb25zZSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgcGx1Z2luUmVnaXN0cnkgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaERvY3VtZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNyB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuaW1wb3J0IHsgTGFrZWJhc2VTZWFyY2hCYWNrZW5kIH0gZnJvbSBcIi4vbGFrZWJhc2UudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInNlYXJjaC9sYWtlYmFzZS1wbHVnaW5cIik7XG5cbi8qKiBQZXItYWxpYXMgTGFrZWJhc2Ugc2VhcmNoIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlQWlTZWFyY2hJbmRleENvbmZpZyBleHRlbmRzIE9taXQ8XG4gIEluZGV4Q29uZmlnLFxuICBcImVtYmVkZGluZ0ZuXCIgfCBcImVuZHBvaW50TmFtZVwiIHwgXCJwYWdpbmF0aW9uXCIgfCBcInJlcmFua2VyXCJcbj4ge1xuICAvKiogRG9jdW1lbnRzIHVzZWQgdG8gc2VlZCBhbiBlbXB0eSBmdWxsLXRleHQgdGFibGUgZHVyaW5nIHNldHVwLiAqL1xuICBkb2N1bWVudHM/OiBTZWFyY2hEb2N1bWVudFtdO1xuICAvKiogRG9jdW1lbnQgZmllbGQgaW5kZXhlZCBmaXJzdC4gRGVmYXVsdHMgdG8gYHRleHRgLiAqL1xuICB0ZXh0Q29sdW1uPzogc3RyaW5nO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgdGhlIExha2ViYXNlIGltcGxlbWVudGF0aW9uIG9mIEFwcEtpdCBBSSBTZWFyY2guICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlQWlTZWFyY2hDb25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgaW5kZXhlcz86IFJlY29yZDxzdHJpbmcsIExha2ViYXNlQWlTZWFyY2hJbmRleENvbmZpZz47XG4gIC8qKiBQb3N0Z3JlU1FMIHNjaGVtYSB0aGF0IG93bnMgdGhlIGdlbmVyYXRlZCBmdWxsLXRleHQgdGFibGVzLiAqL1xuICBzY2hlbWE/OiBzdHJpbmc7XG4gIC8qKiBFbmFibGUgdGhlIGRvY3VtZW50IHVwc2VydCByb3V0ZSBhbmQgZXhwb3J0ZWQgbWV0aG9kLiAqL1xuICBhbGxvd1dyaXRlPzogYm9vbGVhbjtcbn1cblxuY29uc3QgQ09ORklHX1NDSEVNQTogSlNPTlNjaGVtYTcgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIsXG4gIHJlcXVpcmVkOiBbXCJpbmRleGVzXCJdLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgaW5kZXhlczoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBpbmRleE5hbWU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIGNvbHVtbnM6IHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcbiAgICAgICAgICBudW1SZXN1bHRzOiB7IHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgICBxdWVyeVR5cGU6IHsgZW51bTogW1wiZnVsbF90ZXh0XCJdIH0sXG4gICAgICAgICAgYXV0aDogeyBlbnVtOiBbXCJzZXJ2aWNlLXByaW5jaXBhbFwiLCBcIm9uLWJlaGFsZi1vZi11c2VyXCJdIH0sXG4gICAgICAgICAgdGV4dENvbHVtbjogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgZG9jdW1lbnRzOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJvYmplY3RcIiB9IH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2NoZW1hOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICBhbGxvd1dyaXRlOiB7IHR5cGU6IFwiYm9vbGVhblwiIH0sXG4gIH0sXG59O1xuXG5pbnRlcmZhY2UgUmVzb2x2ZWRMYWtlYmFzZUluZGV4IHtcbiAgYWxpYXM6IHN0cmluZztcbiAgaW5kZXhOYW1lOiBzdHJpbmc7XG4gIGNvbmZpZzogTGFrZWJhc2VBaVNlYXJjaEluZGV4Q29uZmlnO1xufVxuXG5mdW5jdGlvbiByb3V0ZVBhcmFtKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICh2YWx1ZVswXSA/PyBcIlwiKSA6IHZhbHVlO1xufVxuXG4vKiogTGFrZWJhc2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIG5hdGl2ZSBBcHBLaXQgYGFpU2VhcmNoYCBjb250cmFjdC4gKi9cbmV4cG9ydCBjbGFzcyBMYWtlYmFzZUFpU2VhcmNoUGx1Z2luIGV4dGVuZHMgUGx1Z2luPExha2ViYXNlQWlTZWFyY2hDb25maWc+IHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwiYWlTZWFyY2hcIixcbiAgICBkaXNwbGF5TmFtZTogXCJMYWtlYmFzZSBBSSBTZWFyY2hcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBcHBLaXQgQUkgU2VhcmNoIGNvbnRyYWN0IGJhY2tlZCBieSBQb3N0Z3JlU1FMIGZ1bGwtdGV4dCBzZWFyY2hcIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczogeyByZXF1aXJlZDogW10sIG9wdGlvbmFsOiBbXSB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IENPTkZJR19TQ0hFTUEgfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luTWFuaWZlc3Q8XCJhaVNlYXJjaFwiPjtcblxuICBkZWNsYXJlIHByb3RlY3RlZCBjb25maWc6IExha2ViYXNlQWlTZWFyY2hDb25maWc7XG4gIHByaXZhdGUgYmFja2VuZDogTGFrZWJhc2VTZWFyY2hCYWNrZW5kIHwgdW5kZWZpbmVkO1xuXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ZXMgPSB0aGlzLmluZGV4ZXMoKTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHRoaXMudmFsaWRhdGVBdXRoKGluZGV4KTtcbiAgICBjb25zdCBsYWtlID0gcGx1Z2luUmVnaXN0cnkucmVxdWlyZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlLCB0aGlzKTtcbiAgICB0aGlzLmJhY2tlbmQgPSBuZXcgTGFrZWJhc2VTZWFyY2hCYWNrZW5kKFxuICAgICAgeyBtYW5hZ2VkUG9vbDogKCkgPT4gbGFrZS5leHBvcnRzKCkucG9vbCB9LFxuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh0aGlzLmNvbmZpZy5zY2hlbWEpID8/IFwicHVibGljXCIsXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYmFja2VuZC5wcm92aXNpb24oaW5kZXguaW5kZXhOYW1lLCB7XG4gICAgICAgIHRleHRDb2x1bW46IGluZGV4LmNvbmZpZy50ZXh0Q29sdW1uID8/IFwidGV4dFwiLFxuICAgICAgICAuLi4oaW5kZXguY29uZmlnLmRvY3VtZW50cyA/IHsgc2VlZDogaW5kZXguY29uZmlnLmRvY3VtZW50cyB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgaW5kZXhlczogdGhpcy5pbmRleGVzKCkubWFwKChpbmRleCkgPT4gaW5kZXguYWxpYXMpLFxuICAgICAgc2NoZW1hOiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHRoaXMuY29uZmlnLnNjaGVtYSkgPz8gXCJwdWJsaWNcIixcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJxdWVyeVwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFwiLzphbGlhcy9xdWVyeVwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXM6IGV4cHJlc3MuUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhbGlhcyA9IHJvdXRlUGFyYW0ocmVxLnBhcmFtcy5hbGlhcyk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlc29sdmVJbmRleChhbGlhcyk7XG4gICAgICAgICAgY29uc3QgeyBjb2x1bW5zOiBfdW50cnVzdGVkQ29sdW1ucywgLi4ucmVxdWVzdCB9ID0gb2JqZWN0LmlzUmVjb3JkKHJlcS5ib2R5KVxuICAgICAgICAgICAgPyByZXEuYm9keVxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgICByZXMuanNvbihhd2FpdCB0aGlzLnJvdXRlUnVudGltZShpbmRleCwgcmVxKS5xdWVyeShhbGlhcywgcmVxdWVzdCBhcyBTZWFyY2hSZXF1ZXN0KSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJTZWFyY2ggZmFpbGVkXCIsXG4gICAgICAgICAgICBwbHVnaW46IHRoaXMubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJnZXRDb25maWdcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IFwiLzphbGlhcy9jb25maWdcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVzOiBleHByZXNzLlJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNvbHZlSW5kZXgocm91dGVQYXJhbShyZXEucGFyYW1zLmFsaWFzKSk7XG4gICAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgICBhbGlhczogaW5kZXguYWxpYXMsXG4gICAgICAgICAgY29sdW1uczogaW5kZXguY29uZmlnLmNvbHVtbnMsXG4gICAgICAgICAgcXVlcnlUeXBlOiBcImZ1bGxfdGV4dFwiLFxuICAgICAgICAgIG51bVJlc3VsdHM6IGluZGV4LmNvbmZpZy5udW1SZXN1bHRzID8/IDIwLFxuICAgICAgICAgIHJlcmFua2VyOiBmYWxzZSxcbiAgICAgICAgICBwYWdpbmF0aW9uOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgICBuYW1lOiBcImFkZERvY3VtZW50c1wiLFxuICAgICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgICBwYXRoOiBcIi86YWxpYXMvZG9jdW1lbnRzXCIsXG4gICAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVzOiBleHByZXNzLlJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWxpYXMgPSByb3V0ZVBhcmFtKHJlcS5wYXJhbXMuYWxpYXMpO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNvbHZlSW5kZXgoYWxpYXMpO1xuICAgICAgICAgIGNvbnN0IGRvY3VtZW50cyA9IEFycmF5LmlzQXJyYXkocmVxLmJvZHk/LmRvY3VtZW50cylcbiAgICAgICAgICAgID8gcmVxLmJvZHkuZG9jdW1lbnRzLmZpbHRlcihvYmplY3QuaXNSZWNvcmQpXG4gICAgICAgICAgICA6IFtdO1xuICAgICAgICAgIHJlcy5qc29uKGF3YWl0IHRoaXMucm91dGVSdW50aW1lKGluZGV4LCByZXEpLmFkZERvY3VtZW50cyhhbGlhcywgZG9jdW1lbnRzKSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogUXVlcnkgb25lIGNvbmZpZ3VyZWQgTGFrZWJhc2UgZnVsbC10ZXh0IGluZGV4IHVzaW5nIEFwcEtpdCdzIHJlc3BvbnNlIHNoYXBlLiAqL1xuICBhc3luYyBxdWVyeShcbiAgICBhbGlhczogc3RyaW5nLFxuICAgIHJlcXVlc3Q6IFNlYXJjaFJlcXVlc3QsXG4gICk6IFByb21pc2U8U2VhcmNoUmVzcG9uc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiB7XG4gICAgaWYgKCFyZXF1ZXN0LnF1ZXJ5VGV4dCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcIkxha2ViYXNlIEFJIFNlYXJjaCByZXF1aXJlcyBxdWVyeVRleHRcIik7XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0LnF1ZXJ5VmVjdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIGRvZXMgbm90IGFjY2VwdCBxdWVyeVZlY3RvclwiKTtcbiAgICB9XG4gICAgaWYgKHJlcXVlc3QucXVlcnlUeXBlICYmIHJlcXVlc3QucXVlcnlUeXBlICE9PSBcImZ1bGxfdGV4dFwiKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIHN1cHBvcnRzIG9ubHkgZnVsbF90ZXh0IHF1ZXJpZXNcIik7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXNvbHZlSW5kZXgoYWxpYXMpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWlyZUJhY2tlbmQoKS5zZWFyY2goaW5kZXguaW5kZXhOYW1lLCByZXF1ZXN0LnF1ZXJ5VGV4dCwge1xuICAgICAgbGltaXQ6IHJlcXVlc3QubnVtUmVzdWx0cyA/PyBpbmRleC5jb25maWcubnVtUmVzdWx0cyA/PyAyMCxcbiAgICAgIC4uLihyZXF1ZXN0LmZpbHRlcnMgPyB7IGZpbHRlcjogcmVxdWVzdC5maWx0ZXJzIH0gOiB7fSksXG4gICAgfSk7XG4gICAgY29uc3QgY29sdW1ucyA9IHJlcXVlc3QuY29sdW1ucyA/PyBpbmRleC5jb25maWcuY29sdW1ucztcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0czogcmVzdWx0LmhpdHMubWFwKChoaXQpID0+ICh7XG4gICAgICAgIHNjb3JlOiBoaXQuc2NvcmUsXG4gICAgICAgIGRhdGE6IHRoaXMucHJvamVjdCh7IGlkOiBoaXQuaWQsIC4uLmhpdC5maWVsZHMgfSwgY29sdW1ucyksXG4gICAgICB9KSksXG4gICAgICB0b3RhbENvdW50OiByZXN1bHQuY291bnQsXG4gICAgICBxdWVyeVRpbWVNczogTWF0aC5tYXgoMCwgcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQpLFxuICAgICAgcXVlcnlUeXBlOiBcImZ1bGxfdGV4dFwiLFxuICAgICAgbmV4dFBhZ2VUb2tlbjogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIG9uZSBjb25maWd1cmVkIExha2ViYXNlIGZ1bGwtdGV4dCBpbmRleC4gKi9cbiAgYXN5bmMgYWRkRG9jdW1lbnRzKGFsaWFzOiBzdHJpbmcsIGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSkge1xuICAgIGlmICghdGhpcy5jb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcIkxha2ViYXNlIEFJIFNlYXJjaCB3cml0ZXMgYXJlIGRpc2FibGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHRoaXMucmVzb2x2ZUluZGV4KGFsaWFzKTtcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlQmFja2VuZCgpLmFkZERvY3VtZW50cyhcbiAgICAgIGluZGV4LmluZGV4TmFtZSxcbiAgICAgIGRvY3VtZW50cy5maWx0ZXIob2JqZWN0LmlzUmVjb3JkKSxcbiAgICAgIGluZGV4LmNvbmZpZy50ZXh0Q29sdW1uID8/IFwidGV4dFwiLFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBjbGllbnRDb25maWcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluZGV4ZXM6IHRoaXMuaW5kZXhlcygpLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgcXVlcnlUeXBlOiBcImZ1bGxfdGV4dFwiIGFzIGNvbnN0LFxuICAgICAgICBwYWdpbmF0aW9uOiBmYWxzZSxcbiAgICAgIH0pKSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdmlkZXJLaW5kOiBcImxha2ViYXNlXCIgYXMgY29uc3QsXG4gICAgICBxdWVyeTogdGhpcy5xdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgYWRkRG9jdW1lbnRzOiB0aGlzLmFkZERvY3VtZW50cy5iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmJhY2tlbmQ/LmNsb3NlKCk7XG4gICAgdGhpcy5iYWNrZW5kID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmRleGVzKCk6IFJlc29sdmVkTGFrZWJhc2VJbmRleFtdIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5jb25maWcuaW5kZXhlcyA/PyB7fSkubWFwKChbYWxpYXMsIGNvbmZpZ10pID0+ICh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluZGV4TmFtZTogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb25maWcuaW5kZXhOYW1lKSA/PyBhbGlhcyxcbiAgICAgIGNvbmZpZyxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVJbmRleChhbGlhczogc3RyaW5nKTogUmVzb2x2ZWRMYWtlYmFzZUluZGV4IHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXhlcygpLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmFsaWFzID09PSBhbGlhcyk7XG4gICAgaWYgKCFpbmRleCkgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVW5rbm93biBBSSBTZWFyY2ggaW5kZXggYWxpYXMgXCIke2FsaWFzfVwiYCk7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUF1dGgoaW5kZXg6IFJlc29sdmVkTGFrZWJhc2VJbmRleCk6IHZvaWQge1xuICAgIGNvbnN0IGF1dGggPSAoaW5kZXguY29uZmlnIGFzIHsgYXV0aD86IHVua25vd24gfSkuYXV0aDtcbiAgICBpZiAoYXV0aCAhPT0gdW5kZWZpbmVkICYmIGF1dGggIT09IFwic2VydmljZS1wcmluY2lwYWxcIiAmJiBhdXRoICE9PSBcIm9uLWJlaGFsZi1vZi11c2VyXCIpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFVua25vd24gQUkgU2VhcmNoIGF1dGggbW9kZSBmb3IgXCIke2luZGV4LmFsaWFzfVwiYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByb3V0ZVJ1bnRpbWUoaW5kZXg6IFJlc29sdmVkTGFrZWJhc2VJbmRleCwgcmVxOiBleHByZXNzLlJlcXVlc3QpOiB0aGlzIHtcbiAgICByZXR1cm4gaW5kZXguY29uZmlnLmF1dGggPT09IFwib24tYmVoYWxmLW9mLXVzZXJcIiA/IHRoaXMuYXNVc2VyKHJlcSkgOiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1aXJlQmFja2VuZCgpOiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQge1xuICAgIGlmICghdGhpcy5iYWNrZW5kKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIGlzIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICByZXR1cm4gdGhpcy5iYWNrZW5kO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9qZWN0KFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCFjb2x1bW5zPy5sZW5ndGgpIHJldHVybiBkYXRhO1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBjb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4gaW4gZGF0YSkubWFwKChjb2x1bW4pID0+IFtjb2x1bW4sIGRhdGFbY29sdW1uXV0pLFxuICAgICk7XG4gIH1cbn1cblxuLyoqIEFwcEtpdC1jb21wYXRpYmxlIExha2ViYXNlIEFJIFNlYXJjaCBwcm92aWRlci4gKi9cbmV4cG9ydCBjb25zdCBsYWtlYmFzZUFpU2VhcmNoID0gdG9QbHVnaW4oTGFrZWJhc2VBaVNlYXJjaFBsdWdpbik7XG4iXX0=
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xha2ViYXNlLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLGVBQWUsR0FJaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQXNCcEQsTUFBTSxhQUFhLEdBQWdCO0lBQ2pDLElBQUksRUFBRSxRQUFRO0lBQ2QsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDO0lBQ3JCLFVBQVUsRUFBRTtRQUNWLE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxRQUFRO1lBQ2Qsb0JBQW9CLEVBQUU7Z0JBQ3BCLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO29CQUM3QixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRTtvQkFDckQsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtvQkFDOUIsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQ2xDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLEVBQUU7b0JBQzFELFVBQVUsRUFBRSxFQUFF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YixJQUE2QixFQUM3QixPQUE2QjtRQUU3QixJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQ25GLENBQUM7SUFDSixDQUFDOztBQUdILHFEQUFxRDtBQUNyRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0LWNvbXBhdGlibGUgQUkgU2VhcmNoIHByb3ZpZGVyIGJhY2tlZCBieSBMYWtlYmFzZSBmdWxsLXRleHQgc2VhcmNoLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBsYWtlYmFzZSxcbiAgUGx1Z2luLFxuICB0b1BsdWdpbixcbiAgVmFsaWRhdGlvbkVycm9yLFxuICB0eXBlIEJhc2VQbHVnaW5Db25maWcsXG4gIHR5cGUgSUFwcFJvdXRlcixcbiAgdHlwZSBQbHVnaW5NYW5pZmVzdCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBJbmRleENvbmZpZywgU2VhcmNoUmVxdWVzdCwgU2VhcmNoUmVzcG9uc2UgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcbmltcG9ydCB7IHBsdWdpblJlZ2lzdHJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBTZWFyY2hEb2N1bWVudCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYTcgfSBmcm9tIFwianNvbi1zY2hlbWFcIjtcbmltcG9ydCB7IExha2ViYXNlU2VhcmNoQmFja2VuZCB9IGZyb20gXCIuL2xha2ViYXNlLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2gvbGFrZWJhc2UtcGx1Z2luXCIpO1xuXG4vKiogUGVyLWFsaWFzIExha2ViYXNlIHNlYXJjaCBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYmFzZUFpU2VhcmNoSW5kZXhDb25maWcgZXh0ZW5kcyBPbWl0PFxuICBJbmRleENvbmZpZyxcbiAgXCJlbWJlZGRpbmdGblwiIHwgXCJlbmRwb2ludE5hbWVcIiB8IFwicGFnaW5hdGlvblwiIHwgXCJyZXJhbmtlclwiXG4+IHtcbiAgLyoqIERvY3VtZW50cyB1c2VkIHRvIHNlZWQgYW4gZW1wdHkgZnVsbC10ZXh0IHRhYmxlIGR1cmluZyBzZXR1cC4gKi9cbiAgZG9jdW1lbnRzPzogU2VhcmNoRG9jdW1lbnRbXTtcbiAgLyoqIERvY3VtZW50IGZpZWxkIGluZGV4ZWQgZmlyc3QuIERlZmF1bHRzIHRvIGB0ZXh0YC4gKi9cbiAgdGV4dENvbHVtbj86IHN0cmluZztcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBMYWtlYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBBcHBLaXQgQUkgU2VhcmNoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYmFzZUFpU2VhcmNoQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIGluZGV4ZXM/OiBSZWNvcmQ8c3RyaW5nLCBMYWtlYmFzZUFpU2VhcmNoSW5kZXhDb25maWc+O1xuICAvKiogUG9zdGdyZVNRTCBzY2hlbWEgdGhhdCBvd25zIHRoZSBnZW5lcmF0ZWQgZnVsbC10ZXh0IHRhYmxlcy4gKi9cbiAgc2NoZW1hPzogc3RyaW5nO1xuICAvKiogRW5hYmxlIHRoZSBkb2N1bWVudCB1cHNlcnQgcm91dGUgYW5kIGV4cG9ydGVkIG1ldGhvZC4gKi9cbiAgYWxsb3dXcml0ZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IENPTkZJR19TQ0hFTUE6IEpTT05TY2hlbWE3ID0ge1xuICB0eXBlOiBcIm9iamVjdFwiLFxuICByZXF1aXJlZDogW1wiaW5kZXhlc1wiXSxcbiAgcHJvcGVydGllczoge1xuICAgIGluZGV4ZXM6IHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczoge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgaW5kZXhOYW1lOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICBjb2x1bW5zOiB7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH0sXG4gICAgICAgICAgbnVtUmVzdWx0czogeyB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgcXVlcnlUeXBlOiB7IGVudW06IFtcImZ1bGxfdGV4dFwiXSB9LFxuICAgICAgICAgIGF1dGg6IHsgZW51bTogW1wic2VydmljZS1wcmluY2lwYWxcIiwgXCJvbi1iZWhhbGYtb2YtdXNlclwiXSB9LFxuICAgICAgICAgIHRleHRDb2x1bW46IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIGRvY3VtZW50czogeyB0eXBlOiBcImFycmF5XCIsIGl0ZW1zOiB7IHR5cGU6IFwib2JqZWN0XCIgfSB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNjaGVtYTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgYWxsb3dXcml0ZTogeyB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICB9LFxufTtcblxuaW50ZXJmYWNlIFJlc29sdmVkTGFrZWJhc2VJbmRleCB7XG4gIGFsaWFzOiBzdHJpbmc7XG4gIGluZGV4TmFtZTogc3RyaW5nO1xuICBjb25maWc6IExha2ViYXNlQWlTZWFyY2hJbmRleENvbmZpZztcbn1cblxuZnVuY3Rpb24gcm91dGVQYXJhbSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAodmFsdWVbMF0gPz8gXCJcIikgOiB2YWx1ZTtcbn1cblxuLyoqIExha2ViYXNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBuYXRpdmUgQXBwS2l0IGBhaVNlYXJjaGAgY29udHJhY3QuICovXG5leHBvcnQgY2xhc3MgTGFrZWJhc2VBaVNlYXJjaFBsdWdpbiBleHRlbmRzIFBsdWdpbjxMYWtlYmFzZUFpU2VhcmNoQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImFpU2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiTGFrZWJhc2UgQUkgU2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQXBwS2l0IEFJIFNlYXJjaCBjb250cmFjdCBiYWNrZWQgYnkgUG9zdGdyZVNRTCBmdWxsLXRleHQgc2VhcmNoXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHsgcmVxdWlyZWQ6IFtdLCBvcHRpb25hbDogW10gfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBDT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwiYWlTZWFyY2hcIj47XG5cbiAgZGVjbGFyZSBwcm90ZWN0ZWQgY29uZmlnOiBMYWtlYmFzZUFpU2VhcmNoQ29uZmlnO1xuICBwcml2YXRlIHNlcnZpY2VQcmluY2lwYWxCYWNrZW5kOiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXNlckJhY2tlbmQ6IExha2ViYXNlU2VhcmNoQmFja2VuZCB8IHVuZGVmaW5lZDtcblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmRleGVzID0gdGhpcy5pbmRleGVzKCk7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB0aGlzLnZhbGlkYXRlQXV0aChpbmRleCk7XG4gICAgdGhpcy5jb250ZXh0Py5vbkxpZmVjeWNsZShcInNldHVwOmNvbXBsZXRlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGxha2UgPSBwbHVnaW5SZWdpc3RyeS5yZXF1aXJlKHRoaXMuY29udGV4dCwgbGFrZWJhc2UsIHRoaXMpO1xuICAgICAgY29uc3Qgc2NoZW1hID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh0aGlzLmNvbmZpZy5zY2hlbWEpID8/IFwicHVibGljXCI7XG4gICAgICB0aGlzLnNlcnZpY2VQcmluY2lwYWxCYWNrZW5kID0gbmV3IExha2ViYXNlU2VhcmNoQmFja2VuZChsYWtlLmV4cG9ydHMoKS5wb29sLCBzY2hlbWEpO1xuICAgICAgdGhpcy51c2VyQmFja2VuZCA9IG5ldyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQoXG4gICAgICAgIHsgbWFuYWdlZFBvb2w6ICgpID0+IGxha2UuZXhwb3J0cygpLnBvb2wgfSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5kZXhlcykge1xuICAgICAgICBhd2FpdCB0aGlzLnNlcnZpY2VQcmluY2lwYWxCYWNrZW5kLnByb3Zpc2lvbihpbmRleC5pbmRleE5hbWUsIHtcbiAgICAgICAgICB0ZXh0Q29sdW1uOiBpbmRleC5jb25maWcudGV4dENvbHVtbiA/PyBcInRleHRcIixcbiAgICAgICAgICAuLi4oaW5kZXguY29uZmlnLmRvY3VtZW50cyA/IHsgc2VlZDogaW5kZXguY29uZmlnLmRvY3VtZW50cyB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMoKS5tYXAoKGluZGV4KSA9PiBpbmRleC5hbGlhcyksXG4gICAgICAgIHNjaGVtYSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5qZWN0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcInF1ZXJ5XCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogXCIvOmFsaWFzL3F1ZXJ5XCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlczogZXhwcmVzcy5SZXNwb25zZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFsaWFzID0gcm91dGVQYXJhbShyZXEucGFyYW1zLmFsaWFzKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucmVzb2x2ZUluZGV4KGFsaWFzKTtcbiAgICAgICAgICBjb25zdCB7IGNvbHVtbnM6IF91bnRydXN0ZWRDb2x1bW5zLCAuLi5yZXF1ZXN0IH0gPSBvYmplY3QuaXNSZWNvcmQocmVxLmJvZHkpXG4gICAgICAgICAgICA/IHJlcS5ib2R5XG4gICAgICAgICAgICA6IHt9O1xuICAgICAgICAgIHJlcy5qc29uKGF3YWl0IHRoaXMucm91dGVSdW50aW1lKGluZGV4LCByZXEpLnF1ZXJ5KGFsaWFzLCByZXF1ZXN0IGFzIFNlYXJjaFJlcXVlc3QpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7XG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlNlYXJjaCBmYWlsZWRcIixcbiAgICAgICAgICAgIHBsdWdpbjogdGhpcy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdldENvbmZpZ1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogXCIvOmFsaWFzL2NvbmZpZ1wiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXM6IGV4cHJlc3MuUmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlc29sdmVJbmRleChyb3V0ZVBhcmFtKHJlcS5wYXJhbXMuYWxpYXMpKTtcbiAgICAgICAgcmVzLmpzb24oe1xuICAgICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgICBjb2x1bW5zOiBpbmRleC5jb25maWcuY29sdW1ucyxcbiAgICAgICAgICBxdWVyeVR5cGU6IFwiZnVsbF90ZXh0XCIsXG4gICAgICAgICAgbnVtUmVzdWx0czogaW5kZXguY29uZmlnLm51bVJlc3VsdHMgPz8gMjAsXG4gICAgICAgICAgcmVyYW5rZXI6IGZhbHNlLFxuICAgICAgICAgIHBhZ2luYXRpb246IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmFsbG93V3JpdGUpIHtcbiAgICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICAgIG5hbWU6IFwiYWRkRG9jdW1lbnRzXCIsXG4gICAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICAgIHBhdGg6IFwiLzphbGlhcy9kb2N1bWVudHNcIixcbiAgICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXM6IGV4cHJlc3MuUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCBhbGlhcyA9IHJvdXRlUGFyYW0ocmVxLnBhcmFtcy5hbGlhcyk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlc29sdmVJbmRleChhbGlhcyk7XG4gICAgICAgICAgY29uc3QgZG9jdW1lbnRzID0gQXJyYXkuaXNBcnJheShyZXEuYm9keT8uZG9jdW1lbnRzKVxuICAgICAgICAgICAgPyByZXEuYm9keS5kb2N1bWVudHMuZmlsdGVyKG9iamVjdC5pc1JlY29yZClcbiAgICAgICAgICAgIDogW107XG4gICAgICAgICAgcmVzLmpzb24oYXdhaXQgdGhpcy5yb3V0ZVJ1bnRpbWUoaW5kZXgsIHJlcSkuYWRkRG9jdW1lbnRzKGFsaWFzLCBkb2N1bWVudHMpKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBRdWVyeSBvbmUgY29uZmlndXJlZCBMYWtlYmFzZSBmdWxsLXRleHQgaW5kZXggdXNpbmcgQXBwS2l0J3MgcmVzcG9uc2Ugc2hhcGUuICovXG4gIGFzeW5jIHF1ZXJ5KFxuICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgcmVxdWVzdDogU2VhcmNoUmVxdWVzdCxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXNwb25zZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+IHtcbiAgICBpZiAoIXJlcXVlc3QucXVlcnlUZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIHJlcXVpcmVzIHF1ZXJ5VGV4dFwiKTtcbiAgICB9XG4gICAgaWYgKHJlcXVlc3QucXVlcnlWZWN0b3IpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJMYWtlYmFzZSBBSSBTZWFyY2ggZG9lcyBub3QgYWNjZXB0IHF1ZXJ5VmVjdG9yXCIpO1xuICAgIH1cbiAgICBpZiAocmVxdWVzdC5xdWVyeVR5cGUgJiYgcmVxdWVzdC5xdWVyeVR5cGUgIT09IFwiZnVsbF90ZXh0XCIpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJMYWtlYmFzZSBBSSBTZWFyY2ggc3VwcG9ydHMgb25seSBmdWxsX3RleHQgcXVlcmllc1wiKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnJlc29sdmVJbmRleChhbGlhcyk7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1aXJlQmFja2VuZChpbmRleCkuc2VhcmNoKGluZGV4LmluZGV4TmFtZSwgcmVxdWVzdC5xdWVyeVRleHQsIHtcbiAgICAgIGxpbWl0OiByZXF1ZXN0Lm51bVJlc3VsdHMgPz8gaW5kZXguY29uZmlnLm51bVJlc3VsdHMgPz8gMjAsXG4gICAgICAuLi4ocmVxdWVzdC5maWx0ZXJzID8geyBmaWx0ZXI6IHJlcXVlc3QuZmlsdGVycyB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbHVtbnMgPSByZXF1ZXN0LmNvbHVtbnMgPz8gaW5kZXguY29uZmlnLmNvbHVtbnM7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdHM6IHJlc3VsdC5oaXRzLm1hcCgoaGl0KSA9PiAoe1xuICAgICAgICBzY29yZTogaGl0LnNjb3JlLFxuICAgICAgICBkYXRhOiB0aGlzLnByb2plY3QoeyBpZDogaGl0LmlkLCAuLi5oaXQuZmllbGRzIH0sIGNvbHVtbnMpLFxuICAgICAgfSkpLFxuICAgICAgdG90YWxDb3VudDogcmVzdWx0LmNvdW50LFxuICAgICAgcXVlcnlUaW1lTXM6IE1hdGgubWF4KDAsIHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0KSxcbiAgICAgIHF1ZXJ5VHlwZTogXCJmdWxsX3RleHRcIixcbiAgICAgIG5leHRQYWdlVG9rZW46IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBpbiBvbmUgY29uZmlndXJlZCBMYWtlYmFzZSBmdWxsLXRleHQgaW5kZXguICovXG4gIGFzeW5jIGFkZERvY3VtZW50cyhhbGlhczogc3RyaW5nLCBkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmFsbG93V3JpdGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJMYWtlYmFzZSBBSSBTZWFyY2ggd3JpdGVzIGFyZSBkaXNhYmxlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnJlc29sdmVJbmRleChhbGlhcyk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWlyZUJhY2tlbmQoaW5kZXgpLmFkZERvY3VtZW50cyhcbiAgICAgIGluZGV4LmluZGV4TmFtZSxcbiAgICAgIGRvY3VtZW50cy5maWx0ZXIob2JqZWN0LmlzUmVjb3JkKSxcbiAgICAgIGluZGV4LmNvbmZpZy50ZXh0Q29sdW1uID8/IFwidGV4dFwiLFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBjbGllbnRDb25maWcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluZGV4ZXM6IHRoaXMuaW5kZXhlcygpLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgcXVlcnlUeXBlOiBcImZ1bGxfdGV4dFwiIGFzIGNvbnN0LFxuICAgICAgICBwYWdpbmF0aW9uOiBmYWxzZSxcbiAgICAgIH0pKSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdmlkZXJLaW5kOiBcImxha2ViYXNlXCIgYXMgY29uc3QsXG4gICAgICBxdWVyeTogdGhpcy5xdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgYWRkRG9jdW1lbnRzOiB0aGlzLmFkZERvY3VtZW50cy5iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5zZXJ2aWNlUHJpbmNpcGFsQmFja2VuZD8uY2xvc2UoKSwgdGhpcy51c2VyQmFja2VuZD8uY2xvc2UoKV0pO1xuICAgIHRoaXMuc2VydmljZVByaW5jaXBhbEJhY2tlbmQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy51c2VyQmFja2VuZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgaW5kZXhlcygpOiBSZXNvbHZlZExha2ViYXNlSW5kZXhbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuY29uZmlnLmluZGV4ZXMgPz8ge30pLm1hcCgoW2FsaWFzLCBjb25maWddKSA9PiAoe1xuICAgICAgYWxpYXMsXG4gICAgICBpbmRleE5hbWU6IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoY29uZmlnLmluZGV4TmFtZSkgPz8gYWxpYXMsXG4gICAgICBjb25maWcsXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlSW5kZXgoYWxpYXM6IHN0cmluZyk6IFJlc29sdmVkTGFrZWJhc2VJbmRleCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4ZXMoKS5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5hbGlhcyA9PT0gYWxpYXMpO1xuICAgIGlmICghaW5kZXgpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFVua25vd24gQUkgU2VhcmNoIGluZGV4IGFsaWFzIFwiJHthbGlhc31cImApO1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBdXRoKGluZGV4OiBSZXNvbHZlZExha2ViYXNlSW5kZXgpOiB2b2lkIHtcbiAgICBjb25zdCBhdXRoID0gKGluZGV4LmNvbmZpZyBhcyB7IGF1dGg/OiB1bmtub3duIH0pLmF1dGg7XG4gICAgaWYgKGF1dGggIT09IHVuZGVmaW5lZCAmJiBhdXRoICE9PSBcInNlcnZpY2UtcHJpbmNpcGFsXCIgJiYgYXV0aCAhPT0gXCJvbi1iZWhhbGYtb2YtdXNlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBVbmtub3duIEFJIFNlYXJjaCBhdXRoIG1vZGUgZm9yIFwiJHtpbmRleC5hbGlhc31cImApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcm91dGVSdW50aW1lKGluZGV4OiBSZXNvbHZlZExha2ViYXNlSW5kZXgsIHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogdGhpcyB7XG4gICAgcmV0dXJuIGluZGV4LmNvbmZpZy5hdXRoID09PSBcIm9uLWJlaGFsZi1vZi11c2VyXCIgPyB0aGlzLmFzVXNlcihyZXEpIDogdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWlyZUJhY2tlbmQoaW5kZXg6IFJlc29sdmVkTGFrZWJhc2VJbmRleCk6IExha2ViYXNlU2VhcmNoQmFja2VuZCB7XG4gICAgY29uc3QgYmFja2VuZCA9XG4gICAgICBpbmRleC5jb25maWcuYXV0aCA9PT0gXCJvbi1iZWhhbGYtb2YtdXNlclwiXG4gICAgICAgID8gdGhpcy51c2VyQmFja2VuZFxuICAgICAgICA6IHRoaXMuc2VydmljZVByaW5jaXBhbEJhY2tlbmQ7XG4gICAgaWYgKCFiYWNrZW5kKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiTGFrZWJhc2UgQUkgU2VhcmNoIGlzIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICByZXR1cm4gYmFja2VuZDtcbiAgfVxuXG4gIHByaXZhdGUgcHJvamVjdChcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghY29sdW1ucz8ubGVuZ3RoKSByZXR1cm4gZGF0YTtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgY29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uIGluIGRhdGEpLm1hcCgoY29sdW1uKSA9PiBbY29sdW1uLCBkYXRhW2NvbHVtbl1dKSxcbiAgICApO1xuICB9XG59XG5cbi8qKiBBcHBLaXQtY29tcGF0aWJsZSBMYWtlYmFzZSBBSSBTZWFyY2ggcHJvdmlkZXIuICovXG5leHBvcnQgY29uc3QgbGFrZWJhc2VBaVNlYXJjaCA9IHRvUGx1Z2luKExha2ViYXNlQWlTZWFyY2hQbHVnaW4pO1xuIl19
@@ -148,7 +148,15 @@ export declare class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig>
148
148
  count: number;
149
149
  }>;
150
150
  /** Create a Vector Search index (throws when writes are disabled). */
151
- createIndex: (request: searchSchemas.CreateIndexRequest, signal?: AbortSignal) => Promise<import("./client.ts").IndexInfo>;
151
+ createIndex: (request: searchSchemas.CreateIndexRequest, signal?: AbortSignal) => Promise<{
152
+ name: string;
153
+ columns: string[];
154
+ ready: boolean;
155
+ endpoint?: string | undefined;
156
+ primaryKey?: string | undefined;
157
+ rowCount?: number | undefined;
158
+ directAccess?: boolean | undefined;
159
+ }>;
152
160
  /** Sync a Delta Sync index from its source table (throws when writes are disabled). */
153
161
  syncIndex: (request: searchSchemas.SyncIndexRequest, signal?: AbortSignal) => Promise<{
154
162
  index: string;
package/lib/src/plugin.js CHANGED
@@ -217,7 +217,7 @@ export class SearchPlugin extends ToolRegistryPlugin {
217
217
  });
218
218
  }
219
219
  catch (cause) {
220
- logger.warn("ensure-failed", { index, message: errorUtils.errorMessage(cause) });
220
+ logger.warn("ensure-failed", { index, error: errorUtils.toError(cause) });
221
221
  }
222
222
  }
223
223
  /** Build a Vector Search `schema_json` map from a seed document's value types. */
@@ -323,7 +323,10 @@ export class SearchPlugin extends ToolRegistryPlugin {
323
323
  }
324
324
  catch (cause) {
325
325
  const message = errorUtils.errorMessage(cause);
326
- logger.warn("route-failed", { operation, message });
326
+ logger.warn("route-failed", {
327
+ operation,
328
+ error: errorUtils.toError(cause),
329
+ });
327
330
  res.status(500).json({ error: message });
328
331
  }
329
332
  }
@@ -414,4 +417,4 @@ export class SearchPlugin extends ToolRegistryPlugin {
414
417
  * ```
415
418
  */
416
419
  export const search = toPlugin(SearchPlugin);
417
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBd0MsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBcUIsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRixPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBMkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUEyQixNQUFNLGFBQWEsQ0FBQztBQUNqRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQXNCLE1BQU0sY0FBYyxDQUFDO0FBQzdGLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsNkJBQTZCLEVBQzdCLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFDM0IsaUNBQWlDLEdBQ2xDLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztBQUVyQywyRUFBMkU7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LE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2pDLENBQUM7O0FBR0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcEtpdCBleHRlbnNpb24gcGx1Z2luIChyZWdpc3RlcmVkIG5hbWU6IGBzZWFyY2hgKSBhcm91bmQgYSBzaWJsaW5nXG4gKiBgYWlTZWFyY2hgIHByb3ZpZGVyLiBOYXRpdmUgQXBwS2l0IG93bnMgVmVjdG9yIFNlYXJjaCBxdWVyeSBleGVjdXRpb247IHRoaXNcbiAqIHBsdWdpbiBhZGRzIHRoZSBzdXJmYWNlcyB0aGF0IHJlbWFpbiB1c2VmdWwgYWNyb3NzIG5hdGl2ZSBhbmQgTGFrZWJhc2VcbiAqIHByb3ZpZGVyczpcbiAqXG4gKiAgIC0gYSBgc2VhcmNoYCAvIGB1bml2ZXJzYWxfc2VhcmNoYCAvIChvcHQtaW4pIGBhZGRfZG9jdW1lbnRzYCB0b29sIHNldCBmb3JcbiAqICAgICBib3RoIE1hc3RyYSBhbmQgQXBwS2l0IGFnZW50cyAoYXV0b2NvbXBsZXRlIGlzIGEgc21hbGwtYGxpbWl0YCBzZWFyY2gpO1xuICogICAtIGNvbXBhdGliaWxpdHkgYW5kIGV4dGVuc2lvbiByb3V0ZXMgdW5kZXIgYC9hcGkvc2VhcmNoYFxuICogICAgIChgUE9TVCAvYCBzZWFyY2gsIGBQT1NUIC91bml2ZXJzYWxgIGZlZGVyYXRlZCwgYEdFVCAvaW5kZXhlc2AgY2F0YWxvZ3VlLFxuICogICAgIGFuZCBgUE9TVCAvZG9jdW1lbnRzYCB3aGVuIHdyaXRlcyBhcmUgZW5hYmxlZCk7XG4gKiAgIC0gYSBgY2xpZW50Q29uZmlnKClgIHBheWxvYWQgc28gYSBVSSBrbm93cyB0aGUgaW5kZXhlcywgZGVmYXVsdCwgYW5kIHBhZ2VcbiAqICAgICBzaXplIGF0IGJvb3Qgd2l0aCBubyByb3VuZC10cmlwO1xuICogICAtIGBleHBvcnRzKClgIHNvIGFwcCBjb2RlIGNhbiBgYXBwa2l0LnNlYXJjaC5zZWFyY2goLi4uKWAgZGlyZWN0bHkuXG4gKlxuICogVmVjdG9yIFNlYXJjaCByZWFkcyBkZWxlZ2F0ZSB0byB0aGUgcmVnaXN0ZXJlZCBuYXRpdmUgQXBwS2l0IGBhaVNlYXJjaGBcbiAqIHBsdWdpbiwgcHJlc2VydmluZyBpdHMgT0JPLCBjYWNoaW5nLCByZXJhbmtpbmcsIGFuZCByZXNwb25zZSBoYW5kbGluZy4gVGhlXG4gKiBhbHRlcm5hdGl2ZSBgbGFrZWJhc2VBaVNlYXJjaGAgcHJvdmlkZXIgc3VwcGxpZXMgdGhlIHNhbWUgcXVlcnkgY29udHJhY3RcbiAqIG92ZXIgUG9zdGdyZVNRTCBmdWxsLXRleHQgc2VhcmNoLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyB0b1BsdWdpbiwgdHlwZSBJQXBwUm91dGVyLCB0eXBlIFBsdWdpbk1hbmlmZXN0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYWlTZWFyY2gsIGRlZmluZVRvb2wsIHR5cGUgVG9vbFJlZ2lzdHJ5IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSwgVG9vbFJlZ2lzdHJ5UGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHNlYXJjaFNjaGVtYXMsIHR5cGUgU2VhcmNoQ2xpZW50Q29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHsgdG9TZWFyY2hPcHRpb25zLCB0b1VuaXZlcnNhbFNlYXJjaE9wdGlvbnMgfSBmcm9tIFwiLi9fc2VhcmNoLW9wdGlvbnMudHNcIjtcbmltcG9ydCB7IFNFQVJDSF9DT05GSUdfU0NIRU1BLCByZXNvbHZlU2VhcmNoQ29uZmlnLCB0eXBlIFNlYXJjaFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgdG9DcmVhdGVJbmRleE9wdGlvbnMgfSBmcm9tIFwiLi9pbmRleC1vcHRpb25zLnRzXCI7XG5pbXBvcnQgeyBuYXRpdmVBaVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9uYXRpdmUudHNcIjtcbmltcG9ydCB7IHRvRG9jdW1lbnRBcnJheSB9IGZyb20gXCIuL3F1ZXJ5LnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVTZWFyY2hSdW50aW1lLCBzZXRTZWFyY2hSZWFkQmFja2VuZCwgdHlwZSBTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHtcbiAgQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxufSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInNlYXJjaFwiKTtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBhIHVuaXZlcnNhbCAoZmVkZXJhdGVkKSBzZWFyY2ggYWNyb3NzIGluZGV4ZXMuICovXG5jb25zdCBVTklWRVJTQUxfUk9VVEUgPSBcIi91bml2ZXJzYWxcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIHNlcnZpbmcgdGhlIGluZGV4IGNhdGFsb2d1ZSBhIHNlYXJjaCBib3ggcmVhZHMuICovXG5jb25zdCBJTkRFWEVTX1JPVVRFID0gXCIvaW5kZXhlc1wiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIGFkZGluZyBkb2N1bWVudHMgdG8gYSBkaXJlY3QtYWNjZXNzIGluZGV4LiAqL1xuY29uc3QgRE9DVU1FTlRTX1JPVVRFID0gXCIvZG9jdW1lbnRzXCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3IgY3JlYXRpbmcgYSBWZWN0b3IgU2VhcmNoIGluZGV4LiAqL1xuY29uc3QgSU5ERVhfUk9VVEUgPSBcIi9pbmRleFwiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIHN5bmNpbmcgYSBEZWx0YSBTeW5jIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZS4gKi9cbmNvbnN0IElOREVYX1NZTkNfUk9VVEUgPSBcIi9pbmRleC9zeW5jXCI7XG5cbi8qKlxuICogQXBwS2l0IGV4dGVuc2lvbiBwbHVnaW4gZm9yIGFnZW50IHRvb2xzLCBmZWRlcmF0ZWQgc2VhcmNoLCBhbmQgb3B0aW9uYWxcbiAqIFZlY3RvciBTZWFyY2ggbGlmZWN5Y2xlIG9wZXJhdGlvbnMuIFJlZ2lzdGVyIGBhaVNlYXJjaCgpYCBvclxuICogYGxha2ViYXNlQWlTZWFyY2goKWAgYmVmb3JlIHRoaXMgcGx1Z2luLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBhaVNlYXJjaCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuICogaW1wb3J0IHsgc2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIGFpU2VhcmNoKHtcbiAqICAgICAgIGluZGV4ZXM6IHtcbiAqICAgICAgICAgZG9jczoge1xuICogICAgICAgICAgIGluZGV4TmFtZTogXCJtYWluLnN1cHBvcnQuZG9jc1wiLFxuICogICAgICAgICAgIGNvbHVtbnM6IFtcImlkXCIsIFwidGl0bGVcIiwgXCJib2R5XCJdLFxuICogICAgICAgICB9LFxuICogICAgICAgfSxcbiAqICAgICB9KSxcbiAqICAgICBzZWFyY2goe1xuICogICAgICAgaW5kZXg6IFwibWFpbi5zdXBwb3J0LmRvY3NcIixcbiAqICAgICAgIGluZGV4ZXM6IFt7IG5hbWU6IFwibWFpbi5zdXBwb3J0LmRvY3NcIiwgYWxpYXM6IFwiZG9jc1wiIH1dLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIFRvb2xSZWdpc3RyeVBsdWdpbjxTZWFyY2hQbHVnaW5Db25maWc+IHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwic2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQUkgU2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXhlczogYWdlbnQgdG9vbHMsIEhUVFAgcm91dGVzIGZvciBhIFwiICtcbiAgICAgIFwic2VhcmNoIGJveCwgdW5pdmVyc2FsIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcywgYW5kIGFuIG9wdC1pbiBkb2N1bWVudCB3cml0ZSBzdXJmYWNlLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW10sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBTRUFSQ0hfQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcInNlYXJjaFwiPjtcblxuICAvKiogUnVudGltZSBvd25lZCBleGNsdXNpdmVseSBieSB0aGlzIHBsdWdpbiBpbnN0YW5jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lOiBTZWFyY2hSdW50aW1lID0gY3JlYXRlU2VhcmNoUnVudGltZSh7IGNvbmZpZzogdGhpcy5jb25maWcgfSk7XG5cbiAgLyoqIFRoZSBiYXNlIHBhdGggQXBwS2l0IG1vdW50cyB0aGlzIHBsdWdpbidzIHJvdXRlcyB1bmRlci4gKi9cbiAgcHJpdmF0ZSBnZXQgYmFzZVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC9hcGkvJHtTZWFyY2hQbHVnaW4ubWFuaWZlc3QubmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b29scyB0aGlzIHBsdWdpbiBvZmZlcnMgdG8gYW4gQXBwS2l0IGFnZW50LiBgc2VhcmNoYCAvXG4gICAqIGB1bml2ZXJzYWxfc2VhcmNoYCBhcmUgcmVhZHM7IGBhZGRfZG9jdW1lbnRzYCAvIGBjcmVhdGVfaW5kZXhgIC9cbiAgICogYHN5bmNfaW5kZXhgIGFyZSBvbmx5IG9mZmVyZWQgd2hlbiB0aGUgd3JpdGUgc3VyZmFjZSBpcyBlbmFibGVkLiBOb25lIGlzXG4gICAqIGF1dG9Jbmhlcml0YWJsZTogZXZlcnkgdG9vbCBydW5zIHVuZGVyIHRoZSBjYWxsZXIncyBpZGVudGl0eSwgc28gaXQgbXVzdCBiZVxuICAgKiBncmFudGVkIGV4cGxpY2l0bHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRvb2xSZWdpc3RyeSgpOiBUb29sUmVnaXN0cnkge1xuICAgIGNvbnN0IHsgY29uZmlnLCByZWFkQmFja2VuZCB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IHJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgICBzZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2VhcmNoU2NoZW1hcy5zZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICAgIHVuaXZlcnNhbF9zZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNlYXJjaFNjaGVtYXMudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcInJlYWRcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1blVuaXZlcnNhbFNlYXJjaChhcmdzLCBzaWduYWwpLFxuICAgICAgfSksXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmFsbG93V3JpdGUpIHtcbiAgICAgIHJlZ2lzdHJ5LmFkZF9kb2N1bWVudHMgPSBkZWZpbmVUb29sKHtcbiAgICAgICAgZGVzY3JpcHRpb246IEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgc2NoZW1hOiBzZWFyY2hTY2hlbWFzLnNlYXJjaFJlcXVlc3RTY2hlbWFcbiAgICAgICAgICAucGljayh7IGluZGV4OiB0cnVlIH0pXG4gICAgICAgICAgLmV4dGVuZCh7IGRvY3VtZW50czogc2VhcmNoU2NoZW1hcy5zZWFyY2hEb2N1bWVudFNjaGVtYS5hcnJheSgpIH0pLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1bkFkZERvY3VtZW50cyhhcmdzLCBzaWduYWwpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVhZEJhY2tlbmQ/LnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICAgIHJlZ2lzdHJ5LmNyZWF0ZV9pbmRleCA9IGRlZmluZVRvb2woe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgICBzY2hlbWE6IHNlYXJjaFNjaGVtYXMuY3JlYXRlSW5kZXhSZXF1ZXN0U2NoZW1hLFxuICAgICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1bkNyZWF0ZUluZGV4KGFyZ3MsIHNpZ25hbCksXG4gICAgICAgIH0pO1xuICAgICAgICByZWdpc3RyeS5zeW5jX2luZGV4ID0gZGVmaW5lVG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgICBzY2hlbWE6IHNlYXJjaFNjaGVtYXMuc3luY0luZGV4UmVxdWVzdFNjaGVtYSxcbiAgICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5TeW5jSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyeTtcbiAgfVxuXG4gIC8qKiBBdHRhY2ggdGhlIHJlZ2lzdGVyZWQgcHJvdmlkZXIgYW5kIGxvZyB0aGUgZWZmZWN0aXZlIHBvbGljeSBhdCBib290LiAqL1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWFkQmFja2VuZCA9IHRoaXMucmVzb2x2ZVByb3ZpZGVyQmFja2VuZCgpO1xuICAgIHNldFNlYXJjaFJlYWRCYWNrZW5kKHRoaXMucnVudGltZSwgcmVhZEJhY2tlbmQpO1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBiYWNrZW5kOiByZWFkQmFja2VuZC5zdXBwb3J0c0xpZmVjeWNsZSA/IFwiYXBwa2l0LWFpLXNlYXJjaFwiIDogXCJsYWtlYmFzZS1haS1zZWFyY2hcIixcbiAgICAgIGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIihub25lIC0gcGFzcyBwZXIgcmVxdWVzdClcIixcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaSkgPT4gaS5hbGlhcyksXG4gICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2VTaXplLFxuICAgICAgbW9kZTogY29uZmlnLm1vZGUsXG4gICAgICBhbGxvd1dyaXRlOiBjb25maWcuYWxsb3dXcml0ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgZW5zdXJlT25TZXR1cDogY29uZmlnLmVuc3VyZU9uU2V0dXBcbiAgICAgICAgPyAoY29uZmlnLmVuc3VyZU9uU2V0dXAuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleClcbiAgICAgICAgOiBcIm9mZlwiLFxuICAgIH0pO1xuICAgIC8vIFByb3Zpc2lvbiBhIHJlYWwgaW5kZXggaW4gdGhlIEJBQ0tHUk9VTkQgc28gYSBzbG93IGZpcnN0LXRpbWUgZW5kcG9pbnQgb3JcbiAgICAvLyBpbmRleCBidWlsZCBuZXZlciBibG9ja3MgdGhlIHNlcnZlciBmcm9tIGNvbWluZyB1cC5cbiAgICBpZiAoY29uZmlnLmVuc3VyZU9uU2V0dXAgJiYgcmVhZEJhY2tlbmQuc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgIHZvaWQgdGhpcy5ydW5FbnN1cmVPblNldHVwKGNvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc29sdmUgdGhlIHJlZ2lzdGVyZWQgQXBwS2l0LWNvbXBhdGlibGUgQUkgU2VhcmNoIHByb3ZpZGVyLiAqL1xuICBwcml2YXRlIHJlc29sdmVQcm92aWRlckJhY2tlbmQoKTogUmV0dXJuVHlwZTx0eXBlb2YgbmF0aXZlQWlTZWFyY2hCYWNrZW5kPiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBwbHVnaW5SZWdpc3RyeS5yZXF1aXJlKHRoaXMuY29udGV4dCwgYWlTZWFyY2gsIHRoaXMpLmV4cG9ydHMoKTtcbiAgICByZXR1cm4gbmF0aXZlQWlTZWFyY2hCYWNrZW5kKHByb3ZpZGVyLCByZXNvbHZlU2VhcmNoQ29uZmlnKHRoaXMuY29uZmlnKSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIHRoZW0sIGhvbm9yaW5nIGBlbnN1cmVPblNldHVwYC5cbiAgICogVXNlcyBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKSB2aWEgdGhlIGNsaWVudCdzXG4gICAqIG91dC1vZi1yZXF1ZXN0IGZhbGxiYWNrLiBGYWlsdXJlcyBhcmUgbG9nZ2VkLCBuZXZlciB0aHJvd24gLSBhIHNlYXJjaCBhcHBcbiAgICogc2hvdWxkIHN0aWxsIHN0YXJ0IGV2ZW4gaWYgcHJvdmlzaW9uaW5nIGlzIHNsb3cgb3IgYSBwZXJtaXNzaW9uIGlzIG1pc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnOiBTZWFyY2hSdW50aW1lW1wiY29uZmlnXCJdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbmZpZy5lbnN1cmVPblNldHVwO1xuICAgIGlmICghc3BlYykgcmV0dXJuO1xuICAgIGNvbnN0IGluZGV4ID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChzcGVjLmluZGV4KSA/PyBjb25maWcuZGVmYXVsdEluZGV4O1xuICAgIGlmICghaW5kZXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiZW5zdXJlLXNraXBwZWRcIiwge1xuICAgICAgICByZWFzb246IFwibm8gaW5kZXggbmFtZSAoc2V0IGBpbmRleGAgb3IgYGVuc3VyZU9uU2V0dXAuaW5kZXhgKVwiLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRvY3VtZW50cyA9IHNwZWMuZG9jdW1lbnRzID8/IFtdO1xuICAgIC8vIEluZmVyIGEgbWFuYWdlZC1kaXJlY3QtYWNjZXNzIHNjaGVtYSBmcm9tIHRoZSBmaXJzdCBzZWVkIHJvdyB3aGVuIG5vdCBnaXZlbi5cbiAgICBjb25zdCBzY2hlbWEgPVxuICAgICAgc3BlYy5zY2hlbWEgPz9cbiAgICAgIChkb2N1bWVudHMubGVuZ3RoID4gMCAmJiAhc3BlYy5zb3VyY2VUYWJsZVxuICAgICAgICA/IHRoaXMuaW5mZXJTY2hlbWEoZG9jdW1lbnRzWzBdLCBzcGVjLnByaW1hcnlLZXkgPz8gXCJpZFwiLCBzcGVjLnRleHRDb2x1bW4gPz8gXCJ0ZXh0XCIpXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgICB0cnkge1xuICAgICAgbG9nZ2VyLmluZm8oXCJlbnN1cmUtc3RhcnRcIiwgeyBpbmRleCB9KTtcbiAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICBjb25zdCBpbmZvID0gYXdhaXQgY2xpZW50LnByb3Zpc2lvbihpbmRleCwge1xuICAgICAgICAuLi4oc3BlYy5lbmRwb2ludCA/IHsgZW5kcG9pbnQ6IHNwZWMuZW5kcG9pbnQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMucHJpbWFyeUtleSA/IHsgcHJpbWFyeUtleTogc3BlYy5wcmltYXJ5S2V5IH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnRleHRDb2x1bW4gPyB7IGVtYmVkZGluZ1NvdXJjZUNvbHVtbjogc3BlYy50ZXh0Q29sdW1uIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLmVtYmVkZGluZ01vZGVsID8geyBlbWJlZGRpbmdNb2RlbDogc3BlYy5lbWJlZGRpbmdNb2RlbCB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5zb3VyY2VUYWJsZSA/IHsgc291cmNlVGFibGU6IHNwZWMuc291cmNlVGFibGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNjaGVtYSA/IHsgc2NoZW1hIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnRpbWVvdXRNcyA/IHsgdGltZW91dE1zOiBzcGVjLnRpbWVvdXRNcyB9IDoge30pLFxuICAgICAgICAuLi4oZG9jdW1lbnRzLmxlbmd0aCA+IDAgPyB7IHNlZWQ6IGRvY3VtZW50cyB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBsb2dnZXIuaW5mbyhcImVuc3VyZS1yZWFkeVwiLCB7XG4gICAgICAgIGluZGV4OiBpbmZvLm5hbWUsXG4gICAgICAgIHJlYWR5OiBpbmZvLnJlYWR5LFxuICAgICAgICByb3dDb3VudDogaW5mby5yb3dDb3VudCA/PyAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiZW5zdXJlLWZhaWxlZFwiLCB7IGluZGV4LCBtZXNzYWdlOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVzZSkgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIGEgVmVjdG9yIFNlYXJjaCBgc2NoZW1hX2pzb25gIG1hcCBmcm9tIGEgc2VlZCBkb2N1bWVudCdzIHZhbHVlIHR5cGVzLiAqL1xuICBwcml2YXRlIGluZmVyU2NoZW1hKFxuICAgIGRvYzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcHJpbWFyeUtleTogc3RyaW5nLFxuICAgIHRleHRDb2x1bW46IHN0cmluZyxcbiAgKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsIFt0ZXh0Q29sdW1uXTogXCJzdHJpbmdcIiB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRvYykpIHtcbiAgICAgIGlmIChrZXkgaW4gc2NoZW1hKSBjb250aW51ZTtcbiAgICAgIHNjaGVtYVtrZXldID1cbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgPyBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKVxuICAgICAgICAgICAgPyBcImludFwiXG4gICAgICAgICAgICA6IFwiZG91YmxlXCJcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgICAgID8gXCJib29sZWFuXCJcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIjtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKiBSZWxlYXNlIHRoaXMgcGx1Z2luJ3MgaW5zdGFuY2Utb3duZWQgcnVudGltZS4gKi9cbiAgc2h1dGRvd24oKTogdm9pZCB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IGV4dGVuc2lvbiByb3V0ZXMgdW5kZXIgYC9hcGkvc2VhcmNoYC4gU2luZ2xlLWluZGV4IHF1ZXJpZXMgc3RheSBvblxuICAgKiB0aGUgcHJvdmlkZXIncyBuYXRpdmUgYC9hcGkvYWktc2VhcmNoLzphbGlhcy9xdWVyeWAgc3VyZmFjZS5cbiAgICovXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJ1bml2ZXJzYWxTZWFyY2hcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBVTklWRVJTQUxfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJ1bml2ZXJzYWxTZWFyY2hcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzZWFyY2hTY2hlbWFzLnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UocmVxLmJvZHkgPz8ge30pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmFzVXNlcihyZXEpLnJ1blVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImluZGV4ZXNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IElOREVYRVNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoX3JlcSwgcmVzKSA9PiB7XG4gICAgICAgIHJlcy5qc29uKHRoaXMuY2xpZW50Q29uZmlnKCkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkb2N1bWVudHNcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBET0NVTUVOVFNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGRvY3VtZW50IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJhZGREb2N1bWVudHNcIiwgKCkgPT5cbiAgICAgICAgICB0aGlzLmFzVXNlcihyZXEpLnJ1bkFkZERvY3VtZW50cyhyZXEuYm9keSA/PyB7fSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImNyZWF0ZUluZGV4XCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogSU5ERVhfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUgfHwgIXJlYWRCYWNrZW5kPy5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGluZGV4IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJjcmVhdGVJbmRleFwiLCAoKSA9PlxuICAgICAgICAgIHRoaXMuYXNVc2VyKHJlcSkucnVuQ3JlYXRlSW5kZXgocmVxLmJvZHkgPz8ge30pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzeW5jSW5kZXhcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBJTkRFWF9TWU5DX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnLCByZWFkQmFja2VuZCB9ID0gdGhpcy5ydW50aW1lO1xuICAgICAgICBpZiAoIWNvbmZpZy5hbGxvd1dyaXRlIHx8ICFyZWFkQmFja2VuZD8uc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcInRoZSBpbmRleCB3cml0ZSBzdXJmYWNlIGlzIGRpc2FibGVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwic3luY0luZGV4XCIsICgpID0+IHRoaXMuYXNVc2VyKHJlcSkucnVuU3luY0luZGV4KHJlcS5ib2R5ID8/IHt9KSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIHJvdXRlIGJvZHksIHR1cm5pbmcgYSBmYWlsdXJlIGludG8gYSBKU09OIGVycm9yIHJlc3BvbnNlLlxuICAgKlxuICAgKiBBcHBLaXQncyBgcm91dGUoKWAgcmVnaXN0ZXJzIHRoZSBoYW5kbGVyIGFzLWlzLCBzbyBhIHJlamVjdGlvbiBlc2NhcGVzIGFzXG4gICAqIGFuIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiBhbmQgdGFrZXMgdGhlIHdob2xlIHByb2Nlc3MgZG93biByYXRoZXIgdGhhblxuICAgKiBmYWlsaW5nIHRoZSBvbmUgcmVxdWVzdC4gRXZlcnkgcm91dGUgaGVyZSBnb2VzIHRocm91Z2ggdGhpcywgc28gYSBiYWQgaW5kZXhcbiAgICogbmFtZSBvciBhIFZlY3RvciBTZWFyY2ggQVBJIGVycm9yIHJldHVybnMgNTAwIHdpdGggYSBtZXNzYWdlIGluc3RlYWQgb2ZcbiAgICoga2lsbGluZyB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNwb25kKFxuICAgIHJlczogUGFyYW1ldGVyczxQYXJhbWV0ZXJzPElBcHBSb3V0ZXJbXCJwb3N0XCJdPlsxXT5bMV0sXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgcnVuOiAoKSA9PiBQcm9taXNlPHVua25vd24+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmVzLmpzb24oYXdhaXQgcnVuKCkpO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoY2F1c2UpO1xuICAgICAgbG9nZ2VyLndhcm4oXCJyb3V0ZS1mYWlsZWRcIiwgeyBvcGVyYXRpb24sIG1lc3NhZ2UgfSk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBtZXNzYWdlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdXJmYWNlIHRoZSBpbmRleCBjYXRhbG9ndWUgKyBkZWZhdWx0cyBzbyBhIHNlYXJjaCBib3ggbmVlZHMgbm8gcm91bmQtdHJpcC4gKi9cbiAgb3ZlcnJpZGUgY2xpZW50Q29uZmlnKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCB7IGNvbmZpZyB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaENsaWVudENvbmZpZyA9IHtcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgIG5hbWU6IGluZGV4Lm5hbWUsXG4gICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgLi4uKGluZGV4LnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IGluZGV4LnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4LmNvbHVtbnMgPyB7IGNvbHVtbnM6IGluZGV4LmNvbHVtbnMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4Lm5hbWUgPT09IGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGlzRGVmYXVsdDogdHJ1ZSB9IDoge30pLFxuICAgICAgfSkpLFxuICAgICAgLi4uKGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCB9IDoge30pLFxuICAgICAgcGFnZVNpemU6IGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgIH07XG4gICAgcmV0dXJuIHBheWxvYWQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKiBTZWFyY2ggb25lIGluZGV4IChkZWZhdWx0IHdoZW4gb21pdHRlZCkuIFJ1bnMgYXMgdGhlIGN1cnJlbnQgY29udGV4dCB1c2VyLiAqL1xuICAgICAgc2VhcmNoOiAocmVxdWVzdDogc2VhcmNoU2NoZW1hcy5TZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5TZWFyY2gocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBTZWFyY2ggYWNyb3NzIGV2ZXJ5IGNvbmZpZ3VyZWQgaW5kZXggYW5kIG1lcmdlIHRoZSBoaXRzLiAqL1xuICAgICAgdW5pdmVyc2FsU2VhcmNoOiAocmVxdWVzdDogc2VhcmNoU2NoZW1hcy5Vbml2ZXJzYWxTZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5Vbml2ZXJzYWxTZWFyY2gocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBpbiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgYWRkRG9jdW1lbnRzOiAocmVxdWVzdDogeyBpbmRleD86IHN0cmluZzsgZG9jdW1lbnRzOiB1bmtub3duIH0sIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkFkZERvY3VtZW50cyhyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIENyZWF0ZSBhIFZlY3RvciBTZWFyY2ggaW5kZXggKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgY3JlYXRlSW5kZXg6IChyZXF1ZXN0OiBzZWFyY2hTY2hlbWFzLkNyZWF0ZUluZGV4UmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuQ3JlYXRlSW5kZXgocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBTeW5jIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUgKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgc3luY0luZGV4OiAocmVxdWVzdDogc2VhcmNoU2NoZW1hcy5TeW5jSW5kZXhSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5TeW5jSW5kZXgocmVxdWVzdCwgc2lnbmFsKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TZWFyY2goYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoU2NoZW1hcy5zZWFyY2hSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIGNsaWVudC5zZWFyY2gocmVxdWVzdC5xdWVyeSwgdG9TZWFyY2hPcHRpb25zKHJlcXVlc3QsIHNpZ25hbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5Vbml2ZXJzYWxTZWFyY2goYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoU2NoZW1hcy51bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIGNsaWVudC51bml2ZXJzYWxTZWFyY2gocmVxdWVzdC5xdWVyeSwgdG9Vbml2ZXJzYWxTZWFyY2hPcHRpb25zKHJlcXVlc3QsIHNpZ25hbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5BZGREb2N1bWVudHMoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZWNvcmQgPSAoYXJncyA/PyB7fSkgYXMgeyBpbmRleD86IHN0cmluZzsgZG9jdW1lbnRzOiB1bmtub3duIH07XG4gICAgY29uc3QgeyBjbGllbnQsIGNvbmZpZyB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IGRvY3VtZW50cyA9IHRvRG9jdW1lbnRBcnJheShyZWNvcmQuZG9jdW1lbnRzKTtcbiAgICBjb25zdCBpbmRleCA9IHJlY29yZC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiXCI7XG4gICAgcmV0dXJuIGNsaWVudC5hZGREb2N1bWVudHMoaW5kZXgsIGRvY3VtZW50cywgc2lnbmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQ3JlYXRlSW5kZXgoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoU2NoZW1hcy5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMucnVudGltZTtcbiAgICByZXR1cm4gY2xpZW50LmNyZWF0ZUluZGV4KHJlcXVlc3QubmFtZSwgdG9DcmVhdGVJbmRleE9wdGlvbnMocmVxdWVzdCwgc2lnbmFsKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blN5bmNJbmRleChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzZWFyY2hTY2hlbWFzLnN5bmNJbmRleFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQsIGNvbmZpZyB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IGluZGV4ID0gcmVxdWVzdC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiXCI7XG4gICAgYXdhaXQgY2xpZW50LnN5bmNJbmRleChpbmRleCwgc2lnbmFsKTtcbiAgICByZXR1cm4geyBpbmRleCwgc3luY2VkOiB0cnVlIH07XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgQUkgU2VhcmNoIHBsdWdpbiB3aXRoIEFwcEtpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgc2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG4gKiBpbXBvcnQgeyBhZ2VudHMsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiBjb25zdCBzdXBwb3J0ID0gYWdlbnRzLmNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIkFuc3dlciBmcm9tIHRoZSBkb2NzOyB1c2UgYHNlYXJjaGAgdG8gZmluZCB0aGVtLlwiLFxuICogICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHsgLi4uKGF3YWl0IHBsdWdpbnMuc2VhcmNoLnRvb2xraXQoKSkgfTtcbiAqICAgfSxcbiAqIH0pO1xuICpcbiAqIGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBzZXJ2ZXIoKSxcbiAqICAgICBzZWFyY2goeyBpbmRleDogXCJtYWluLnN1cHBvcnQuZG9jc1wiIH0pLFxuICogICAgIG1hc3RyYSh7IGFnZW50czogc3VwcG9ydCB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBzZWFyY2ggPSB0b1BsdWdpbihTZWFyY2hQbHVnaW4pO1xuIl19
420
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBd0MsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBcUIsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRixPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBMkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUEyQixNQUFNLGFBQWEsQ0FBQztBQUNqRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQXNCLE1BQU0sY0FBYyxDQUFDO0FBQzdGLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsNkJBQTZCLEVBQzdCLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFDM0IsaUNBQWlDLEdBQ2xDLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztBQUVyQywyRUFBMkU7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QU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQ3pELE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQzs7QUFHSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IGV4dGVuc2lvbiBwbHVnaW4gKHJlZ2lzdGVyZWQgbmFtZTogYHNlYXJjaGApIGFyb3VuZCBhIHNpYmxpbmdcbiAqIGBhaVNlYXJjaGAgcHJvdmlkZXIuIE5hdGl2ZSBBcHBLaXQgb3ducyBWZWN0b3IgU2VhcmNoIHF1ZXJ5IGV4ZWN1dGlvbjsgdGhpc1xuICogcGx1Z2luIGFkZHMgdGhlIHN1cmZhY2VzIHRoYXQgcmVtYWluIHVzZWZ1bCBhY3Jvc3MgbmF0aXZlIGFuZCBMYWtlYmFzZVxuICogcHJvdmlkZXJzOlxuICpcbiAqICAgLSBhIGBzZWFyY2hgIC8gYHVuaXZlcnNhbF9zZWFyY2hgIC8gKG9wdC1pbikgYGFkZF9kb2N1bWVudHNgIHRvb2wgc2V0IGZvclxuICogICAgIGJvdGggTWFzdHJhIGFuZCBBcHBLaXQgYWdlbnRzIChhdXRvY29tcGxldGUgaXMgYSBzbWFsbC1gbGltaXRgIHNlYXJjaCk7XG4gKiAgIC0gY29tcGF0aWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHJvdXRlcyB1bmRlciBgL2FwaS9zZWFyY2hgXG4gKiAgICAgKGBQT1NUIC9gIHNlYXJjaCwgYFBPU1QgL3VuaXZlcnNhbGAgZmVkZXJhdGVkLCBgR0VUIC9pbmRleGVzYCBjYXRhbG9ndWUsXG4gKiAgICAgYW5kIGBQT1NUIC9kb2N1bWVudHNgIHdoZW4gd3JpdGVzIGFyZSBlbmFibGVkKTtcbiAqICAgLSBhIGBjbGllbnRDb25maWcoKWAgcGF5bG9hZCBzbyBhIFVJIGtub3dzIHRoZSBpbmRleGVzLCBkZWZhdWx0LCBhbmQgcGFnZVxuICogICAgIHNpemUgYXQgYm9vdCB3aXRoIG5vIHJvdW5kLXRyaXA7XG4gKiAgIC0gYGV4cG9ydHMoKWAgc28gYXBwIGNvZGUgY2FuIGBhcHBraXQuc2VhcmNoLnNlYXJjaCguLi4pYCBkaXJlY3RseS5cbiAqXG4gKiBWZWN0b3IgU2VhcmNoIHJlYWRzIGRlbGVnYXRlIHRvIHRoZSByZWdpc3RlcmVkIG5hdGl2ZSBBcHBLaXQgYGFpU2VhcmNoYFxuICogcGx1Z2luLCBwcmVzZXJ2aW5nIGl0cyBPQk8sIGNhY2hpbmcsIHJlcmFua2luZywgYW5kIHJlc3BvbnNlIGhhbmRsaW5nLiBUaGVcbiAqIGFsdGVybmF0aXZlIGBsYWtlYmFzZUFpU2VhcmNoYCBwcm92aWRlciBzdXBwbGllcyB0aGUgc2FtZSBxdWVyeSBjb250cmFjdFxuICogb3ZlciBQb3N0Z3JlU1FMIGZ1bGwtdGV4dCBzZWFyY2guXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHRvUGx1Z2luLCB0eXBlIElBcHBSb3V0ZXIsIHR5cGUgUGx1Z2luTWFuaWZlc3QgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhaVNlYXJjaCwgZGVmaW5lVG9vbCwgdHlwZSBUb29sUmVnaXN0cnkgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcbmltcG9ydCB7IHBsdWdpblJlZ2lzdHJ5LCBUb29sUmVnaXN0cnlQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZywgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgc2VhcmNoU2NoZW1hcywgdHlwZSBTZWFyY2hDbGllbnRDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgeyB0b1NlYXJjaE9wdGlvbnMsIHRvVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyB9IGZyb20gXCIuL19zZWFyY2gtb3B0aW9ucy50c1wiO1xuaW1wb3J0IHsgU0VBUkNIX0NPTkZJR19TQ0hFTUEsIHJlc29sdmVTZWFyY2hDb25maWcsIHR5cGUgU2VhcmNoUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NyZWF0ZUluZGV4T3B0aW9ucyB9IGZyb20gXCIuL2luZGV4LW9wdGlvbnMudHNcIjtcbmltcG9ydCB7IG5hdGl2ZUFpU2VhcmNoQmFja2VuZCB9IGZyb20gXCIuL25hdGl2ZS50c1wiO1xuaW1wb3J0IHsgdG9Eb2N1bWVudEFycmF5IH0gZnJvbSBcIi4vcXVlcnkudHNcIjtcbmltcG9ydCB7IGNyZWF0ZVNlYXJjaFJ1bnRpbWUsIHNldFNlYXJjaFJlYWRCYWNrZW5kLCB0eXBlIFNlYXJjaFJ1bnRpbWUgfSBmcm9tIFwiLi9ydW50aW1lLnRzXCI7XG5pbXBvcnQge1xuICBBRERfRE9DVU1FTlRTX1RPT0xfREVTQ1JJUFRJT04sXG4gIENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG59IGZyb20gXCIuL3NjaGVtYS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwic2VhcmNoXCIpO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIGEgdW5pdmVyc2FsIChmZWRlcmF0ZWQpIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcy4gKi9cbmNvbnN0IFVOSVZFUlNBTF9ST1VURSA9IFwiL3VuaXZlcnNhbFwiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgc2VydmluZyB0aGUgaW5kZXggY2F0YWxvZ3VlIGEgc2VhcmNoIGJveCByZWFkcy4gKi9cbmNvbnN0IElOREVYRVNfUk9VVEUgPSBcIi9pbmRleGVzXCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3IgYWRkaW5nIGRvY3VtZW50cyB0byBhIGRpcmVjdC1hY2Nlc3MgaW5kZXguICovXG5jb25zdCBET0NVTUVOVFNfUk9VVEUgPSBcIi9kb2N1bWVudHNcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBjcmVhdGluZyBhIFZlY3RvciBTZWFyY2ggaW5kZXguICovXG5jb25zdCBJTkRFWF9ST1VURSA9IFwiL2luZGV4XCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3Igc3luY2luZyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuY29uc3QgSU5ERVhfU1lOQ19ST1VURSA9IFwiL2luZGV4L3N5bmNcIjtcblxuLyoqXG4gKiBBcHBLaXQgZXh0ZW5zaW9uIHBsdWdpbiBmb3IgYWdlbnQgdG9vbHMsIGZlZGVyYXRlZCBzZWFyY2gsIGFuZCBvcHRpb25hbFxuICogVmVjdG9yIFNlYXJjaCBsaWZlY3ljbGUgb3BlcmF0aW9ucy4gUmVnaXN0ZXIgYGFpU2VhcmNoKClgIG9yXG4gKiBgbGFrZWJhc2VBaVNlYXJjaCgpYCBiZWZvcmUgdGhpcyBwbHVnaW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGFpU2VhcmNoIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG4gKiBpbXBvcnQgeyBzZWFyY2ggfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgYWlTZWFyY2goe1xuICogICAgICAgaW5kZXhlczoge1xuICogICAgICAgICBkb2NzOiB7XG4gKiAgICAgICAgICAgaW5kZXhOYW1lOiBcIm1haW4uc3VwcG9ydC5kb2NzXCIsXG4gKiAgICAgICAgICAgY29sdW1uczogW1wiaWRcIiwgXCJ0aXRsZVwiLCBcImJvZHlcIl0sXG4gKiAgICAgICAgIH0sXG4gKiAgICAgICB9LFxuICogICAgIH0pLFxuICogICAgIHNlYXJjaCh7XG4gKiAgICAgICBpbmRleDogXCJtYWluLnN1cHBvcnQuZG9jc1wiLFxuICogICAgICAgaW5kZXhlczogW3sgbmFtZTogXCJtYWluLnN1cHBvcnQuZG9jc1wiLCBhbGlhczogXCJkb2NzXCIgfV0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoUGx1Z2luIGV4dGVuZHMgVG9vbFJlZ2lzdHJ5UGx1Z2luPFNlYXJjaFBsdWdpbkNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJzZWFyY2hcIixcbiAgICBkaXNwbGF5TmFtZTogXCJBSSBTZWFyY2hcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VhcmNoIERhdGFicmlja3MgQUkgU2VhcmNoIChWZWN0b3IgU2VhcmNoKSBpbmRleGVzOiBhZ2VudCB0b29scywgSFRUUCByb3V0ZXMgZm9yIGEgXCIgK1xuICAgICAgXCJzZWFyY2ggYm94LCB1bml2ZXJzYWwgc2VhcmNoIGFjcm9zcyBpbmRleGVzLCBhbmQgYW4gb3B0LWluIGRvY3VtZW50IHdyaXRlIHN1cmZhY2UuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICAgIG9wdGlvbmFsOiBbXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IFNFQVJDSF9DT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwic2VhcmNoXCI+O1xuXG4gIC8qKiBSdW50aW1lIG93bmVkIGV4Y2x1c2l2ZWx5IGJ5IHRoaXMgcGx1Z2luIGluc3RhbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFNlYXJjaFJ1bnRpbWUgPSBjcmVhdGVTZWFyY2hSdW50aW1lKHsgY29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcblxuICAvKiogVGhlIGJhc2UgcGF0aCBBcHBLaXQgbW91bnRzIHRoaXMgcGx1Z2luJ3Mgcm91dGVzIHVuZGVyLiAqL1xuICBwcml2YXRlIGdldCBiYXNlUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgL2FwaS8ke1NlYXJjaFBsdWdpbi5tYW5pZmVzdC5uYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRvb2xzIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuIGBzZWFyY2hgIC9cbiAgICogYHVuaXZlcnNhbF9zZWFyY2hgIGFyZSByZWFkczsgYGFkZF9kb2N1bWVudHNgIC8gYGNyZWF0ZV9pbmRleGAgL1xuICAgKiBgc3luY19pbmRleGAgYXJlIG9ubHkgb2ZmZXJlZCB3aGVuIHRoZSB3cml0ZSBzdXJmYWNlIGlzIGVuYWJsZWQuIE5vbmUgaXNcbiAgICogYXV0b0luaGVyaXRhYmxlOiBldmVyeSB0b29sIHJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LCBzbyBpdCBtdXN0IGJlXG4gICAqIGdyYW50ZWQgZXhwbGljaXRseS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdG9vbFJlZ2lzdHJ5KCk6IFRvb2xSZWdpc3RyeSB7XG4gICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgY29uc3QgcmVnaXN0cnk6IFRvb2xSZWdpc3RyeSA9IHtcbiAgICAgIHNlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgc2NoZW1hOiBzZWFyY2hTY2hlbWFzLnNlYXJjaFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5TZWFyY2goYXJncywgc2lnbmFsKSxcbiAgICAgIH0pLFxuICAgICAgdW5pdmVyc2FsX3NlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2VhcmNoU2NoZW1hcy51bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICB9O1xuICAgIGlmIChjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgcmVnaXN0cnkuYWRkX2RvY3VtZW50cyA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNlYXJjaFNjaGVtYXMuc2VhcmNoUmVxdWVzdFNjaGVtYVxuICAgICAgICAgIC5waWNrKHsgaW5kZXg6IHRydWUgfSlcbiAgICAgICAgICAuZXh0ZW5kKHsgZG9jdW1lbnRzOiBzZWFyY2hTY2hlbWFzLnNlYXJjaERvY3VtZW50U2NoZW1hLmFycmF5KCkgfSksXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQWRkRG9jdW1lbnRzKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KTtcbiAgICAgIGlmIChyZWFkQmFja2VuZD8uc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgICAgcmVnaXN0cnkuY3JlYXRlX2luZGV4ID0gZGVmaW5lVG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICAgIHNjaGVtYTogc2VhcmNoU2NoZW1hcy5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQ3JlYXRlSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlZ2lzdHJ5LnN5bmNfaW5kZXggPSBkZWZpbmVUb29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICAgIHNjaGVtYTogc2VhcmNoU2NoZW1hcy5zeW5jSW5kZXhSZXF1ZXN0U2NoZW1hLFxuICAgICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1blN5bmNJbmRleChhcmdzLCBzaWduYWwpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqIEF0dGFjaCB0aGUgcmVnaXN0ZXJlZCBwcm92aWRlciBhbmQgbG9nIHRoZSBlZmZlY3RpdmUgcG9saWN5IGF0IGJvb3QuICovXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlYWRCYWNrZW5kID0gdGhpcy5yZXNvbHZlUHJvdmlkZXJCYWNrZW5kKCk7XG4gICAgc2V0U2VhcmNoUmVhZEJhY2tlbmQodGhpcy5ydW50aW1lLCByZWFkQmFja2VuZCk7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGJhY2tlbmQ6IHJlYWRCYWNrZW5kLnN1cHBvcnRzTGlmZWN5Y2xlID8gXCJhcHBraXQtYWktc2VhcmNoXCIgOiBcImxha2ViYXNlLWFpLXNlYXJjaFwiLFxuICAgICAgZGVmYXVsdEluZGV4OiBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiKG5vbmUgLSBwYXNzIHBlciByZXF1ZXN0KVwiLFxuICAgICAgaW5kZXhlczogY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLmFsaWFzKSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBtb2RlOiBjb25maWcubW9kZSxcbiAgICAgIGFsbG93V3JpdGU6IGNvbmZpZy5hbGxvd1dyaXRlLFxuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBlbnN1cmVPblNldHVwOiBjb25maWcuZW5zdXJlT25TZXR1cFxuICAgICAgICA/IChjb25maWcuZW5zdXJlT25TZXR1cC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4KVxuICAgICAgICA6IFwib2ZmXCIsXG4gICAgfSk7XG4gICAgLy8gUHJvdmlzaW9uIGEgcmVhbCBpbmRleCBpbiB0aGUgQkFDS0dST1VORCBzbyBhIHNsb3cgZmlyc3QtdGltZSBlbmRwb2ludCBvclxuICAgIC8vIGluZGV4IGJ1aWxkIG5ldmVyIGJsb2NrcyB0aGUgc2VydmVyIGZyb20gY29taW5nIHVwLlxuICAgIGlmIChjb25maWcuZW5zdXJlT25TZXR1cCAmJiByZWFkQmFja2VuZC5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgdm9pZCB0aGlzLnJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVzb2x2ZSB0aGUgcmVnaXN0ZXJlZCBBcHBLaXQtY29tcGF0aWJsZSBBSSBTZWFyY2ggcHJvdmlkZXIuICovXG4gIHByaXZhdGUgcmVzb2x2ZVByb3ZpZGVyQmFja2VuZCgpOiBSZXR1cm5UeXBlPHR5cGVvZiBuYXRpdmVBaVNlYXJjaEJhY2tlbmQ+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHBsdWdpblJlZ2lzdHJ5LnJlcXVpcmUodGhpcy5jb250ZXh0LCBhaVNlYXJjaCwgdGhpcykuZXhwb3J0cygpO1xuICAgIHJldHVybiBuYXRpdmVBaVNlYXJjaEJhY2tlbmQocHJvdmlkZXIsIHJlc29sdmVTZWFyY2hDb25maWcodGhpcy5jb25maWcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgdGhlIGVuZHBvaW50ICsgaW5kZXggZXhpc3QgYW5kIHNlZWQgdGhlbSwgaG9ub3JpbmcgYGVuc3VyZU9uU2V0dXBgLlxuICAgKiBVc2VzIGJvb3QtdGltZSBTREsgYXV0aCAoZW52IC8gY29uZmlnIHByb2ZpbGUpIHZpYSB0aGUgY2xpZW50J3NcbiAgICogb3V0LW9mLXJlcXVlc3QgZmFsbGJhY2suIEZhaWx1cmVzIGFyZSBsb2dnZWQsIG5ldmVyIHRocm93biAtIGEgc2VhcmNoIGFwcFxuICAgKiBzaG91bGQgc3RpbGwgc3RhcnQgZXZlbiBpZiBwcm92aXNpb25pbmcgaXMgc2xvdyBvciBhIHBlcm1pc3Npb24gaXMgbWlzc2luZy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcnVuRW5zdXJlT25TZXR1cChjb25maWc6IFNlYXJjaFJ1bnRpbWVbXCJjb25maWdcIl0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzcGVjID0gY29uZmlnLmVuc3VyZU9uU2V0dXA7XG4gICAgaWYgKCFzcGVjKSByZXR1cm47XG4gICAgY29uc3QgaW5kZXggPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHNwZWMuaW5kZXgpID8/IGNvbmZpZy5kZWZhdWx0SW5kZXg7XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJlbnN1cmUtc2tpcHBlZFwiLCB7XG4gICAgICAgIHJlYXNvbjogXCJubyBpbmRleCBuYW1lIChzZXQgYGluZGV4YCBvciBgZW5zdXJlT25TZXR1cC5pbmRleGApXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZG9jdW1lbnRzID0gc3BlYy5kb2N1bWVudHMgPz8gW107XG4gICAgLy8gSW5mZXIgYSBtYW5hZ2VkLWRpcmVjdC1hY2Nlc3Mgc2NoZW1hIGZyb20gdGhlIGZpcnN0IHNlZWQgcm93IHdoZW4gbm90IGdpdmVuLlxuICAgIGNvbnN0IHNjaGVtYSA9XG4gICAgICBzcGVjLnNjaGVtYSA/P1xuICAgICAgKGRvY3VtZW50cy5sZW5ndGggPiAwICYmICFzcGVjLnNvdXJjZVRhYmxlXG4gICAgICAgID8gdGhpcy5pbmZlclNjaGVtYShkb2N1bWVudHNbMF0sIHNwZWMucHJpbWFyeUtleSA/PyBcImlkXCIsIHNwZWMudGV4dENvbHVtbiA/PyBcInRleHRcIilcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICAgIHRyeSB7XG4gICAgICBsb2dnZXIuaW5mbyhcImVuc3VyZS1zdGFydFwiLCB7IGluZGV4IH0pO1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMucnVudGltZTtcbiAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBjbGllbnQucHJvdmlzaW9uKGluZGV4LCB7XG4gICAgICAgIC4uLihzcGVjLmVuZHBvaW50ID8geyBlbmRwb2ludDogc3BlYy5lbmRwb2ludCB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5wcmltYXJ5S2V5ID8geyBwcmltYXJ5S2V5OiBzcGVjLnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMudGV4dENvbHVtbiA/IHsgZW1iZWRkaW5nU291cmNlQ29sdW1uOiBzcGVjLnRleHRDb2x1bW4gfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMuZW1iZWRkaW5nTW9kZWwgPyB7IGVtYmVkZGluZ01vZGVsOiBzcGVjLmVtYmVkZGluZ01vZGVsIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnNvdXJjZVRhYmxlID8geyBzb3VyY2VUYWJsZTogc3BlYy5zb3VyY2VUYWJsZSB9IDoge30pLFxuICAgICAgICAuLi4oc2NoZW1hID8geyBzY2hlbWEgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMudGltZW91dE1zID8geyB0aW1lb3V0TXM6IHNwZWMudGltZW91dE1zIH0gOiB7fSksXG4gICAgICAgIC4uLihkb2N1bWVudHMubGVuZ3RoID4gMCA/IHsgc2VlZDogZG9jdW1lbnRzIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5pbmZvKFwiZW5zdXJlLXJlYWR5XCIsIHtcbiAgICAgICAgaW5kZXg6IGluZm8ubmFtZSxcbiAgICAgICAgcmVhZHk6IGluZm8ucmVhZHksXG4gICAgICAgIHJvd0NvdW50OiBpbmZvLnJvd0NvdW50ID8/IDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJlbnN1cmUtZmFpbGVkXCIsIHsgaW5kZXgsIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoY2F1c2UpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCBhIFZlY3RvciBTZWFyY2ggYHNjaGVtYV9qc29uYCBtYXAgZnJvbSBhIHNlZWQgZG9jdW1lbnQncyB2YWx1ZSB0eXBlcy4gKi9cbiAgcHJpdmF0ZSBpbmZlclNjaGVtYShcbiAgICBkb2M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHByaW1hcnlLZXk6IHN0cmluZyxcbiAgICB0ZXh0Q29sdW1uOiBzdHJpbmcsXG4gICk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHNjaGVtYTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgW3ByaW1hcnlLZXldOiBcInN0cmluZ1wiLCBbdGV4dENvbHVtbl06IFwic3RyaW5nXCIgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkb2MpKSB7XG4gICAgICBpZiAoa2V5IGluIHNjaGVtYSkgY29udGludWU7XG4gICAgICBzY2hlbWFba2V5XSA9XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgID8gTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSlcbiAgICAgICAgICAgID8gXCJpbnRcIlxuICAgICAgICAgICAgOiBcImRvdWJsZVwiXG4gICAgICAgICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA6IFwic3RyaW5nXCI7XG4gICAgfVxuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cblxuICAvKiogUmVsZWFzZSB0aGlzIHBsdWdpbidzIGluc3RhbmNlLW93bmVkIHJ1bnRpbWUuICovXG4gIHNodXRkb3duKCk6IHZvaWQge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCBleHRlbnNpb24gcm91dGVzIHVuZGVyIGAvYXBpL3NlYXJjaGAuIFNpbmdsZS1pbmRleCBxdWVyaWVzIHN0YXkgb25cbiAgICogdGhlIHByb3ZpZGVyJ3MgbmF0aXZlIGAvYXBpL2FpLXNlYXJjaC86YWxpYXMvcXVlcnlgIHN1cmZhY2UuXG4gICAqL1xuICBvdmVycmlkZSBpbmplY3RSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwidW5pdmVyc2FsU2VhcmNoXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogVU5JVkVSU0FMX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwidW5pdmVyc2FsU2VhcmNoXCIsICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoU2NoZW1hcy51bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLnBhcnNlKHJlcS5ib2R5ID8/IHt9KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hc1VzZXIocmVxKS5ydW5Vbml2ZXJzYWxTZWFyY2gocmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJpbmRleGVzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBJTkRFWEVTX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKF9yZXEsIHJlcykgPT4ge1xuICAgICAgICByZXMuanNvbih0aGlzLmNsaWVudENvbmZpZygpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZG9jdW1lbnRzXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogRE9DVU1FTlRTX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcInRoZSBkb2N1bWVudCB3cml0ZSBzdXJmYWNlIGlzIGRpc2FibGVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwiYWRkRG9jdW1lbnRzXCIsICgpID0+XG4gICAgICAgICAgdGhpcy5hc1VzZXIocmVxKS5ydW5BZGREb2N1bWVudHMocmVxLmJvZHkgPz8ge30pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJjcmVhdGVJbmRleFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IElOREVYX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnLCByZWFkQmFja2VuZCB9ID0gdGhpcy5ydW50aW1lO1xuICAgICAgICBpZiAoIWNvbmZpZy5hbGxvd1dyaXRlIHx8ICFyZWFkQmFja2VuZD8uc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcInRoZSBpbmRleCB3cml0ZSBzdXJmYWNlIGlzIGRpc2FibGVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwiY3JlYXRlSW5kZXhcIiwgKCkgPT5cbiAgICAgICAgICB0aGlzLmFzVXNlcihyZXEpLnJ1bkNyZWF0ZUluZGV4KHJlcS5ib2R5ID8/IHt9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic3luY0luZGV4XCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogSU5ERVhfU1lOQ19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZywgcmVhZEJhY2tlbmQgfSA9IHRoaXMucnVudGltZTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSB8fCAhcmVhZEJhY2tlbmQ/LnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgaW5kZXggd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcInN5bmNJbmRleFwiLCAoKSA9PiB0aGlzLmFzVXNlcihyZXEpLnJ1blN5bmNJbmRleChyZXEuYm9keSA/PyB7fSkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSByb3V0ZSBib2R5LCB0dXJuaW5nIGEgZmFpbHVyZSBpbnRvIGEgSlNPTiBlcnJvciByZXNwb25zZS5cbiAgICpcbiAgICogQXBwS2l0J3MgYHJvdXRlKClgIHJlZ2lzdGVycyB0aGUgaGFuZGxlciBhcy1pcywgc28gYSByZWplY3Rpb24gZXNjYXBlcyBhc1xuICAgKiBhbiB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gYW5kIHRha2VzIHRoZSB3aG9sZSBwcm9jZXNzIGRvd24gcmF0aGVyIHRoYW5cbiAgICogZmFpbGluZyB0aGUgb25lIHJlcXVlc3QuIEV2ZXJ5IHJvdXRlIGhlcmUgZ29lcyB0aHJvdWdoIHRoaXMsIHNvIGEgYmFkIGluZGV4XG4gICAqIG5hbWUgb3IgYSBWZWN0b3IgU2VhcmNoIEFQSSBlcnJvciByZXR1cm5zIDUwMCB3aXRoIGEgbWVzc2FnZSBpbnN0ZWFkIG9mXG4gICAqIGtpbGxpbmcgdGhlIHNlcnZlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzcG9uZChcbiAgICByZXM6IFBhcmFtZXRlcnM8UGFyYW1ldGVyczxJQXBwUm91dGVyW1wicG9zdFwiXT5bMV0+WzFdLFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHJ1bjogKCkgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlcy5qc29uKGF3YWl0IHJ1bigpKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdXNlKTtcbiAgICAgIGxvZ2dlci53YXJuKFwicm91dGUtZmFpbGVkXCIsIHtcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGNhdXNlKSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogU3VyZmFjZSB0aGUgaW5kZXggY2F0YWxvZ3VlICsgZGVmYXVsdHMgc28gYSBzZWFyY2ggYm94IG5lZWRzIG5vIHJvdW5kLXRyaXAuICovXG4gIG92ZXJyaWRlIGNsaWVudENvbmZpZygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBjb25zdCBwYXlsb2FkOiBTZWFyY2hDbGllbnRDb25maWcgPSB7XG4gICAgICBpbmRleGVzOiBjb25maWcuaW5kZXhlcy5tYXAoKGluZGV4KSA9PiAoe1xuICAgICAgICBuYW1lOiBpbmRleC5uYW1lLFxuICAgICAgICBhbGlhczogaW5kZXguYWxpYXMsXG4gICAgICAgIC4uLihpbmRleC5wcmltYXJ5S2V5ID8geyBwcmltYXJ5S2V5OiBpbmRleC5wcmltYXJ5S2V5IH0gOiB7fSksXG4gICAgICAgIC4uLihpbmRleC5jb2x1bW5zID8geyBjb2x1bW5zOiBpbmRleC5jb2x1bW5zIH0gOiB7fSksXG4gICAgICAgIC4uLihpbmRleC5uYW1lID09PSBjb25maWcuZGVmYXVsdEluZGV4ID8geyBpc0RlZmF1bHQ6IHRydWUgfSA6IHt9KSxcbiAgICAgIH0pKSxcbiAgICAgIC4uLihjb25maWcuZGVmYXVsdEluZGV4ID8geyBkZWZhdWx0SW5kZXg6IGNvbmZpZy5kZWZhdWx0SW5kZXggfSA6IHt9KSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBiYXNlUGF0aDogdGhpcy5iYXNlUGF0aCxcbiAgICB9O1xuICAgIHJldHVybiBwYXlsb2FkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvKiogU2VhcmNoIG9uZSBpbmRleCAoZGVmYXVsdCB3aGVuIG9taXR0ZWQpLiBSdW5zIGFzIHRoZSBjdXJyZW50IGNvbnRleHQgdXNlci4gKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IHNlYXJjaFNjaGVtYXMuU2VhcmNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuU2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU2VhcmNoIGFjcm9zcyBldmVyeSBjb25maWd1cmVkIGluZGV4IGFuZCBtZXJnZSB0aGUgaGl0cy4gKi9cbiAgICAgIHVuaXZlcnNhbFNlYXJjaDogKHJlcXVlc3Q6IHNlYXJjaFNjaGVtYXMuVW5pdmVyc2FsU2VhcmNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gYSBkaXJlY3QtYWNjZXNzIGluZGV4ICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIGFkZERvY3VtZW50czogKHJlcXVlc3Q6IHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5BZGREb2N1bWVudHMocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBDcmVhdGUgYSBWZWN0b3IgU2VhcmNoIGluZGV4ICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIGNyZWF0ZUluZGV4OiAocmVxdWVzdDogc2VhcmNoU2NoZW1hcy5DcmVhdGVJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkNyZWF0ZUluZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU3luYyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIHN5bmNJbmRleDogKHJlcXVlc3Q6IHNlYXJjaFNjaGVtYXMuU3luY0luZGV4UmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuU3luY0luZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU2VhcmNoKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFNjaGVtYXMuc2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gdGhpcy5ydW50aW1lO1xuICAgIHJldHVybiBjbGllbnQuc2VhcmNoKHJlcXVlc3QucXVlcnksIHRvU2VhcmNoT3B0aW9ucyhyZXF1ZXN0LCBzaWduYWwpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFNjaGVtYXMudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gdGhpcy5ydW50aW1lO1xuICAgIHJldHVybiBjbGllbnQudW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QucXVlcnksIHRvVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyhyZXF1ZXN0LCBzaWduYWwpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWRkRG9jdW1lbnRzKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVjb3JkID0gKGFyZ3MgPz8ge30pIGFzIHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9O1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBjb25zdCBkb2N1bWVudHMgPSB0b0RvY3VtZW50QXJyYXkocmVjb3JkLmRvY3VtZW50cyk7XG4gICAgY29uc3QgaW5kZXggPSByZWNvcmQuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIHJldHVybiBjbGllbnQuYWRkRG9jdW1lbnRzKGluZGV4LCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkNyZWF0ZUluZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFNjaGVtYXMuY3JlYXRlSW5kZXhSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIGNsaWVudC5jcmVhdGVJbmRleChyZXF1ZXN0Lm5hbWUsIHRvQ3JlYXRlSW5kZXhPcHRpb25zKHJlcXVlc3QsIHNpZ25hbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TeW5jSW5kZXgoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoU2NoZW1hcy5zeW5jSW5kZXhSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBjb25zdCBpbmRleCA9IHJlcXVlc3QuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIGF3YWl0IGNsaWVudC5zeW5jSW5kZXgoaW5kZXgsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHsgaW5kZXgsIHN5bmNlZDogdHJ1ZSB9O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIEFJIFNlYXJjaCBwbHVnaW4gd2l0aCBBcHBLaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHNlYXJjaCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NlYXJjaFwiO1xuICogaW1wb3J0IHsgYWdlbnRzLCBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogY29uc3Qgc3VwcG9ydCA9IGFnZW50cy5jcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCJBbnN3ZXIgZnJvbSB0aGUgZG9jczsgdXNlIGBzZWFyY2hgIHRvIGZpbmQgdGhlbS5cIixcbiAqICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7IC4uLihhd2FpdCBwbHVnaW5zLnNlYXJjaC50b29sa2l0KCkpIH07XG4gKiAgIH0sXG4gKiB9KTtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgc2VhcmNoKHsgaW5kZXg6IFwibWFpbi5zdXBwb3J0LmRvY3NcIiB9KSxcbiAqICAgICBtYXN0cmEoeyBhZ2VudHM6IHN1cHBvcnQgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc2VhcmNoID0gdG9QbHVnaW4oU2VhcmNoUGx1Z2luKTtcbiJdfQ==
@@ -76,6 +76,7 @@ export declare const indexInfoSchema: import("zod").ZodObject<{
76
76
  columns: import("zod").ZodArray<import("zod").ZodString>;
77
77
  ready: import("zod").ZodBoolean;
78
78
  rowCount: import("zod").ZodOptional<import("zod").ZodNumber>;
79
+ directAccess: import("zod").ZodOptional<import("zod").ZodBoolean>;
79
80
  }, import("zod/v4/core").$strip>;
80
81
  /** Schema for the `sync_index` tool input. */
81
82
  export declare const syncIndexToolSchema: import("zod").ZodObject<{
package/lib/src/tool.d.ts CHANGED
@@ -113,6 +113,7 @@ export declare function createIndexTool(options?: SearchToolOptions): import("@m
113
113
  endpoint?: string | undefined;
114
114
  primaryKey?: string | undefined;
115
115
  rowCount?: number | undefined;
116
+ directAccess?: boolean | undefined;
116
117
  }, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, string, unknown>;
117
118
  /**
118
119
  * Build the opt-in `sync_index` tool (refresh a Delta Sync index from its
package/package.json CHANGED
@@ -28,13 +28,13 @@
28
28
  "dependencies": {
29
29
  "@databricks/appkit": "0.81.0",
30
30
  "@databricks/sdk-experimental": "^0.17.0",
31
- "@dbx-tools/appkit": "^0.9.119",
32
- "@dbx-tools/core": "^0.9.119",
33
- "@dbx-tools/model": "^0.9.119",
34
- "@dbx-tools/postgres": "^0.9.119",
35
- "@dbx-tools/shared-core": "^0.9.119",
36
- "@dbx-tools/shared-model": "^0.9.119",
37
- "@dbx-tools/shared-search": "^0.9.119",
31
+ "@dbx-tools/appkit": "^0.9.120",
32
+ "@dbx-tools/core": "^0.9.120",
33
+ "@dbx-tools/model": "^0.9.120",
34
+ "@dbx-tools/postgres": "^0.9.120",
35
+ "@dbx-tools/shared-core": "^0.9.120",
36
+ "@dbx-tools/shared-model": "^0.9.120",
37
+ "@dbx-tools/shared-search": "^0.9.120",
38
38
  "@mastra/core": "1.71.0",
39
39
  "pg": "^8.22.0",
40
40
  "zod": "4.3.6"
@@ -101,7 +101,7 @@
101
101
  "./package.json": "./package.json"
102
102
  }
103
103
  },
104
- "version": "0.9.119",
104
+ "version": "0.9.120",
105
105
  "types": "./lib/index.d.ts",
106
106
  "dbxToolsConfig": {
107
107
  "tags": [
package/src/client.ts CHANGED
@@ -26,6 +26,7 @@ import { invoke, resolve as modelResolve, modelCatalog } from "@dbx-tools/model"
26
26
  import { asyncUtils, json, log, stringUtils } from "@dbx-tools/shared-core";
27
27
  import { ModelClass } from "@dbx-tools/shared-model";
28
28
  import type {
29
+ IndexInfo,
29
30
  SearchDocument,
30
31
  SearchHit,
31
32
  SearchMode,
@@ -141,16 +142,7 @@ export class SearchIndex {
141
142
  }
142
143
 
143
144
  /** A resolved live index definition. */
144
- export interface IndexInfo {
145
- name: string;
146
- endpoint?: string;
147
- primaryKey?: string;
148
- columns: string[];
149
- ready: boolean;
150
- rowCount?: number;
151
- /** True for a DIRECT_ACCESS index (you supply vectors; queries embed client-side). */
152
- directAccess?: boolean;
153
- }
145
+ export type { IndexInfo };
154
146
 
155
147
  /**
156
148
  * Options for {@link SearchClient.createIndex} / {@link SearchClient.ensureIndex}.
@@ -89,25 +89,30 @@ export class LakebaseAiSearchPlugin extends Plugin<LakebaseAiSearchConfig> {
89
89
  } satisfies PluginManifest<"aiSearch">;
90
90
 
91
91
  declare protected config: LakebaseAiSearchConfig;
92
- private backend: LakebaseSearchBackend | undefined;
92
+ private servicePrincipalBackend: LakebaseSearchBackend | undefined;
93
+ private userBackend: LakebaseSearchBackend | undefined;
93
94
 
94
95
  override async setup(): Promise<void> {
95
96
  const indexes = this.indexes();
96
97
  for (const index of indexes) this.validateAuth(index);
97
- const lake = pluginRegistry.require(this.context, lakebase, this);
98
- this.backend = new LakebaseSearchBackend(
99
- { managedPool: () => lake.exports().pool },
100
- stringUtils.trimToNull(this.config.schema) ?? "public",
101
- );
102
- for (const index of indexes) {
103
- await this.backend.provision(index.indexName, {
104
- textColumn: index.config.textColumn ?? "text",
105
- ...(index.config.documents ? { seed: index.config.documents } : {}),
98
+ this.context?.onLifecycle("setup:complete", async () => {
99
+ const lake = pluginRegistry.require(this.context, lakebase, this);
100
+ const schema = stringUtils.trimToNull(this.config.schema) ?? "public";
101
+ this.servicePrincipalBackend = new LakebaseSearchBackend(lake.exports().pool, schema);
102
+ this.userBackend = new LakebaseSearchBackend(
103
+ { managedPool: () => lake.exports().pool },
104
+ schema,
105
+ );
106
+ for (const index of indexes) {
107
+ await this.servicePrincipalBackend.provision(index.indexName, {
108
+ textColumn: index.config.textColumn ?? "text",
109
+ ...(index.config.documents ? { seed: index.config.documents } : {}),
110
+ });
111
+ }
112
+ logger.info("ready", {
113
+ indexes: this.indexes().map((index) => index.alias),
114
+ schema,
106
115
  });
107
- }
108
- logger.info("ready", {
109
- indexes: this.indexes().map((index) => index.alias),
110
- schema: stringUtils.trimToNull(this.config.schema) ?? "public",
111
116
  });
112
117
  }
113
118
 
@@ -181,7 +186,7 @@ export class LakebaseAiSearchPlugin extends Plugin<LakebaseAiSearchConfig> {
181
186
  }
182
187
  const index = this.resolveIndex(alias);
183
188
  const startedAt = performance.now();
184
- const result = await this.requireBackend().search(index.indexName, request.queryText, {
189
+ const result = await this.requireBackend(index).search(index.indexName, request.queryText, {
185
190
  limit: request.numResults ?? index.config.numResults ?? 20,
186
191
  ...(request.filters ? { filter: request.filters } : {}),
187
192
  });
@@ -204,7 +209,7 @@ export class LakebaseAiSearchPlugin extends Plugin<LakebaseAiSearchConfig> {
204
209
  throw new ValidationError("Lakebase AI Search writes are disabled");
205
210
  }
206
211
  const index = this.resolveIndex(alias);
207
- return this.requireBackend().addDocuments(
212
+ return this.requireBackend(index).addDocuments(
208
213
  index.indexName,
209
214
  documents.filter(object.isRecord),
210
215
  index.config.textColumn ?? "text",
@@ -230,8 +235,9 @@ export class LakebaseAiSearchPlugin extends Plugin<LakebaseAiSearchConfig> {
230
235
  }
231
236
 
232
237
  async shutdown(): Promise<void> {
233
- await this.backend?.close();
234
- this.backend = undefined;
238
+ await Promise.all([this.servicePrincipalBackend?.close(), this.userBackend?.close()]);
239
+ this.servicePrincipalBackend = undefined;
240
+ this.userBackend = undefined;
235
241
  }
236
242
 
237
243
  private indexes(): ResolvedLakebaseIndex[] {
@@ -259,9 +265,13 @@ export class LakebaseAiSearchPlugin extends Plugin<LakebaseAiSearchConfig> {
259
265
  return index.config.auth === "on-behalf-of-user" ? this.asUser(req) : this;
260
266
  }
261
267
 
262
- private requireBackend(): LakebaseSearchBackend {
263
- if (!this.backend) throw new ValidationError("Lakebase AI Search is not initialized");
264
- return this.backend;
268
+ private requireBackend(index: ResolvedLakebaseIndex): LakebaseSearchBackend {
269
+ const backend =
270
+ index.config.auth === "on-behalf-of-user"
271
+ ? this.userBackend
272
+ : this.servicePrincipalBackend;
273
+ if (!backend) throw new ValidationError("Lakebase AI Search is not initialized");
274
+ return backend;
265
275
  }
266
276
 
267
277
  private project(
package/src/plugin.ts CHANGED
@@ -237,7 +237,7 @@ export class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig> {
237
237
  rowCount: info.rowCount ?? 0,
238
238
  });
239
239
  } catch (cause) {
240
- logger.warn("ensure-failed", { index, message: errorUtils.errorMessage(cause) });
240
+ logger.warn("ensure-failed", { index, error: errorUtils.toError(cause) });
241
241
  }
242
242
  }
243
243
 
@@ -358,7 +358,10 @@ export class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig> {
358
358
  res.json(await run());
359
359
  } catch (cause) {
360
360
  const message = errorUtils.errorMessage(cause);
361
- logger.warn("route-failed", { operation, message });
361
+ logger.warn("route-failed", {
362
+ operation,
363
+ error: errorUtils.toError(cause),
364
+ });
362
365
  res.status(500).json({ error: message });
363
366
  }
364
367
  }