@dbx-tools/search 0.9.154 → 0.9.157

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.ts CHANGED
@@ -3,28 +3,33 @@
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.154";
6
+ export const PACKAGE_VERSION = "0.9.157";
7
7
  export * as client from "./src/client.ts";
8
8
  export * as config from "./src/config.ts";
9
9
  export * as indexOptions from "./src/index-options.ts";
10
- export * as lakebase from "./src/lakebase.ts";
11
10
  export * as lakebasePlugin from "./src/lakebase-plugin.ts";
11
+ export * as lakebase from "./src/lakebase.ts";
12
12
  export * as native from "./src/native.ts";
13
13
  export * as plugin from "./src/plugin.ts";
14
14
  export * as query from "./src/query.ts";
15
15
  export * as runtime from "./src/runtime.ts";
16
16
  export * as schema from "./src/schema.ts";
17
17
  export * as tool from "./src/tool.ts";
18
- export { SearchIndex, SearchClient } from "./src/client.ts";
19
- export type { SearchReadBackend, SearchOptions, UniversalSearchOptions, IndexInfo, CreateIndexOptions, EnsureEndpointOptions, ProvisionOptions } from "./src/client.ts";
20
- export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, SEARCH_CONFIG_SCHEMA } from "./src/config.ts";
18
+ export { SearchIndex, SearchClient, createSearchClient } from "./src/client.ts";
19
+ export type { SearchReadBackend, SearchOptions, UniversalSearchOptions, CreateIndexOptions, EnsureEndpointOptions, ProvisionOptions } from "./src/client.ts";
20
+ export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, SEARCH_CONFIG_SCHEMA, defaultAlias, resolveSearchConfig, resolveIndexName, indexConfigFor } from "./src/config.ts";
21
21
  export type { SearchIndexConfig, SearchPluginConfig, EnsureOnSetupConfig, ResolvedIndexConfig, ResolvedSearchConfig } from "./src/config.ts";
22
- export { LakebaseSearchBackend } from "./src/lakebase.ts";
23
- export type { LakebaseSearchOptions, LakebaseSearchPool, LakebaseProvisionOptions } from "./src/lakebase.ts";
22
+ export { toCreateIndexOptions } from "./src/index-options.ts";
24
23
  export { LakebaseAiSearchPlugin, lakebaseAiSearch } from "./src/lakebase-plugin.ts";
25
24
  export type { LakebaseAiSearchIndexConfig, LakebaseAiSearchConfig } from "./src/lakebase-plugin.ts";
25
+ export { toSearchTerms, toTsQuery, LakebaseSearchBackend } from "./src/lakebase.ts";
26
+ export type { LakebaseSearchOptions, LakebaseSearchPool, LakebaseProvisionOptions } from "./src/lakebase.ts";
27
+ export { nativeAiSearchBackend } from "./src/native.ts";
26
28
  export type { AiSearchProvider } from "./src/native.ts";
27
29
  export { SearchPlugin, search } from "./src/plugin.ts";
30
+ export { toDocumentArray } from "./src/query.ts";
31
+ export { createSearchRuntime, setSearchReadBackend } from "./src/runtime.ts";
28
32
  export type { SearchRuntimeOptions, SearchRuntime } from "./src/runtime.ts";
29
- 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.ts";
33
+ export { SEARCH_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION, ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION } from "./src/schema.ts";
34
+ export { searchTool, universalSearchTool, addDocumentsTool, createIndexTool, syncIndexTool } from "./src/tool.ts";
30
35
  export type { SearchToolOptions } from "./src/tool.ts";
package/lib/index.d.ts CHANGED
@@ -1,26 +1,31 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/search";
2
- export declare const PACKAGE_VERSION = "0.9.154";
2
+ export declare const PACKAGE_VERSION = "0.9.157";
3
3
  export * as client from "./src/client.ts";
4
4
  export * as config from "./src/config.ts";
5
5
  export * as indexOptions from "./src/index-options.ts";
6
- export * as lakebase from "./src/lakebase.ts";
7
6
  export * as lakebasePlugin from "./src/lakebase-plugin.ts";
7
+ export * as lakebase from "./src/lakebase.ts";
8
8
  export * as native from "./src/native.ts";
9
9
  export * as plugin from "./src/plugin.ts";
10
10
  export * as query from "./src/query.ts";
11
11
  export * as runtime from "./src/runtime.ts";
12
12
  export * as schema from "./src/schema.ts";
13
13
  export * as tool from "./src/tool.ts";
14
- export { SearchIndex, SearchClient } from "./src/client.ts";
15
- export type { SearchReadBackend, SearchOptions, UniversalSearchOptions, IndexInfo, CreateIndexOptions, EnsureEndpointOptions, ProvisionOptions } from "./src/client.ts";
16
- export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, SEARCH_CONFIG_SCHEMA } from "./src/config.ts";
14
+ export { SearchIndex, SearchClient, createSearchClient } from "./src/client.ts";
15
+ export type { SearchReadBackend, SearchOptions, UniversalSearchOptions, CreateIndexOptions, EnsureEndpointOptions, ProvisionOptions } from "./src/client.ts";
16
+ export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, SEARCH_CONFIG_SCHEMA, defaultAlias, resolveSearchConfig, resolveIndexName, indexConfigFor } from "./src/config.ts";
17
17
  export type { SearchIndexConfig, SearchPluginConfig, EnsureOnSetupConfig, ResolvedIndexConfig, ResolvedSearchConfig } from "./src/config.ts";
18
- export { LakebaseSearchBackend } from "./src/lakebase.ts";
19
- export type { LakebaseSearchOptions, LakebaseSearchPool, LakebaseProvisionOptions } from "./src/lakebase.ts";
18
+ export { toCreateIndexOptions } from "./src/index-options.ts";
20
19
  export { LakebaseAiSearchPlugin, lakebaseAiSearch } from "./src/lakebase-plugin.ts";
21
20
  export type { LakebaseAiSearchIndexConfig, LakebaseAiSearchConfig } from "./src/lakebase-plugin.ts";
21
+ export { toSearchTerms, toTsQuery, LakebaseSearchBackend } from "./src/lakebase.ts";
22
+ export type { LakebaseSearchOptions, LakebaseSearchPool, LakebaseProvisionOptions } from "./src/lakebase.ts";
23
+ export { nativeAiSearchBackend } from "./src/native.ts";
22
24
  export type { AiSearchProvider } from "./src/native.ts";
23
25
  export { SearchPlugin, search } from "./src/plugin.ts";
26
+ export { toDocumentArray } from "./src/query.ts";
27
+ export { createSearchRuntime, setSearchReadBackend } from "./src/runtime.ts";
24
28
  export type { SearchRuntimeOptions, SearchRuntime } from "./src/runtime.ts";
25
- 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.ts";
29
+ export { SEARCH_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION, ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION } from "./src/schema.ts";
30
+ export { searchTool, universalSearchTool, addDocumentsTool, createIndexTool, syncIndexTool } from "./src/tool.ts";
26
31
  export type { SearchToolOptions } from "./src/tool.ts";
package/lib/index.js CHANGED
@@ -2,22 +2,27 @@
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.154";
5
+ export const PACKAGE_VERSION = "0.9.157";
6
6
  export * as client from "./src/client.js";
7
7
  export * as config from "./src/config.js";
8
8
  export * as indexOptions from "./src/index-options.js";
9
- export * as lakebase from "./src/lakebase.js";
10
9
  export * as lakebasePlugin from "./src/lakebase-plugin.js";
10
+ export * as lakebase from "./src/lakebase.js";
11
11
  export * as native from "./src/native.js";
12
12
  export * as plugin from "./src/plugin.js";
13
13
  export * as query from "./src/query.js";
14
14
  export * as runtime from "./src/runtime.js";
15
15
  export * as schema from "./src/schema.js";
16
16
  export * as tool from "./src/tool.js";
17
- export { SearchIndex, SearchClient } from "./src/client.js";
18
- export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, SEARCH_CONFIG_SCHEMA } from "./src/config.js";
19
- export { LakebaseSearchBackend } from "./src/lakebase.js";
17
+ export { SearchIndex, SearchClient, createSearchClient } from "./src/client.js";
18
+ export { INDEX_ENV, DATABRICKS_INDEX_ENV, ENDPOINT_ENV, DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, SEARCH_CONFIG_SCHEMA, defaultAlias, resolveSearchConfig, resolveIndexName, indexConfigFor } from "./src/config.js";
19
+ export { toCreateIndexOptions } from "./src/index-options.js";
20
20
  export { LakebaseAiSearchPlugin, lakebaseAiSearch } from "./src/lakebase-plugin.js";
21
+ export { toSearchTerms, toTsQuery, LakebaseSearchBackend } from "./src/lakebase.js";
22
+ export { nativeAiSearchBackend } from "./src/native.js";
21
23
  export { SearchPlugin, search } from "./src/plugin.js";
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzSixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQ0FBaUMsRUFBRSw4QkFBOEIsRUFBRSw2QkFBNkIsRUFBRSwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTU0XCI7XG5leHBvcnQgKiBhcyBjbGllbnQgZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIGluZGV4T3B0aW9ucyBmcm9tIFwiLi9zcmMvaW5kZXgtb3B0aW9ucy50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2UgZnJvbSBcIi4vc3JjL2xha2ViYXNlLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZVBsdWdpbiBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBuYXRpdmUgZnJvbSBcIi4vc3JjL25hdGl2ZS50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHF1ZXJ5IGZyb20gXCIuL3NyYy9xdWVyeS50c1wiO1xuZXhwb3J0ICogYXMgcnVudGltZSBmcm9tIFwiLi9zcmMvcnVudGltZS50c1wiO1xuZXhwb3J0ICogYXMgc2NoZW1hIGZyb20gXCIuL3NyYy9zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHRvb2wgZnJvbSBcIi4vc3JjL3Rvb2wudHNcIjtcbmV4cG9ydCB7IFNlYXJjaEluZGV4LCBTZWFyY2hDbGllbnQgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaFJlYWRCYWNrZW5kLCBTZWFyY2hPcHRpb25zLCBVbml2ZXJzYWxTZWFyY2hPcHRpb25zLCBJbmRleEluZm8sIENyZWF0ZUluZGV4T3B0aW9ucywgRW5zdXJlRW5kcG9pbnRPcHRpb25zLCBQcm92aXNpb25PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0IHsgSU5ERVhfRU5WLCBEQVRBQlJJQ0tTX0lOREVYX0VOViwgRU5EUE9JTlRfRU5WLCBERUZBVUxUX01PREUsIERFRkFVTFRfUEFHRV9TSVpFLCBERUZBVUxUX1RJTUVPVVRfTVMsIFNFQVJDSF9DT05GSUdfU0NIRU1BIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWFyY2hJbmRleENvbmZpZywgU2VhcmNoUGx1Z2luQ29uZmlnLCBFbnN1cmVPblNldHVwQ29uZmlnLCBSZXNvbHZlZEluZGV4Q29uZmlnLCBSZXNvbHZlZFNlYXJjaENvbmZpZyB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB7IExha2ViYXNlU2VhcmNoQmFja2VuZCB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYmFzZVNlYXJjaE9wdGlvbnMsIExha2ViYXNlU2VhcmNoUG9vbCwgTGFrZWJhc2VQcm92aXNpb25PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLnRzXCI7XG5leHBvcnQgeyBMYWtlYmFzZUFpU2VhcmNoUGx1Z2luLCBsYWtlYmFzZUFpU2VhcmNoIH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXBsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYmFzZUFpU2VhcmNoSW5kZXhDb25maWcsIExha2ViYXNlQWlTZWFyY2hDb25maWcgfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFpU2VhcmNoUHJvdmlkZXIgfSBmcm9tIFwiLi9zcmMvbmF0aXZlLnRzXCI7XG5leHBvcnQgeyBTZWFyY2hQbHVnaW4sIHNlYXJjaCB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VhcmNoUnVudGltZU9wdGlvbnMsIFNlYXJjaFJ1bnRpbWUgfSBmcm9tIFwiLi9zcmMvcnVudGltZS50c1wiO1xuZXhwb3J0IHsgU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sIFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTiwgQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLCBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTiwgU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLCBzZWFyY2hUb29sU2NoZW1hLCB1bml2ZXJzYWxTZWFyY2hUb29sU2NoZW1hLCBzZWFyY2hSZXN1bHRTY2hlbWEsIGNyZWF0ZUluZGV4VG9vbFNjaGVtYSwgaW5kZXhJbmZvU2NoZW1hLCBzeW5jSW5kZXhUb29sU2NoZW1hIH0gZnJvbSBcIi4vc3JjL3NjaGVtYS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWFyY2hUb29sT3B0aW9ucyB9IGZyb20gXCIuL3NyYy90b29sLnRzXCI7XG4iXX0=
24
+ export { toDocumentArray } from "./src/query.js";
25
+ export { createSearchRuntime, setSearchReadBackend } from "./src/runtime.js";
26
+ export { SEARCH_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION, ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION } from "./src/schema.js";
27
+ export { searchTool, universalSearchTool, addDocumentsTool, createIndexTool, syncIndexTool } from "./src/tool.js";
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRixPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhPLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXBGLE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFN0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlDQUFpQyxFQUFFLDhCQUE4QixFQUFFLDZCQUE2QixFQUFFLDJCQUEyQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekwsT0FBTyxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9zZWFyY2hcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xNTdcIjtcbmV4cG9ydCAqIGFzIGNsaWVudCBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgaW5kZXhPcHRpb25zIGZyb20gXCIuL3NyYy9pbmRleC1vcHRpb25zLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZVBsdWdpbiBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UudHNcIjtcbmV4cG9ydCAqIGFzIG5hdGl2ZSBmcm9tIFwiLi9zcmMvbmF0aXZlLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcXVlcnkgZnJvbSBcIi4vc3JjL3F1ZXJ5LnRzXCI7XG5leHBvcnQgKiBhcyBydW50aW1lIGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgKiBhcyBzY2hlbWEgZnJvbSBcIi4vc3JjL3NjaGVtYS50c1wiO1xuZXhwb3J0ICogYXMgdG9vbCBmcm9tIFwiLi9zcmMvdG9vbC50c1wiO1xuZXhwb3J0IHsgU2VhcmNoSW5kZXgsIFNlYXJjaENsaWVudCwgY3JlYXRlU2VhcmNoQ2xpZW50IH0gZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWFyY2hSZWFkQmFja2VuZCwgU2VhcmNoT3B0aW9ucywgVW5pdmVyc2FsU2VhcmNoT3B0aW9ucywgQ3JlYXRlSW5kZXhPcHRpb25zLCBFbnN1cmVFbmRwb2ludE9wdGlvbnMsIFByb3Zpc2lvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgeyBJTkRFWF9FTlYsIERBVEFCUklDS1NfSU5ERVhfRU5WLCBFTkRQT0lOVF9FTlYsIERFRkFVTFRfTU9ERSwgREVGQVVMVF9QQUdFX1NJWkUsIERFRkFVTFRfVElNRU9VVF9NUywgU0VBUkNIX0NPTkZJR19TQ0hFTUEsIGRlZmF1bHRBbGlhcywgcmVzb2x2ZVNlYXJjaENvbmZpZywgcmVzb2x2ZUluZGV4TmFtZSwgaW5kZXhDb25maWdGb3IgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlYXJjaEluZGV4Q29uZmlnLCBTZWFyY2hQbHVnaW5Db25maWcsIEVuc3VyZU9uU2V0dXBDb25maWcsIFJlc29sdmVkSW5kZXhDb25maWcsIFJlc29sdmVkU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHsgdG9DcmVhdGVJbmRleE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvaW5kZXgtb3B0aW9ucy50c1wiO1xuZXhwb3J0IHsgTGFrZWJhc2VBaVNlYXJjaFBsdWdpbiwgbGFrZWJhc2VBaVNlYXJjaCB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VBaVNlYXJjaEluZGV4Q29uZmlnLCBMYWtlYmFzZUFpU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXBsdWdpbi50c1wiO1xuZXhwb3J0IHsgdG9TZWFyY2hUZXJtcywgdG9Uc1F1ZXJ5LCBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VTZWFyY2hPcHRpb25zLCBMYWtlYmFzZVNlYXJjaFBvb2wsIExha2ViYXNlUHJvdmlzaW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS50c1wiO1xuZXhwb3J0IHsgbmF0aXZlQWlTZWFyY2hCYWNrZW5kIH0gZnJvbSBcIi4vc3JjL25hdGl2ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBBaVNlYXJjaFByb3ZpZGVyIH0gZnJvbSBcIi4vc3JjL25hdGl2ZS50c1wiO1xuZXhwb3J0IHsgU2VhcmNoUGx1Z2luLCBzZWFyY2ggfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyB0b0RvY3VtZW50QXJyYXkgfSBmcm9tIFwiLi9zcmMvcXVlcnkudHNcIjtcbmV4cG9ydCB7IGNyZWF0ZVNlYXJjaFJ1bnRpbWUsIHNldFNlYXJjaFJlYWRCYWNrZW5kIH0gZnJvbSBcIi4vc3JjL3J1bnRpbWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VhcmNoUnVudGltZU9wdGlvbnMsIFNlYXJjaFJ1bnRpbWUgfSBmcm9tIFwiLi9zcmMvcnVudGltZS50c1wiO1xuZXhwb3J0IHsgU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sIFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTiwgQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLCBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTiwgU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OIH0gZnJvbSBcIi4vc3JjL3NjaGVtYS50c1wiO1xuZXhwb3J0IHsgc2VhcmNoVG9vbCwgdW5pdmVyc2FsU2VhcmNoVG9vbCwgYWRkRG9jdW1lbnRzVG9vbCwgY3JlYXRlSW5kZXhUb29sLCBzeW5jSW5kZXhUb29sIH0gZnJvbSBcIi4vc3JjL3Rvb2wudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VhcmNoVG9vbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdG9vbC50c1wiO1xuIl19
@@ -85,8 +85,6 @@ export declare class SearchIndex {
85
85
  /** Create this index if it does not exist, otherwise return the existing one. */
86
86
  ensure(options?: CreateIndexOptions): Promise<IndexInfo>;
87
87
  }
88
- /** A resolved live index definition. */
89
- export type { IndexInfo };
90
88
  /**
91
89
  * Options for {@link SearchClient.createIndex} / {@link SearchClient.ensureIndex}.
92
90
  * The goal is the same as the rest of the client: name a source table and a
@@ -272,3 +270,4 @@ export declare class SearchClient {
272
270
  }
273
271
  /** Construct a {@link SearchClient} from a resolved config. */
274
272
  export declare function createSearchClient(config?: ResolvedSearchConfig, workspaceClientFactory?: () => WorkspaceClientLike, readBackend?: SearchReadBackend): SearchClient;
