@dbx-tools/search 0.9.5 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -62,8 +62,8 @@ the Lakebase full-text implementation of the AppKit AI Search contract.
62
62
  ```ts
63
63
  import { createApp, server } from "@databricks/appkit";
64
64
  import { aiSearch } from "@databricks/appkit/beta";
65
- import { plugin as searchPlugin } from "@dbx-tools/search";
66
- import { agents, plugin as mastraPlugin } from "@dbx-tools/appkit-mastra";
65
+ import { search } from "@dbx-tools/search";
66
+ import { agents, mastra } from "@dbx-tools/appkit-mastra";
67
67
 
68
68
  const support = agents.createAgent({
69
69
  instructions: "Answer from the docs; use `search` to find them.",
@@ -83,11 +83,11 @@ await createApp({
83
83
  },
84
84
  },
85
85
  }),
86
- searchPlugin.search({
86
+ search({
87
87
  index: "main.support.docs",
88
88
  indexes: [{ name: "main.support.docs", alias: "docs" }],
89
89
  }),
90
- mastraPlugin.mastra({ agents: support }),
90
+ mastra({ agents: support }),
91
91
  ],
92
92
  });
93
93
  ```
@@ -107,10 +107,6 @@ const searchRuntime = runtime.createSearchRuntime({
107
107
  const search = tool.searchTool({ runtime: searchRuntime });
108
108
  ```
109
109
 
110
- `getSearchRuntime()` remains as a deprecated compatibility constructor and
111
- returns a new isolated runtime on every call. It does not discover a registered
112
- plugin or provider.
113
-
114
110
  Use Lakebase full-text search without changing the AppKit UI hook:
115
111
 
116
112
  ```ts
@@ -315,8 +311,7 @@ default.
315
311
  full-text provider.
316
312
  - `lakebase` - `LakebaseSearchBackend`, the provider's `tsvector` runtime.
317
313
  - `query` - `toDocumentArray`, shared by write routes and tools.
318
- - `runtime` - `createSearchRuntime` / `setSearchReadBackend` for isolated
319
- clients, plus deprecated global-era compatibility names.
314
+ - `runtime` - `createSearchRuntime` / `setSearchReadBackend` for isolated clients.
320
315
  - `schema` - the tool descriptions and re-exported request schemas.
321
316
 
322
317
  Browser-safe schemas live in
package/index.ts CHANGED
@@ -3,10 +3,10 @@
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.5";
6
+ export const PACKAGE_VERSION = "0.9.7";
7
7
  export * as client from "./src/client.ts";
8
8
  export * as config from "./src/config.ts";
9
- export * as indexTools from "./src/index-tools.ts";
9
+ export * as indexOptions from "./src/index-options.ts";
10
10
  export * as lakebase from "./src/lakebase.ts";
11
11
  export * as lakebasePlugin from "./src/lakebase-plugin.ts";
12
12
  export * as native from "./src/native.ts";
package/lib/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/search";
2
- export declare const PACKAGE_VERSION = "0.9.5";
2
+ export declare const PACKAGE_VERSION = "0.9.7";
3
3
  export * as client from "./src/client.ts";
4
4
  export * as config from "./src/config.ts";
5
- export * as indexTools from "./src/index-tools.ts";
5
+ export * as indexOptions from "./src/index-options.ts";
6
6
  export * as lakebase from "./src/lakebase.ts";
7
7
  export * as lakebasePlugin from "./src/lakebase-plugin.ts";
8
8
  export * as native from "./src/native.ts";
package/lib/index.js CHANGED
@@ -2,10 +2,10 @@
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.5";
5
+ export const PACKAGE_VERSION = "0.9.7";
6
6
  export * as client from "./src/client.js";
7
7
  export * as config from "./src/config.js";
8
- export * as indexTools from "./src/index-tools.js";
8
+ export * as indexOptions from "./src/index-options.js";
9
9
  export * as lakebase from "./src/lakebase.js";
10
10
  export * as lakebasePlugin from "./src/lakebase-plugin.js";
11
11
  export * as native from "./src/native.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5SyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQ0FBaUMsRUFBRSw4QkFBOEIsRUFBRSw2QkFBNkIsRUFBRSwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNVwiO1xuZXhwb3J0ICogYXMgY2xpZW50IGZyb20gXCIuL3NyYy9jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBpbmRleFRvb2xzIGZyb20gXCIuL3NyYy9pbmRleC10b29scy50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2UgZnJvbSBcIi4vc3JjL2xha2ViYXNlLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZVBsdWdpbiBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBuYXRpdmUgZnJvbSBcIi4vc3JjL25hdGl2ZS50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHF1ZXJ5IGZyb20gXCIuL3NyYy9xdWVyeS50c1wiO1xuZXhwb3J0ICogYXMgcnVudGltZSBmcm9tIFwiLi9zcmMvcnVudGltZS50c1wiO1xuZXhwb3J0ICogYXMgc2NoZW1hIGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2wgZnJvbSBcIi4vc3JjL3Rvb2wudHNcIjtcbmV4cG9ydCB7IFNlYXJjaEluZGV4LCBTZWFyY2hDbGllbnQgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaFJlYWRCYWNrZW5kLCBTZWFyY2hPcHRpb25zLCBVbml2ZXJzYWxTZWFyY2hPcHRpb25zLCBJbmRleEluZm8sIENyZWF0ZUluZGV4T3B0aW9ucywgRW5zdXJlRW5kcG9pbnRPcHRpb25zLCBQcm92aXNpb25PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0IHsgSU5ERVhfRU5WLCBEQVRBQlJJQ0tTX0lOREVYX0VOViwgRU5EUE9JTlRfRU5WLCBERUZBVUxUX01PREUsIERFRkFVTFRfUEFHRV9TSVpFLCBERUZBVUxUX1RJTUVPVVRfTVMsIERFRkFVTFRfQkFTRV9QQVRILCBTRUFSQ0hfQ09ORklHX1NDSEVNQSB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VhcmNoSW5kZXhDb25maWcsIFNlYXJjaFBsdWdpbkNvbmZpZywgRW5zdXJlT25TZXR1cENvbmZpZywgUmVzb2x2ZWRJbmRleENvbmZpZywgUmVzb2x2ZWRTZWFyY2hDb25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VTZWFyY2hPcHRpb25zLCBMYWtlYmFzZVNlYXJjaFBvb2wsIExha2ViYXNlUHJvdmlzaW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS50c1wiO1xuZXhwb3J0IHsgTGFrZWJhc2VBaVNlYXJjaFBsdWdpbiwgbGFrZWJhc2VBaVNlYXJjaCB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VBaVNlYXJjaEluZGV4Q29uZmlnLCBMYWtlYmFzZUFpU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXBsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBBaVNlYXJjaFByb3ZpZGVyIH0gZnJvbSBcIi4vc3JjL25hdGl2ZS50c1wiO1xuZXhwb3J0IHsgU2VhcmNoUGx1Z2luLCBzZWFyY2ggfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaFJ1bnRpbWVPcHRpb25zLCBTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vc3JjL3J1bnRpbWUudHNcIjtcbmV4cG9ydCB7IFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLCBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTiwgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sIFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTiwgc2VhcmNoVG9vbFNjaGVtYSwgdW5pdmVyc2FsU2VhcmNoVG9vbFNjaGVtYSwgc2VhcmNoUmVzdWx0U2NoZW1hLCBjcmVhdGVJbmRleFRvb2xTY2hlbWEsIGluZGV4SW5mb1NjaGVtYSwgc3luY0luZGV4VG9vbFNjaGVtYSB9IGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VhcmNoVG9vbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdG9vbC50c1wiO1xuIl19
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5SyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQ0FBaUMsRUFBRSw4QkFBOEIsRUFBRSw2QkFBNkIsRUFBRSwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuN1wiO1xuZXhwb3J0ICogYXMgY2xpZW50IGZyb20gXCIuL3NyYy9jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBpbmRleE9wdGlvbnMgZnJvbSBcIi4vc3JjL2luZGV4LW9wdGlvbnMudHNcIjtcbmV4cG9ydCAqIGFzIGxha2ViYXNlIGZyb20gXCIuL3NyYy9sYWtlYmFzZS50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2VQbHVnaW4gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXBsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgbmF0aXZlIGZyb20gXCIuL3NyYy9uYXRpdmUudHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBxdWVyeSBmcm9tIFwiLi9zcmMvcXVlcnkudHNcIjtcbmV4cG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSBcIi4vc3JjL3J1bnRpbWUudHNcIjtcbmV4cG9ydCAqIGFzIHNjaGVtYSBmcm9tIFwiLi9zcmMvc2NoZW1hLnRzXCI7XG5leHBvcnQgKiBhcyB0b29sIGZyb20gXCIuL3NyYy90b29sLnRzXCI7XG5leHBvcnQgeyBTZWFyY2hJbmRleCwgU2VhcmNoQ2xpZW50IH0gZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWFyY2hSZWFkQmFja2VuZCwgU2VhcmNoT3B0aW9ucywgVW5pdmVyc2FsU2VhcmNoT3B0aW9ucywgSW5kZXhJbmZvLCBDcmVhdGVJbmRleE9wdGlvbnMsIEVuc3VyZUVuZHBvaW50T3B0aW9ucywgUHJvdmlzaW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9jbGllbnQudHNcIjtcbmV4cG9ydCB7IElOREVYX0VOViwgREFUQUJSSUNLU19JTkRFWF9FTlYsIEVORFBPSU5UX0VOViwgREVGQVVMVF9NT0RFLCBERUZBVUxUX1BBR0VfU0laRSwgREVGQVVMVF9USU1FT1VUX01TLCBERUZBVUxUX0JBU0VfUEFUSCwgU0VBUkNIX0NPTkZJR19TQ0hFTUEgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaEluZGV4Q29uZmlnLCBTZWFyY2hQbHVnaW5Db25maWcsIEVuc3VyZU9uU2V0dXBDb25maWcsIFJlc29sdmVkSW5kZXhDb25maWcsIFJlc29sdmVkU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHsgTGFrZWJhc2VTZWFyY2hCYWNrZW5kIH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLnRzXCI7XG5leHBvcnQgdHlwZSB7IExha2ViYXNlU2VhcmNoT3B0aW9ucywgTGFrZWJhc2VTZWFyY2hQb29sLCBMYWtlYmFzZVByb3Zpc2lvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UudHNcIjtcbmV4cG9ydCB7IExha2ViYXNlQWlTZWFyY2hQbHVnaW4sIGxha2ViYXNlQWlTZWFyY2ggfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IExha2ViYXNlQWlTZWFyY2hJbmRleENvbmZpZywgTGFrZWJhc2VBaVNlYXJjaENvbmZpZyB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlTZWFyY2hQcm92aWRlciB9IGZyb20gXCIuL3NyYy9uYXRpdmUudHNcIjtcbmV4cG9ydCB7IFNlYXJjaFBsdWdpbiwgc2VhcmNoIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWFyY2hSdW50aW1lT3B0aW9ucywgU2VhcmNoUnVudGltZSB9IGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgeyBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTiwgVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLCBBRERfRE9DVU1FTlRTX1RPT0xfREVTQ1JJUFRJT04sIENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OLCBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sIHNlYXJjaFRvb2xTY2hlbWEsIHVuaXZlcnNhbFNlYXJjaFRvb2xTY2hlbWEsIHNlYXJjaFJlc3VsdFNjaGVtYSwgY3JlYXRlSW5kZXhUb29sU2NoZW1hLCBpbmRleEluZm9TY2hlbWEsIHN5bmNJbmRleFRvb2xTY2hlbWEgfSBmcm9tIFwiLi9zcmMvc2NoZW1hLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaFRvb2xPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3Rvb2wudHNcIjtcbiJdfQ==
package/lib/src/client.js CHANGED
@@ -20,8 +20,8 @@
20
20
  */
21
21
  import { ExecutionError, getExecutionContext } from "@databricks/appkit";
22
22
  import { appkit, databricks } from "@dbx-tools/appkit";
23
- import { invoke, resolve as modelResolve, serving } from "@dbx-tools/model";
24
- import { async as sharedAsync, json, log, string } from "@dbx-tools/shared-core";
23
+ import { invoke, resolve as modelResolve, modelCatalog } from "@dbx-tools/model";
24
+ import { asyncUtils, json, log, stringUtils } from "@dbx-tools/shared-core";
25
25
  import { ModelClass } from "@dbx-tools/shared-model";
26
26
  import { DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, resolveIndexName, } from "./config.js";
27
27
  const logger = log.logger("search/client");
@@ -105,7 +105,7 @@ export class SearchClient {
105
105
  * omitted to use the default index. Returns hits sorted most-relevant-first.
106
106
  */
107
107
  async search(query, options = {}) {
108
- const text = string.trimToEmpty(query);
108
+ const text = stringUtils.trimToEmpty(query);
109
109
  const name = resolveIndexName(this.config, options.index);
110
110
  if (name === null) {
111
111
  throw new ExecutionError("search: no index configured; set a default index or pass one", {
@@ -127,7 +127,7 @@ export class SearchClient {
127
127
  * so one bad index does not sink the whole search.
128
128
  */
129
129
  async universalSearch(query, options = {}) {
130
- const text = string.trimToEmpty(query);
130
+ const text = stringUtils.trimToEmpty(query);
131
131
  const names = options.indexes && options.indexes.length > 0
132
132
  ? options.indexes.map((ref) => resolveIndexName(this.config, ref) ?? ref)
133
133
  : this.config.indexes.map((i) => i.name);
@@ -160,7 +160,7 @@ export class SearchClient {
160
160
  * `ENDPOINT_NOT_FOUND` instead of naming the real problem.
161
161
  */
162
162
  requireIndexName(reference, operation) {
163
- const name = string.trimToNull(resolveIndexName(this.config, reference) ?? reference);
163
+ const name = stringUtils.trimToNull(resolveIndexName(this.config, reference) ?? reference);
164
164
  if (name === null) {
165
165
  throw new ExecutionError(`search: no index configured; set a default index or pass one to ${operation}`, { context: { operation } });
166
166
  }
@@ -227,7 +227,7 @@ export class SearchClient {
227
227
  * live catalogue, otherwise the highest-ranked embedding endpoint is chosen.
228
228
  */
229
229
  async resolveEmbeddingModel(requested, signal) {
230
- const explicit = string.trimToNull(requested ?? this.config.embeddingModel);
230
+ const explicit = stringUtils.trimToNull(requested ?? this.config.embeddingModel);
231
231
  // An explicit name that already looks like an endpoint id (no whitespace)
232
232
  // is used verbatim - no need to fetch and fuzzy-match the live catalogue.
233
233
  // A genuinely loose name (e.g. "gte large") still resolves against it.
@@ -236,12 +236,12 @@ export class SearchClient {
236
236
  signal?.throwIfAborted();
237
237
  const client = defaultAppKitWorkspaceClient();
238
238
  const host = (await client.config.getHost()).toString();
239
- const endpoints = await serving.listServingEndpoints(client, host);
239
+ const endpoints = await modelCatalog.listServingEndpoints(client, host);
240
240
  signal?.throwIfAborted();
241
241
  const { modelId } = modelResolve.resolveModel(endpoints, {
242
242
  ...(explicit ? { explicit } : { modelClass: ModelClass.Embedding }),
243
243
  });
244
- return string.trimToNull(modelId);
244
+ return stringUtils.trimToNull(modelId);
245
245
  }
246
246
  /**
247
247
  * Embed text via a Databricks embedding serving endpoint, returning one
@@ -410,7 +410,7 @@ export class SearchClient {
410
410
  const needEmbed = seed.some((doc) => doc[vectorColumn] === undefined);
411
411
  let rows = seed;
412
412
  if (needEmbed) {
413
- const texts = seed.map((doc) => string.trimToEmpty(String(doc[sourceColumn] ?? "")));
413
+ const texts = seed.map((doc) => stringUtils.trimToEmpty(String(doc[sourceColumn] ?? "")));
414
414
  const vectors = await this.embed(texts, options.embeddingModel, options.signal);
415
415
  rows = seed.map((doc, i) => doc[vectorColumn] === undefined ? { ...doc, [vectorColumn]: vectors[i] } : doc);
416
416
  }
@@ -430,7 +430,7 @@ export class SearchClient {
430
430
  context: { operation: "provision" },
431
431
  });
432
432
  }
433
- await sharedAsync.sleep(5000, signal);
433
+ await asyncUtils.sleep(5000, signal);
434
434
  info = await this.getIndex(name, signal);
435
435
  }
436
436
  return info;
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFdBQVcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVNyRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEdBRWpCLE1BQU0sYUFBYSxDQUFDO0FBR3JCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUEwQzNDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUVYO0lBQ1E7SUFGbkIsWUFDVyxJQUFZLEVBQ0osTUFBb0I7UUFENUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNKLFdBQU0sR0FBTixNQUFNLENBQWM7SUFDcEMsQ0FBQztJQUVKLDBEQUEwRDtJQUMxRCxNQUFNLENBQUMsS0FBYSxFQUFFLE9BQXVCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxD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Y2ggZXh0ZW5zaW9uIGNsaWVudC4gUmVhZHMgZGVsZWdhdGUgdG8gdGhlIHJlZ2lzdGVyZWQgQXBwS2l0LWNvbXBhdGlibGVcbiAqIGBhaVNlYXJjaGAgcHJvdmlkZXI7IHRoaXMgbW9kdWxlIG93bnMgZmVkZXJhdGVkIGZhbi1vdXQgYW5kIHRoZSBWZWN0b3IgU2VhcmNoXG4gKiBsaWZlY3ljbGUgQVBJcyBBcHBLaXQgZG9lcyBub3QgZXhwb3NlLlxuICpcbiAqIGBjbGllbnQuc2VhcmNoKHF1ZXJ5LCBvcHRzKWAgc2VhcmNoZXMgdGhlIGRlZmF1bHQgaW5kZXg7IGBjbGllbnQuaW5kZXgobmFtZSlgXG4gKiByZXR1cm5zIGEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleDsgYGNsaWVudC51bml2ZXJzYWxTZWFyY2gocXVlcnkpYCBmYW5zIGFcbiAqIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlcyB0aGUgcmVzdWx0cyAoTWVpbGlzZWFyY2gncyBmZWRlcmF0ZWRcbiAqIC8gbXVsdGktc2VhcmNoLCB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgdGhlIGNhbGxlciBhc2tlZCBmb3IpLiBFdmVyeXRoaW5nIGlzXG4gKiBhc3luYyBhbmQgY2FuY2VsbGFibGUgYW5kIHJldHVybnMgdGhlIGJyb3dzZXItc2FmZSBzaGFwZXMgZnJvbVxuICogYEBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaGAuIExpZmVjeWNsZSBtZXRob2RzIGNyb3NzIEFwcEtpdCdzIGV4cGxpY2l0IGxlZ2FjeVxuICogY2xpZW50IGhhbmRvZmYgYmVjYXVzZSB0aGUgcHVibGljIGZhY2FkZSBkb2VzIG5vdCB5ZXQgZXhwb3NlIGluZGV4IGNyZWF0aW9uLFxuICogc3luYywgb3IgZGVsZXRpb24uXG4gKlxuICogQXV0b2NvbXBsZXRlIGlzIGp1c3QgYSBzZWFyY2ggd2l0aCBhIHNtYWxsIGBsaW1pdGAgYW5kIHRoZSByYXcgcXVlcnkgdGV4dCAtXG4gKiBoeWJyaWQgbW9kZSBhbHJlYWR5IHByZWZpeC1tYXRjaGVzLCBzbyBubyBzZXBhcmF0ZSBlbmRwb2ludCBpcyBuZWVkZWQ7IHRoZVxuICoge0BsaW5rIFNlYXJjaEluZGV4LmF1dG9jb21wbGV0ZX0gaGVscGVyIGlzIGEgdGhpbiwgc2VsZi1kb2N1bWVudGluZyBhbGlhcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgRXhlY3V0aW9uRXJyb3IsIGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxcIjtcbmltcG9ydCB7IGFwcGtpdCwgZGF0YWJyaWNrcyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgaW52b2tlLCByZXNvbHZlIGFzIG1vZGVsUmVzb2x2ZSwgc2VydmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBhc3luYyBhcyBzaGFyZWRBc3luYywganNvbiwgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgTW9kZWxDbGFzcyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuICBTZWFyY2hEb2N1bWVudCxcbiAgU2VhcmNoSGl0LFxuICBTZWFyY2hNb2RlLFxuICBTZWFyY2hSZXF1ZXN0LFxuICBTZWFyY2hSZXN1bHQsXG4gIFVwc2VydFJlc3VsdCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RFLFxuICBERUZBVUxUX1BBR0VfU0laRSxcbiAgREVGQVVMVF9USU1FT1VUX01TLFxuICByZXNvbHZlSW5kZXhOYW1lLFxuICB0eXBlIFJlc29sdmVkU2VhcmNoQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcblxudHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gUmV0dXJuVHlwZTxhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZVtcInRvTGVnYWN5V29ya3NwYWNlQ2xpZW50XCJdPjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2gvY2xpZW50XCIpO1xuXG4vKiogUXVlcnkgYmFja2VuZCB1c2VkIHdoZW4gQXBwS2l0IG93bnMgdGhlIFZlY3RvciBTZWFyY2ggZXhlY3V0aW9uIHBhdGguICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlYWRCYWNrZW5kIHtcbiAgLyoqIFdoZXRoZXIgVmVjdG9yIFNlYXJjaCBsaWZlY3ljbGUgbWV0aG9kcyBhcmUgdmFsaWQgZm9yIHRoaXMgcHJvdmlkZXIuICovXG4gIHN1cHBvcnRzTGlmZWN5Y2xlOiBib29sZWFuO1xuICBzZWFyY2goaW5kZXg6IHN0cmluZywgcXVlcnk6IHN0cmluZywgb3B0aW9ucz86IFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG4gIGFkZERvY3VtZW50cz8oXG4gICAgaW5kZXg6IHN0cmluZyxcbiAgICBkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0Pjtcbn1cblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgYSBzaW5nbGUtaW5kZXggc2VhcmNoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgLyoqIE1heGltdW0gaGl0cyB0byByZXR1cm4uIERlZmF1bHRzIHRvIHRoZSBjb25maWd1cmVkIHBhZ2Ugc2l6ZS4gKi9cbiAgbGltaXQ/OiBudW1iZXI7XG4gIC8qKiBNYXRjaCBtb2RlLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBtb2RlIChoeWJyaWQpLiAqL1xuICBtb2RlPzogU2VhcmNoTW9kZTtcbiAgLyoqIENvbHVtbnMgdG8gcmV0dXJuIHBlciBoaXQuIERlZmF1bHRzIHRvIHRoZSBpbmRleCdzIGNvbmZpZ3VyZWQgY29sdW1ucy4gKi9cbiAgY29sdW1ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogQXBwS2l0IEFJIFNlYXJjaCBzY2FsYXIvYXJyYXkgZmlsdGVycy4gKi9cbiAgZmlsdGVyPzogU2VhcmNoUmVxdWVzdFtcImZpbHRlclwiXTtcbiAgLyoqIERyb3AgaGl0cyBiZWxvdyB0aGlzIHNjb3JlLiAqL1xuICBzY29yZVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGEgdW5pdmVyc2FsIChmZWRlcmF0ZWQpIHNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBJbmRleGVzIHRvIHNlYXJjaC4gRGVmYXVsdHMgdG8gZXZlcnkga25vd24gaW5kZXguICovXG4gIGluZGV4ZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIE1heGltdW0gaGl0cyBwZXIgaW5kZXggYmVmb3JlIG1lcmdpbmcuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogTWF0Y2ggbW9kZS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleC4gTW9kZWxlZCBvbiBNZWlsaXNlYXJjaCdzIGBjbGllbnQuaW5kZXgodWlkKWA6XG4gKiBgc2VhcmNoYCAvIGBhdXRvY29tcGxldGVgIHJlYWQsIGBhZGREb2N1bWVudHNgIC8gYGRlbGV0ZURvY3VtZW50c2Agd3JpdGUgKHRvXG4gKiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXgpLCBhbmQgYGluZm9gIGZldGNoZXMgdGhlIGxpdmUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaEluZGV4IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBTZWFyY2hDbGllbnQsXG4gICkge31cblxuICAvKiogU2VhcmNoIHRoaXMgaW5kZXguIFNlZSB7QGxpbmsgU2VhcmNoQ2xpZW50LnNlYXJjaH0uICovXG4gIHNlYXJjaChxdWVyeTogc3RyaW5nLCBvcHRpb25zPzogU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlYXJjaChxdWVyeSwgeyAuLi5vcHRpb25zLCBpbmRleDogdGhpcy5uYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dG9jb21wbGV0ZSBhZ2FpbnN0IHRoaXMgaW5kZXg6IGEgc2VhcmNoIHdpdGggYSBzbWFsbCBkZWZhdWx0IGBsaW1pdGAgYW5kXG4gICAqIHRoZSByYXcgcHJlZml4IGFzIHRoZSBxdWVyeS4gSHlicmlkIG1vZGUgYWxyZWFkeSBoYW5kbGVzIHByZWZpeGVzLCBzbyB0aGlzXG4gICAqIGlzIGEgc2VsZi1kb2N1bWVudGluZyBhbGlhcyByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIGNvZGUgcGF0aC5cbiAgICovXG4gIGF1dG9jb21wbGV0ZShwcmVmaXg6IHN0cmluZywgb3B0aW9ucz86IFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaChwcmVmaXgsIHsgbGltaXQ6IDUsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gdGhpcyAoZGlyZWN0LWFjY2VzcykgaW5kZXguICovXG4gIGFkZERvY3VtZW50cyhkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYWRkRG9jdW1lbnRzKHRoaXMubmFtZSwgZG9jdW1lbnRzLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBkb2N1bWVudHMgZnJvbSB0aGlzIChkaXJlY3QtYWNjZXNzKSBpbmRleCBieSBwcmltYXJ5IGtleS4gKi9cbiAgZGVsZXRlRG9jdW1lbnRzKGlkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGVEb2N1bWVudHModGhpcy5uYW1lLCBpZHMsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRmV0Y2ggdGhpcyBpbmRleCdzIGxpdmUgZGVmaW5pdGlvbiAocHJpbWFyeSBrZXksIGNvbHVtbnMsIHJlYWRpbmVzcykuICovXG4gIGluZm8oc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogVHJpZ2dlciBhIHN5bmMgb2YgdGhpcyAoRGVsdGEgU3luYykgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuICBzeW5jKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnN5bmNJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRGVsZXRlIHRoaXMgaW5kZXguICovXG4gIGRlbGV0ZShzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGVJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIHRoaXMgaW5kZXggaWYgaXQgZG9lcyBub3QgZXhpc3QsIG90aGVyd2lzZSByZXR1cm4gdGhlIGV4aXN0aW5nIG9uZS4gKi9cbiAgZW5zdXJlKG9wdGlvbnM/OiBDcmVhdGVJbmRleE9wdGlvbnMpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5lbnN1cmVJbmRleCh0aGlzLm5hbWUsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKiBBIHJlc29sdmVkIGxpdmUgaW5kZXggZGVmaW5pdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhJbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgcHJpbWFyeUtleT86IHN0cmluZztcbiAgY29sdW1uczogc3RyaW5nW107XG4gIHJlYWR5OiBib29sZWFuO1xuICByb3dDb3VudD86IG51bWJlcjtcbiAgLyoqIFRydWUgZm9yIGEgRElSRUNUX0FDQ0VTUyBpbmRleCAoeW91IHN1cHBseSB2ZWN0b3JzOyBxdWVyaWVzIGVtYmVkIGNsaWVudC1zaWRlKS4gKi9cbiAgZGlyZWN0QWNjZXNzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU2VhcmNoQ2xpZW50LmNyZWF0ZUluZGV4fSAvIHtAbGluayBTZWFyY2hDbGllbnQuZW5zdXJlSW5kZXh9LlxuICogVGhlIGdvYWwgaXMgdGhlIHNhbWUgYXMgdGhlIHJlc3Qgb2YgdGhlIGNsaWVudDogbmFtZSBhIHNvdXJjZSB0YWJsZSBhbmQgYVxuICogdGV4dCBjb2x1bW4sIGFuZCBldmVyeXRoaW5nIGVsc2UgLSB0aGUgZW5kcG9pbnQsIHRoZSBlbWJlZGRpbmcgbW9kZWwsIHRoZVxuICogaW5kZXggdHlwZSwgdGhlIHN5bmMgbW9kZSAtIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQgdGhhdCBpbmZlcnMgZnJvbSB0aGVcbiAqIHdvcmtzcGFjZSwgb3ZlcnJpZGFibGUgd2hlbiBhIGRlcGxveW1lbnQgbmVlZHMgdG8gZ28gZGVlcGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUluZGV4T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTb3VyY2UgRGVsdGEgdGFibGUgKGNhdGFsb2cuc2NoZW1hLnRhYmxlKSBmb3IgYSBEZWx0YSBTeW5jIGluZGV4LiBQcm92aWRlXG4gICAqIHRoaXMgZm9yIHRoZSBjb21tb24gY2FzZTogRGF0YWJyaWNrcyBjb21wdXRlcyBhbmQgc3luY3MgZW1iZWRkaW5ncyBmcm9tIGl0LlxuICAgKiBPbWl0IGl0IChhbmQgcGFzcyB7QGxpbmsgZW1iZWRkaW5nRGltZW5zaW9ufSkgdG8gY3JlYXRlIGEgZGlyZWN0LWFjY2Vzc1xuICAgKiBpbmRleCB5b3Ugd3JpdGUgdmVjdG9ycyB0byB5b3Vyc2VsZi5cbiAgICovXG4gIHNvdXJjZVRhYmxlPzogc3RyaW5nO1xuICAvKiogUHJpbWFyeS1rZXkgY29sdW1uLiBEZWZhdWx0cyB0byBgaWRgLiAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRleHQgY29sdW1uIGVtYmVkZGluZ3MgYXJlIGNvbXB1dGVkIGZyb20gKERlbHRhIFN5bmMpLiBEZWZhdWx0cyB0byB0aGVcbiAgICogZmlyc3Qgb2YgYHRleHRgIC8gYGNvbnRlbnRgIC8gYGJvZHlgIHByZXNlbnQsIGVsc2UgdGhlIGNhbGxlciBtdXN0IHNldCBpdC5cbiAgICovXG4gIGVtYmVkZGluZ1NvdXJjZUNvbHVtbj86IHN0cmluZztcbiAgLyoqXG4gICAqIEVtYmVkZGluZyBtb2RlbCBlbmRwb2ludC4gQSBsb29zZSBuYW1lIGlzIGZ1enp5LW1hdGNoZWQ7IHdoZW4gb21pdHRlZCB0aGVcbiAgICogYmVzdCBlbWJlZGRpbmcgZW5kcG9pbnQgaW4gdGhlIHdvcmtzcGFjZSBpcyBjaG9zZW4gKHtAbGluayByZXNvbHZlRW1iZWRkaW5nTW9kZWx9KS5cbiAgICovXG4gIGVtYmVkZGluZ01vZGVsPzogc3RyaW5nO1xuICAvKiogVmVjdG9yIFNlYXJjaCBlbmRwb2ludCB0byBob3N0IHRoZSBpbmRleCBvbi4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIGBlbmRwb2ludGAuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICAvKiogRm9yIGEgZGlyZWN0LWFjY2VzcyBpbmRleDogdGhlIGVtYmVkZGluZyB2ZWN0b3IgZGltZW5zaW9uIChzZWxmLW1hbmFnZWQgdmVjdG9ycywgbm8gc291cmNlIHRhYmxlKS4gKi9cbiAgZW1iZWRkaW5nRGltZW5zaW9uPzogbnVtYmVyO1xuICAvKiogRm9yIGEgZGlyZWN0LWFjY2VzcyBpbmRleDogdGhlIGNvbHVtbiB0aGUgdmVjdG9yIGlzIHN0b3JlZCBpbi4gRGVmYXVsdHMgdG8gYGVtYmVkZGluZ2AuICovXG4gIGVtYmVkZGluZ1ZlY3RvckNvbHVtbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4tbmFtZSAtPiB0eXBlIG1hcCB1c2VkIHRvIGJ1aWxkIGEgZGlyZWN0LWFjY2VzcyBpbmRleCdzXG4gICAqIGBzY2hlbWFfanNvbmAgKHR5cGVzOiBgc3RyaW5nYCwgYGludGAsIGBsb25nYCwgYGZsb2F0YCwgYGRvdWJsZWAsXG4gICAqIGBib29sZWFuYCwgYGRhdGVgLCBgdGltZXN0YW1wYCkuIE11c3QgaW5jbHVkZSB0aGUgcHJpbWFyeSBrZXkgYW5kIGFueVxuICAgKiBjb2x1bW5zIHlvdSB1cHNlcnQuIERlZmF1bHRzIHRvIGB7IGlkOiBcInN0cmluZ1wiLCB0ZXh0OiBcInN0cmluZ1wiIH1gLiBUaGVcbiAgICogZW1iZWRkaW5nIHZlY3RvciBjb2x1bW4gaXMgYWRkZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHNjaGVtYT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBTeW5jIG1vZGUgZm9yIGEgRGVsdGEgU3luYyBpbmRleC4gYFRSSUdHRVJFRGAgKGRlZmF1bHQpIHN5bmNzIG9uIGRlbWFuZDsgYENPTlRJTlVPVVNgIGtlZXBzIGZyZXNoLiAqL1xuICBwaXBlbGluZVR5cGU/OiBcIlRSSUdHRVJFRFwiIHwgXCJDT05USU5VT1VTXCI7XG4gIC8qKiBFeHRyYSBjb2x1bW5zIHRvIHN5bmMgYWxvbmdzaWRlIHRoZSBlbWJlZGRpbmcgc291cmNlIChEZWx0YSBTeW5jKS4gKi9cbiAgY29sdW1uc1RvU3luYz86IHN0cmluZ1tdO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBTZWFyY2hDbGllbnQuZW5zdXJlRW5kcG9pbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnN1cmVFbmRwb2ludE9wdGlvbnMge1xuICAvKiogV2FpdCBmb3IgdGhlIGVuZHBvaW50IHRvIGNvbWUgb25saW5lIGJlZm9yZSByZXR1cm5pbmcuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICB3YWl0PzogYm9vbGVhbjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFNlYXJjaENsaWVudC5wcm92aXNpb259IC0gYSBvbmUtY2FsbCBcIm1ha2UgdGhpcyBpbmRleCByZWFsXG4gKiBhbmQgc2VhcmNoYWJsZVwiIHVzZWQgYXQgYm9vdCBvciBpbiBhIHNlZWQgc2NyaXB0LiBJdCBlbnN1cmVzIHRoZSBlbmRwb2ludCxcbiAqIGVuc3VyZXMgdGhlIGluZGV4LCBhbmQgKG9wdGlvbmFsbHkpIHNlZWRzIGRvY3VtZW50cyB3aGVuIHRoZSBpbmRleCBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25PcHRpb25zIGV4dGVuZHMgQ3JlYXRlSW5kZXhPcHRpb25zIHtcbiAgLyoqIERvY3VtZW50cyB0byBzZWVkIHdoZW4gdGhlIGluZGV4IGhhcyBubyByb3dzIHlldC4gU2tpcHBlZCBpZiBpdCBhbHJlYWR5IGhhcyBkYXRhLiAqL1xuICBzZWVkPzogU2VhcmNoRG9jdW1lbnRbXTtcbiAgLyoqXG4gICAqIFdhaXQgZm9yIHRoZSBlbmRwb2ludCBBTkQgaW5kZXggdG8gY29tZSBvbmxpbmUgYmVmb3JlIHJldHVybmluZyAobmVlZGVkXG4gICAqIGJlZm9yZSBzZWVkaW5nKS4gRGVmYXVsdHMgdG8gdHJ1ZS4gRW5kcG9pbnQgY3JlYXRpb24gY2FuIHRha2UgbWFueSBtaW51dGVzLlxuICAgKi9cbiAgd2FpdD86IGJvb2xlYW47XG4gIC8qKiBIb3cgbG9uZyB0byB3YWl0IGZvciByZWFkaW5lc3MgYmVmb3JlIGdpdmluZyB1cC4gRGVmYXVsdHMgdG8gMjAgbWludXRlcy4gKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBBSSBTZWFyY2ggY2xpZW50LiBDb25zdHJ1Y3QgaXQgd2l0aCB7QGxpbmsgY3JlYXRlU2VhcmNoQ2xpZW50fSAod2hpY2hcbiAqIHJlYWRzIGEgcmVzb2x2ZWQgY29uZmlnKSBvciBkaXJlY3RseSBmb3Igb25lLW9mZiB1c2UuIEFsbCByZWFkcyByZXNvbHZlIHRoZVxuICogT0JPIHdvcmtzcGFjZSBjbGllbnQgZnJvbSB0aGUgYWN0aXZlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoQ2xpZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnID0ge1xuICAgICAgaW5kZXhlczogW10sXG4gICAgICBwYWdlU2l6ZTogREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICBtb2RlOiBERUZBVUxUX01PREUsXG4gICAgICBiYXNlUGF0aDogXCIvYXBpL3NlYXJjaFwiLFxuICAgICAgdGltZW91dE1zOiBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgICBhbGxvd1dyaXRlOiBmYWxzZSxcbiAgICB9LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlQ2xpZW50RmFjdG9yeTogKCkgPT4gV29ya3NwYWNlQ2xpZW50TGlrZSA9IGRlZmF1bHRXb3Jrc3BhY2VDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWFkQmFja2VuZD86IFNlYXJjaFJlYWRCYWNrZW5kLFxuICApIHt9XG5cbiAgLyoqIEEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleCAoYnkgZnVsbCBVQyBuYW1lIG9yIGNvbmZpZ3VyZWQgYWxpYXMpLiAqL1xuICBpbmRleChyZWZlcmVuY2U6IHN0cmluZyk6IFNlYXJjaEluZGV4IHtcbiAgICBjb25zdCBuYW1lID0gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmZXJlbmNlKSA/PyByZWZlcmVuY2U7XG4gICAgcmV0dXJuIG5ldyBTZWFyY2hJbmRleChuYW1lLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggb25lIGluZGV4LiBgaW5kZXhgIG1heSBiZSBhIGZ1bGwgVUMgbmFtZSwgYSBjb25maWd1cmVkIGFsaWFzLCBvclxuICAgKiBvbWl0dGVkIHRvIHVzZSB0aGUgZGVmYXVsdCBpbmRleC4gUmV0dXJucyBoaXRzIHNvcnRlZCBtb3N0LXJlbGV2YW50LWZpcnN0LlxuICAgKi9cbiAgYXN5bmMgc2VhcmNoKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2VhcmNoT3B0aW9ucyAmIHsgaW5kZXg/OiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGNvbnN0IHRleHQgPSBzdHJpbmcudHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IG5hbWUgPSByZXNvbHZlSW5kZXhOYW1lKHRoaXMuY29uZmlnLCBvcHRpb25zLmluZGV4KTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBpbmRleCBjb25maWd1cmVkOyBzZXQgYSBkZWZhdWx0IGluZGV4IG9yIHBhc3Mgb25lXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwic2VhcmNoXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucmVhZEJhY2tlbmQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgXCJzZWFyY2g6IG5vIEFJIFNlYXJjaCBwcm92aWRlciByZWdpc3RlcmVkOyBhZGQgYWlTZWFyY2goKSBvciBsYWtlYmFzZUFpU2VhcmNoKClcIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJzZWFyY2hcIiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZWFkQmFja2VuZC5zZWFyY2gobmFtZSwgdGV4dCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0ID8/IHRoaXMuY29uZmlnLnBhZ2VTaXplLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbiBhIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlIHRoZSBoaXRzLCBzb3J0ZWQgYnkgc2NvcmUgLVxuICAgKiB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgYSBzaW5nbGUgYm94IG92ZXIgbWFueSBjb2xsZWN0aW9ucyBuZWVkcy4gRWFjaFxuICAgKiBpbmRleCBpcyBzZWFyY2hlZCBjb25jdXJyZW50bHk7IGFuIGluZGV4IHRoYXQgZXJyb3JzIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZFxuICAgKiBzbyBvbmUgYmFkIGluZGV4IGRvZXMgbm90IHNpbmsgdGhlIHdob2xlIHNlYXJjaC5cbiAgICovXG4gIGFzeW5jIHVuaXZlcnNhbFNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gc3RyaW5nLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lcyA9XG4gICAgICBvcHRpb25zLmluZGV4ZXMgJiYgb3B0aW9ucy5pbmRleGVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBvcHRpb25zLmluZGV4ZXMubWFwKChyZWYpID0+IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZikgPz8gcmVmKVxuICAgICAgICA6IHRoaXMuY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLm5hbWUpO1xuICAgIGNvbnN0IHBlckluZGV4ID0gb3B0aW9ucy5saW1pdCA/PyB0aGlzLmNvbmZpZy5wYWdlU2l6ZTtcblxuICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBuYW1lcy5tYXAoYXN5bmMgKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZWFyY2godGV4dCwge1xuICAgICAgICAgIGluZGV4OiBuYW1lLFxuICAgICAgICAgIGxpbWl0OiBwZXJJbmRleCxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5tb2RlID8geyBtb2RlOiBvcHRpb25zLm1vZGUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQuaGl0cy5tYXAoKGhpdCk6IFNlYXJjaEhpdCA9PiAoeyAuLi5oaXQsIGluZGV4OiBuYW1lIH0pKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBoaXRzID0gc2V0dGxlZFxuICAgICAgLmZsYXRNYXAoKG91dGNvbWUsIGkpID0+IHtcbiAgICAgICAgaWYgKG91dGNvbWUuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSByZXR1cm4gb3V0Y29tZS52YWx1ZTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ1bml2ZXJzYWwtaW5kZXgtZmFpbGVkXCIsIHsgaW5kZXg6IG5hbWVzW2ldIH0pO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcblxuICAgIHJldHVybiB7IHF1ZXJ5OiB0ZXh0LCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGluZGV4IHJlZmVyZW5jZSAoZnVsbCBVQyBuYW1lIG9yIGNvbmZpZ3VyZWQgYWxpYXMpIHRvIHRoZSBuYW1lXG4gICAqIHRoZSBBUEkgZXhwZWN0cywgZmFpbGluZyBmYXN0IHdoZW4gaXQgcmVzb2x2ZXMgdG8gbm90aGluZy4gV2l0aG91dCB0aGlzIGFcbiAgICogYmxhbmsgcmVmZXJlbmNlIC0gd2hhdCBhbiBvbWl0dGVkIGBpbmRleGAgYmVjb21lcyB3aGVuIG5vIGRlZmF1bHQgaXNcbiAgICogY29uZmlndXJlZCAtIHJlYWNoZXMgdGhlIFNESyBhcyBhbiBlbXB0eSBgaW5kZXhfbmFtZWAsIHdoaWNoIGJ1aWxkcyBhXG4gICAqIFVSTCB3aXRoIHRoZSBuYW1lIHNlZ21lbnQgbWlzc2luZyBhbmQgY29tZXMgYmFjayBhcyBhIGNvbmZ1c2luZ1xuICAgKiBgRU5EUE9JTlRfTk9UX0ZPVU5EYCBpbnN0ZWFkIG9mIG5hbWluZyB0aGUgcmVhbCBwcm9ibGVtLlxuICAgKi9cbiAgcHJpdmF0ZSByZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZTogc3RyaW5nLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHN0cmluZy50cmltVG9OdWxsKHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZmVyZW5jZSkgPz8gcmVmZXJlbmNlKTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBgc2VhcmNoOiBubyBpbmRleCBjb25maWd1cmVkOyBzZXQgYSBkZWZhdWx0IGluZGV4IG9yIHBhc3Mgb25lIHRvICR7b3BlcmF0aW9ufWAsXG4gICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb24gfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICAvKiogUmVqZWN0IFZlY3RvciBTZWFyY2ggbGlmZWN5Y2xlIGNhbGxzIGFnYWluc3QgYSBub24tVmVjdG9yIHByb3ZpZGVyLiAqL1xuICBwcml2YXRlIHJlcXVpcmVMaWZlY3ljbGUob3BlcmF0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkQmFja2VuZCAmJiAhdGhpcy5yZWFkQmFja2VuZC5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKGBzZWFyY2g6IHRoZSByZWdpc3RlcmVkIHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgJHtvcGVyYXRpb259YCwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbiB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEZldGNoIGFuIGluZGV4J3MgbGl2ZSBkZWZpbml0aW9uLiAqL1xuICBhc3luYyBnZXRJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImdldEluZGV4XCIpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImdldEluZGV4XCIpO1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZ2V0SW5kZXhcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuZ2V0SW5kZXgoeyBpbmRleF9uYW1lOiBuYW1lIH0sIGNvbnRleHQpLFxuICAgICk7XG4gICAgY29uc3QgZGlyZWN0QWNjZXNzID0gaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3BlYyA9IGluZGV4LmRlbHRhX3N5bmNfaW5kZXhfc3BlYyA/PyBpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM7XG4gICAgLy8gRGVsdGEgU3luYyBzdXJmYWNlcyBpdHMgZW1iZWRkaW5nIHNvdXJjZSBjb2x1bW5zIGRpcmVjdGx5OyBhIGRpcmVjdC1hY2Nlc3NcbiAgICAvLyBpbmRleCBjYXJyaWVzIGl0cyBjb2x1bW5zIGluIHNjaGVtYV9qc29uIChtaW51cyB0aGUgdmVjdG9yIGNvbHVtbikuXG4gICAgbGV0IGNvbHVtbnMgPSAoc3BlYz8uZW1iZWRkaW5nX3NvdXJjZV9jb2x1bW5zID8/IFtdKS5tYXAoKGMpID0+IGMubmFtZSA/PyBcIlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3Qgc2NoZW1hSnNvbiA9IGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYz8uc2NoZW1hX2pzb247XG4gICAgaWYgKGRpcmVjdEFjY2VzcyAmJiBzY2hlbWFKc29uKSB7XG4gICAgICBjb25zdCBzY2hlbWEgPSBqc29uLnBhcnNlUmVjb3JkKHNjaGVtYUpzb24pID8/IHt9O1xuICAgICAgY29uc3QgdmVjdG9yTmFtZXMgPSBuZXcgU2V0KFxuICAgICAgICAoaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjPy5lbWJlZGRpbmdfdmVjdG9yX2NvbHVtbnMgPz8gW10pXG4gICAgICAgICAgLm1hcCgoYykgPT4gYy5uYW1lKVxuICAgICAgICAgIC5maWx0ZXIoKG4pOiBuIGlzIHN0cmluZyA9PiBCb29sZWFuKG4pKSxcbiAgICAgICk7XG4gICAgICBjb2x1bW5zID0gT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoKGMpID0+ICF2ZWN0b3JOYW1lcy5oYXMoYykpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogaW5kZXgubmFtZSA/PyBuYW1lLFxuICAgICAgLi4uKGluZGV4LmVuZHBvaW50X25hbWUgPyB7IGVuZHBvaW50OiBpbmRleC5lbmRwb2ludF9uYW1lIH0gOiB7fSksXG4gICAgICAuLi4oaW5kZXgucHJpbWFyeV9rZXkgPyB7IHByaW1hcnlLZXk6IGluZGV4LnByaW1hcnlfa2V5IH0gOiB7fSksXG4gICAgICBjb2x1bW5zLFxuICAgICAgcmVhZHk6IGluZGV4LnN0YXR1cz8ucmVhZHkgPz8gZmFsc2UsXG4gICAgICAuLi4oaW5kZXguc3RhdHVzPy5pbmRleGVkX3Jvd19jb3VudCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyByb3dDb3VudDogaW5kZXguc3RhdHVzLmluZGV4ZWRfcm93X2NvdW50IH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4oZGlyZWN0QWNjZXNzID8geyBkaXJlY3RBY2Nlc3M6IHRydWUgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBpbmRleC4gKi9cbiAgYXN5bmMgYWRkRG9jdW1lbnRzKFxuICAgIHJlZmVyZW5jZTogc3RyaW5nLFxuICAgIGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJhZGREb2N1bWVudHNcIik7XG4gICAgaWYgKHRoaXMucmVhZEJhY2tlbmQ/LmFkZERvY3VtZW50cykge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEJhY2tlbmQuYWRkRG9jdW1lbnRzKG5hbWUsIGRvY3VtZW50cywgc2lnbmFsKTtcbiAgICB9XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiYWRkRG9jdW1lbnRzXCIpO1xuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImFkZERvY3VtZW50c1wiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy51cHNlcnREYXRhVmVjdG9ySW5kZXgoXG4gICAgICAgIHsgaW5kZXhfbmFtZTogbmFtZSwgaW5wdXRzX2pzb246IEpTT04uc3RyaW5naWZ5KGRvY3VtZW50cykgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4geyBpbmRleDogbmFtZSwgY291bnQ6IGRvY3VtZW50cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZG9jdW1lbnRzIGZyb20gYSBkaXJlY3QtYWNjZXNzIGluZGV4IGJ5IHByaW1hcnkga2V5LiAqL1xuICBhc3luYyBkZWxldGVEb2N1bWVudHMoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgaWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImRlbGV0ZURvY3VtZW50c1wiKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJkZWxldGVEb2N1bWVudHNcIik7XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZGVsZXRlRG9jdW1lbnRzXCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmRlbGV0ZURhdGFWZWN0b3JJbmRleChcbiAgICAgICAgeyBpbmRleF9uYW1lOiBuYW1lLCBwcmltYXJ5X2tleXM6IGlkcy5tYXAoU3RyaW5nKSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiB7IGluZGV4OiBuYW1lLCBjb3VudDogaWRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gZW1iZWRkaW5nIGVuZHBvaW50IGlkIGZvciBjcmVhdGluZyBhIERlbHRhIFN5bmMgaW5kZXguIFJldXNlc1xuICAgKiB0aGUgbW9kZWwgcmVzb2x2ZXI6IGEgY29uZmlndXJlZCAvIHBhc3NlZCBuYW1lIGlzIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCB0aGVcbiAgICogbGl2ZSBjYXRhbG9ndWUsIG90aGVyd2lzZSB0aGUgaGlnaGVzdC1yYW5rZWQgZW1iZWRkaW5nIGVuZHBvaW50IGlzIGNob3Nlbi5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVFbWJlZGRpbmdNb2RlbChyZXF1ZXN0ZWQ/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgZXhwbGljaXQgPSBzdHJpbmcudHJpbVRvTnVsbChyZXF1ZXN0ZWQgPz8gdGhpcy5jb25maWcuZW1iZWRkaW5nTW9kZWwpO1xuICAgIC8vIEFuIGV4cGxpY2l0IG5hbWUgdGhhdCBhbHJlYWR5IGxvb2tzIGxpa2UgYW4gZW5kcG9pbnQgaWQgKG5vIHdoaXRlc3BhY2UpXG4gICAgLy8gaXMgdXNlZCB2ZXJiYXRpbSAtIG5vIG5lZWQgdG8gZmV0Y2ggYW5kIGZ1enp5LW1hdGNoIHRoZSBsaXZlIGNhdGFsb2d1ZS5cbiAgICAvLyBBIGdlbnVpbmVseSBsb29zZSBuYW1lIChlLmcuIFwiZ3RlIGxhcmdlXCIpIHN0aWxsIHJlc29sdmVzIGFnYWluc3QgaXQuXG4gICAgaWYgKGV4cGxpY2l0ICYmICEvXFxzLy50ZXN0KGV4cGxpY2l0KSkgcmV0dXJuIGV4cGxpY2l0O1xuICAgIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjbGllbnQgPSBkZWZhdWx0QXBwS2l0V29ya3NwYWNlQ2xpZW50KCk7XG4gICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBzZXJ2aW5nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCk7XG4gICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IHsgbW9kZWxJZCB9ID0gbW9kZWxSZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHtcbiAgICAgIC4uLihleHBsaWNpdCA/IHsgZXhwbGljaXQgfSA6IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cmluZy50cmltVG9OdWxsKG1vZGVsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkIHRleHQgdmlhIGEgRGF0YWJyaWNrcyBlbWJlZGRpbmcgc2VydmluZyBlbmRwb2ludCwgcmV0dXJuaW5nIG9uZVxuICAgKiB2ZWN0b3IgcGVyIGlucHV0LiBVc2VkIHRvIHNlZWQgYSBkaXJlY3QtYWNjZXNzIGluZGV4IGFuZCB0byB0dXJuIGEgc2VhcmNoXG4gICAqIHF1ZXJ5IGludG8gYSBxdWVyeSB2ZWN0b3IgLSBEYXRhYnJpY2tzIG9ubHkgbWFuYWdlcyBlbWJlZGRpbmdzIGZvciBEZWx0YVxuICAgKiBTeW5jIGluZGV4ZXMsIHNvIGEgZGlyZWN0LWFjY2VzcyBpbmRleCAobm8gRGVsdGEgdGFibGUsIG5vIHdhcmVob3VzZSkgbmVlZHNcbiAgICogdGhlIGNsaWVudCB0byBlbWJlZCBvbiB3cml0ZSBhbmQgb24gcXVlcnkuIFRoZSBlbmRwb2ludCBpcyByZXNvbHZlZCB0aGVcbiAgICogc2FtZSB3YXkgYXMgZm9yIGluZGV4IGNyZWF0aW9uIHdoZW4gbm90IG5hbWVkLlxuICAgKi9cbiAgYXN5bmMgZW1iZWQodGV4dHM6IHN0cmluZ1tdLCBtb2RlbD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPG51bWJlcltdW10+IHtcbiAgICBpZiAodGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgZW5kcG9pbnQgPSBhd2FpdCB0aGlzLnJlc29sdmVFbWJlZGRpbmdNb2RlbChtb2RlbCwgc2lnbmFsKTtcbiAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGNvdWxkIG5vdCByZXNvbHZlIGFuIGVtYmVkZGluZyBtb2RlbCB0byBlbWJlZCB0ZXh0XCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW1iZWRcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndpdGhDbGllbnQoXCJlbWJlZFwiLCBzaWduYWwsIGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCB1cmwgPSBpbnZva2UuaW52b2NhdGlvbnNVcmwoaG9zdCwgZW5kcG9pbnQpO1xuICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGludm9rZS5hdXRoSGVhZGVycyhjbGllbnQpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczogeyAuLi5oZWFkZXJzLCBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGlucHV0OiB0ZXh0cyB9KSxcbiAgICAgICAgLi4uKHNpZ25hbCA/IHsgc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIGBzZWFyY2g6IGVtYmVkZGluZyBlbmRwb2ludCAke2VuZHBvaW50fSBmYWlsZWQgKCR7cmVzcG9uc2Uuc3RhdHVzfSlgLFxuICAgICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW1iZWRcIiB9IH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBkYXRhPzogQXJyYXk8eyBlbWJlZGRpbmc6IG51bWJlcltdIH0+IH07XG4gICAgICBjb25zdCB2ZWN0b3JzID0gKGJvZHkuZGF0YSA/PyBbXSkubWFwKChyb3cpID0+IHJvdy5lbWJlZGRpbmcpO1xuICAgICAgaWYgKHZlY3RvcnMubGVuZ3RoICE9PSB0ZXh0cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBlbWJlZGRpbmcgcmVzcG9uc2UgZGlkIG5vdCBtYXRjaCB0aGUgaW5wdXQgY291bnRcIiwge1xuICAgICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVtYmVkXCIgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmVjdG9ycztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgdmVjdG9yIGRpbWVuc2lvbiBhIG1vZGVsIHByb2R1Y2VzIChlbWJlZHMgYSBwcm9iZSBzdHJpbmcgb25jZSkuICovXG4gIHByaXZhdGUgYXN5bmMgZW1iZWRkaW5nRGltZW5zaW9uKG1vZGVsPzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgW3ZlY3Rvcl0gPSBhd2FpdCB0aGlzLmVtYmVkKFtcImRpbWVuc2lvbiBwcm9iZVwiXSwgbW9kZWwsIHNpZ25hbCk7XG4gICAgaWYgKCF2ZWN0b3IgfHwgdmVjdG9yLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBjb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBlbWJlZGRpbmcgZGltZW5zaW9uXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiY3JlYXRlSW5kZXhcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2ZWN0b3IubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBBSSBTZWFyY2ggaW5kZXggd2l0aCBhcyBsaXR0bGUgY2VyZW1vbnkgYXMgcG9zc2libGUuIFR3byBzaGFwZXM6XG4gICAqXG4gICAqICAgLSAqKkRlbHRhIFN5bmMqKiAodGhlIGRlZmF1bHQpOiBwYXNzIGBzb3VyY2VUYWJsZWA7IERhdGFicmlja3MgY29tcHV0ZXNcbiAgICogICAgIGVtYmVkZGluZ3MgZnJvbSB0aGUgdGV4dCBjb2x1bW4gYW5kIGtlZXBzIHRoZSBpbmRleCBzeW5jZWQuIFRoZVxuICAgKiAgICAgZW1iZWRkaW5nIG1vZGVsIGlzIHJlc29sdmVkIGF1dG9tYXRpY2FsbHkgd2hlbiBub3QgbmFtZWQuXG4gICAqICAgLSAqKkRpcmVjdCBBY2Nlc3MqKjogb21pdCBgc291cmNlVGFibGVgIGFuZCBwYXNzIGBlbWJlZGRpbmdEaW1lbnNpb25gO1xuICAgKiAgICAgeW91IHdyaXRlIHZlY3RvcnMgeW91cnNlbGYgdmlhIHtAbGluayBhZGREb2N1bWVudHN9LlxuICAgKlxuICAgKiBFdmVyeXRoaW5nIGVsc2UgaW5mZXJzOiB0aGUgZW5kcG9pbnQgZnJvbSB0aGUgcGx1Z2luIGNvbmZpZywgdGhlIHByaW1hcnlcbiAgICoga2V5IChgaWRgKSwgdGhlIHRleHQgY29sdW1uIChgdGV4dGAgLyBgY29udGVudGAgLyBgYm9keWApLCBhbmQgdGhlIHZlY3RvclxuICAgKiBjb2x1bW4gKGBlbWJlZGRpbmdgKS4gUmV0dXJucyB0aGUgY3JlYXRlZCBpbmRleCdzIHtAbGluayBJbmRleEluZm99LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlSW5kZXgobmFtZTogc3RyaW5nLCBvcHRpb25zOiBDcmVhdGVJbmRleE9wdGlvbnMgPSB7fSk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiY3JlYXRlSW5kZXhcIik7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBvcHRpb25zLmVuZHBvaW50ID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgXCJzZWFyY2g6IG5vIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgY29uZmlndXJlZDsgcGFzcyBgZW5kcG9pbnRgIG9yIHNldCBpdCBvbiB0aGUgcGx1Z2luXCIsXG4gICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb246IFwiY3JlYXRlSW5kZXhcIiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gb3B0aW9ucy5wcmltYXJ5S2V5ID8/IFwiaWRcIjtcbiAgICBjb25zdCBkaXJlY3QgPSAhb3B0aW9ucy5zb3VyY2VUYWJsZTtcbiAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSBvcHRpb25zLmVtYmVkZGluZ1NvdXJjZUNvbHVtbiA/PyBcInRleHRcIjtcbiAgICBjb25zdCB2ZWN0b3JDb2x1bW4gPSBvcHRpb25zLmVtYmVkZGluZ1ZlY3RvckNvbHVtbiA/PyBcImVtYmVkZGluZ1wiO1xuXG4gICAgLy8gRGVsdGEgU3luYyBsZXRzIERhdGFicmlja3MgZW1iZWQgYSBzb3VyY2UgY29sdW1uLCBzbyBpdCBuZWVkcyBhbiBlbWJlZGRpbmdcbiAgICAvLyBtb2RlbC4gQSBkaXJlY3QtYWNjZXNzIGluZGV4IHN0b3JlcyB2ZWN0b3JzIFlPVSBzdXBwbHkgKERhdGFicmlja3Mgb25seVxuICAgIC8vIHN1cHBvcnRzIG1hbmFnZWQgZW1iZWRkaW5ncyBvbiBEZWx0YSBTeW5jKSwgc28gaXQgbmVlZHMgYSBkaW1lbnNpb247IHdlXG4gICAgLy8gcmVzb2x2ZSBvbmUgZnJvbSB0aGUgZW1iZWRkaW5nIG1vZGVsIHdoZW4gbm90IGdpdmVuIHNvIGEgZGlyZWN0LWFjY2Vzc1xuICAgIC8vIGluZGV4IHN0aWxsIHdvcmtzIHdpdGggemVybyBleHRyYSBjb25maWcgKGVtYmVkIHZpYSBgZW1iZWQoKWAgb24gc2VlZCArXG4gICAgLy8gcXVlcnkgLSBzZWUgYHByb3Zpc2lvbmAgLyBgc2VhcmNoYCkuXG4gICAgY29uc3QgZW1iZWRkaW5nTW9kZWwgPVxuICAgICAgKGF3YWl0IHRoaXMucmVzb2x2ZUVtYmVkZGluZ01vZGVsKG9wdGlvbnMuZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKSkgPz8gdW5kZWZpbmVkO1xuICAgIGlmICghZW1iZWRkaW5nTW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgXCJzZWFyY2g6IGNvdWxkIG5vdCByZXNvbHZlIGFuIGVtYmVkZGluZyBtb2RlbDsgcGFzcyBgZW1iZWRkaW5nTW9kZWxgXCIsXG4gICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb246IFwiY3JlYXRlSW5kZXhcIiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkaW1lbnNpb24gPVxuICAgICAgb3B0aW9ucy5lbWJlZGRpbmdEaW1lbnNpb24gPz8gKGF3YWl0IHRoaXMuZW1iZWRkaW5nRGltZW5zaW9uKGVtYmVkZGluZ01vZGVsLCBvcHRpb25zLnNpZ25hbCkpO1xuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgW3ByaW1hcnlLZXldOiBcInN0cmluZ1wiLFxuICAgICAgW3NvdXJjZUNvbHVtbl06IFwic3RyaW5nXCIsXG4gICAgICAuLi4ob3B0aW9ucy5zY2hlbWEgPz8ge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBkaXJlY3RTcGVjID0ge1xuICAgICAgZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjOiB7XG4gICAgICAgIGVtYmVkZGluZ192ZWN0b3JfY29sdW1uczogW3sgbmFtZTogdmVjdG9yQ29sdW1uLCBlbWJlZGRpbmdfZGltZW5zaW9uOiBkaW1lbnNpb24gfV0sXG4gICAgICAgIHNjaGVtYV9qc29uOiBKU09OLnN0cmluZ2lmeSh7IC4uLnNjaGVtYSwgW3ZlY3RvckNvbHVtbl06IGBhcnJheTxmbG9hdD5gIH0pLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiY3JlYXRlSW5kZXhcIiwgb3B0aW9ucy5zaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5jcmVhdGVJbmRleChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZW5kcG9pbnRfbmFtZTogZW5kcG9pbnQsXG4gICAgICAgICAgcHJpbWFyeV9rZXk6IHByaW1hcnlLZXksXG4gICAgICAgICAgaW5kZXhfdHlwZTogZGlyZWN0ID8gXCJESVJFQ1RfQUNDRVNTXCIgOiBcIkRFTFRBX1NZTkNcIixcbiAgICAgICAgICAuLi4oZGlyZWN0XG4gICAgICAgICAgICA/IGRpcmVjdFNwZWNcbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIGRlbHRhX3N5bmNfaW5kZXhfc3BlYzoge1xuICAgICAgICAgICAgICAgICAgc291cmNlX3RhYmxlOiBvcHRpb25zLnNvdXJjZVRhYmxlLFxuICAgICAgICAgICAgICAgICAgcGlwZWxpbmVfdHlwZTogb3B0aW9ucy5waXBlbGluZVR5cGUgPz8gXCJUUklHR0VSRURcIixcbiAgICAgICAgICAgICAgICAgIGVtYmVkZGluZ19zb3VyY2VfY29sdW1uczogW1xuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6IHNvdXJjZUNvbHVtbiwgZW1iZWRkaW5nX21vZGVsX2VuZHBvaW50X25hbWU6IGVtYmVkZGluZ01vZGVsIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgLi4uKG9wdGlvbnMuY29sdW1uc1RvU3luYyAmJiBvcHRpb25zLmNvbHVtbnNUb1N5bmMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICA/IHsgY29sdW1uc190b19zeW5jOiBvcHRpb25zLmNvbHVtbnNUb1N5bmMgfVxuICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICksXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhcImluZGV4LWNyZWF0ZWRcIiwge1xuICAgICAgaW5kZXg6IG5hbWUsXG4gICAgICBlbmRwb2ludCxcbiAgICAgIHR5cGU6IGRpcmVjdCA/IFwiRElSRUNUX0FDQ0VTU1wiIDogXCJERUxUQV9TWU5DXCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW5kZXgobmFtZSwgb3B0aW9ucy5zaWduYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgaW5kZXggaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgb3RoZXJ3aXNlIHJldHVybiB0aGVcbiAgICogZXhpc3Rpbmcgb25lLiBJZGVtcG90ZW50IC0gc2FmZSB0byBjYWxsIG9uIGV2ZXJ5IGJvb3QgdG8gZ3VhcmFudGVlIGFuXG4gICAqIGluZGV4IGlzIHByZXNlbnQuXG4gICAqL1xuICBhc3luYyBlbnN1cmVJbmRleChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJlbnN1cmVJbmRleFwiKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgb3B0aW9ucy5zaWduYWwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlSW5kZXgobmFtZSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhbiBpbmRleCBleGlzdHMsIGlzIG9ubGluZSwgYW5kIChvcHRpb25hbGx5KSBob2xkcyBzZWVkIGRhdGEgLSB0aGVcbiAgICogXCJ3aXJlIHVwIGEgcmVhbCBpbmRleCBvbiBib290XCIgcGF0aC4gSWRlbXBvdGVudCBhbmQgY2hlYXAgdG8gY2FsbCBldmVyeVxuICAgKiBib290OiBpdCBjcmVhdGVzIHRoZSBlbmRwb2ludCBhbmQgaW5kZXggb25seSBpZiBtaXNzaW5nLCB3YWl0cyBmb3IgdGhlbSB0b1xuICAgKiBjb21lIG9ubGluZSwgYW5kIHNlZWRzIGRvY3VtZW50cyBPTkxZIHdoZW4gdGhlIGluZGV4IGlzIHN0aWxsIGVtcHR5LlxuICAgKlxuICAgKiBGb3IgdGhlIGRlbW8vZHVtbXktZGF0YSBjYXNlIHRoaXMgbmVlZHMgbm8gRGVsdGEgdGFibGUgYW5kIG5vIHdhcmVob3VzZTpcbiAgICogdGhlIGRlZmF1bHQgaXMgYSBNQU5BR0VEIGRpcmVjdC1hY2Nlc3MgaW5kZXggKERhdGFicmlja3MgZW1iZWRzIHRoZSBgdGV4dGBcbiAgICogY29sdW1uIG9uIHdyaXRlIGFuZCBxdWVyeSksIHNvIHNlZWRpbmcgaXMganVzdCBhbiBgYWRkRG9jdW1lbnRzYCBvZiBwbGFpblxuICAgKiByb3dzIGFuZCBzZWFyY2gtYnktdGV4dCB3b3JrcyBpbW1lZGlhdGVseS5cbiAgICovXG4gIGFzeW5jIHByb3Zpc2lvbihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFByb3Zpc2lvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwicHJvdmlzaW9uXCIpO1xuICAgIGNvbnN0IHdhaXQgPSBvcHRpb25zLndhaXQgPz8gdHJ1ZTtcbiAgICBjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcyA/PyAyMCAqIDYwICogMTAwMDtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKGVuZHBvaW50KSBhd2FpdCB0aGlzLmVuc3VyZUVuZHBvaW50KGVuZHBvaW50LCB7IHdhaXQsIHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG5cbiAgICBjb25zdCB7IHNlZWQ6IF9zZWVkLCB3YWl0OiBfd2FpdCwgdGltZW91dE1zOiBfdGltZW91dE1zLCAuLi5jcmVhdGVPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGxldCBpbmZvID0gYXdhaXQgdGhpcy5lbnN1cmVJbmRleChuYW1lLCBjcmVhdGVPcHRpb25zKTtcblxuICAgIGlmICh3YWl0ICYmICFpbmZvLnJlYWR5KSBpbmZvID0gYXdhaXQgdGhpcy53YWl0Rm9ySW5kZXhSZWFkeShuYW1lLCB0aW1lb3V0TXMsIG9wdGlvbnMuc2lnbmFsKTtcblxuICAgIGNvbnN0IHNlZWQgPSBvcHRpb25zLnNlZWQgPz8gW107XG4gICAgaWYgKHNlZWQubGVuZ3RoID4gMCAmJiAoaW5mby5yb3dDb3VudCA/PyAwKSA9PT0gMCkge1xuICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdTb3VyY2VDb2x1bW4gPz8gXCJ0ZXh0XCI7XG4gICAgICBjb25zdCB2ZWN0b3JDb2x1bW4gPSBvcHRpb25zLmVtYmVkZGluZ1ZlY3RvckNvbHVtbiA/PyBcImVtYmVkZGluZ1wiO1xuICAgICAgLy8gRGlyZWN0LWFjY2VzcyBpbmRleGVzIHN0b3JlIHZlY3RvcnMgd2Ugc3VwcGx5LCBzbyBlbWJlZCB0aGUgdGV4dCBjb2x1bW5cbiAgICAgIC8vIGZvciBhbnkgc2VlZCByb3cgdGhhdCBkaWQgbm90IGFscmVhZHkgY2FycnkgYSB2ZWN0b3IuXG4gICAgICBjb25zdCBuZWVkRW1iZWQgPSBzZWVkLnNvbWUoKGRvYykgPT4gZG9jW3ZlY3RvckNvbHVtbl0gPT09IHVuZGVmaW5lZCk7XG4gICAgICBsZXQgcm93cyA9IHNlZWQ7XG4gICAgICBpZiAobmVlZEVtYmVkKSB7XG4gICAgICAgIGNvbnN0IHRleHRzID0gc2VlZC5tYXAoKGRvYykgPT4gc3RyaW5nLnRyaW1Ub0VtcHR5KFN0cmluZyhkb2Nbc291cmNlQ29sdW1uXSA/PyBcIlwiKSkpO1xuICAgICAgICBjb25zdCB2ZWN0b3JzID0gYXdhaXQgdGhpcy5lbWJlZCh0ZXh0cywgb3B0aW9ucy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgICByb3dzID0gc2VlZC5tYXAoKGRvYywgaSkgPT5cbiAgICAgICAgICBkb2NbdmVjdG9yQ29sdW1uXSA9PT0gdW5kZWZpbmVkID8geyAuLi5kb2MsIFt2ZWN0b3JDb2x1bW5dOiB2ZWN0b3JzW2ldIH0gOiBkb2MsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkZERvY3VtZW50cyhuYW1lLCByb3dzLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgICBsb2dnZXIuaW5mbyhcImluZGV4LXNlZWRlZFwiLCB7IGluZGV4OiBuYW1lLCBjb3VudDogcm93cy5sZW5ndGggfSk7XG4gICAgICBpbmZvID0gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLyoqIFBvbGwgYW4gaW5kZXggdW50aWwgaXQgcmVwb3J0cyByZWFkeSwgb3IgdGhyb3cgYWZ0ZXIge0BsaW5rIHRpbWVvdXRNc30uICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckluZGV4UmVhZHkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHRpbWVvdXRNczogbnVtYmVyLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcbiAgICBsZXQgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICB3aGlsZSAoIWluZm8ucmVhZHkpIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKGBzZWFyY2g6IGluZGV4ICR7bmFtZX0gZGlkIG5vdCBjb21lIG9ubGluZSBpbiB0aW1lYCwge1xuICAgICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcInByb3Zpc2lvblwiIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2hhcmVkQXN5bmMuc2xlZXAoNTAwMCwgc2lnbmFsKTtcbiAgICAgIGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgYSBzeW5jIG9mIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG4gIGFzeW5jIHN5bmNJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJzeW5jSW5kZXhcIik7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwic3luY0luZGV4XCIpO1xuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcInN5bmNJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5zeW5jSW5kZXgoeyBpbmRleF9uYW1lOiBuYW1lIH0sIGNvbnRleHQpLFxuICAgICk7XG4gICAgbG9nZ2VyLmluZm8oXCJpbmRleC1zeW5jZWRcIiwgeyBpbmRleDogbmFtZSB9KTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYW4gaW5kZXguICovXG4gIGFzeW5jIGRlbGV0ZUluZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImRlbGV0ZUluZGV4XCIpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImRlbGV0ZUluZGV4XCIpO1xuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImRlbGV0ZUluZGV4XCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmRlbGV0ZUluZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtZGVsZXRlZFwiLCB7IGluZGV4OiBuYW1lIH0pO1xuICB9XG5cbiAgLyoqIExpc3QgdGhlIGluZGV4ZXMgaG9zdGVkIG9uIGEgVmVjdG9yIFNlYXJjaCBlbmRwb2ludCAobmFtZSArIHR5cGUgb25seSkuICovXG4gIGFzeW5jIGxpc3RJbmRleGVzKGVuZHBvaW50Pzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJsaXN0SW5kZXhlc1wiKTtcbiAgICBjb25zdCBlbmRwb2ludE5hbWUgPSBlbmRwb2ludCA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBlbmRwb2ludCBjb25maWd1cmVkIHRvIGxpc3QgaW5kZXhlc1wiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImxpc3RJbmRleGVzXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53aXRoQ2xpZW50KFwibGlzdEluZGV4ZXNcIiwgc2lnbmFsLCBhc3luYyAoY2xpZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgaW5kZXggb2YgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMubGlzdEluZGV4ZXMoXG4gICAgICAgIHsgZW5kcG9pbnRfbmFtZTogZW5kcG9pbnROYW1lIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApKSB7XG4gICAgICAgIGlmIChpbmRleC5uYW1lKSBuYW1lcy5wdXNoKGluZGV4Lm5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hbWVzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgZXhpc3RzLCBjcmVhdGluZyBhIGBTVEFOREFSRGAgb25lIHdoZW4gaXRcbiAgICogZG9lcyBub3QuIE9wdGlvbmFsbHkgd2FpdCBmb3IgaXQgdG8gY29tZSBvbmxpbmUuIElkZW1wb3RlbnQuXG4gICAqL1xuICBhc3luYyBlbnN1cmVFbmRwb2ludChuYW1lPzogc3RyaW5nLCBvcHRpb25zOiBFbnN1cmVFbmRwb2ludE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImVuc3VyZUVuZHBvaW50XCIpO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gbmFtZSA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IG5vIGVuZHBvaW50IG5hbWUgdG8gZW5zdXJlXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW5zdXJlRW5kcG9pbnRcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImVuc3VyZUVuZHBvaW50XCIsIG9wdGlvbnMuc2lnbmFsLCBhc3luYyAoY2xpZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGllbnQudmVjdG9yU2VhcmNoRW5kcG9pbnRzLmdldEVuZHBvaW50KHsgZW5kcG9pbnRfbmFtZTogZW5kcG9pbnQgfSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCB3YWl0ZXIgPSBhd2FpdCBjbGllbnQudmVjdG9yU2VhcmNoRW5kcG9pbnRzLmNyZWF0ZUVuZHBvaW50KFxuICAgICAgICAgIHsgbmFtZTogZW5kcG9pbnQsIGVuZHBvaW50X3R5cGU6IFwiU1RBTkRBUkRcIiB9LFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiZW5kcG9pbnQtY3JlYXRlZFwiLCB7IGVuZHBvaW50IH0pO1xuICAgICAgICBpZiAob3B0aW9ucy53YWl0KSBhd2FpdCB3YWl0ZXIud2FpdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHdvcmtzcGFjZSBjbGllbnQgYW5kIHJ1biBvbmUgY2FsbCB1bmRlciBhIGJvdW5kZWQgdGltZW91dC4gVGhlXG4gICAqIGNhbGxlcidzIHNpZ25hbCAoaWYgYW55KSBhbmQgYSB0aW1lb3V0IGFyZSBtZXJnZWQgaW50byBvbmUgU0RLIGBDb250ZXh0YFxuICAgKiB2aWEge0BsaW5rIGFwcGtpdC5kYXRhYnJpY2tzLnRvQ29udGV4dH0sIHNvIGVpdGhlciB1bndpbmRzIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQ2xpZW50PFQ+KFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gICAgZm46IChjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsIGNvbnRleHQ/OiBDb250ZXh0KSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLndvcmtzcGFjZUNsaWVudEZhY3RvcnkoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRoaXMuY29uZmlnLnRpbWVvdXRNcyk7XG4gICAgY29uc3QgY29udGV4dCA9IGRhdGFicmlja3MudG9Db250ZXh0KGNvbnRyb2xsZXIsIHNpZ25hbCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbihjbGllbnQsIGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgRXhlY3V0aW9uRXJyb3IuY2FuY2VsZWQoKTtcbiAgICAgIGxvZ2dlci53YXJuKFwiZXhlY3V0aW9uLWZhaWxlZFwiLCB7IG9wZXJhdGlvbiB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIFRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgY29udGV4dCwgb3IgYSBzZXJ2aWNlLXByaW5jaXBhbCBjbGllbnQuICovXG5mdW5jdGlvbiBkZWZhdWx0V29ya3NwYWNlQ2xpZW50KCk6IFdvcmtzcGFjZUNsaWVudExpa2Uge1xuICByZXR1cm4gZGVmYXVsdEFwcEtpdFdvcmtzcGFjZUNsaWVudCgpLnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCk7XG59XG5cbi8qKiBBcHBLaXQgd29ya3NwYWNlLWNsaWVudCBmYWNhZGUgZnJvbSB0aGUgYWN0aXZlIHJlcXVlc3Qgb3Igc2VydmljZSBjb250ZXh0LiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFwcEtpdFdvcmtzcGFjZUNsaWVudCgpOiBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZSB7XG4gIGNvbnN0IGN0eCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGlmIChjdHg/LmNsaWVudCkgcmV0dXJuIGN0eC5jbGllbnQ7XG4gIC8vIE91dHNpZGUgYSByZXF1ZXN0IHNjb3BlIChhIHNjcmlwdCwgYSB0ZXN0KTogYSBmcmVzaCBlbnYtYXV0aCBjbGllbnQuXG4gIHJldHVybiBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xufVxuXG4vKiogQ29uc3RydWN0IGEge0BsaW5rIFNlYXJjaENsaWVudH0gZnJvbSBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWFyY2hDbGllbnQoXG4gIGNvbmZpZz86IFJlc29sdmVkU2VhcmNoQ29uZmlnLFxuICB3b3Jrc3BhY2VDbGllbnRGYWN0b3J5PzogKCkgPT4gV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgcmVhZEJhY2tlbmQ/OiBTZWFyY2hSZWFkQmFja2VuZCxcbik6IFNlYXJjaENsaWVudCB7XG4gIHJldHVybiBuZXcgU2VhcmNoQ2xpZW50KGNvbmZpZywgd29ya3NwYWNlQ2xpZW50RmFjdG9yeSwgcmVhZEJhY2tlbmQpO1xufVxuIl19
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