273
+ export {};
package/lib/src/client.js CHANGED
@@ -19,9 +19,9 @@
19
19
  * @module
20
20
  */
21
21
  import { ExecutionError, getExecutionContext } from "@databricks/appkit";
22
- import { appkit, databricks } from "@dbx-tools/appkit";
23
- import { invoke, resolve as modelResolve, modelCatalog } from "@dbx-tools/model";
24
- import { asyncUtils, json, log, stringUtils } from "@dbx-tools/shared-core";
22
+ import { tryGetExecutionContext, toContext } from "@dbx-tools/appkit";
23
+ import { invoke, selection, modelCatalog } from "@dbx-tools/model";
24
+ import { log, sleep, parseRecord, trimToEmpty, trimToNull } 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");
@@ -104,7 +104,7 @@ export class SearchClient {
104
104
  * omitted to use the default index. Returns hits sorted most-relevant-first.
105
105
  */
106
106
  async search(query, options = {}) {
107
- const text = stringUtils.trimToEmpty(query);
107
+ const text = trimToEmpty(query);
108
108
  const name = resolveIndexName(this.config, options.index);
109
109
  if (name === null) {
110
110
  throw new ExecutionError("search: no index configured; set a default index or pass one", {
@@ -126,7 +126,7 @@ export class SearchClient {
126
126
  * so one bad index does not sink the whole search.
127
127
  */
128
128
  async universalSearch(query, options = {}) {
129
- const text = stringUtils.trimToEmpty(query);
129
+ const text = trimToEmpty(query);
130
130
  const names = options.indexes && options.indexes.length > 0
131
131
  ? options.indexes.map((ref) => resolveIndexName(this.config, ref) ?? ref)
132
132
  : this.config.indexes.map((i) => i.name);
@@ -159,7 +159,7 @@ export class SearchClient {
159
159
  * `ENDPOINT_NOT_FOUND` instead of naming the real problem.
160
160
  */
161
161
  requireIndexName(reference, operation) {
162
- const name = stringUtils.trimToNull(resolveIndexName(this.config, reference) ?? reference);
162
+ const name = trimToNull(resolveIndexName(this.config, reference) ?? reference);
163
163
  if (name === null) {
164
164
  throw new ExecutionError(`search: no index configured; set a default index or pass one to ${operation}`, { context: { operation } });
165
165
  }
@@ -185,7 +185,7 @@ export class SearchClient {
185
185
  let columns = (spec?.embedding_source_columns ?? []).map((c) => c.name ?? "").filter(Boolean);
186
186
  const schemaJson = index.direct_access_index_spec?.schema_json;
187
187
  if (directAccess && schemaJson) {
188
- const schema = json.parseRecord(schemaJson) ?? {};
188
+ const schema = parseRecord(schemaJson) ?? {};
189
189
  const vectorNames = new Set((index.direct_access_index_spec?.embedding_vector_columns ?? [])
190
190
  .map((c) => c.name)
191
191
  .filter((n) => Boolean(n)));
@@ -226,7 +226,7 @@ export class SearchClient {
226
226
  * live catalogue, otherwise the highest-ranked embedding endpoint is chosen.
227
227
  */
228
228
  async resolveEmbeddingModel(requested, signal) {
229
- const explicit = stringUtils.trimToNull(requested ?? this.config.embeddingModel);
229
+ const explicit = trimToNull(requested ?? this.config.embeddingModel);
230
230
  // An explicit name that already looks like an endpoint id (no whitespace)
231
231
  // is used verbatim - no need to fetch and fuzzy-match the live catalogue.
232
232
  // A genuinely loose name (e.g. "gte large") still resolves against it.
@@ -237,10 +237,10 @@ export class SearchClient {
237
237
  const host = (await client.config.getHost()).toString();
238
238
  const endpoints = await modelCatalog.listServingEndpoints(client, host);
239
239
  signal?.throwIfAborted();
240
- const { modelId } = modelResolve.resolveModel(endpoints, {
240
+ const { modelId } = selection.resolveModel(endpoints, {
241
241
  ...(explicit ? { explicit } : { modelClass: ModelClass.Embedding }),
242
242
  });
243
- return stringUtils.trimToNull(modelId);
243
+ return trimToNull(modelId);
244
244
  }
245
245
  /**
246
246
  * Embed text via a Databricks embedding serving endpoint, returning one
@@ -409,7 +409,7 @@ export class SearchClient {
409
409
  const needEmbed = seed.some((doc) => doc[vectorColumn] === undefined);
410
410
  let rows = seed;
411
411
  if (needEmbed) {
412
- const texts = seed.map((doc) => stringUtils.trimToEmpty(String(doc[sourceColumn] ?? "")));
412
+ const texts = seed.map((doc) => trimToEmpty(String(doc[sourceColumn] ?? "")));
413
413
  const vectors = await this.embed(texts, options.embeddingModel, options.signal);
414
414
  rows = seed.map((doc, i) => doc[vectorColumn] === undefined ? { ...doc, [vectorColumn]: vectors[i] } : doc);
415
415
  }
@@ -429,7 +429,7 @@ export class SearchClient {
429
429
  context: { operation: "provision" },
430
430
  });
431
431
  }
432
- await asyncUtils.sleep(5000, signal);
432
+ await sleep(5000, signal);
433
433
  info = await this.getIndex(name, signal);
434
434
  }
435
435
  return info;
@@ -500,7 +500,7 @@ export class SearchClient {
500
500
  const client = this.workspaceClientFactory();
501
501
  const controller = new AbortController();
502
502
  const timer = setTimeout(() => controller.abort(), this.config.timeoutMs);
503
- const context = databricks.toContext(controller, signal);
503
+ const context = toContext(controller, signal);
504
504
  try {
505
505
  return await fn(client, context);
506
506
  }
@@ -521,7 +521,7 @@ function defaultWorkspaceClient() {
521
521
  }
522
522
  /** AppKit workspace-client facade from the active request or service context. */
523
523
  function defaultAppKitWorkspaceClient() {
524
- const ctx = appkit.tryGetExecutionContext();
524
+ const ctx = tryGetExecutionContext();
525
525
  if (ctx?.client)
526
526
  return ctx.client;
527
527
  // Outside a request scope (a script, a test): a fresh env-auth client.
@@ -531,4 +531,4 @@ function defaultAppKitWorkspaceClient() {
531
531
  export function createSearchClient(config, workspaceClientFactory, readBackend) {
532
532
  return new SearchClient(config, workspaceClientFactory, readBackend);
533
533
  }
534
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBVXJELE9BQU8sRUFDTCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixnQkFBZ0IsR0FFakIsTUFBTSxhQUFhLENBQUM7QUFHckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQTBDM0M7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBRVg7SUFDUTtJQUZuQixZQUNXLElBQVksRUFDSixNQUFvQjtRQUQ1QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ0osV0FBTSxHQUFOLE1BQU0sQ0FBYztJQUNwQyxDQUFDO0lBRUosMERBQTBEO0lBQzFELE1BQU0sQ0FBQyxLQUFhLEVBQUUsT0FBdUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsTUFBYyxF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Z2F0ZSB0byB0aGUgcmVnaXN0ZXJlZCBBcHBLaXQtY29tcGF0aWJsZVxuICogYGFpU2VhcmNoYCBwcm92aWRlcjsgdGhpcyBtb2R1bGUgb3ducyBmZWRlcmF0ZWQgZmFuLW91dCBhbmQgdGhlIFZlY3RvciBTZWFyY2hcbiAqIGxpZmVjeWNsZSBBUElzIEFwcEtpdCBkb2VzIG5vdCBleHBvc2UuXG4gKlxuICogYGNsaWVudC5zZWFyY2gocXVlcnksIG9wdHMpYCBzZWFyY2hlcyB0aGUgZGVmYXVsdCBpbmRleDsgYGNsaWVudC5pbmRleChuYW1lKWBcbiAqIHJldHVybnMgYSBoYW5kbGUgYm91bmQgdG8gb25lIGluZGV4OyBgY2xpZW50LnVuaXZlcnNhbFNlYXJjaChxdWVyeSlgIGZhbnMgYVxuICogcXVlcnkgYWNyb3NzIHNldmVyYWwgaW5kZXhlcyBhbmQgbWVyZ2VzIHRoZSByZXN1bHRzIChNZWlsaXNlYXJjaCdzIGZlZGVyYXRlZFxuICogLyBtdWx0aS1zZWFyY2gsIHRoZSBcInVuaXZlcnNhbCBzZWFyY2hcIiB0aGUgY2FsbGVyIGFza2VkIGZvcikuIEV2ZXJ5dGhpbmcgaXNcbiAqIGFzeW5jIGFuZCBjYW5jZWxsYWJsZSBhbmQgcmV0dXJucyB0aGUgYnJvd3Nlci1zYWZlIHNoYXBlcyBmcm9tXG4gKiBgQGRieC10b29scy9zaGFyZWQtc2VhcmNoYC4gTGlmZWN5Y2xlIG1ldGhvZHMgY3Jvc3MgQXBwS2l0J3MgZXhwbGljaXQgbGVnYWN5XG4gKiBjbGllbnQgaGFuZG9mZiBiZWNhdXNlIHRoZSBwdWJsaWMgZmFjYWRlIGRvZXMgbm90IHlldCBleHBvc2UgaW5kZXggY3JlYXRpb24sXG4gKiBzeW5jLCBvciBkZWxldGlvbi5cbiAqXG4gKiBBdXRvY29tcGxldGUgaXMganVzdCBhIHNlYXJjaCB3aXRoIGEgc21hbGwgYGxpbWl0YCBhbmQgdGhlIHJhdyBxdWVyeSB0ZXh0IC1cbiAqIGh5YnJpZCBtb2RlIGFscmVhZHkgcHJlZml4LW1hdGNoZXMsIHNvIG5vIHNlcGFyYXRlIGVuZHBvaW50IGlzIG5lZWRlZDsgdGhlXG4gKiB7QGxpbmsgU2VhcmNoSW5kZXguYXV0b2NvbXBsZXRlfSBoZWxwZXIgaXMgYSB0aGluLCBzZWxmLWRvY3VtZW50aW5nIGFsaWFzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBFeGVjdXRpb25FcnJvciwgZ2V0RXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbFwiO1xuaW1wb3J0IHsgYXBwa2l0LCBkYXRhYnJpY2tzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBpbnZva2UsIHJlc29sdmUgYXMgbW9kZWxSZXNvbHZlLCBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywganNvbiwgbG9nLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEluZGV4SW5mbyxcbiAgU2VhcmNoRG9jdW1lbnQsXG4gIFNlYXJjaEhpdCxcbiAgU2VhcmNoTW9kZSxcbiAgU2VhcmNoUmVxdWVzdCxcbiAgU2VhcmNoUmVzdWx0LFxuICBVcHNlcnRSZXN1bHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfTU9ERSxcbiAgREVGQVVMVF9QQUdFX1NJWkUsXG4gIERFRkFVTFRfVElNRU9VVF9NUyxcbiAgcmVzb2x2ZUluZGV4TmFtZSxcbiAgdHlwZSBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbnR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IFJldHVyblR5cGU8YXBwa2l0LldvcmtzcGFjZUNsaWVudExpa2VbXCJ0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudFwiXT47XG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwic2VhcmNoL2NsaWVudFwiKTtcblxuLyoqIFF1ZXJ5IGJhY2tlbmQgdXNlZCB3aGVuIEFwcEtpdCBvd25zIHRoZSBWZWN0b3IgU2VhcmNoIGV4ZWN1dGlvbiBwYXRoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZWFkQmFja2VuZCB7XG4gIC8qKiBXaGV0aGVyIFZlY3RvciBTZWFyY2ggbGlmZWN5Y2xlIG1ldGhvZHMgYXJlIHZhbGlkIGZvciB0aGlzIHByb3ZpZGVyLiAqL1xuICBzdXBwb3J0c0xpZmVjeWNsZTogYm9vbGVhbjtcbiAgc2VhcmNoKGluZGV4OiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM/OiBTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xuICBhZGREb2N1bWVudHM/KFxuICAgIGluZGV4OiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD47XG59XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGEgc2luZ2xlLWluZGV4IHNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIGhpdHMgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBwYWdlIHNpemUuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogTWF0Y2ggbW9kZS4gRGVmYXVsdHMgdG8gdGhlIGNvbmZpZ3VyZWQgbW9kZSAoaHlicmlkKS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBDb2x1bW5zIHRvIHJldHVybiBwZXIgaGl0LiBEZWZhdWx0cyB0byB0aGUgaW5kZXgncyBjb25maWd1cmVkIGNvbHVtbnMuICovXG4gIGNvbHVtbnM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIEFwcEtpdCBBSSBTZWFyY2ggc2NhbGFyL2FycmF5IGZpbHRlcnMuICovXG4gIGZpbHRlcj86IFNlYXJjaFJlcXVlc3RbXCJmaWx0ZXJcIl07XG4gIC8qKiBEcm9wIGhpdHMgYmVsb3cgdGhpcyBzY29yZS4gKi9cbiAgc2NvcmVUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogT3B0aW9ucyBhY2NlcHRlZCBieSBhIHVuaXZlcnNhbCAoZmVkZXJhdGVkKSBzZWFyY2guICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMge1xuICAvKiogSW5kZXhlcyB0byBzZWFyY2guIERlZmF1bHRzIHRvIGV2ZXJ5IGtub3duIGluZGV4LiAqL1xuICBpbmRleGVzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBNYXhpbXVtIGhpdHMgcGVyIGluZGV4IGJlZm9yZSBtZXJnaW5nLiAqL1xuICBsaW1pdD86IG51bWJlcjtcbiAgLyoqIE1hdGNoIG1vZGUuICovXG4gIG1vZGU/OiBTZWFyY2hNb2RlO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZSBib3VuZCB0byBvbmUgaW5kZXguIE1vZGVsZWQgb24gTWVpbGlzZWFyY2gncyBgY2xpZW50LmluZGV4KHVpZClgOlxuICogYHNlYXJjaGAgLyBgYXV0b2NvbXBsZXRlYCByZWFkLCBgYWRkRG9jdW1lbnRzYCAvIGBkZWxldGVEb2N1bWVudHNgIHdyaXRlICh0b1xuICogYSBkaXJlY3QtYWNjZXNzIGluZGV4KSwgYW5kIGBpbmZvYCBmZXRjaGVzIHRoZSBsaXZlIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hJbmRleCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogU2VhcmNoQ2xpZW50LFxuICApIHt9XG5cbiAgLyoqIFNlYXJjaCB0aGlzIGluZGV4LiBTZWUge0BsaW5rIFNlYXJjaENsaWVudC5zZWFyY2h9LiAqL1xuICBzZWFyY2gocXVlcnk6IHN0cmluZywgb3B0aW9ucz86IFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZWFyY2gocXVlcnksIHsgLi4ub3B0aW9ucywgaW5kZXg6IHRoaXMubmFtZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRvY29tcGxldGUgYWdhaW5zdCB0aGlzIGluZGV4OiBhIHNlYXJjaCB3aXRoIGEgc21hbGwgZGVmYXVsdCBgbGltaXRgIGFuZFxuICAgKiB0aGUgcmF3IHByZWZpeCBhcyB0aGUgcXVlcnkuIEh5YnJpZCBtb2RlIGFscmVhZHkgaGFuZGxlcyBwcmVmaXhlcywgc28gdGhpc1xuICAgKiBpcyBhIHNlbGYtZG9jdW1lbnRpbmcgYWxpYXMgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBjb2RlIHBhdGguXG4gICAqL1xuICBhdXRvY29tcGxldGUocHJlZml4OiBzdHJpbmcsIG9wdGlvbnM/OiBTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2gocHJlZml4LCB7IGxpbWl0OiA1LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIHRoaXMgKGRpcmVjdC1hY2Nlc3MpIGluZGV4LiAqL1xuICBhZGREb2N1bWVudHMoZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmFkZERvY3VtZW50cyh0aGlzLm5hbWUsIGRvY3VtZW50cywgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZG9jdW1lbnRzIGZyb20gdGhpcyAoZGlyZWN0LWFjY2VzcykgaW5kZXggYnkgcHJpbWFyeSBrZXkuICovXG4gIGRlbGV0ZURvY3VtZW50cyhpZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlRG9jdW1lbnRzKHRoaXMubmFtZSwgaWRzLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIEZldGNoIHRoaXMgaW5kZXgncyBsaXZlIGRlZmluaXRpb24gKHByaW1hcnkga2V5LCBjb2x1bW5zLCByZWFkaW5lc3MpLiAqL1xuICBpbmZvKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0SW5kZXgodGhpcy5uYW1lLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgYSBzeW5jIG9mIHRoaXMgKERlbHRhIFN5bmMpIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZS4gKi9cbiAgc3luYyhzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zeW5jSW5kZXgodGhpcy5uYW1lLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSB0aGlzIGluZGV4LiAqL1xuICBkZWxldGUoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlSW5kZXgodGhpcy5uYW1lLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSB0aGlzIGluZGV4IGlmIGl0IGRvZXMgbm90IGV4aXN0LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBleGlzdGluZyBvbmUuICovXG4gIGVuc3VyZShvcHRpb25zPzogQ3JlYXRlSW5kZXhPcHRpb25zKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZW5zdXJlSW5kZXgodGhpcy5uYW1lLCBvcHRpb25zKTtcbiAgfVxufVxuXG4vKiogQSByZXNvbHZlZCBsaXZlIGluZGV4IGRlZmluaXRpb24uICovXG5leHBvcnQgdHlwZSB7IEluZGV4SW5mbyB9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBTZWFyY2hDbGllbnQuY3JlYXRlSW5kZXh9IC8ge0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVJbmRleH0uXG4gKiBUaGUgZ29hbCBpcyB0aGUgc2FtZSBhcyB0aGUgcmVzdCBvZiB0aGUgY2xpZW50OiBuYW1lIGEgc291cmNlIHRhYmxlIGFuZCBhXG4gKiB0ZXh0IGNvbHVtbiwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSAtIHRoZSBlbmRwb2ludCwgdGhlIGVtYmVkZGluZyBtb2RlbCwgdGhlXG4gKiBpbmRleCB0eXBlLCB0aGUgc3luYyBtb2RlIC0gaGFzIGEgc2Vuc2libGUgZGVmYXVsdCB0aGF0IGluZmVycyBmcm9tIHRoZVxuICogd29ya3NwYWNlLCBvdmVycmlkYWJsZSB3aGVuIGEgZGVwbG95bWVudCBuZWVkcyB0byBnbyBkZWVwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlSW5kZXhPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNvdXJjZSBEZWx0YSB0YWJsZSAoY2F0YWxvZy5zY2hlbWEudGFibGUpIGZvciBhIERlbHRhIFN5bmMgaW5kZXguIFByb3ZpZGVcbiAgICogdGhpcyBmb3IgdGhlIGNvbW1vbiBjYXNlOiBEYXRhYnJpY2tzIGNvbXB1dGVzIGFuZCBzeW5jcyBlbWJlZGRpbmdzIGZyb20gaXQuXG4gICAqIE9taXQgaXQgKGFuZCBwYXNzIHtAbGluayBlbWJlZGRpbmdEaW1lbnNpb259KSB0byBjcmVhdGUgYSBkaXJlY3QtYWNjZXNzXG4gICAqIGluZGV4IHlvdSB3cml0ZSB2ZWN0b3JzIHRvIHlvdXJzZWxmLlxuICAgKi9cbiAgc291cmNlVGFibGU/OiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5LWtleSBjb2x1bW4uIERlZmF1bHRzIHRvIGBpZGAuICovXG4gIHByaW1hcnlLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBjb2x1bW4gZW1iZWRkaW5ncyBhcmUgY29tcHV0ZWQgZnJvbSAoRGVsdGEgU3luYykuIERlZmF1bHRzIHRvIHRoZVxuICAgKiBmaXJzdCBvZiBgdGV4dGAgLyBgY29udGVudGAgLyBgYm9keWAgcHJlc2VudCwgZWxzZSB0aGUgY2FsbGVyIG11c3Qgc2V0IGl0LlxuICAgKi9cbiAgZW1iZWRkaW5nU291cmNlQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogRW1iZWRkaW5nIG1vZGVsIGVuZHBvaW50LiBBIGxvb3NlIG5hbWUgaXMgZnV6enktbWF0Y2hlZDsgd2hlbiBvbWl0dGVkIHRoZVxuICAgKiBiZXN0IGVtYmVkZGluZyBlbmRwb2ludCBpbiB0aGUgd29ya3NwYWNlIGlzIGNob3NlbiAoe0BsaW5rIHJlc29sdmVFbWJlZGRpbmdNb2RlbH0pLlxuICAgKi9cbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IHRvIGhvc3QgdGhlIGluZGV4IG9uLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgYGVuZHBvaW50YC4gKi9cbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgZW1iZWRkaW5nIHZlY3RvciBkaW1lbnNpb24gKHNlbGYtbWFuYWdlZCB2ZWN0b3JzLCBubyBzb3VyY2UgdGFibGUpLiAqL1xuICBlbWJlZGRpbmdEaW1lbnNpb24/OiBudW1iZXI7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgY29sdW1uIHRoZSB2ZWN0b3IgaXMgc3RvcmVkIGluLiBEZWZhdWx0cyB0byBgZW1iZWRkaW5nYC4gKi9cbiAgZW1iZWRkaW5nVmVjdG9yQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbHVtbi1uYW1lIC0+IHR5cGUgbWFwIHVzZWQgdG8gYnVpbGQgYSBkaXJlY3QtYWNjZXNzIGluZGV4J3NcbiAgICogYHNjaGVtYV9qc29uYCAodHlwZXM6IGBzdHJpbmdgLCBgaW50YCwgYGxvbmdgLCBgZmxvYXRgLCBgZG91YmxlYCxcbiAgICogYGJvb2xlYW5gLCBgZGF0ZWAsIGB0aW1lc3RhbXBgKS4gTXVzdCBpbmNsdWRlIHRoZSBwcmltYXJ5IGtleSBhbmQgYW55XG4gICAqIGNvbHVtbnMgeW91IHVwc2VydC4gRGVmYXVsdHMgdG8gYHsgaWQ6IFwic3RyaW5nXCIsIHRleHQ6IFwic3RyaW5nXCIgfWAuIFRoZVxuICAgKiBlbWJlZGRpbmcgdmVjdG9yIGNvbHVtbiBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgc2NoZW1hPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFN5bmMgbW9kZSBmb3IgYSBEZWx0YSBTeW5jIGluZGV4LiBgVFJJR0dFUkVEYCAoZGVmYXVsdCkgc3luY3Mgb24gZGVtYW5kOyBgQ09OVElOVU9VU2Aga2VlcHMgZnJlc2guICovXG4gIHBpcGVsaW5lVHlwZT86IFwiVFJJR0dFUkVEXCIgfCBcIkNPTlRJTlVPVVNcIjtcbiAgLyoqIEV4dHJhIGNvbHVtbnMgdG8gc3luYyBhbG9uZ3NpZGUgdGhlIGVtYmVkZGluZyBzb3VyY2UgKERlbHRhIFN5bmMpLiAqL1xuICBjb2x1bW5zVG9TeW5jPzogc3RyaW5nW107XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVFbmRwb2ludH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEVuc3VyZUVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBXYWl0IGZvciB0aGUgZW5kcG9pbnQgdG8gY29tZSBvbmxpbmUgYmVmb3JlIHJldHVybmluZy4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHdhaXQ/OiBib29sZWFuO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU2VhcmNoQ2xpZW50LnByb3Zpc2lvbn0gLSBhIG9uZS1jYWxsIFwibWFrZSB0aGlzIGluZGV4IHJlYWxcbiAqIGFuZCBzZWFyY2hhYmxlXCIgdXNlZCBhdCBib290IG9yIGluIGEgc2VlZCBzY3JpcHQuIEl0IGVuc3VyZXMgdGhlIGVuZHBvaW50LFxuICogZW5zdXJlcyB0aGUgaW5kZXgsIGFuZCAob3B0aW9uYWxseSkgc2VlZHMgZG9jdW1lbnRzIHdoZW4gdGhlIGluZGV4IGlzIGVtcHR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvbk9wdGlvbnMgZXh0ZW5kcyBDcmVhdGVJbmRleE9wdGlvbnMge1xuICAvKiogRG9jdW1lbnRzIHRvIHNlZWQgd2hlbiB0aGUgaW5kZXggaGFzIG5vIHJvd3MgeWV0LiBTa2lwcGVkIGlmIGl0IGFscmVhZHkgaGFzIGRhdGEuICovXG4gIHNlZWQ/OiBTZWFyY2hEb2N1bWVudFtdO1xuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIGVuZHBvaW50IEFORCBpbmRleCB0byBjb21lIG9ubGluZSBiZWZvcmUgcmV0dXJuaW5nIChuZWVkZWRcbiAgICogYmVmb3JlIHNlZWRpbmcpLiBEZWZhdWx0cyB0byB0cnVlLiBFbmRwb2ludCBjcmVhdGlvbiBjYW4gdGFrZSBtYW55IG1pbnV0ZXMuXG4gICAqL1xuICB3YWl0PzogYm9vbGVhbjtcbiAgLyoqIEhvdyBsb25nIHRvIHdhaXQgZm9yIHJlYWRpbmVzcyBiZWZvcmUgZ2l2aW5nIHVwLiBEZWZhdWx0cyB0byAyMCBtaW51dGVzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIEFJIFNlYXJjaCBjbGllbnQuIENvbnN0cnVjdCBpdCB3aXRoIHtAbGluayBjcmVhdGVTZWFyY2hDbGllbnR9ICh3aGljaFxuICogcmVhZHMgYSByZXNvbHZlZCBjb25maWcpIG9yIGRpcmVjdGx5IGZvciBvbmUtb2ZmIHVzZS4gQWxsIHJlYWRzIHJlc29sdmUgdGhlXG4gKiBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUmVzb2x2ZWRTZWFyY2hDb25maWcgPSB7XG4gICAgICBpbmRleGVzOiBbXSxcbiAgICAgIHBhZ2VTaXplOiBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgIG1vZGU6IERFRkFVTFRfTU9ERSxcbiAgICAgIHRpbWVvdXRNczogREVGQVVMVF9USU1FT1VUX01TLFxuICAgICAgYWxsb3dXcml0ZTogZmFsc2UsXG4gICAgfSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmtzcGFjZUNsaWVudEZhY3Rvcnk6ICgpID0+IFdvcmtzcGFjZUNsaWVudExpa2UgPSBkZWZhdWx0V29ya3NwYWNlQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVhZEJhY2tlbmQ/OiBTZWFyY2hSZWFkQmFja2VuZCxcbiAgKSB7fVxuXG4gIC8qKiBBIGhhbmRsZSBib3VuZCB0byBvbmUgaW5kZXggKGJ5IGZ1bGwgVUMgbmFtZSBvciBjb25maWd1cmVkIGFsaWFzKS4gKi9cbiAgaW5kZXgocmVmZXJlbmNlOiBzdHJpbmcpOiBTZWFyY2hJbmRleCB7XG4gICAgY29uc3QgbmFtZSA9IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZmVyZW5jZSkgPz8gcmVmZXJlbmNlO1xuICAgIHJldHVybiBuZXcgU2VhcmNoSW5kZXgobmFtZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIG9uZSBpbmRleC4gYGluZGV4YCBtYXkgYmUgYSBmdWxsIFVDIG5hbWUsIGEgY29uZmlndXJlZCBhbGlhcywgb3JcbiAgICogb21pdHRlZCB0byB1c2UgdGhlIGRlZmF1bHQgaW5kZXguIFJldHVybnMgaGl0cyBzb3J0ZWQgbW9zdC1yZWxldmFudC1maXJzdC5cbiAgICovXG4gIGFzeW5jIHNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgJiB7IGluZGV4Pzogc3RyaW5nIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IG5hbWUgPSByZXNvbHZlSW5kZXhOYW1lKHRoaXMuY29uZmlnLCBvcHRpb25zLmluZGV4KTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBpbmRleCBjb25maWd1cmVkOyBzZXQgYSBkZWZhdWx0IGluZGV4IG9yIHBhc3Mgb25lXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwic2VhcmNoXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucmVhZEJhY2tlbmQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgXCJzZWFyY2g6IG5vIEFJIFNlYXJjaCBwcm92aWRlciByZWdpc3RlcmVkOyBhZGQgYWlTZWFyY2goKSBvciBsYWtlYmFzZUFpU2VhcmNoKClcIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJzZWFyY2hcIiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZWFkQmFja2VuZC5zZWFyY2gobmFtZSwgdGV4dCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0ID8/IHRoaXMuY29uZmlnLnBhZ2VTaXplLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbiBhIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlIHRoZSBoaXRzLCBzb3J0ZWQgYnkgc2NvcmUgLVxuICAgKiB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgYSBzaW5nbGUgYm94IG92ZXIgbWFueSBjb2xsZWN0aW9ucyBuZWVkcy4gRWFjaFxuICAgKiBpbmRleCBpcyBzZWFyY2hlZCBjb25jdXJyZW50bHk7IGFuIGluZGV4IHRoYXQgZXJyb3JzIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZFxuICAgKiBzbyBvbmUgYmFkIGluZGV4IGRvZXMgbm90IHNpbmsgdGhlIHdob2xlIHNlYXJjaC5cbiAgICovXG4gIGFzeW5jIHVuaXZlcnNhbFNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IG5hbWVzID1cbiAgICAgIG9wdGlvbnMuaW5kZXhlcyAmJiBvcHRpb25zLmluZGV4ZXMubGVuZ3RoID4gMFxuICAgICAgICA/IG9wdGlvbnMuaW5kZXhlcy5tYXAoKHJlZikgPT4gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmKSA/PyByZWYpXG4gICAgICAgIDogdGhpcy5jb25maWcuaW5kZXhlcy5tYXAoKGkpID0+IGkubmFtZSk7XG4gICAgY29uc3QgcGVySW5kZXggPSBvcHRpb25zLmxpbWl0ID8/IHRoaXMuY29uZmlnLnBhZ2VTaXplO1xuXG4gICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIG5hbWVzLm1hcChhc3luYyAobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlYXJjaCh0ZXh0LCB7XG4gICAgICAgICAgaW5kZXg6IG5hbWUsXG4gICAgICAgICAgbGltaXQ6IHBlckluZGV4LFxuICAgICAgICAgIC4uLihvcHRpb25zLm1vZGUgPyB7IG1vZGU6IG9wdGlvbnMubW9kZSB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRpb25zLnNpZ25hbCA/IHsgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5oaXRzLm1hcCgoaGl0KTogU2VhcmNoSGl0ID0+ICh7IC4uLmhpdCwgaW5kZXg6IG5hbWUgfSkpO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IGhpdHMgPSBzZXR0bGVkXG4gICAgICAuZmxhdE1hcCgob3V0Y29tZSwgaSkgPT4ge1xuICAgICAgICBpZiAob3V0Y29tZS5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIpIHJldHVybiBvdXRjb21lLnZhbHVlO1xuICAgICAgICBsb2dnZXIud2FybihcInVuaXZlcnNhbC1pbmRleC1mYWlsZWRcIiwgeyBpbmRleDogbmFtZXNbaV0gfSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuXG4gICAgcmV0dXJuIHsgcXVlcnk6IHRleHQsIGhpdHMsIGNvdW50OiBoaXRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gaW5kZXggcmVmZXJlbmNlIChmdWxsIFVDIG5hbWUgb3IgY29uZmlndXJlZCBhbGlhcykgdG8gdGhlIG5hbWVcbiAgICogdGhlIEFQSSBleHBlY3RzLCBmYWlsaW5nIGZhc3Qgd2hlbiBpdCByZXNvbHZlcyB0byBub3RoaW5nLiBXaXRob3V0IHRoaXMgYVxuICAgKiBibGFuayByZWZlcmVuY2UgLSB3aGF0IGFuIG9taXR0ZWQgYGluZGV4YCBiZWNvbWVzIHdoZW4gbm8gZGVmYXVsdCBpc1xuICAgKiBjb25maWd1cmVkIC0gcmVhY2hlcyB0aGUgU0RLIGFzIGFuIGVtcHR5IGBpbmRleF9uYW1lYCwgd2hpY2ggYnVpbGRzIGFcbiAgICogVVJMIHdpdGggdGhlIG5hbWUgc2VnbWVudCBtaXNzaW5nIGFuZCBjb21lcyBiYWNrIGFzIGEgY29uZnVzaW5nXG4gICAqIGBFTkRQT0lOVF9OT1RfRk9VTkRgIGluc3RlYWQgb2YgbmFtaW5nIHRoZSByZWFsIHByb2JsZW0uXG4gICAqL1xuICBwcml2YXRlIHJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlOiBzdHJpbmcsIG9wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXNvbHZlSW5kZXhOYW1lKHRoaXMuY29uZmlnLCByZWZlcmVuY2UpID8/IHJlZmVyZW5jZSk7XG4gICAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgYHNlYXJjaDogbm8gaW5kZXggY29uZmlndXJlZDsgc2V0IGEgZGVmYXVsdCBpbmRleCBvciBwYXNzIG9uZSB0byAke29wZXJhdGlvbn1gLFxuICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgLyoqIFJlamVjdCBWZWN0b3IgU2VhcmNoIGxpZmVjeWNsZSBjYWxscyBhZ2FpbnN0IGEgbm9uLVZlY3RvciBwcm92aWRlci4gKi9cbiAgcHJpdmF0ZSByZXF1aXJlTGlmZWN5Y2xlKG9wZXJhdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZEJhY2tlbmQgJiYgIXRoaXMucmVhZEJhY2tlbmQuc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgc2VhcmNoOiB0aGUgcmVnaXN0ZXJlZCBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0ICR7b3BlcmF0aW9ufWAsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb24gfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBGZXRjaCBhbiBpbmRleCdzIGxpdmUgZGVmaW5pdGlvbi4gKi9cbiAgYXN5bmMgZ2V0SW5kZXgocmVmZXJlbmNlOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJnZXRJbmRleFwiKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJnZXRJbmRleFwiKTtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMud2l0aENsaWVudChcImdldEluZGV4XCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmdldEluZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGNvbnN0IGRpcmVjdEFjY2VzcyA9IGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYyAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNwZWMgPSBpbmRleC5kZWx0YV9zeW5jX2luZGV4X3NwZWMgPz8gaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjO1xuICAgIC8vIERlbHRhIFN5bmMgc3VyZmFjZXMgaXRzIGVtYmVkZGluZyBzb3VyY2UgY29sdW1ucyBkaXJlY3RseTsgYSBkaXJlY3QtYWNjZXNzXG4gICAgLy8gaW5kZXggY2FycmllcyBpdHMgY29sdW1ucyBpbiBzY2hlbWFfanNvbiAobWludXMgdGhlIHZlY3RvciBjb2x1bW4pLlxuICAgIGxldCBjb2x1bW5zID0gKHNwZWM/LmVtYmVkZGluZ19zb3VyY2VfY29sdW1ucyA/PyBbXSkubWFwKChjKSA9PiBjLm5hbWUgPz8gXCJcIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHNjaGVtYUpzb24gPSBpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM/LnNjaGVtYV9qc29uO1xuICAgIGlmIChkaXJlY3RBY2Nlc3MgJiYgc2NoZW1hSnNvbikge1xuICAgICAgY29uc3Qgc2NoZW1hID0ganNvbi5wYXJzZVJlY29yZChzY2hlbWFKc29uKSA/PyB7fTtcbiAgICAgIGNvbnN0IHZlY3Rvck5hbWVzID0gbmV3IFNldChcbiAgICAgICAgKGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYz8uZW1iZWRkaW5nX3ZlY3Rvcl9jb2x1bW5zID8/IFtdKVxuICAgICAgICAgIC5tYXAoKGMpID0+IGMubmFtZSlcbiAgICAgICAgICAuZmlsdGVyKChuKTogbiBpcyBzdHJpbmcgPT4gQm9vbGVhbihuKSksXG4gICAgICApO1xuICAgICAgY29sdW1ucyA9IE9iamVjdC5rZXlzKHNjaGVtYSkuZmlsdGVyKChjKSA9PiAhdmVjdG9yTmFtZXMuaGFzKGMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGluZGV4Lm5hbWUgPz8gbmFtZSxcbiAgICAgIC4uLihpbmRleC5lbmRwb2ludF9uYW1lID8geyBlbmRwb2ludDogaW5kZXguZW5kcG9pbnRfbmFtZSB9IDoge30pLFxuICAgICAgLi4uKGluZGV4LnByaW1hcnlfa2V5ID8geyBwcmltYXJ5S2V5OiBpbmRleC5wcmltYXJ5X2tleSB9IDoge30pLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHJlYWR5OiBpbmRleC5zdGF0dXM/LnJlYWR5ID8/IGZhbHNlLFxuICAgICAgLi4uKGluZGV4LnN0YXR1cz8uaW5kZXhlZF9yb3dfY291bnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgcm93Q291bnQ6IGluZGV4LnN0YXR1cy5pbmRleGVkX3Jvd19jb3VudCB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKGRpcmVjdEFjY2VzcyA/IHsgZGlyZWN0QWNjZXNzOiB0cnVlIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBpbiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXguICovXG4gIGFzeW5jIGFkZERvY3VtZW50cyhcbiAgICByZWZlcmVuY2U6IHN0cmluZyxcbiAgICBkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiYWRkRG9jdW1lbnRzXCIpO1xuICAgIGlmICh0aGlzLnJlYWRCYWNrZW5kPy5hZGREb2N1bWVudHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRCYWNrZW5kLmFkZERvY3VtZW50cyhuYW1lLCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gICAgfVxuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImFkZERvY3VtZW50c1wiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJhZGREb2N1bWVudHNcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMudXBzZXJ0RGF0YVZlY3RvckluZGV4KFxuICAgICAgICB7IGluZGV4X25hbWU6IG5hbWUsIGlucHV0c19qc29uOiBKU09OLnN0cmluZ2lmeShkb2N1bWVudHMpIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIHsgaW5kZXg6IG5hbWUsIGNvdW50OiBkb2N1bWVudHMubGVuZ3RoIH07XG4gIH1cblxuICAvKiogRGVsZXRlIGRvY3VtZW50cyBmcm9tIGEgZGlyZWN0LWFjY2VzcyBpbmRleCBieSBwcmltYXJ5IGtleS4gKi9cbiAgYXN5bmMgZGVsZXRlRG9jdW1lbnRzKFxuICAgIHJlZmVyZW5jZTogc3RyaW5nLFxuICAgIGlkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJkZWxldGVEb2N1bWVudHNcIik7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiZGVsZXRlRG9jdW1lbnRzXCIpO1xuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImRlbGV0ZURvY3VtZW50c1wiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5kZWxldGVEYXRhVmVjdG9ySW5kZXgoXG4gICAgICAgIHsgaW5kZXhfbmFtZTogbmFtZSwgcHJpbWFyeV9rZXlzOiBpZHMubWFwKFN0cmluZykgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4geyBpbmRleDogbmFtZSwgY291bnQ6IGlkcy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGVtYmVkZGluZyBlbmRwb2ludCBpZCBmb3IgY3JlYXRpbmcgYSBEZWx0YSBTeW5jIGluZGV4LiBSZXVzZXNcbiAgICogdGhlIG1vZGVsIHJlc29sdmVyOiBhIGNvbmZpZ3VyZWQgLyBwYXNzZWQgbmFtZSBpcyBmdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlXG4gICAqIGxpdmUgY2F0YWxvZ3VlLCBvdGhlcndpc2UgdGhlIGhpZ2hlc3QtcmFua2VkIGVtYmVkZGluZyBlbmRwb2ludCBpcyBjaG9zZW4uXG4gICAqL1xuICBhc3luYyByZXNvbHZlRW1iZWRkaW5nTW9kZWwocmVxdWVzdGVkPzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IGV4cGxpY2l0ID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXF1ZXN0ZWQgPz8gdGhpcy5jb25maWcuZW1iZWRkaW5nTW9kZWwpO1xuICAgIC8vIEFuIGV4cGxpY2l0IG5hbWUgdGhhdCBhbHJlYWR5IGxvb2tzIGxpa2UgYW4gZW5kcG9pbnQgaWQgKG5vIHdoaXRlc3BhY2UpXG4gICAgLy8gaXMgdXNlZCB2ZXJiYXRpbSAtIG5vIG5lZWQgdG8gZmV0Y2ggYW5kIGZ1enp5LW1hdGNoIHRoZSBsaXZlIGNhdGFsb2d1ZS5cbiAgICAvLyBBIGdlbnVpbmVseSBsb29zZSBuYW1lIChlLmcuIFwiZ3RlIGxhcmdlXCIpIHN0aWxsIHJlc29sdmVzIGFnYWluc3QgaXQuXG4gICAgaWYgKGV4cGxpY2l0ICYmICEvXFxzLy50ZXN0KGV4cGxpY2l0KSkgcmV0dXJuIGV4cGxpY2l0O1xuICAgIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjbGllbnQgPSBkZWZhdWx0QXBwS2l0V29ya3NwYWNlQ2xpZW50KCk7XG4gICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBtb2RlbENhdGFsb2cubGlzdFNlcnZpbmdFbmRwb2ludHMoY2xpZW50LCBob3N0KTtcbiAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgY29uc3QgeyBtb2RlbElkIH0gPSBtb2RlbFJlc29sdmUucmVzb2x2ZU1vZGVsKGVuZHBvaW50cywge1xuICAgICAgLi4uKGV4cGxpY2l0ID8geyBleHBsaWNpdCB9IDogeyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9KSxcbiAgICB9KTtcbiAgICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChtb2RlbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWJlZCB0ZXh0IHZpYSBhIERhdGFicmlja3MgZW1iZWRkaW5nIHNlcnZpbmcgZW5kcG9pbnQsIHJldHVybmluZyBvbmVcbiAgICogdmVjdG9yIHBlciBpbnB1dC4gVXNlZCB0byBzZWVkIGEgZGlyZWN0LWFjY2VzcyBpbmRleCBhbmQgdG8gdHVybiBhIHNlYXJjaFxuICAgKiBxdWVyeSBpbnRvIGEgcXVlcnkgdmVjdG9yIC0gRGF0YWJyaWNrcyBvbmx5IG1hbmFnZXMgZW1iZWRkaW5ncyBmb3IgRGVsdGFcbiAgICogU3luYyBpbmRleGVzLCBzbyBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggKG5vIERlbHRhIHRhYmxlLCBubyB3YXJlaG91c2UpIG5lZWRzXG4gICAqIHRoZSBjbGllbnQgdG8gZW1iZWQgb24gd3JpdGUgYW5kIG9uIHF1ZXJ5LiBUaGUgZW5kcG9pbnQgaXMgcmVzb2x2ZWQgdGhlXG4gICAqIHNhbWUgd2F5IGFzIGZvciBpbmRleCBjcmVhdGlvbiB3aGVuIG5vdCBuYW1lZC5cbiAgICovXG4gIGFzeW5jIGVtYmVkKHRleHRzOiBzdHJpbmdbXSwgbW9kZWw/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxudW1iZXJbXVtdPiB7XG4gICAgaWYgKHRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gYXdhaXQgdGhpcy5yZXNvbHZlRW1iZWRkaW5nTW9kZWwobW9kZWwsIHNpZ25hbCk7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBjb3VsZCBub3QgcmVzb2x2ZSBhbiBlbWJlZGRpbmcgbW9kZWwgdG8gZW1iZWQgdGV4dFwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVtYmVkXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53aXRoQ2xpZW50KFwiZW1iZWRcIiwgc2lnbmFsLCBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgY29uc3QgdXJsID0gaW52b2tlLmludm9jYXRpb25zVXJsKGhvc3QsIGVuZHBvaW50KTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBpbnZva2UuYXV0aEhlYWRlcnMoY2xpZW50KTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4uaGVhZGVycywgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpbnB1dDogdGV4dHMgfSksXG4gICAgICAgIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgICBgc2VhcmNoOiBlbWJlZGRpbmcgZW5kcG9pbnQgJHtlbmRwb2ludH0gZmFpbGVkICgke3Jlc3BvbnNlLnN0YXR1c30pYCxcbiAgICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVtYmVkXCIgfSB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgZGF0YT86IEFycmF5PHsgZW1iZWRkaW5nOiBudW1iZXJbXSB9PiB9O1xuICAgICAgY29uc3QgdmVjdG9ycyA9IChib2R5LmRhdGEgPz8gW10pLm1hcCgocm93KSA9PiByb3cuZW1iZWRkaW5nKTtcbiAgICAgIGlmICh2ZWN0b3JzLmxlbmd0aCAhPT0gdGV4dHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogZW1iZWRkaW5nIHJlc3BvbnNlIGRpZCBub3QgbWF0Y2ggdGhlIGlucHV0IGNvdW50XCIsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZlY3RvcnM7XG4gICAgfSk7XG4gIH1cblxuICAvKiogVGhlIHZlY3RvciBkaW1lbnNpb24gYSBtb2RlbCBwcm9kdWNlcyAoZW1iZWRzIGEgcHJvYmUgc3RyaW5nIG9uY2UpLiAqL1xuICBwcml2YXRlIGFzeW5jIGVtYmVkZGluZ0RpbWVuc2lvbihtb2RlbD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IFt2ZWN0b3JdID0gYXdhaXQgdGhpcy5lbWJlZChbXCJkaW1lbnNpb24gcHJvYmVcIl0sIG1vZGVsLCBzaWduYWwpO1xuICAgIGlmICghdmVjdG9yIHx8IHZlY3Rvci5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogY291bGQgbm90IGRldGVybWluZSB0aGUgZW1iZWRkaW5nIGRpbWVuc2lvblwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImNyZWF0ZUluZGV4XCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gQUkgU2VhcmNoIGluZGV4IHdpdGggYXMgbGl0dGxlIGNlcmVtb255IGFzIHBvc3NpYmxlLiBUd28gc2hhcGVzOlxuICAgKlxuICAgKiAgIC0gKipEZWx0YSBTeW5jKiogKHRoZSBkZWZhdWx0KTogcGFzcyBgc291cmNlVGFibGVgOyBEYXRhYnJpY2tzIGNvbXB1dGVzXG4gICAqICAgICBlbWJlZGRpbmdzIGZyb20gdGhlIHRleHQgY29sdW1uIGFuZCBrZWVwcyB0aGUgaW5kZXggc3luY2VkLiBUaGVcbiAgICogICAgIGVtYmVkZGluZyBtb2RlbCBpcyByZXNvbHZlZCBhdXRvbWF0aWNhbGx5IHdoZW4gbm90IG5hbWVkLlxuICAgKiAgIC0gKipEaXJlY3QgQWNjZXNzKio6IG9taXQgYHNvdXJjZVRhYmxlYCBhbmQgcGFzcyBgZW1iZWRkaW5nRGltZW5zaW9uYDtcbiAgICogICAgIHlvdSB3cml0ZSB2ZWN0b3JzIHlvdXJzZWxmIHZpYSB7QGxpbmsgYWRkRG9jdW1lbnRzfS5cbiAgICpcbiAgICogRXZlcnl0aGluZyBlbHNlIGluZmVyczogdGhlIGVuZHBvaW50IGZyb20gdGhlIHBsdWdpbiBjb25maWcsIHRoZSBwcmltYXJ5XG4gICAqIGtleSAoYGlkYCksIHRoZSB0ZXh0IGNvbHVtbiAoYHRleHRgIC8gYGNvbnRlbnRgIC8gYGJvZHlgKSwgYW5kIHRoZSB2ZWN0b3JcbiAgICogY29sdW1uIChgZW1iZWRkaW5nYCkuIFJldHVybnMgdGhlIGNyZWF0ZWQgaW5kZXgncyB7QGxpbmsgSW5kZXhJbmZvfS5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUluZGV4KG5hbWU6IHN0cmluZywgb3B0aW9uczogQ3JlYXRlSW5kZXhPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImNyZWF0ZUluZGV4XCIpO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludCA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIFwic2VhcmNoOiBubyBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IGNvbmZpZ3VyZWQ7IHBhc3MgYGVuZHBvaW50YCBvciBzZXQgaXQgb24gdGhlIHBsdWdpblwiLFxuICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImNyZWF0ZUluZGV4XCIgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcHJpbWFyeUtleSA9IG9wdGlvbnMucHJpbWFyeUtleSA/PyBcImlkXCI7XG4gICAgY29uc3QgZGlyZWN0ID0gIW9wdGlvbnMuc291cmNlVGFibGU7XG4gICAgY29uc3Qgc291cmNlQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdTb3VyY2VDb2x1bW4gPz8gXCJ0ZXh0XCI7XG4gICAgY29uc3QgdmVjdG9yQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdWZWN0b3JDb2x1bW4gPz8gXCJlbWJlZGRpbmdcIjtcblxuICAgIC8vIERlbHRhIFN5bmMgbGV0cyBEYXRhYnJpY2tzIGVtYmVkIGEgc291cmNlIGNvbHVtbiwgc28gaXQgbmVlZHMgYW4gZW1iZWRkaW5nXG4gICAgLy8gbW9kZWwuIEEgZGlyZWN0LWFjY2VzcyBpbmRleCBzdG9yZXMgdmVjdG9ycyBZT1Ugc3VwcGx5IChEYXRhYnJpY2tzIG9ubHlcbiAgICAvLyBzdXBwb3J0cyBtYW5hZ2VkIGVtYmVkZGluZ3Mgb24gRGVsdGEgU3luYyksIHNvIGl0IG5lZWRzIGEgZGltZW5zaW9uOyB3ZVxuICAgIC8vIHJlc29sdmUgb25lIGZyb20gdGhlIGVtYmVkZGluZyBtb2RlbCB3aGVuIG5vdCBnaXZlbiBzbyBhIGRpcmVjdC1hY2Nlc3NcbiAgICAvLyBpbmRleCBzdGlsbCB3b3JrcyB3aXRoIHplcm8gZXh0cmEgY29uZmlnIChlbWJlZCB2aWEgYGVtYmVkKClgIG9uIHNlZWQgK1xuICAgIC8vIHF1ZXJ5IC0gc2VlIGBwcm92aXNpb25gIC8gYHNlYXJjaGApLlxuICAgIGNvbnN0IGVtYmVkZGluZ01vZGVsID1cbiAgICAgIChhd2FpdCB0aGlzLnJlc29sdmVFbWJlZGRpbmdNb2RlbChvcHRpb25zLmVtYmVkZGluZ01vZGVsLCBvcHRpb25zLnNpZ25hbCkpID8/IHVuZGVmaW5lZDtcbiAgICBpZiAoIWVtYmVkZGluZ01vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIFwic2VhcmNoOiBjb3VsZCBub3QgcmVzb2x2ZSBhbiBlbWJlZGRpbmcgbW9kZWw7IHBhc3MgYGVtYmVkZGluZ01vZGVsYFwiLFxuICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImNyZWF0ZUluZGV4XCIgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGltZW5zaW9uID1cbiAgICAgIG9wdGlvbnMuZW1iZWRkaW5nRGltZW5zaW9uID8/IChhd2FpdCB0aGlzLmVtYmVkZGluZ0RpbWVuc2lvbihlbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKTtcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIFtwcmltYXJ5S2V5XTogXCJzdHJpbmdcIixcbiAgICAgIFtzb3VyY2VDb2x1bW5dOiBcInN0cmluZ1wiLFxuICAgICAgLi4uKG9wdGlvbnMuc2NoZW1hID8/IHt9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgZGlyZWN0U3BlYyA9IHtcbiAgICAgIGRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYzoge1xuICAgICAgICBlbWJlZGRpbmdfdmVjdG9yX2NvbHVtbnM6IFt7IG5hbWU6IHZlY3RvckNvbHVtbiwgZW1iZWRkaW5nX2RpbWVuc2lvbjogZGltZW5zaW9uIH1dLFxuICAgICAgICBzY2hlbWFfanNvbjogSlNPTi5zdHJpbmdpZnkoeyAuLi5zY2hlbWEsIFt2ZWN0b3JDb2x1bW5dOiBgYXJyYXk8ZmxvYXQ+YCB9KSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImNyZWF0ZUluZGV4XCIsIG9wdGlvbnMuc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuY3JlYXRlSW5kZXgoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGVuZHBvaW50X25hbWU6IGVuZHBvaW50LFxuICAgICAgICAgIHByaW1hcnlfa2V5OiBwcmltYXJ5S2V5LFxuICAgICAgICAgIGluZGV4X3R5cGU6IGRpcmVjdCA/IFwiRElSRUNUX0FDQ0VTU1wiIDogXCJERUxUQV9TWU5DXCIsXG4gICAgICAgICAgLi4uKGRpcmVjdFxuICAgICAgICAgICAgPyBkaXJlY3RTcGVjXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBkZWx0YV9zeW5jX2luZGV4X3NwZWM6IHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZV90YWJsZTogb3B0aW9ucy5zb3VyY2VUYWJsZSxcbiAgICAgICAgICAgICAgICAgIHBpcGVsaW5lX3R5cGU6IG9wdGlvbnMucGlwZWxpbmVUeXBlID8/IFwiVFJJR0dFUkVEXCIsXG4gICAgICAgICAgICAgICAgICBlbWJlZGRpbmdfc291cmNlX2NvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiBzb3VyY2VDb2x1bW4sIGVtYmVkZGluZ19tb2RlbF9lbmRwb2ludF9uYW1lOiBlbWJlZGRpbmdNb2RlbCB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIC4uLihvcHRpb25zLmNvbHVtbnNUb1N5bmMgJiYgb3B0aW9ucy5jb2x1bW5zVG9TeW5jLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB7IGNvbHVtbnNfdG9fc3luYzogb3B0aW9ucy5jb2x1bW5zVG9TeW5jIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApLFxuICAgICk7XG4gICAgbG9nZ2VyLmluZm8oXCJpbmRleC1jcmVhdGVkXCIsIHtcbiAgICAgIGluZGV4OiBuYW1lLFxuICAgICAgZW5kcG9pbnQsXG4gICAgICB0eXBlOiBkaXJlY3QgPyBcIkRJUkVDVF9BQ0NFU1NcIiA6IFwiREVMVEFfU1lOQ1wiLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmdldEluZGV4KG5hbWUsIG9wdGlvbnMuc2lnbmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGluZGV4IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIG90aGVyd2lzZSByZXR1cm4gdGhlXG4gICAqIGV4aXN0aW5nIG9uZS4gSWRlbXBvdGVudCAtIHNhZmUgdG8gY2FsbCBvbiBldmVyeSBib290IHRvIGd1YXJhbnRlZSBhblxuICAgKiBpbmRleCBpcyBwcmVzZW50LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlSW5kZXgobmFtZTogc3RyaW5nLCBvcHRpb25zOiBDcmVhdGVJbmRleE9wdGlvbnMgPSB7fSk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiZW5zdXJlSW5kZXhcIik7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUluZGV4KG5hbWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYW4gaW5kZXggZXhpc3RzLCBpcyBvbmxpbmUsIGFuZCAob3B0aW9uYWxseSkgaG9sZHMgc2VlZCBkYXRhIC0gdGhlXG4gICAqIFwid2lyZSB1cCBhIHJlYWwgaW5kZXggb24gYm9vdFwiIHBhdGguIElkZW1wb3RlbnQgYW5kIGNoZWFwIHRvIGNhbGwgZXZlcnlcbiAgICogYm9vdDogaXQgY3JlYXRlcyB0aGUgZW5kcG9pbnQgYW5kIGluZGV4IG9ubHkgaWYgbWlzc2luZywgd2FpdHMgZm9yIHRoZW0gdG9cbiAgICogY29tZSBvbmxpbmUsIGFuZCBzZWVkcyBkb2N1bWVudHMgT05MWSB3aGVuIHRoZSBpbmRleCBpcyBzdGlsbCBlbXB0eS5cbiAgICpcbiAgICogRm9yIHRoZSBkZW1vL2R1bW15LWRhdGEgY2FzZSB0aGlzIG5lZWRzIG5vIERlbHRhIHRhYmxlIGFuZCBubyB3YXJlaG91c2U6XG4gICAqIHRoZSBkZWZhdWx0IGlzIGEgTUFOQUdFRCBkaXJlY3QtYWNjZXNzIGluZGV4IChEYXRhYnJpY2tzIGVtYmVkcyB0aGUgYHRleHRgXG4gICAqIGNvbHVtbiBvbiB3cml0ZSBhbmQgcXVlcnkpLCBzbyBzZWVkaW5nIGlzIGp1c3QgYW4gYGFkZERvY3VtZW50c2Agb2YgcGxhaW5cbiAgICogcm93cyBhbmQgc2VhcmNoLWJ5LXRleHQgd29ya3MgaW1tZWRpYXRlbHkuXG4gICAqL1xuICBhc3luYyBwcm92aXNpb24obmFtZTogc3RyaW5nLCBvcHRpb25zOiBQcm92aXNpb25PcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcInByb3Zpc2lvblwiKTtcbiAgICBjb25zdCB3YWl0ID0gb3B0aW9ucy53YWl0ID8/IHRydWU7XG4gICAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXMgPz8gMjAgKiA2MCAqIDEwMDA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBvcHRpb25zLmVuZHBvaW50ID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmIChlbmRwb2ludCkgYXdhaXQgdGhpcy5lbnN1cmVFbmRwb2ludChlbmRwb2ludCwgeyB3YWl0LCBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuXG4gICAgY29uc3QgeyBzZWVkOiBfc2VlZCwgd2FpdDogX3dhaXQsIHRpbWVvdXRNczogX3RpbWVvdXRNcywgLi4uY3JlYXRlT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICBsZXQgaW5mbyA9IGF3YWl0IHRoaXMuZW5zdXJlSW5kZXgobmFtZSwgY3JlYXRlT3B0aW9ucyk7XG5cbiAgICBpZiAod2FpdCAmJiAhaW5mby5yZWFkeSkgaW5mbyA9IGF3YWl0IHRoaXMud2FpdEZvckluZGV4UmVhZHkobmFtZSwgdGltZW91dE1zLCBvcHRpb25zLnNpZ25hbCk7XG5cbiAgICBjb25zdCBzZWVkID0gb3B0aW9ucy5zZWVkID8/IFtdO1xuICAgIGlmIChzZWVkLmxlbmd0aCA+IDAgJiYgKGluZm8ucm93Q291bnQgPz8gMCkgPT09IDApIHtcbiAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiO1xuICAgICAgY29uc3QgdmVjdG9yQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdWZWN0b3JDb2x1bW4gPz8gXCJlbWJlZGRpbmdcIjtcbiAgICAgIC8vIERpcmVjdC1hY2Nlc3MgaW5kZXhlcyBzdG9yZSB2ZWN0b3JzIHdlIHN1cHBseSwgc28gZW1iZWQgdGhlIHRleHQgY29sdW1uXG4gICAgICAvLyBmb3IgYW55IHNlZWQgcm93IHRoYXQgZGlkIG5vdCBhbHJlYWR5IGNhcnJ5IGEgdmVjdG9yLlxuICAgICAgY29uc3QgbmVlZEVtYmVkID0gc2VlZC5zb21lKChkb2MpID0+IGRvY1t2ZWN0b3JDb2x1bW5dID09PSB1bmRlZmluZWQpO1xuICAgICAgbGV0IHJvd3MgPSBzZWVkO1xuICAgICAgaWYgKG5lZWRFbWJlZCkge1xuICAgICAgICBjb25zdCB0ZXh0cyA9IHNlZWQubWFwKChkb2MpID0+IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KFN0cmluZyhkb2Nbc291cmNlQ29sdW1uXSA/PyBcIlwiKSkpO1xuICAgICAgICBjb25zdCB2ZWN0b3JzID0gYXdhaXQgdGhpcy5lbWJlZCh0ZXh0cywgb3B0aW9ucy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgICByb3dzID0gc2VlZC5tYXAoKGRvYywgaSkgPT5cbiAgICAgICAgICBkb2NbdmVjdG9yQ29sdW1uXSA9PT0gdW5kZWZpbmVkID8geyAuLi5kb2MsIFt2ZWN0b3JDb2x1bW5dOiB2ZWN0b3JzW2ldIH0gOiBkb2MsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkZERvY3VtZW50cyhuYW1lLCByb3dzLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgICBsb2dnZXIuaW5mbyhcImluZGV4LXNlZWRlZFwiLCB7IGluZGV4OiBuYW1lLCBjb3VudDogcm93cy5sZW5ndGggfSk7XG4gICAgICBpbmZvID0gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLyoqIFBvbGwgYW4gaW5kZXggdW50aWwgaXQgcmVwb3J0cyByZWFkeSwgb3IgdGhyb3cgYWZ0ZXIge0BsaW5rIHRpbWVvdXRNc30uICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckluZGV4UmVhZHkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHRpbWVvdXRNczogbnVtYmVyLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcbiAgICBsZXQgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICB3aGlsZSAoIWluZm8ucmVhZHkpIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKGBzZWFyY2g6IGluZGV4ICR7bmFtZX0gZGlkIG5vdCBjb21lIG9ubGluZSBpbiB0aW1lYCwge1xuICAgICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcInByb3Zpc2lvblwiIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgYXN5bmNVdGlscy5zbGVlcCg1MDAwLCBzaWduYWwpO1xuICAgICAgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH1cblxuICAvKiogVHJpZ2dlciBhIHN5bmMgb2YgYSBEZWx0YSBTeW5jIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZS4gKi9cbiAgYXN5bmMgc3luY0luZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcInN5bmNJbmRleFwiKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJzeW5jSW5kZXhcIik7XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwic3luY0luZGV4XCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLnN5bmNJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhcImluZGV4LXN5bmNlZFwiLCB7IGluZGV4OiBuYW1lIH0pO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBhbiBpbmRleC4gKi9cbiAgYXN5bmMgZGVsZXRlSW5kZXgocmVmZXJlbmNlOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiZGVsZXRlSW5kZXhcIik7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiZGVsZXRlSW5kZXhcIik7XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZGVsZXRlSW5kZXhcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuZGVsZXRlSW5kZXgoeyBpbmRleF9uYW1lOiBuYW1lIH0sIGNvbnRleHQpLFxuICAgICk7XG4gICAgbG9nZ2VyLmluZm8oXCJpbmRleC1kZWxldGVkXCIsIHsgaW5kZXg6IG5hbWUgfSk7XG4gIH1cblxuICAvKiogTGlzdCB0aGUgaW5kZXhlcyBob3N0ZWQgb24gYSBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IChuYW1lICsgdHlwZSBvbmx5KS4gKi9cbiAgYXN5bmMgbGlzdEluZGV4ZXMoZW5kcG9pbnQ/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImxpc3RJbmRleGVzXCIpO1xuICAgIGNvbnN0IGVuZHBvaW50TmFtZSA9IGVuZHBvaW50ID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmICghZW5kcG9pbnROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IG5vIGVuZHBvaW50IGNvbmZpZ3VyZWQgdG8gbGlzdCBpbmRleGVzXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwibGlzdEluZGV4ZXNcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndpdGhDbGllbnQoXCJsaXN0SW5kZXhlc1wiLCBzaWduYWwsIGFzeW5jIChjbGllbnQsIGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBpbmRleCBvZiBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5saXN0SW5kZXhlcyhcbiAgICAgICAgeyBlbmRwb2ludF9uYW1lOiBlbmRwb2ludE5hbWUgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICkpIHtcbiAgICAgICAgaWYgKGluZGV4Lm5hbWUpIG5hbWVzLnB1c2goaW5kZXgubmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmFtZXM7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGEgVmVjdG9yIFNlYXJjaCBlbmRwb2ludCBleGlzdHMsIGNyZWF0aW5nIGEgYFNUQU5EQVJEYCBvbmUgd2hlbiBpdFxuICAgKiBkb2VzIG5vdC4gT3B0aW9uYWxseSB3YWl0IGZvciBpdCB0byBjb21lIG9ubGluZS4gSWRlbXBvdGVudC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUVuZHBvaW50KG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM6IEVuc3VyZUVuZHBvaW50T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiZW5zdXJlRW5kcG9pbnRcIik7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBuYW1lID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gZW5kcG9pbnQgbmFtZSB0byBlbnN1cmVcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbnN1cmVFbmRwb2ludFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZW5zdXJlRW5kcG9pbnRcIiwgb3B0aW9ucy5zaWduYWwsIGFzeW5jIChjbGllbnQsIGNvbnRleHQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC52ZWN0b3JTZWFyY2hFbmRwb2ludHMuZ2V0RW5kcG9pbnQoeyBlbmRwb2ludF9uYW1lOiBlbmRwb2ludCB9LCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IHdhaXRlciA9IGF3YWl0IGNsaWVudC52ZWN0b3JTZWFyY2hFbmRwb2ludHMuY3JlYXRlRW5kcG9pbnQoXG4gICAgICAgICAgeyBuYW1lOiBlbmRwb2ludCwgZW5kcG9pbnRfdHlwZTogXCJTVEFOREFSRFwiIH0sXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJlbmRwb2ludC1jcmVhdGVkXCIsIHsgZW5kcG9pbnQgfSk7XG4gICAgICAgIGlmIChvcHRpb25zLndhaXQpIGF3YWl0IHdhaXRlci53YWl0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgd29ya3NwYWNlIGNsaWVudCBhbmQgcnVuIG9uZSBjYWxsIHVuZGVyIGEgYm91bmRlZCB0aW1lb3V0LiBUaGVcbiAgICogY2FsbGVyJ3Mgc2lnbmFsIChpZiBhbnkpIGFuZCBhIHRpbWVvdXQgYXJlIG1lcmdlZCBpbnRvIG9uZSBTREsgYENvbnRleHRgXG4gICAqIHZpYSB7QGxpbmsgYXBwa2l0LmRhdGFicmlja3MudG9Db250ZXh0fSwgc28gZWl0aGVyIHVud2luZHMgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdpdGhDbGllbnQ8VD4oXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCxcbiAgICBmbjogKGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSwgY29udGV4dD86IENvbnRleHQpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMud29ya3NwYWNlQ2xpZW50RmFjdG9yeSgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGhpcy5jb25maWcudGltZW91dE1zKTtcbiAgICBjb25zdCBjb250ZXh0ID0gZGF0YWJyaWNrcy50b0NvbnRleHQoY29udHJvbGxlciwgc2lnbmFsKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKGNsaWVudCwgY29udGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBFeGVjdXRpb25FcnJvci5jYW5jZWxlZCgpO1xuICAgICAgbG9nZ2VyLndhcm4oXCJleGVjdXRpb24tZmFpbGVkXCIsIHsgb3BlcmF0aW9uIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogVGhlIE9CTyB3b3Jrc3BhY2UgY2xpZW50IGZyb20gdGhlIGFjdGl2ZSBjb250ZXh0LCBvciBhIHNlcnZpY2UtcHJpbmNpcGFsIGNsaWVudC4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRXb3Jrc3BhY2VDbGllbnQoKTogV29ya3NwYWNlQ2xpZW50TGlrZSB7XG4gIHJldHVybiBkZWZhdWx0QXBwS2l0V29ya3NwYWNlQ2xpZW50KCkudG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoKTtcbn1cblxuLyoqIEFwcEtpdCB3b3Jrc3BhY2UtY2xpZW50IGZhY2FkZSBmcm9tIHRoZSBhY3RpdmUgcmVxdWVzdCBvciBzZXJ2aWNlIGNvbnRleHQuICovXG5mdW5jdGlvbiBkZWZhdWx0QXBwS2l0V29ya3NwYWNlQ2xpZW50KCk6IGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlIHtcbiAgY29uc3QgY3R4ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgaWYgKGN0eD8uY2xpZW50KSByZXR1cm4gY3R4LmNsaWVudDtcbiAgLy8gT3V0c2lkZSBhIHJlcXVlc3Qgc2NvcGUgKGEgc2NyaXB0LCBhIHRlc3QpOiBhIGZyZXNoIGVudi1hdXRoIGNsaWVudC5cbiAgcmV0dXJuIGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG59XG5cbi8qKiBDb25zdHJ1Y3QgYSB7QGxpbmsgU2VhcmNoQ2xpZW50fSBmcm9tIGEgcmVzb2x2ZWQgY29uZmlnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlYXJjaENsaWVudChcbiAgY29uZmlnPzogUmVzb2x2ZWRTZWFyY2hDb25maWcsXG4gIHdvcmtzcGFjZUNsaWVudEZhY3Rvcnk/OiAoKSA9PiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICByZWFkQmFja2VuZD86IFNlYXJjaFJlYWRCYWNrZW5kLFxuKTogU2VhcmNoQ2xpZW50IHtcbiAgcmV0dXJuIG5ldyBTZWFyY2hDbGllbnQoY29uZmlnLCB3b3Jrc3BhY2VDbGllbnRGYWN0b3J5LCByZWFkQmFja2VuZCk7XG59XG4iXX0=
534
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RSxPQUFPLEVBQVUsc0JBQXNCLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFVckQsT0FBTyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGdCQUFnQixHQUVqQixNQUFNLGFBQWEsQ0FBQztBQUdyQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBMEMzQzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFFWDtJQUNRO0lBRm5CLFlBQ1csSUFBWSxFQUNKLE1BQW9CO1FBRDVCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDSixXQUFNLEdBQU4sTUFBTSxDQUFjO0lBQ3BDLENBQUM7SUFFSiwwREFBMEQ7SUFDMUQsTUFBTSxDQUFDLEtBQWEsRUFBRSxPQUF1QjtRQUMzQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxNQUFj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OUMsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLE1BQU0sRUFBRSxPQUFPO2dCQUFFLE1BQU0sY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztnQkFBUyxDQUFDO1lBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCx1RkFBdUY7QUFDdkYsU0FBUyxzQkFBc0I7SUFDN0IsT0FBTyw0QkFBNEIsRUFBRSxDQUFDLHVCQUF1QixFQUFFLENBQUM7QUFDbEUsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixTQUFTLDRCQUE0QjtJQUNuQyxNQUFNLEdBQUcsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3JDLElBQUksR0FBRyxFQUFFLE1BQU07UUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDbkMsdUVBQXVFO0lBQ3ZFLE9BQU8sbUJBQW1CLEVBQUUsQ0FBQyxNQUFNLENBQUM7QUFDdEMsQ0FBQztBQUVELCtEQUErRDtBQUMvRCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE1BQTZCLEVBQzdCLHNCQUFrRCxFQUNsRCxXQUErQjtJQUUvQixPQUFPLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWFyY2ggZXh0ZW5zaW9uIGNsaWVudC4gUmVhZHMgZGVsZWdhdGUgdG8gdGhlIHJlZ2lzdGVyZWQgQXBwS2l0LWNvbXBhdGlibGVcbiAqIGBhaVNlYXJjaGAgcHJvdmlkZXI7IHRoaXMgbW9kdWxlIG93bnMgZmVkZXJhdGVkIGZhbi1vdXQgYW5kIHRoZSBWZWN0b3IgU2VhcmNoXG4gKiBsaWZlY3ljbGUgQVBJcyBBcHBLaXQgZG9lcyBub3QgZXhwb3NlLlxuICpcbiAqIGBjbGllbnQuc2VhcmNoKHF1ZXJ5LCBvcHRzKWAgc2VhcmNoZXMgdGhlIGRlZmF1bHQgaW5kZXg7IGBjbGllbnQuaW5kZXgobmFtZSlgXG4gKiByZXR1cm5zIGEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleDsgYGNsaWVudC51bml2ZXJzYWxTZWFyY2gocXVlcnkpYCBmYW5zIGFcbiAqIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlcyB0aGUgcmVzdWx0cyAoTWVpbGlzZWFyY2gncyBmZWRlcmF0ZWRcbiAqIC8gbXVsdGktc2VhcmNoLCB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgdGhlIGNhbGxlciBhc2tlZCBmb3IpLiBFdmVyeXRoaW5nIGlzXG4gKiBhc3luYyBhbmQgY2FuY2VsbGFibGUgYW5kIHJldHVybnMgdGhlIGJyb3dzZXItc2FmZSBzaGFwZXMgZnJvbVxuICogYEBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaGAuIExpZmVjeWNsZSBtZXRob2RzIGNyb3NzIEFwcEtpdCdzIGV4cGxpY2l0IGxlZ2FjeVxuICogY2xpZW50IGhhbmRvZmYgYmVjYXVzZSB0aGUgcHVibGljIGZhY2FkZSBkb2VzIG5vdCB5ZXQgZXhwb3NlIGluZGV4IGNyZWF0aW9uLFxuICogc3luYywgb3IgZGVsZXRpb24uXG4gKlxuICogQXV0b2NvbXBsZXRlIGlzIGp1c3QgYSBzZWFyY2ggd2l0aCBhIHNtYWxsIGBsaW1pdGAgYW5kIHRoZSByYXcgcXVlcnkgdGV4dCAtXG4gKiBoeWJyaWQgbW9kZSBhbHJlYWR5IHByZWZpeC1tYXRjaGVzLCBzbyBubyBzZXBhcmF0ZSBlbmRwb2ludCBpcyBuZWVkZWQ7IHRoZVxuICoge0BsaW5rIFNlYXJjaEluZGV4LmF1dG9jb21wbGV0ZX0gaGVscGVyIGlzIGEgdGhpbiwgc2VsZi1kb2N1bWVudGluZyBhbGlhcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgRXhlY3V0aW9uRXJyb3IsIGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxcIjtcbmltcG9ydCB7IGFwcGtpdCwgdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCwgdG9Db250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBpbnZva2UsIHNlbGVjdGlvbiwgbW9kZWxDYXRhbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGxvZywgc2xlZXAsIHBhcnNlUmVjb3JkLCB0cmltVG9FbXB0eSwgdHJpbVRvTnVsbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbENsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEluZGV4SW5mbyxcbiAgU2VhcmNoRG9jdW1lbnQsXG4gIFNlYXJjaEhpdCxcbiAgU2VhcmNoTW9kZSxcbiAgU2VhcmNoUmVxdWVzdCxcbiAgU2VhcmNoUmVzdWx0LFxuICBVcHNlcnRSZXN1bHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfTU9ERSxcbiAgREVGQVVMVF9QQUdFX1NJWkUsXG4gIERFRkFVTFRfVElNRU9VVF9NUyxcbiAgcmVzb2x2ZUluZGV4TmFtZSxcbiAgdHlwZSBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbnR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IFJldHVyblR5cGU8YXBwa2l0LldvcmtzcGFjZUNsaWVudExpa2VbXCJ0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudFwiXT47XG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwic2VhcmNoL2NsaWVudFwiKTtcblxuLyoqIFF1ZXJ5IGJhY2tlbmQgdXNlZCB3aGVuIEFwcEtpdCBvd25zIHRoZSBWZWN0b3IgU2VhcmNoIGV4ZWN1dGlvbiBwYXRoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZWFkQmFja2VuZCB7XG4gIC8qKiBXaGV0aGVyIFZlY3RvciBTZWFyY2ggbGlmZWN5Y2xlIG1ldGhvZHMgYXJlIHZhbGlkIGZvciB0aGlzIHByb3ZpZGVyLiAqL1xuICBzdXBwb3J0c0xpZmVjeWNsZTogYm9vbGVhbjtcbiAgc2VhcmNoKGluZGV4OiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM/OiBTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xuICBhZGREb2N1bWVudHM/KFxuICAgIGluZGV4OiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD47XG59XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGEgc2luZ2xlLWluZGV4IHNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIGhpdHMgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBwYWdlIHNpemUuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogTWF0Y2ggbW9kZS4gRGVmYXVsdHMgdG8gdGhlIGNvbmZpZ3VyZWQgbW9kZSAoaHlicmlkKS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBDb2x1bW5zIHRvIHJldHVybiBwZXIgaGl0LiBEZWZhdWx0cyB0byB0aGUgaW5kZXgncyBjb25maWd1cmVkIGNvbHVtbnMuICovXG4gIGNvbHVtbnM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIEFwcEtpdCBBSSBTZWFyY2ggc2NhbGFyL2FycmF5IGZpbHRlcnMuICovXG4gIGZpbHRlcj86IFNlYXJjaFJlcXVlc3RbXCJmaWx0ZXJcIl07XG4gIC8qKiBEcm9wIGhpdHMgYmVsb3cgdGhpcyBzY29yZS4gKi9cbiAgc2NvcmVUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogT3B0aW9ucyBhY2NlcHRlZCBieSBhIHVuaXZlcnNhbCAoZmVkZXJhdGVkKSBzZWFyY2guICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMge1xuICAvKiogSW5kZXhlcyB0byBzZWFyY2guIERlZmF1bHRzIHRvIGV2ZXJ5IGtub3duIGluZGV4LiAqL1xuICBpbmRleGVzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBNYXhpbXVtIGhpdHMgcGVyIGluZGV4IGJlZm9yZSBtZXJnaW5nLiAqL1xuICBsaW1pdD86IG51bWJlcjtcbiAgLyoqIE1hdGNoIG1vZGUuICovXG4gIG1vZGU/OiBTZWFyY2hNb2RlO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZSBib3VuZCB0byBvbmUgaW5kZXguIE1vZGVsZWQgb24gTWVpbGlzZWFyY2gncyBgY2xpZW50LmluZGV4KHVpZClgOlxuICogYHNlYXJjaGAgLyBgYXV0b2NvbXBsZXRlYCByZWFkLCBgYWRkRG9jdW1lbnRzYCAvIGBkZWxldGVEb2N1bWVudHNgIHdyaXRlICh0b1xuICogYSBkaXJlY3QtYWNjZXNzIGluZGV4KSwgYW5kIGBpbmZvYCBmZXRjaGVzIHRoZSBsaXZlIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hJbmRleCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogU2VhcmNoQ2xpZW50LFxuICApIHt9XG5cbiAgLyoqIFNlYXJjaCB0aGlzIGluZGV4LiBTZWUge0BsaW5rIFNlYXJjaENsaWVudC5zZWFyY2h9LiAqL1xuICBzZWFyY2gocXVlcnk6IHN0cmluZywgb3B0aW9ucz86IFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZWFyY2gocXVlcnksIHsgLi4ub3B0aW9ucywgaW5kZXg6IHRoaXMubmFtZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRvY29tcGxldGUgYWdhaW5zdCB0aGlzIGluZGV4OiBhIHNlYXJjaCB3aXRoIGEgc21hbGwgZGVmYXVsdCBgbGltaXRgIGFuZFxuICAgKiB0aGUgcmF3IHByZWZpeCBhcyB0aGUgcXVlcnkuIEh5YnJpZCBtb2RlIGFscmVhZHkgaGFuZGxlcyBwcmVmaXhlcywgc28gdGhpc1xuICAgKiBpcyBhIHNlbGYtZG9jdW1lbnRpbmcgYWxpYXMgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBjb2RlIHBhdGguXG4gICAqL1xuICBhdXRvY29tcGxldGUocHJlZml4OiBzdHJpbmcsIG9wdGlvbnM/OiBTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2gocHJlZml4LCB7IGxpbWl0OiA1LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIHRoaXMgKGRpcmVjdC1hY2Nlc3MpIGluZGV4LiAqL1xuICBhZGREb2N1bWVudHMoZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmFkZERvY3VtZW50cyh0aGlzLm5hbWUsIGRvY3VtZW50cywgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZG9jdW1lbnRzIGZyb20gdGhpcyAoZGlyZWN0LWFjY2VzcykgaW5kZXggYnkgcHJpbWFyeSBrZXkuICovXG4gIGRlbGV0ZURvY3VtZW50cyhpZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlRG9jdW1lbnRzKHRoaXMubmFtZSwgaWRzLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIEZldGNoIHRoaXMgaW5kZXgncyBsaXZlIGRlZmluaXRpb24gKHByaW1hcnkga2V5LCBjb2x1bW5zLCByZWFkaW5lc3MpLiAqL1xuICBpbmZvKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0SW5kZXgodGhpcy5uYW1lLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgYSBzeW5jIG9mIHRoaXMgKERlbHRhIFN5bmMpIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZS4gKi9cbiAgc3luYyhzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zeW5jSW5kZXgodGhpcy5uYW1lLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSB0aGlzIGluZGV4LiAqL1xuICBkZWxldGUoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlSW5kZXgodGhpcy5uYW1lLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSB0aGlzIGluZGV4IGlmIGl0IGRvZXMgbm90IGV4aXN0LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBleGlzdGluZyBvbmUuICovXG4gIGVuc3VyZShvcHRpb25zPzogQ3JlYXRlSW5kZXhPcHRpb25zKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZW5zdXJlSW5kZXgodGhpcy5uYW1lLCBvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBTZWFyY2hDbGllbnQuY3JlYXRlSW5kZXh9IC8ge0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVJbmRleH0uXG4gKiBUaGUgZ29hbCBpcyB0aGUgc2FtZSBhcyB0aGUgcmVzdCBvZiB0aGUgY2xpZW50OiBuYW1lIGEgc291cmNlIHRhYmxlIGFuZCBhXG4gKiB0ZXh0IGNvbHVtbiwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSAtIHRoZSBlbmRwb2ludCwgdGhlIGVtYmVkZGluZyBtb2RlbCwgdGhlXG4gKiBpbmRleCB0eXBlLCB0aGUgc3luYyBtb2RlIC0gaGFzIGEgc2Vuc2libGUgZGVmYXVsdCB0aGF0IGluZmVycyBmcm9tIHRoZVxuICogd29ya3NwYWNlLCBvdmVycmlkYWJsZSB3aGVuIGEgZGVwbG95bWVudCBuZWVkcyB0byBnbyBkZWVwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlSW5kZXhPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNvdXJjZSBEZWx0YSB0YWJsZSAoY2F0YWxvZy5zY2hlbWEudGFibGUpIGZvciBhIERlbHRhIFN5bmMgaW5kZXguIFByb3ZpZGVcbiAgICogdGhpcyBmb3IgdGhlIGNvbW1vbiBjYXNlOiBEYXRhYnJpY2tzIGNvbXB1dGVzIGFuZCBzeW5jcyBlbWJlZGRpbmdzIGZyb20gaXQuXG4gICAqIE9taXQgaXQgKGFuZCBwYXNzIHtAbGluayBlbWJlZGRpbmdEaW1lbnNpb259KSB0byBjcmVhdGUgYSBkaXJlY3QtYWNjZXNzXG4gICAqIGluZGV4IHlvdSB3cml0ZSB2ZWN0b3JzIHRvIHlvdXJzZWxmLlxuICAgKi9cbiAgc291cmNlVGFibGU/OiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5LWtleSBjb2x1bW4uIERlZmF1bHRzIHRvIGBpZGAuICovXG4gIHByaW1hcnlLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBjb2x1bW4gZW1iZWRkaW5ncyBhcmUgY29tcHV0ZWQgZnJvbSAoRGVsdGEgU3luYykuIERlZmF1bHRzIHRvIHRoZVxuICAgKiBmaXJzdCBvZiBgdGV4dGAgLyBgY29udGVudGAgLyBgYm9keWAgcHJlc2VudCwgZWxzZSB0aGUgY2FsbGVyIG11c3Qgc2V0IGl0LlxuICAgKi9cbiAgZW1iZWRkaW5nU291cmNlQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogRW1iZWRkaW5nIG1vZGVsIGVuZHBvaW50LiBBIGxvb3NlIG5hbWUgaXMgZnV6enktbWF0Y2hlZDsgd2hlbiBvbWl0dGVkIHRoZVxuICAgKiBiZXN0IGVtYmVkZGluZyBlbmRwb2ludCBpbiB0aGUgd29ya3NwYWNlIGlzIGNob3NlbiAoe0BsaW5rIHJlc29sdmVFbWJlZGRpbmdNb2RlbH0pLlxuICAgKi9cbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IHRvIGhvc3QgdGhlIGluZGV4IG9uLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgYGVuZHBvaW50YC4gKi9cbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgZW1iZWRkaW5nIHZlY3RvciBkaW1lbnNpb24gKHNlbGYtbWFuYWdlZCB2ZWN0b3JzLCBubyBzb3VyY2UgdGFibGUpLiAqL1xuICBlbWJlZGRpbmdEaW1lbnNpb24/OiBudW1iZXI7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgY29sdW1uIHRoZSB2ZWN0b3IgaXMgc3RvcmVkIGluLiBEZWZhdWx0cyB0byBgZW1iZWRkaW5nYC4gKi9cbiAgZW1iZWRkaW5nVmVjdG9yQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbHVtbi1uYW1lIC0+IHR5cGUgbWFwIHVzZWQgdG8gYnVpbGQgYSBkaXJlY3QtYWNjZXNzIGluZGV4J3NcbiAgICogYHNjaGVtYV9qc29uYCAodHlwZXM6IGBzdHJpbmdgLCBgaW50YCwgYGxvbmdgLCBgZmxvYXRgLCBgZG91YmxlYCxcbiAgICogYGJvb2xlYW5gLCBgZGF0ZWAsIGB0aW1lc3RhbXBgKS4gTXVzdCBpbmNsdWRlIHRoZSBwcmltYXJ5IGtleSBhbmQgYW55XG4gICAqIGNvbHVtbnMgeW91IHVwc2VydC4gRGVmYXVsdHMgdG8gYHsgaWQ6IFwic3RyaW5nXCIsIHRleHQ6IFwic3RyaW5nXCIgfWAuIFRoZVxuICAgKiBlbWJlZGRpbmcgdmVjdG9yIGNvbHVtbiBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgc2NoZW1hPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFN5bmMgbW9kZSBmb3IgYSBEZWx0YSBTeW5jIGluZGV4LiBgVFJJR0dFUkVEYCAoZGVmYXVsdCkgc3luY3Mgb24gZGVtYW5kOyBgQ09OVElOVU9VU2Aga2VlcHMgZnJlc2guICovXG4gIHBpcGVsaW5lVHlwZT86IFwiVFJJR0dFUkVEXCIgfCBcIkNPTlRJTlVPVVNcIjtcbiAgLyoqIEV4dHJhIGNvbHVtbnMgdG8gc3luYyBhbG9uZ3NpZGUgdGhlIGVtYmVkZGluZyBzb3VyY2UgKERlbHRhIFN5bmMpLiAqL1xuICBjb2x1bW5zVG9TeW5jPzogc3RyaW5nW107XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVFbmRwb2ludH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEVuc3VyZUVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBXYWl0IGZvciB0aGUgZW5kcG9pbnQgdG8gY29tZSBvbmxpbmUgYmVmb3JlIHJldHVybmluZy4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHdhaXQ/OiBib29sZWFuO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU2VhcmNoQ2xpZW50LnByb3Zpc2lvbn0gLSBhIG9uZS1jYWxsIFwibWFrZSB0aGlzIGluZGV4IHJlYWxcbiAqIGFuZCBzZWFyY2hhYmxlXCIgdXNlZCBhdCBib290IG9yIGluIGEgc2VlZCBzY3JpcHQuIEl0IGVuc3VyZXMgdGhlIGVuZHBvaW50LFxuICogZW5zdXJlcyB0aGUgaW5kZXgsIGFuZCAob3B0aW9uYWxseSkgc2VlZHMgZG9jdW1lbnRzIHdoZW4gdGhlIGluZGV4IGlzIGVtcHR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvbk9wdGlvbnMgZXh0ZW5kcyBDcmVhdGVJbmRleE9wdGlvbnMge1xuICAvKiogRG9jdW1lbnRzIHRvIHNlZWQgd2hlbiB0aGUgaW5kZXggaGFzIG5vIHJvd3MgeWV0LiBTa2lwcGVkIGlmIGl0IGFscmVhZHkgaGFzIGRhdGEuICovXG4gIHNlZWQ/OiBTZWFyY2hEb2N1bWVudFtdO1xuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIGVuZHBvaW50IEFORCBpbmRleCB0byBjb21lIG9ubGluZSBiZWZvcmUgcmV0dXJuaW5nIChuZWVkZWRcbiAgICogYmVmb3JlIHNlZWRpbmcpLiBEZWZhdWx0cyB0byB0cnVlLiBFbmRwb2ludCBjcmVhdGlvbiBjYW4gdGFrZSBtYW55IG1pbnV0ZXMuXG4gICAqL1xuICB3YWl0PzogYm9vbGVhbjtcbiAgLyoqIEhvdyBsb25nIHRvIHdhaXQgZm9yIHJlYWRpbmVzcyBiZWZvcmUgZ2l2aW5nIHVwLiBEZWZhdWx0cyB0byAyMCBtaW51dGVzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIEFJIFNlYXJjaCBjbGllbnQuIENvbnN0cnVjdCBpdCB3aXRoIHtAbGluayBjcmVhdGVTZWFyY2hDbGllbnR9ICh3aGljaFxuICogcmVhZHMgYSByZXNvbHZlZCBjb25maWcpIG9yIGRpcmVjdGx5IGZvciBvbmUtb2ZmIHVzZS4gQWxsIHJlYWRzIHJlc29sdmUgdGhlXG4gKiBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUmVzb2x2ZWRTZWFyY2hDb25maWcgPSB7XG4gICAgICBpbmRleGVzOiBbXSxcbiAgICAgIHBhZ2VTaXplOiBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgIG1vZGU6IERFRkFVTFRfTU9ERSxcbiAgICAgIHRpbWVvdXRNczogREVGQVVMVF9USU1FT1VUX01TLFxuICAgICAgYWxsb3dXcml0ZTogZmFsc2UsXG4gICAgfSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmtzcGFjZUNsaWVudEZhY3Rvcnk6ICgpID0+IFdvcmtzcGFjZUNsaWVudExpa2UgPSBkZWZhdWx0V29ya3NwYWNlQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVhZEJhY2tlbmQ/OiBTZWFyY2hSZWFkQmFja2VuZCxcbiAgKSB7fVxuXG4gIC8qKiBBIGhhbmRsZSBib3VuZCB0byBvbmUgaW5kZXggKGJ5IGZ1bGwgVUMgbmFtZSBvciBjb25maWd1cmVkIGFsaWFzKS4gKi9cbiAgaW5kZXgocmVmZXJlbmNlOiBzdHJpbmcpOiBTZWFyY2hJbmRleCB7XG4gICAgY29uc3QgbmFtZSA9IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZmVyZW5jZSkgPz8gcmVmZXJlbmNlO1xuICAgIHJldHVybiBuZXcgU2VhcmNoSW5kZXgobmFtZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIG9uZSBpbmRleC4gYGluZGV4YCBtYXkgYmUgYSBmdWxsIFVDIG5hbWUsIGEgY29uZmlndXJlZCBhbGlhcywgb3JcbiAgICogb21pdHRlZCB0byB1c2UgdGhlIGRlZmF1bHQgaW5kZXguIFJldHVybnMgaGl0cyBzb3J0ZWQgbW9zdC1yZWxldmFudC1maXJzdC5cbiAgICovXG4gIGFzeW5jIHNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgJiB7IGluZGV4Pzogc3RyaW5nIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gdHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IG5hbWUgPSByZXNvbHZlSW5kZXhOYW1lKHRoaXMuY29uZmlnLCBvcHRpb25zLmluZGV4KTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBpbmRleCBjb25maWd1cmVkOyBzZXQgYSBkZWZhdWx0IGluZGV4IG9yIHBhc3Mgb25lXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwic2VhcmNoXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucmVhZEJhY2tlbmQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgXCJzZWFyY2g6IG5vIEFJIFNlYXJjaCBwcm92aWRlciByZWdpc3RlcmVkOyBhZGQgYWlTZWFyY2goKSBvciBsYWtlYmFzZUFpU2VhcmNoKClcIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJzZWFyY2hcIiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZWFkQmFja2VuZC5zZWFyY2gobmFtZSwgdGV4dCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0ID8/IHRoaXMuY29uZmlnLnBhZ2VTaXplLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbiBhIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlIHRoZSBoaXRzLCBzb3J0ZWQgYnkgc2NvcmUgLVxuICAgKiB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgYSBzaW5nbGUgYm94IG92ZXIgbWFueSBjb2xsZWN0aW9ucyBuZWVkcy4gRWFjaFxuICAgKiBpbmRleCBpcyBzZWFyY2hlZCBjb25jdXJyZW50bHk7IGFuIGluZGV4IHRoYXQgZXJyb3JzIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZFxuICAgKiBzbyBvbmUgYmFkIGluZGV4IGRvZXMgbm90IHNpbmsgdGhlIHdob2xlIHNlYXJjaC5cbiAgICovXG4gIGFzeW5jIHVuaXZlcnNhbFNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gdHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IG5hbWVzID1cbiAgICAgIG9wdGlvbnMuaW5kZXhlcyAmJiBvcHRpb25zLmluZGV4ZXMubGVuZ3RoID4gMFxuICAgICAgICA/IG9wdGlvbnMuaW5kZXhlcy5tYXAoKHJlZikgPT4gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmKSA/PyByZWYpXG4gICAgICAgIDogdGhpcy5jb25maWcuaW5kZXhlcy5tYXAoKGkpID0+IGkubmFtZSk7XG4gICAgY29uc3QgcGVySW5kZXggPSBvcHRpb25zLmxpbWl0ID8/IHRoaXMuY29uZmlnLnBhZ2VTaXplO1xuXG4gICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIG5hbWVzLm1hcChhc3luYyAobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlYXJjaCh0ZXh0LCB7XG4gICAgICAgICAgaW5kZXg6IG5hbWUsXG4gICAgICAgICAgbGltaXQ6IHBlckluZGV4LFxuICAgICAgICAgIC4uLihvcHRpb25zLm1vZGUgPyB7IG1vZGU6IG9wdGlvbnMubW9kZSB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRpb25zLnNpZ25hbCA/IHsgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5oaXRzLm1hcCgoaGl0KTogU2VhcmNoSGl0ID0+ICh7IC4uLmhpdCwgaW5kZXg6IG5hbWUgfSkpO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IGhpdHMgPSBzZXR0bGVkXG4gICAgICAuZmxhdE1hcCgob3V0Y29tZSwgaSkgPT4ge1xuICAgICAgICBpZiAob3V0Y29tZS5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIpIHJldHVybiBvdXRjb21lLnZhbHVlO1xuICAgICAgICBsb2dnZXIud2FybihcInVuaXZlcnNhbC1pbmRleC1mYWlsZWRcIiwgeyBpbmRleDogbmFtZXNbaV0gfSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuXG4gICAgcmV0dXJuIHsgcXVlcnk6IHRleHQsIGhpdHMsIGNvdW50OiBoaXRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gaW5kZXggcmVmZXJlbmNlIChmdWxsIFVDIG5hbWUgb3IgY29uZmlndXJlZCBhbGlhcykgdG8gdGhlIG5hbWVcbiAgICogdGhlIEFQSSBleHBlY3RzLCBmYWlsaW5nIGZhc3Qgd2hlbiBpdCByZXNvbHZlcyB0byBub3RoaW5nLiBXaXRob3V0IHRoaXMgYVxuICAgKiBibGFuayByZWZlcmVuY2UgLSB3aGF0IGFuIG9taXR0ZWQgYGluZGV4YCBiZWNvbWVzIHdoZW4gbm8gZGVmYXVsdCBpc1xuICAgKiBjb25maWd1cmVkIC0gcmVhY2hlcyB0aGUgU0RLIGFzIGFuIGVtcHR5IGBpbmRleF9uYW1lYCwgd2hpY2ggYnVpbGRzIGFcbiAgICogVVJMIHdpdGggdGhlIG5hbWUgc2VnbWVudCBtaXNzaW5nIGFuZCBjb21lcyBiYWNrIGFzIGEgY29uZnVzaW5nXG4gICAqIGBFTkRQT0lOVF9OT1RfRk9VTkRgIGluc3RlYWQgb2YgbmFtaW5nIHRoZSByZWFsIHByb2JsZW0uXG4gICAqL1xuICBwcml2YXRlIHJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlOiBzdHJpbmcsIG9wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdHJpbVRvTnVsbChyZXNvbHZlSW5kZXhOYW1lKHRoaXMuY29uZmlnLCByZWZlcmVuY2UpID8/IHJlZmVyZW5jZSk7XG4gICAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgYHNlYXJjaDogbm8gaW5kZXggY29uZmlndXJlZDsgc2V0IGEgZGVmYXVsdCBpbmRleCBvciBwYXNzIG9uZSB0byAke29wZXJhdGlvbn1gLFxuICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgLyoqIFJlamVjdCBWZWN0b3IgU2VhcmNoIGxpZmVjeWNsZSBjYWxscyBhZ2FpbnN0IGEgbm9uLVZlY3RvciBwcm92aWRlci4gKi9cbiAgcHJpdmF0ZSByZXF1aXJlTGlmZWN5Y2xlKG9wZXJhdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZEJhY2tlbmQgJiYgIXRoaXMucmVhZEJhY2tlbmQuc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgc2VhcmNoOiB0aGUgcmVnaXN0ZXJlZCBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0ICR7b3BlcmF0aW9ufWAsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb24gfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBGZXRjaCBhbiBpbmRleCdzIGxpdmUgZGVmaW5pdGlvbi4gKi9cbiAgYXN5bmMgZ2V0SW5kZXgocmVmZXJlbmNlOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJnZXRJbmRleFwiKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJnZXRJbmRleFwiKTtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMud2l0aENsaWVudChcImdldEluZGV4XCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmdldEluZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGNvbnN0IGRpcmVjdEFjY2VzcyA9IGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYyAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNwZWMgPSBpbmRleC5kZWx0YV9zeW5jX2luZGV4X3NwZWMgPz8gaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjO1xuICAgIC8vIERlbHRhIFN5bmMgc3VyZmFjZXMgaXRzIGVtYmVkZGluZyBzb3VyY2UgY29sdW1ucyBkaXJlY3RseTsgYSBkaXJlY3QtYWNjZXNzXG4gICAgLy8gaW5kZXggY2FycmllcyBpdHMgY29sdW1ucyBpbiBzY2hlbWFfanNvbiAobWludXMgdGhlIHZlY3RvciBjb2x1bW4pLlxuICAgIGxldCBjb2x1bW5zID0gKHNwZWM/LmVtYmVkZGluZ19zb3VyY2VfY29sdW1ucyA/PyBbXSkubWFwKChjKSA9PiBjLm5hbWUgPz8gXCJcIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHNjaGVtYUpzb24gPSBpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM/LnNjaGVtYV9qc29uO1xuICAgIGlmIChkaXJlY3RBY2Nlc3MgJiYgc2NoZW1hSnNvbikge1xuICAgICAgY29uc3Qgc2NoZW1hID0gcGFyc2VSZWNvcmQoc2NoZW1hSnNvbikgPz8ge307XG4gICAgICBjb25zdCB2ZWN0b3JOYW1lcyA9IG5ldyBTZXQoXG4gICAgICAgIChpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM/LmVtYmVkZGluZ192ZWN0b3JfY29sdW1ucyA/PyBbXSlcbiAgICAgICAgICAubWFwKChjKSA9PiBjLm5hbWUpXG4gICAgICAgICAgLmZpbHRlcigobik6IG4gaXMgc3RyaW5nID0+IEJvb2xlYW4obikpLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbnMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcigoYykgPT4gIXZlY3Rvck5hbWVzLmhhcyhjKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBpbmRleC5uYW1lID8/IG5hbWUsXG4gICAgICAuLi4oaW5kZXguZW5kcG9pbnRfbmFtZSA/IHsgZW5kcG9pbnQ6IGluZGV4LmVuZHBvaW50X25hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihpbmRleC5wcmltYXJ5X2tleSA/IHsgcHJpbWFyeUtleTogaW5kZXgucHJpbWFyeV9rZXkgfSA6IHt9KSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICByZWFkeTogaW5kZXguc3RhdHVzPy5yZWFkeSA/PyBmYWxzZSxcbiAgICAgIC4uLihpbmRleC5zdGF0dXM/LmluZGV4ZWRfcm93X2NvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHJvd0NvdW50OiBpbmRleC5zdGF0dXMuaW5kZXhlZF9yb3dfY291bnQgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihkaXJlY3RBY2Nlc3MgPyB7IGRpcmVjdEFjY2VzczogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gYSBkaXJlY3QtYWNjZXNzIGluZGV4LiAqL1xuICBhc3luYyBhZGREb2N1bWVudHMoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgZG9jdW1lbnRzOiBTZWFyY2hEb2N1bWVudFtdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImFkZERvY3VtZW50c1wiKTtcbiAgICBpZiAodGhpcy5yZWFkQmFja2VuZD8uYWRkRG9jdW1lbnRzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQmFja2VuZC5hZGREb2N1bWVudHMobmFtZSwgZG9jdW1lbnRzLCBzaWduYWwpO1xuICAgIH1cbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJhZGREb2N1bWVudHNcIik7XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiYWRkRG9jdW1lbnRzXCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLnVwc2VydERhdGFWZWN0b3JJbmRleChcbiAgICAgICAgeyBpbmRleF9uYW1lOiBuYW1lLCBpbnB1dHNfanNvbjogSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnRzKSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiB7IGluZGV4OiBuYW1lLCBjb3VudDogZG9jdW1lbnRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqIERlbGV0ZSBkb2N1bWVudHMgZnJvbSBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggYnkgcHJpbWFyeSBrZXkuICovXG4gIGFzeW5jIGRlbGV0ZURvY3VtZW50cyhcbiAgICByZWZlcmVuY2U6IHN0cmluZyxcbiAgICBpZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiZGVsZXRlRG9jdW1lbnRzXCIpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImRlbGV0ZURvY3VtZW50c1wiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJkZWxldGVEb2N1bWVudHNcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuZGVsZXRlRGF0YVZlY3RvckluZGV4KFxuICAgICAgICB7IGluZGV4X25hbWU6IG5hbWUsIHByaW1hcnlfa2V5czogaWRzLm1hcChTdHJpbmcpIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIHsgaW5kZXg6IG5hbWUsIGNvdW50OiBpZHMubGVuZ3RoIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhbiBlbWJlZGRpbmcgZW5kcG9pbnQgaWQgZm9yIGNyZWF0aW5nIGEgRGVsdGEgU3luYyBpbmRleC4gUmV1c2VzXG4gICAqIHRoZSBtb2RlbCByZXNvbHZlcjogYSBjb25maWd1cmVkIC8gcGFzc2VkIG5hbWUgaXMgZnV6enktbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBsaXZlIGNhdGFsb2d1ZSwgb3RoZXJ3aXNlIHRoZSBoaWdoZXN0LXJhbmtlZCBlbWJlZGRpbmcgZW5kcG9pbnQgaXMgY2hvc2VuLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZUVtYmVkZGluZ01vZGVsKHJlcXVlc3RlZD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBleHBsaWNpdCA9IHRyaW1Ub051bGwocmVxdWVzdGVkID8/IHRoaXMuY29uZmlnLmVtYmVkZGluZ01vZGVsKTtcbiAgICAvLyBBbiBleHBsaWNpdCBuYW1lIHRoYXQgYWxyZWFkeSBsb29rcyBsaWtlIGFuIGVuZHBvaW50IGlkIChubyB3aGl0ZXNwYWNlKVxuICAgIC8vIGlzIHVzZWQgdmVyYmF0aW0gLSBubyBuZWVkIHRvIGZldGNoIGFuZCBmdXp6eS1tYXRjaCB0aGUgbGl2ZSBjYXRhbG9ndWUuXG4gICAgLy8gQSBnZW51aW5lbHkgbG9vc2UgbmFtZSAoZS5nLiBcImd0ZSBsYXJnZVwiKSBzdGlsbCByZXNvbHZlcyBhZ2FpbnN0IGl0LlxuICAgIGlmIChleHBsaWNpdCAmJiAhL1xccy8udGVzdChleHBsaWNpdCkpIHJldHVybiBleHBsaWNpdDtcbiAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgY29uc3QgY2xpZW50ID0gZGVmYXVsdEFwcEtpdFdvcmtzcGFjZUNsaWVudCgpO1xuICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbW9kZWxDYXRhbG9nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCk7XG4gICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IHsgbW9kZWxJZCB9ID0gc2VsZWN0aW9uLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHtcbiAgICAgIC4uLihleHBsaWNpdCA/IHsgZXhwbGljaXQgfSA6IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRyaW1Ub051bGwobW9kZWxJZCk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWQgdGV4dCB2aWEgYSBEYXRhYnJpY2tzIGVtYmVkZGluZyBzZXJ2aW5nIGVuZHBvaW50LCByZXR1cm5pbmcgb25lXG4gICAqIHZlY3RvciBwZXIgaW5wdXQuIFVzZWQgdG8gc2VlZCBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggYW5kIHRvIHR1cm4gYSBzZWFyY2hcbiAgICogcXVlcnkgaW50byBhIHF1ZXJ5IHZlY3RvciAtIERhdGFicmlja3Mgb25seSBtYW5hZ2VzIGVtYmVkZGluZ3MgZm9yIERlbHRhXG4gICAqIFN5bmMgaW5kZXhlcywgc28gYSBkaXJlY3QtYWNjZXNzIGluZGV4IChubyBEZWx0YSB0YWJsZSwgbm8gd2FyZWhvdXNlKSBuZWVkc1xuICAgKiB0aGUgY2xpZW50IHRvIGVtYmVkIG9uIHdyaXRlIGFuZCBvbiBxdWVyeS4gVGhlIGVuZHBvaW50IGlzIHJlc29sdmVkIHRoZVxuICAgKiBzYW1lIHdheSBhcyBmb3IgaW5kZXggY3JlYXRpb24gd2hlbiBub3QgbmFtZWQuXG4gICAqL1xuICBhc3luYyBlbWJlZCh0ZXh0czogc3RyaW5nW10sIG1vZGVsPzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8bnVtYmVyW11bXT4ge1xuICAgIGlmICh0ZXh0cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBlbmRwb2ludCA9IGF3YWl0IHRoaXMucmVzb2x2ZUVtYmVkZGluZ01vZGVsKG1vZGVsLCBzaWduYWwpO1xuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsIHRvIGVtYmVkIHRleHRcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcImVtYmVkXCIsIHNpZ25hbCwgYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHVybCA9IGludm9rZS5pbnZvY2F0aW9uc1VybChob3N0LCBlbmRwb2ludCk7XG4gICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGNsaWVudCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLmhlYWRlcnMsIFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5wdXQ6IHRleHRzIH0pLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgICAgYHNlYXJjaDogZW1iZWRkaW5nIGVuZHBvaW50ICR7ZW5kcG9pbnR9IGZhaWxlZCAoJHtyZXNwb25zZS5zdGF0dXN9KWAsXG4gICAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRhdGE/OiBBcnJheTx7IGVtYmVkZGluZzogbnVtYmVyW10gfT4gfTtcbiAgICAgIGNvbnN0IHZlY3RvcnMgPSAoYm9keS5kYXRhID8/IFtdKS5tYXAoKHJvdykgPT4gcm93LmVtYmVkZGluZyk7XG4gICAgICBpZiAodmVjdG9ycy5sZW5ndGggIT09IHRleHRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGVtYmVkZGluZyByZXNwb25zZSBkaWQgbm90IG1hdGNoIHRoZSBpbnB1dCBjb3VudFwiLCB7XG4gICAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW1iZWRcIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2ZWN0b3JzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSB2ZWN0b3IgZGltZW5zaW9uIGEgbW9kZWwgcHJvZHVjZXMgKGVtYmVkcyBhIHByb2JlIHN0cmluZyBvbmNlKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbWJlZGRpbmdEaW1lbnNpb24obW9kZWw/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBbdmVjdG9yXSA9IGF3YWl0IHRoaXMuZW1iZWQoW1wiZGltZW5zaW9uIHByb2JlXCJdLCBtb2RlbCwgc2lnbmFsKTtcbiAgICBpZiAoIXZlY3RvciB8fCB2ZWN0b3IubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGVtYmVkZGluZyBkaW1lbnNpb25cIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZlY3Rvci5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEFJIFNlYXJjaCBpbmRleCB3aXRoIGFzIGxpdHRsZSBjZXJlbW9ueSBhcyBwb3NzaWJsZS4gVHdvIHNoYXBlczpcbiAgICpcbiAgICogICAtICoqRGVsdGEgU3luYyoqICh0aGUgZGVmYXVsdCk6IHBhc3MgYHNvdXJjZVRhYmxlYDsgRGF0YWJyaWNrcyBjb21wdXRlc1xuICAgKiAgICAgZW1iZWRkaW5ncyBmcm9tIHRoZSB0ZXh0IGNvbHVtbiBhbmQga2VlcHMgdGhlIGluZGV4IHN5bmNlZC4gVGhlXG4gICAqICAgICBlbWJlZGRpbmcgbW9kZWwgaXMgcmVzb2x2ZWQgYXV0b21hdGljYWxseSB3aGVuIG5vdCBuYW1lZC5cbiAgICogICAtICoqRGlyZWN0IEFjY2VzcyoqOiBvbWl0IGBzb3VyY2VUYWJsZWAgYW5kIHBhc3MgYGVtYmVkZGluZ0RpbWVuc2lvbmA7XG4gICAqICAgICB5b3Ugd3JpdGUgdmVjdG9ycyB5b3Vyc2VsZiB2aWEge0BsaW5rIGFkZERvY3VtZW50c30uXG4gICAqXG4gICAqIEV2ZXJ5dGhpbmcgZWxzZSBpbmZlcnM6IHRoZSBlbmRwb2ludCBmcm9tIHRoZSBwbHVnaW4gY29uZmlnLCB0aGUgcHJpbWFyeVxuICAgKiBrZXkgKGBpZGApLCB0aGUgdGV4dCBjb2x1bW4gKGB0ZXh0YCAvIGBjb250ZW50YCAvIGBib2R5YCksIGFuZCB0aGUgdmVjdG9yXG4gICAqIGNvbHVtbiAoYGVtYmVkZGluZ2ApLiBSZXR1cm5zIHRoZSBjcmVhdGVkIGluZGV4J3Mge0BsaW5rIEluZGV4SW5mb30uXG4gICAqL1xuICBhc3luYyBjcmVhdGVJbmRleChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJjcmVhdGVJbmRleFwiKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogbm8gVmVjdG9yIFNlYXJjaCBlbmRwb2ludCBjb25maWd1cmVkOyBwYXNzIGBlbmRwb2ludGAgb3Igc2V0IGl0IG9uIHRoZSBwbHVnaW5cIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBvcHRpb25zLnByaW1hcnlLZXkgPz8gXCJpZFwiO1xuICAgIGNvbnN0IGRpcmVjdCA9ICFvcHRpb25zLnNvdXJjZVRhYmxlO1xuICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nU291cmNlQ29sdW1uID8/IFwidGV4dFwiO1xuICAgIGNvbnN0IHZlY3RvckNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nVmVjdG9yQ29sdW1uID8/IFwiZW1iZWRkaW5nXCI7XG5cbiAgICAvLyBEZWx0YSBTeW5jIGxldHMgRGF0YWJyaWNrcyBlbWJlZCBhIHNvdXJjZSBjb2x1bW4sIHNvIGl0IG5lZWRzIGFuIGVtYmVkZGluZ1xuICAgIC8vIG1vZGVsLiBBIGRpcmVjdC1hY2Nlc3MgaW5kZXggc3RvcmVzIHZlY3RvcnMgWU9VIHN1cHBseSAoRGF0YWJyaWNrcyBvbmx5XG4gICAgLy8gc3VwcG9ydHMgbWFuYWdlZCBlbWJlZGRpbmdzIG9uIERlbHRhIFN5bmMpLCBzbyBpdCBuZWVkcyBhIGRpbWVuc2lvbjsgd2VcbiAgICAvLyByZXNvbHZlIG9uZSBmcm9tIHRoZSBlbWJlZGRpbmcgbW9kZWwgd2hlbiBub3QgZ2l2ZW4gc28gYSBkaXJlY3QtYWNjZXNzXG4gICAgLy8gaW5kZXggc3RpbGwgd29ya3Mgd2l0aCB6ZXJvIGV4dHJhIGNvbmZpZyAoZW1iZWQgdmlhIGBlbWJlZCgpYCBvbiBzZWVkICtcbiAgICAvLyBxdWVyeSAtIHNlZSBgcHJvdmlzaW9uYCAvIGBzZWFyY2hgKS5cbiAgICBjb25zdCBlbWJlZGRpbmdNb2RlbCA9XG4gICAgICAoYXdhaXQgdGhpcy5yZXNvbHZlRW1iZWRkaW5nTW9kZWwob3B0aW9ucy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKSA/PyB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbWJlZGRpbmdNb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBcInNlYXJjaDogY291bGQgbm90IHJlc29sdmUgYW4gZW1iZWRkaW5nIG1vZGVsOyBwYXNzIGBlbWJlZGRpbmdNb2RlbGBcIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJjcmVhdGVJbmRleFwiIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRpbWVuc2lvbiA9XG4gICAgICBvcHRpb25zLmVtYmVkZGluZ0RpbWVuc2lvbiA/PyAoYXdhaXQgdGhpcy5lbWJlZGRpbmdEaW1lbnNpb24oZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKSk7XG5cbiAgICBjb25zdCBzY2hlbWEgPSB7XG4gICAgICBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsXG4gICAgICBbc291cmNlQ29sdW1uXTogXCJzdHJpbmdcIixcbiAgICAgIC4uLihvcHRpb25zLnNjaGVtYSA/PyB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IGRpcmVjdFNwZWMgPSB7XG4gICAgICBkaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM6IHtcbiAgICAgICAgZW1iZWRkaW5nX3ZlY3Rvcl9jb2x1bW5zOiBbeyBuYW1lOiB2ZWN0b3JDb2x1bW4sIGVtYmVkZGluZ19kaW1lbnNpb246IGRpbWVuc2lvbiB9XSxcbiAgICAgICAgc2NoZW1hX2pzb246IEpTT04uc3RyaW5naWZ5KHsgLi4uc2NoZW1hLCBbdmVjdG9yQ29sdW1uXTogYGFycmF5PGZsb2F0PmAgfSksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJjcmVhdGVJbmRleFwiLCBvcHRpb25zLnNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmNyZWF0ZUluZGV4KFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBlbmRwb2ludF9uYW1lOiBlbmRwb2ludCxcbiAgICAgICAgICBwcmltYXJ5X2tleTogcHJpbWFyeUtleSxcbiAgICAgICAgICBpbmRleF90eXBlOiBkaXJlY3QgPyBcIkRJUkVDVF9BQ0NFU1NcIiA6IFwiREVMVEFfU1lOQ1wiLFxuICAgICAgICAgIC4uLihkaXJlY3RcbiAgICAgICAgICAgID8gZGlyZWN0U3BlY1xuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgZGVsdGFfc3luY19pbmRleF9zcGVjOiB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2VfdGFibGU6IG9wdGlvbnMuc291cmNlVGFibGUsXG4gICAgICAgICAgICAgICAgICBwaXBlbGluZV90eXBlOiBvcHRpb25zLnBpcGVsaW5lVHlwZSA/PyBcIlRSSUdHRVJFRFwiLFxuICAgICAgICAgICAgICAgICAgZW1iZWRkaW5nX3NvdXJjZV9jb2x1bW5zOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogc291cmNlQ29sdW1uLCBlbWJlZGRpbmdfbW9kZWxfZW5kcG9pbnRfbmFtZTogZW1iZWRkaW5nTW9kZWwgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5jb2x1bW5zVG9TeW5jICYmIG9wdGlvbnMuY29sdW1uc1RvU3luYy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8geyBjb2x1bW5zX3RvX3N5bmM6IG9wdGlvbnMuY29sdW1uc1RvU3luYyB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtY3JlYXRlZFwiLCB7XG4gICAgICBpbmRleDogbmFtZSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgdHlwZTogZGlyZWN0ID8gXCJESVJFQ1RfQUNDRVNTXCIgOiBcIkRFTFRBX1NZTkNcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBpbmRleCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBvdGhlcndpc2UgcmV0dXJuIHRoZVxuICAgKiBleGlzdGluZyBvbmUuIElkZW1wb3RlbnQgLSBzYWZlIHRvIGNhbGwgb24gZXZlcnkgYm9vdCB0byBndWFyYW50ZWUgYW5cbiAgICogaW5kZXggaXMgcHJlc2VudC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUluZGV4KG5hbWU6IHN0cmluZywgb3B0aW9uczogQ3JlYXRlSW5kZXhPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImVuc3VyZUluZGV4XCIpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVJbmRleChuYW1lLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGFuIGluZGV4IGV4aXN0cywgaXMgb25saW5lLCBhbmQgKG9wdGlvbmFsbHkpIGhvbGRzIHNlZWQgZGF0YSAtIHRoZVxuICAgKiBcIndpcmUgdXAgYSByZWFsIGluZGV4IG9uIGJvb3RcIiBwYXRoLiBJZGVtcG90ZW50IGFuZCBjaGVhcCB0byBjYWxsIGV2ZXJ5XG4gICAqIGJvb3Q6IGl0IGNyZWF0ZXMgdGhlIGVuZHBvaW50IGFuZCBpbmRleCBvbmx5IGlmIG1pc3NpbmcsIHdhaXRzIGZvciB0aGVtIHRvXG4gICAqIGNvbWUgb25saW5lLCBhbmQgc2VlZHMgZG9jdW1lbnRzIE9OTFkgd2hlbiB0aGUgaW5kZXggaXMgc3RpbGwgZW1wdHkuXG4gICAqXG4gICAqIEZvciB0aGUgZGVtby9kdW1teS1kYXRhIGNhc2UgdGhpcyBuZWVkcyBubyBEZWx0YSB0YWJsZSBhbmQgbm8gd2FyZWhvdXNlOlxuICAgKiB0aGUgZGVmYXVsdCBpcyBhIE1BTkFHRUQgZGlyZWN0LWFjY2VzcyBpbmRleCAoRGF0YWJyaWNrcyBlbWJlZHMgdGhlIGB0ZXh0YFxuICAgKiBjb2x1bW4gb24gd3JpdGUgYW5kIHF1ZXJ5KSwgc28gc2VlZGluZyBpcyBqdXN0IGFuIGBhZGREb2N1bWVudHNgIG9mIHBsYWluXG4gICAqIHJvd3MgYW5kIHNlYXJjaC1ieS10ZXh0IHdvcmtzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgcHJvdmlzaW9uKG5hbWU6IHN0cmluZywgb3B0aW9uczogUHJvdmlzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJwcm92aXNpb25cIik7XG4gICAgY29uc3Qgd2FpdCA9IG9wdGlvbnMud2FpdCA/PyB0cnVlO1xuICAgIGNvbnN0IHRpbWVvdXRNcyA9IG9wdGlvbnMudGltZW91dE1zID8/IDIwICogNjAgKiAxMDAwO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludCA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoZW5kcG9pbnQpIGF3YWl0IHRoaXMuZW5zdXJlRW5kcG9pbnQoZW5kcG9pbnQsIHsgd2FpdCwgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCB9KTtcblxuICAgIGNvbnN0IHsgc2VlZDogX3NlZWQsIHdhaXQ6IF93YWl0LCB0aW1lb3V0TXM6IF90aW1lb3V0TXMsIC4uLmNyZWF0ZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLmVuc3VyZUluZGV4KG5hbWUsIGNyZWF0ZU9wdGlvbnMpO1xuXG4gICAgaWYgKHdhaXQgJiYgIWluZm8ucmVhZHkpIGluZm8gPSBhd2FpdCB0aGlzLndhaXRGb3JJbmRleFJlYWR5KG5hbWUsIHRpbWVvdXRNcywgb3B0aW9ucy5zaWduYWwpO1xuXG4gICAgY29uc3Qgc2VlZCA9IG9wdGlvbnMuc2VlZCA/PyBbXTtcbiAgICBpZiAoc2VlZC5sZW5ndGggPiAwICYmIChpbmZvLnJvd0NvdW50ID8/IDApID09PSAwKSB7XG4gICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSBvcHRpb25zLmVtYmVkZGluZ1NvdXJjZUNvbHVtbiA/PyBcInRleHRcIjtcbiAgICAgIGNvbnN0IHZlY3RvckNvbHVtbiA9IG9wdGlvbnMuZW1iZWRkaW5nVmVjdG9yQ29sdW1uID8/IFwiZW1iZWRkaW5nXCI7XG4gICAgICAvLyBEaXJlY3QtYWNjZXNzIGluZGV4ZXMgc3RvcmUgdmVjdG9ycyB3ZSBzdXBwbHksIHNvIGVtYmVkIHRoZSB0ZXh0IGNvbHVtblxuICAgICAgLy8gZm9yIGFueSBzZWVkIHJvdyB0aGF0IGRpZCBub3QgYWxyZWFkeSBjYXJyeSBhIHZlY3Rvci5cbiAgICAgIGNvbnN0IG5lZWRFbWJlZCA9IHNlZWQuc29tZSgoZG9jKSA9PiBkb2NbdmVjdG9yQ29sdW1uXSA9PT0gdW5kZWZpbmVkKTtcbiAgICAgIGxldCByb3dzID0gc2VlZDtcbiAgICAgIGlmIChuZWVkRW1iZWQpIHtcbiAgICAgICAgY29uc3QgdGV4dHMgPSBzZWVkLm1hcCgoZG9jKSA9PiB0cmltVG9FbXB0eShTdHJpbmcoZG9jW3NvdXJjZUNvbHVtbl0gPz8gXCJcIikpKTtcbiAgICAgICAgY29uc3QgdmVjdG9ycyA9IGF3YWl0IHRoaXMuZW1iZWQodGV4dHMsIG9wdGlvbnMuZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgcm93cyA9IHNlZWQubWFwKChkb2MsIGkpID0+XG4gICAgICAgICAgZG9jW3ZlY3RvckNvbHVtbl0gPT09IHVuZGVmaW5lZCA/IHsgLi4uZG9jLCBbdmVjdG9yQ29sdW1uXTogdmVjdG9yc1tpXSB9IDogZG9jLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGREb2N1bWVudHMobmFtZSwgcm93cywgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgbG9nZ2VyLmluZm8oXCJpbmRleC1zZWVkZWRcIiwgeyBpbmRleDogbmFtZSwgY291bnQ6IHJvd3MubGVuZ3RoIH0pO1xuICAgICAgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgb3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfVxuXG4gIC8qKiBQb2xsIGFuIGluZGV4IHVudGlsIGl0IHJlcG9ydHMgcmVhZHksIG9yIHRocm93IGFmdGVyIHtAbGluayB0aW1lb3V0TXN9LiAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JJbmRleFJlYWR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0aW1lb3V0TXM6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TXM7XG4gICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgd2hpbGUgKCFpbmZvLnJlYWR5KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgc2VhcmNoOiBpbmRleCAke25hbWV9IGRpZCBub3QgY29tZSBvbmxpbmUgaW4gdGltZWAsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJwcm92aXNpb25cIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKDUwMDAsIHNpZ25hbCk7XG4gICAgICBpbmZvID0gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBzaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyIGEgc3luYyBvZiBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuICBhc3luYyBzeW5jSW5kZXgocmVmZXJlbmNlOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwic3luY0luZGV4XCIpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcInN5bmNJbmRleFwiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJzeW5jSW5kZXhcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuc3luY0luZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtc3luY2VkXCIsIHsgaW5kZXg6IG5hbWUgfSk7XG4gIH1cblxuICAvKiogRGVsZXRlIGFuIGluZGV4LiAqL1xuICBhc3luYyBkZWxldGVJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJkZWxldGVJbmRleFwiKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJkZWxldGVJbmRleFwiKTtcbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJkZWxldGVJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5kZWxldGVJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhcImluZGV4LWRlbGV0ZWRcIiwgeyBpbmRleDogbmFtZSB9KTtcbiAgfVxuXG4gIC8qKiBMaXN0IHRoZSBpbmRleGVzIGhvc3RlZCBvbiBhIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgKG5hbWUgKyB0eXBlIG9ubHkpLiAqL1xuICBhc3luYyBsaXN0SW5kZXhlcyhlbmRwb2ludD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwibGlzdEluZGV4ZXNcIik7XG4gICAgY29uc3QgZW5kcG9pbnROYW1lID0gZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gZW5kcG9pbnQgY29uZmlndXJlZCB0byBsaXN0IGluZGV4ZXNcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJsaXN0SW5kZXhlc1wiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcImxpc3RJbmRleGVzXCIsIHNpZ25hbCwgYXN5bmMgKGNsaWVudCwgY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgbmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGluZGV4IG9mIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmxpc3RJbmRleGVzKFxuICAgICAgICB7IGVuZHBvaW50X25hbWU6IGVuZHBvaW50TmFtZSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSkge1xuICAgICAgICBpZiAoaW5kZXgubmFtZSkgbmFtZXMucHVzaChpbmRleC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYW1lcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYSBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IGV4aXN0cywgY3JlYXRpbmcgYSBgU1RBTkRBUkRgIG9uZSB3aGVuIGl0XG4gICAqIGRvZXMgbm90LiBPcHRpb25hbGx5IHdhaXQgZm9yIGl0IHRvIGNvbWUgb25saW5lLiBJZGVtcG90ZW50LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRW5kcG9pbnQobmFtZT86IHN0cmluZywgb3B0aW9uczogRW5zdXJlRW5kcG9pbnRPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJlbnN1cmVFbmRwb2ludFwiKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IG5hbWUgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBlbmRwb2ludCBuYW1lIHRvIGVuc3VyZVwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVuc3VyZUVuZHBvaW50XCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJlbnN1cmVFbmRwb2ludFwiLCBvcHRpb25zLnNpZ25hbCwgYXN5bmMgKGNsaWVudCwgY29udGV4dCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xpZW50LnZlY3RvclNlYXJjaEVuZHBvaW50cy5nZXRFbmRwb2ludCh7IGVuZHBvaW50X25hbWU6IGVuZHBvaW50IH0sIGNvbnRleHQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3Qgd2FpdGVyID0gYXdhaXQgY2xpZW50LnZlY3RvclNlYXJjaEVuZHBvaW50cy5jcmVhdGVFbmRwb2ludChcbiAgICAgICAgICB7IG5hbWU6IGVuZHBvaW50LCBlbmRwb2ludF90eXBlOiBcIlNUQU5EQVJEXCIgfSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICApO1xuICAgICAgICBsb2dnZXIuaW5mbyhcImVuZHBvaW50LWNyZWF0ZWRcIiwgeyBlbmRwb2ludCB9KTtcbiAgICAgICAgaWYgKG9wdGlvbnMud2FpdCkgYXdhaXQgd2FpdGVyLndhaXQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSB3b3Jrc3BhY2UgY2xpZW50IGFuZCBydW4gb25lIGNhbGwgdW5kZXIgYSBib3VuZGVkIHRpbWVvdXQuIFRoZVxuICAgKiBjYWxsZXIncyBzaWduYWwgKGlmIGFueSkgYW5kIGEgdGltZW91dCBhcmUgbWVyZ2VkIGludG8gb25lIFNESyBgQ29udGV4dGBcbiAgICogdmlhIHtAbGluayBhcHBraXQuZGF0YWJyaWNrcy50b0NvbnRleHR9LCBzbyBlaXRoZXIgdW53aW5kcyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2l0aENsaWVudDxUPihcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICAgIGZuOiAoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLCBjb250ZXh0PzogQ29udGV4dCkgPT4gUHJvbWlzZTxUPixcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy53b3Jrc3BhY2VDbGllbnRGYWN0b3J5KCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aGlzLmNvbmZpZy50aW1lb3V0TXMpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0b0NvbnRleHQoY29udHJvbGxlciwgc2lnbmFsKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKGNsaWVudCwgY29udGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBFeGVjdXRpb25FcnJvci5jYW5jZWxlZCgpO1xuICAgICAgbG9nZ2VyLndhcm4oXCJleGVjdXRpb24tZmFpbGVkXCIsIHsgb3BlcmF0aW9uIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogVGhlIE9CTyB3b3Jrc3BhY2UgY2xpZW50IGZyb20gdGhlIGFjdGl2ZSBjb250ZXh0LCBvciBhIHNlcnZpY2UtcHJpbmNpcGFsIGNsaWVudC4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRXb3Jrc3BhY2VDbGllbnQoKTogV29ya3NwYWNlQ2xpZW50TGlrZSB7XG4gIHJldHVybiBkZWZhdWx0QXBwS2l0V29ya3NwYWNlQ2xpZW50KCkudG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoKTtcbn1cblxuLyoqIEFwcEtpdCB3b3Jrc3BhY2UtY2xpZW50IGZhY2FkZSBmcm9tIHRoZSBhY3RpdmUgcmVxdWVzdCBvciBzZXJ2aWNlIGNvbnRleHQuICovXG5mdW5jdGlvbiBkZWZhdWx0QXBwS2l0V29ya3NwYWNlQ2xpZW50KCk6IGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlIHtcbiAgY29uc3QgY3R4ID0gdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBpZiAoY3R4Py5jbGllbnQpIHJldHVybiBjdHguY2xpZW50O1xuICAvLyBPdXRzaWRlIGEgcmVxdWVzdCBzY29wZSAoYSBzY3JpcHQsIGEgdGVzdCk6IGEgZnJlc2ggZW52LWF1dGggY2xpZW50LlxuICByZXR1cm4gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbn1cblxuLyoqIENvbnN0cnVjdCBhIHtAbGluayBTZWFyY2hDbGllbnR9IGZyb20gYSByZXNvbHZlZCBjb25maWcuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VhcmNoQ2xpZW50KFxuICBjb25maWc/OiBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbiAgd29ya3NwYWNlQ2xpZW50RmFjdG9yeT86ICgpID0+IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIHJlYWRCYWNrZW5kPzogU2VhcmNoUmVhZEJhY2tlbmQsXG4pOiBTZWFyY2hDbGllbnQge1xuICByZXR1cm4gbmV3IFNlYXJjaENsaWVudChjb25maWcsIHdvcmtzcGFjZUNsaWVudEZhY3RvcnksIHJlYWRCYWNrZW5kKTtcbn1cbiJdfQ==