@dbx-tools/search 0.9.5 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/plugin.js CHANGED
@@ -20,14 +20,14 @@
20
20
  *
21
21
  * @module
22
22
  */
23
- import { Plugin, toPlugin } from "@databricks/appkit";
24
- import { aiSearch, defineTool, executeFromRegistry, toolsFromRegistry, } from "@databricks/appkit/beta";
25
- import { plugin as appkitPlugin } from "@dbx-tools/appkit";
26
- import { error as sharedError, log, string } from "@dbx-tools/shared-core";
27
- import { search as sharedSearch } from "@dbx-tools/shared-search";
23
+ import { toPlugin } from "@databricks/appkit";
24
+ import { aiSearch, defineTool } from "@databricks/appkit/beta";
25
+ import { pluginRegistry, ToolRegistryPlugin } from "@dbx-tools/appkit";
26
+ import { errorUtils, log, stringUtils } from "@dbx-tools/shared-core";
27
+ import { searchSchemas } from "@dbx-tools/shared-search";
28
28
  import { toSearchOptions, toUniversalSearchOptions } from "./_search-options.js";
29
29
  import { SEARCH_CONFIG_SCHEMA, resolveSearchConfig } from "./config.js";
30
- import { toCreateIndexOptions } from "./index-tools.js";
30
+ import { toCreateIndexOptions } from "./index-options.js";
31
31
  import { nativeAiSearchBackend } from "./native.js";
32
32
  import { toDocumentArray } from "./query.js";
33
33
  import { createSearchRuntime, setSearchReadBackend } from "./runtime.js";
@@ -52,7 +52,7 @@ const INDEX_SYNC_ROUTE = "/index/sync";
52
52
  * ```ts
53
53
  * import { createApp, server } from "@databricks/appkit";
54
54
  * import { aiSearch } from "@databricks/appkit/beta";
55
- * import { plugin as searchPlugin } from "@dbx-tools/search";
55
+ * import { search } from "@dbx-tools/search";
56
56
  *
57
57
  * await createApp({
58
58
  * plugins: [
@@ -65,7 +65,7 @@ const INDEX_SYNC_ROUTE = "/index/sync";
65
65
  * },
66
66
  * },
67
67
  * }),
68
- * searchPlugin.search({
68
+ * search({
69
69
  * index: "main.support.docs",
70
70
  * indexes: [{ name: "main.support.docs", alias: "docs" }],
71
71
  * }),
@@ -73,7 +73,7 @@ const INDEX_SYNC_ROUTE = "/index/sync";
73
73
  * });
74
74
  * ```
75
75
  */
76
- export class SearchPlugin extends Plugin {
76
+ export class SearchPlugin extends ToolRegistryPlugin {
77
77
  static manifest = {
78
78
  name: "search",
79
79
  displayName: "AI Search",
@@ -99,19 +99,19 @@ export class SearchPlugin extends Plugin {
99
99
  * autoInheritable: every tool runs under the caller's identity, so it must be
100
100
  * granted explicitly.
101
101
  */
102
- get tools() {
102
+ get toolRegistry() {
103
103
  const { config, readBackend } = this.runtime;
104
104
  const registry = {
105
105
  search: defineTool({
106
106
  description: SEARCH_TOOL_DESCRIPTION,
107
- schema: sharedSearch.searchRequestSchema,
107
+ schema: searchSchemas.searchRequestSchema,
108
108
  annotations: { effect: "read", requiresUserContext: true },
109
109
  autoInheritable: false,
110
110
  execute: async (args, signal) => this.runSearch(args, signal),
111
111
  }),
112
112
  universal_search: defineTool({
113
113
  description: UNIVERSAL_SEARCH_TOOL_DESCRIPTION,
114
- schema: sharedSearch.universalSearchRequestSchema,
114
+ schema: searchSchemas.universalSearchRequestSchema,
115
115
  annotations: { effect: "read", requiresUserContext: true },
116
116
  autoInheritable: false,
117
117
  execute: async (args, signal) => this.runUniversalSearch(args, signal),
@@ -120,9 +120,9 @@ export class SearchPlugin extends Plugin {
120
120
  if (config.allowWrite) {
121
121
  registry.add_documents = defineTool({
122
122
  description: ADD_DOCUMENTS_TOOL_DESCRIPTION,
123
- schema: sharedSearch.searchRequestSchema
123
+ schema: searchSchemas.searchRequestSchema
124
124
  .pick({ index: true })
125
- .extend({ documents: sharedSearch.searchDocumentSchema.array() }),
125
+ .extend({ documents: searchSchemas.searchDocumentSchema.array() }),
126
126
  annotations: { effect: "write", requiresUserContext: true },
127
127
  autoInheritable: false,
128
128
  execute: async (args, signal) => this.runAddDocuments(args, signal),
@@ -130,14 +130,14 @@ export class SearchPlugin extends Plugin {
130
130
  if (readBackend?.supportsLifecycle) {
131
131
  registry.create_index = defineTool({
132
132
  description: CREATE_INDEX_TOOL_DESCRIPTION,
133
- schema: sharedSearch.createIndexRequestSchema,
133
+ schema: searchSchemas.createIndexRequestSchema,
134
134
  annotations: { effect: "write", requiresUserContext: true },
135
135
  autoInheritable: false,
136
136
  execute: async (args, signal) => this.runCreateIndex(args, signal),
137
137
  });
138
138
  registry.sync_index = defineTool({
139
139
  description: SYNC_INDEX_TOOL_DESCRIPTION,
140
- schema: sharedSearch.syncIndexRequestSchema,
140
+ schema: searchSchemas.syncIndexRequestSchema,
141
141
  annotations: { effect: "write", requiresUserContext: true },
142
142
  autoInheritable: false,
143
143
  execute: async (args, signal) => this.runSyncIndex(args, signal),
@@ -171,7 +171,7 @@ export class SearchPlugin extends Plugin {
171
171
  }
172
172
  /** Resolve the registered AppKit-compatible AI Search provider. */
173
173
  resolveProviderBackend() {
174
- const provider = appkitPlugin.require(this.context, aiSearch, this).exports();
174
+ const provider = pluginRegistry.require(this.context, aiSearch, this).exports();
175
175
  return nativeAiSearchBackend(provider, resolveSearchConfig(this.config));
176
176
  }
177
177
  /**
@@ -184,7 +184,7 @@ export class SearchPlugin extends Plugin {
184
184
  const spec = config.ensureOnSetup;
185
185
  if (!spec)
186
186
  return;
187
- const index = string.trimToNull(spec.index) ?? config.defaultIndex;
187
+ const index = stringUtils.trimToNull(spec.index) ?? config.defaultIndex;
188
188
  if (!index) {
189
189
  logger.warn("ensure-skipped", {
190
190
  reason: "no index name (set `index` or `ensureOnSetup.index`)",
@@ -217,7 +217,7 @@ export class SearchPlugin extends Plugin {
217
217
  });
218
218
  }
219
219
  catch (cause) {
220
- logger.warn("ensure-failed", { index, message: sharedError.errorMessage(cause) });
220
+ logger.warn("ensure-failed", { index, message: errorUtils.errorMessage(cause) });
221
221
  }
222
222
  }
223
223
  /** Build a Vector Search `schema_json` map from a seed document's value types. */
@@ -255,7 +255,7 @@ export class SearchPlugin extends Plugin {
255
255
  path: UNIVERSAL_ROUTE,
256
256
  handler: async (req, res) => {
257
257
  await this.respond(res, "universalSearch", () => {
258
- const request = sharedSearch.universalSearchRequestSchema.parse(req.body ?? {});
258
+ const request = searchSchemas.universalSearchRequestSchema.parse(req.body ?? {});
259
259
  return this.asUser(req).runUniversalSearch(request);
260
260
  });
261
261
  },
@@ -322,7 +322,7 @@ export class SearchPlugin extends Plugin {
322
322
  res.json(await run());
323
323
  }
324
324
  catch (cause) {
325
- const message = sharedError.errorMessage(cause);
325
+ const message = errorUtils.errorMessage(cause);
326
326
  logger.warn("route-failed", { operation, message });
327
327
  res.status(500).json({ error: message });
328
328
  }
@@ -344,14 +344,6 @@ export class SearchPlugin extends Plugin {
344
344
  };
345
345
  return payload;
346
346
  }
347
- /** AppKit `ToolProvider`: the tool definitions offered to an agent. */
348
- getAgentTools() {
349
- return toolsFromRegistry(this.tools);
350
- }
351
- /** AppKit `ToolProvider`: run one tool call, validating input against its schema. */
352
- async executeAgentTool(name, args, signal) {
353
- return executeFromRegistry(this.tools, name, args, signal);
354
- }
355
347
  exports() {
356
348
  return {
357
349
  /** Search one index (default when omitted). Runs as the current context user. */
@@ -367,12 +359,12 @@ export class SearchPlugin extends Plugin {
367
359
  };
368
360
  }
369
361
  async runSearch(args, signal) {
370
- const request = sharedSearch.searchRequestSchema.parse(args);
362
+ const request = searchSchemas.searchRequestSchema.parse(args);
371
363
  const { client } = this.runtime;
372
364
  return client.search(request.query, toSearchOptions(request, signal));
373
365
  }
374
366
  async runUniversalSearch(args, signal) {
375
- const request = sharedSearch.universalSearchRequestSchema.parse(args);
367
+ const request = searchSchemas.universalSearchRequestSchema.parse(args);
376
368
  const { client } = this.runtime;
377
369
  return client.universalSearch(request.query, toUniversalSearchOptions(request, signal));
378
370
  }
@@ -384,12 +376,12 @@ export class SearchPlugin extends Plugin {
384
376
  return client.addDocuments(index, documents, signal);
385
377
  }
386
378
  async runCreateIndex(args, signal) {
387
- const request = sharedSearch.createIndexRequestSchema.parse(args);
379
+ const request = searchSchemas.createIndexRequestSchema.parse(args);
388
380
  const { client } = this.runtime;
389
381
  return client.createIndex(request.name, toCreateIndexOptions(request, signal));
390
382
  }
391
383
  async runSyncIndex(args, signal) {
392
- const request = sharedSearch.syncIndexRequestSchema.parse(args);
384
+ const request = searchSchemas.syncIndexRequestSchema.parse(args);
393
385
  const { client, config } = this.runtime;
394
386
  const index = request.index ?? config.defaultIndex ?? "";
395
387
  await client.syncIndex(index, signal);
@@ -402,8 +394,8 @@ export class SearchPlugin extends Plugin {
402
394
  * @example
403
395
  * ```ts
404
396
  * import { createApp, server } from "@databricks/appkit";
405
- * import { plugin as searchPlugin } from "@dbx-tools/search";
406
- * import { agents, plugin as mastraPlugin } from "@dbx-tools/appkit-mastra";
397
+ * import { search } from "@dbx-tools/search";
398
+ * import { agents, mastra } from "@dbx-tools/appkit-mastra";
407
399
  *
408
400
  * const support = agents.createAgent({
409
401
  * instructions: "Answer from the docs; use `search` to find them.",
@@ -415,11 +407,11 @@ export class SearchPlugin extends Plugin {
415
407
  * await createApp({
416
408
  * plugins: [
417
409
  * server(),
418
- * searchPlugin.search({ index: "main.support.docs" }),
419
- * mastraPlugin.mastra({ agents: support }),
410
+ * search({ index: "main.support.docs" }),
411
+ * mastra({ agents: support }),
420
412
  * ],
421
413
  * });
422
414
  * ```
423
415
  */
424
416
  export const search = toPlugin(SearchPlugin);
425
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQXdDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUYsT0FBTyxFQUNMLFFBQVEsRUFDUixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLGlCQUFpQixHQUlsQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxNQUFNLElBQUksWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssSUFBSSxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLElBQUksWUFBWSxFQUEyQixNQUFNLDBCQUEwQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBc0IsTUFBTSxjQUFjLENBQUM7QUFDN0YsT0FBTyxFQUNMLDhCQUE4QixFQUM5Qiw2QkFBNkIsRUFDN0IsdUJBQXVCLEVBQ3ZCLDJCQUEyQixFQUMzQixpQ0FBaUMsR0FDbEMsTUFBTSxhQUFhLENBQUM7QUFFckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVw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RUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQWEsRUFBRSxNQUFvQjtRQUM1RCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQ3pELE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQzs7QUFHSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IGV4dGVuc2lvbiBwbHVnaW4gKHJlZ2lzdGVyZWQgbmFtZTogYHNlYXJjaGApIGFyb3VuZCBhIHNpYmxpbmdcbiAqIGBhaVNlYXJjaGAgcHJvdmlkZXIuIE5hdGl2ZSBBcHBLaXQgb3ducyBWZWN0b3IgU2VhcmNoIHF1ZXJ5IGV4ZWN1dGlvbjsgdGhpc1xuICogcGx1Z2luIGFkZHMgdGhlIHN1cmZhY2VzIHRoYXQgcmVtYWluIHVzZWZ1bCBhY3Jvc3MgbmF0aXZlIGFuZCBMYWtlYmFzZVxuICogcHJvdmlkZXJzOlxuICpcbiAqICAgLSBhIGBzZWFyY2hgIC8gYHVuaXZlcnNhbF9zZWFyY2hgIC8gKG9wdC1pbikgYGFkZF9kb2N1bWVudHNgIHRvb2wgc2V0IGZvclxuICogICAgIGJvdGggTWFzdHJhIGFuZCBBcHBLaXQgYWdlbnRzIChhdXRvY29tcGxldGUgaXMgYSBzbWFsbC1gbGltaXRgIHNlYXJjaCk7XG4gKiAgIC0gY29tcGF0aWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHJvdXRlcyB1bmRlciBgL2FwaS9zZWFyY2hgXG4gKiAgICAgKGBQT1NUIC9gIHNlYXJjaCwgYFBPU1QgL3VuaXZlcnNhbGAgZmVkZXJhdGVkLCBgR0VUIC9pbmRleGVzYCBjYXRhbG9ndWUsXG4gKiAgICAgYW5kIGBQT1NUIC9kb2N1bWVudHNgIHdoZW4gd3JpdGVzIGFyZSBlbmFibGVkKTtcbiAqICAgLSBhIGBjbGllbnRDb25maWcoKWAgcGF5bG9hZCBzbyBhIFVJIGtub3dzIHRoZSBpbmRleGVzLCBkZWZhdWx0LCBhbmQgcGFnZVxuICogICAgIHNpemUgYXQgYm9vdCB3aXRoIG5vIHJvdW5kLXRyaXA7XG4gKiAgIC0gYGV4cG9ydHMoKWAgc28gYXBwIGNvZGUgY2FuIGBhcHBraXQuc2VhcmNoLnNlYXJjaCguLi4pYCBkaXJlY3RseS5cbiAqXG4gKiBWZWN0b3IgU2VhcmNoIHJlYWRzIGRlbGVnYXRlIHRvIHRoZSByZWdpc3RlcmVkIG5hdGl2ZSBBcHBLaXQgYGFpU2VhcmNoYFxuICogcGx1Z2luLCBwcmVzZXJ2aW5nIGl0cyBPQk8sIGNhY2hpbmcsIHJlcmFua2luZywgYW5kIHJlc3BvbnNlIGhhbmRsaW5nLiBUaGVcbiAqIGFsdGVybmF0aXZlIGBsYWtlYmFzZUFpU2VhcmNoYCBwcm92aWRlciBzdXBwbGllcyB0aGUgc2FtZSBxdWVyeSBjb250cmFjdFxuICogb3ZlciBQb3N0Z3JlU1FMIGZ1bGwtdGV4dCBzZWFyY2guXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFBsdWdpbiwgdG9QbHVnaW4sIHR5cGUgSUFwcFJvdXRlciwgdHlwZSBQbHVnaW5NYW5pZmVzdCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGFpU2VhcmNoLFxuICBkZWZpbmVUb29sLFxuICBleGVjdXRlRnJvbVJlZ2lzdHJ5LFxuICB0b29sc0Zyb21SZWdpc3RyeSxcbiAgdHlwZSBBZ2VudFRvb2xEZWZpbml0aW9uLFxuICB0eXBlIFRvb2xQcm92aWRlcixcbiAgdHlwZSBUb29sUmVnaXN0cnksXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgcGx1Z2luIGFzIGFwcGtpdFBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXJyb3IgYXMgc2hhcmVkRXJyb3IsIGxvZywgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHNlYXJjaCBhcyBzaGFyZWRTZWFyY2gsIHR5cGUgU2VhcmNoQ2xpZW50Q29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHsgdG9TZWFyY2hPcHRpb25zLCB0b1VuaXZlcnNhbFNlYXJjaE9wdGlvbnMgfSBmcm9tIFwiLi9fc2VhcmNoLW9wdGlvbnMudHNcIjtcbmltcG9ydCB7IFNFQVJDSF9DT05GSUdfU0NIRU1BLCByZXNvbHZlU2VhcmNoQ29uZmlnLCB0eXBlIFNlYXJjaFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgdG9DcmVhdGVJbmRleE9wdGlvbnMgfSBmcm9tIFwiLi9pbmRleC10b29scy50c1wiO1xuaW1wb3J0IHsgbmF0aXZlQWlTZWFyY2hCYWNrZW5kIH0gZnJvbSBcIi4vbmF0aXZlLnRzXCI7XG5pbXBvcnQgeyB0b0RvY3VtZW50QXJyYXkgfSBmcm9tIFwiLi9xdWVyeS50c1wiO1xuaW1wb3J0IHsgY3JlYXRlU2VhcmNoUnVudGltZSwgc2V0U2VhcmNoUmVhZEJhY2tlbmQsIHR5cGUgU2VhcmNoUnVudGltZSB9IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB7XG4gIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTixcbiAgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2hcIik7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3IgYSB1bml2ZXJzYWwgKGZlZGVyYXRlZCkgc2VhcmNoIGFjcm9zcyBpbmRleGVzLiAqL1xuY29uc3QgVU5JVkVSU0FMX1JPVVRFID0gXCIvdW5pdmVyc2FsXCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBzZXJ2aW5nIHRoZSBpbmRleCBjYXRhbG9ndWUgYSBzZWFyY2ggYm94IHJlYWRzLiAqL1xuY29uc3QgSU5ERVhFU19ST1VURSA9IFwiL2luZGV4ZXNcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBhZGRpbmcgZG9jdW1lbnRzIHRvIGEgZGlyZWN0LWFjY2VzcyBpbmRleC4gKi9cbmNvbnN0IERPQ1VNRU5UU19ST1VURSA9IFwiL2RvY3VtZW50c1wiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIGNyZWF0aW5nIGEgVmVjdG9yIFNlYXJjaCBpbmRleC4gKi9cbmNvbnN0IElOREVYX1JPVVRFID0gXCIvaW5kZXhcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBzeW5jaW5nIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG5jb25zdCBJTkRFWF9TWU5DX1JPVVRFID0gXCIvaW5kZXgvc3luY1wiO1xuXG4vKipcbiAqIEFwcEtpdCBleHRlbnNpb24gcGx1Z2luIGZvciBhZ2VudCB0b29scywgZmVkZXJhdGVkIHNlYXJjaCwgYW5kIG9wdGlvbmFsXG4gKiBWZWN0b3IgU2VhcmNoIGxpZmVjeWNsZSBvcGVyYXRpb25zLiBSZWdpc3RlciBgYWlTZWFyY2goKWAgb3JcbiAqIGBsYWtlYmFzZUFpU2VhcmNoKClgIGJlZm9yZSB0aGlzIHBsdWdpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYWlTZWFyY2ggfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiBhcyBzZWFyY2hQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgYWlTZWFyY2goe1xuICogICAgICAgaW5kZXhlczoge1xuICogICAgICAgICBkb2NzOiB7XG4gKiAgICAgICAgICAgaW5kZXhOYW1lOiBcIm1haW4uc3VwcG9ydC5kb2NzXCIsXG4gKiAgICAgICAgICAgY29sdW1uczogW1wiaWRcIiwgXCJ0aXRsZVwiLCBcImJvZHlcIl0sXG4gKiAgICAgICAgIH0sXG4gKiAgICAgICB9LFxuICogICAgIH0pLFxuICogICAgIHNlYXJjaFBsdWdpbi5zZWFyY2goe1xuICogICAgICAgaW5kZXg6IFwibWFpbi5zdXBwb3J0LmRvY3NcIixcbiAqICAgICAgIGluZGV4ZXM6IFt7IG5hbWU6IFwibWFpbi5zdXBwb3J0LmRvY3NcIiwgYWxpYXM6IFwiZG9jc1wiIH1dLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIFBsdWdpbjxTZWFyY2hQbHVnaW5Db25maWc+IGltcGxlbWVudHMgVG9vbFByb3ZpZGVyIHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwic2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQUkgU2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXhlczogYWdlbnQgdG9vbHMsIEhUVFAgcm91dGVzIGZvciBhIFwiICtcbiAgICAgIFwic2VhcmNoIGJveCwgdW5pdmVyc2FsIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcywgYW5kIGFuIG9wdC1pbiBkb2N1bWVudCB3cml0ZSBzdXJmYWNlLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW10sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBTRUFSQ0hfQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcInNlYXJjaFwiPjtcblxuICAvKiogUnVudGltZSBvd25lZCBleGNsdXNpdmVseSBieSB0aGlzIHBsdWdpbiBpbnN0YW5jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lOiBTZWFyY2hSdW50aW1lID0gY3JlYXRlU2VhcmNoUnVudGltZSh7IGNvbmZpZzogdGhpcy5jb25maWcgfSk7XG5cbiAgLyoqIFRoZSBiYXNlIHBhdGggQXBwS2l0IG1vdW50cyB0aGlzIHBsdWdpbidzIHJvdXRlcyB1bmRlci4gKi9cbiAgcHJpdmF0ZSBnZXQgYmFzZVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC9hcGkvJHtTZWFyY2hQbHVnaW4ubWFuaWZlc3QubmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b29scyB0aGlzIHBsdWdpbiBvZmZlcnMgdG8gYW4gQXBwS2l0IGFnZW50LiBgc2VhcmNoYCAvXG4gICAqIGB1bml2ZXJzYWxfc2VhcmNoYCBhcmUgcmVhZHM7IGBhZGRfZG9jdW1lbnRzYCAvIGBjcmVhdGVfaW5kZXhgIC9cbiAgICogYHN5bmNfaW5kZXhgIGFyZSBvbmx5IG9mZmVyZWQgd2hlbiB0aGUgd3JpdGUgc3VyZmFjZSBpcyBlbmFibGVkLiBOb25lIGlzXG4gICAqIGF1dG9Jbmhlcml0YWJsZTogZXZlcnkgdG9vbCBydW5zIHVuZGVyIHRoZSBjYWxsZXIncyBpZGVudGl0eSwgc28gaXQgbXVzdCBiZVxuICAgKiBncmFudGVkIGV4cGxpY2l0bHkuXG4gICAqL1xuICBwcml2YXRlIGdldCB0b29scygpOiBUb29sUmVnaXN0cnkge1xuICAgIGNvbnN0IHsgY29uZmlnLCByZWFkQmFja2VuZCB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IHJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgICBzZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnNlYXJjaFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5TZWFyY2goYXJncywgc2lnbmFsKSxcbiAgICAgIH0pLFxuICAgICAgdW5pdmVyc2FsX3NlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5Vbml2ZXJzYWxTZWFyY2goYXJncywgc2lnbmFsKSxcbiAgICAgIH0pLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICByZWdpc3RyeS5hZGRfZG9jdW1lbnRzID0gZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBBRERfRE9DVU1FTlRTX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnNlYXJjaFJlcXVlc3RTY2hlbWFcbiAgICAgICAgICAucGljayh7IGluZGV4OiB0cnVlIH0pXG4gICAgICAgICAgLmV4dGVuZCh7IGRvY3VtZW50czogc2hhcmVkU2VhcmNoLnNlYXJjaERvY3VtZW50U2NoZW1hLmFycmF5KCkgfSksXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQWRkRG9jdW1lbnRzKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KTtcbiAgICAgIGlmIChyZWFkQmFja2VuZD8uc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgICAgcmVnaXN0cnkuY3JlYXRlX2luZGV4ID0gZGVmaW5lVG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLmNyZWF0ZUluZGV4UmVxdWVzdFNjaGVtYSxcbiAgICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5DcmVhdGVJbmRleChhcmdzLCBzaWduYWwpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVnaXN0cnkuc3luY19pbmRleCA9IGRlZmluZVRvb2woe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgICAgc2NoZW1hOiBzaGFyZWRTZWFyY2guc3luY0luZGV4UmVxdWVzdFNjaGVtYSxcbiAgICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5TeW5jSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyeTtcbiAgfVxuXG4gIC8qKiBBdHRhY2ggdGhlIHJlZ2lzdGVyZWQgcHJvdmlkZXIgYW5kIGxvZyB0aGUgZWZmZWN0aXZlIHBvbGljeSBhdCBib290LiAqL1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWFkQmFja2VuZCA9IHRoaXMucmVzb2x2ZVByb3ZpZGVyQmFja2VuZCgpO1xuICAgIHNldFNlYXJjaFJlYWRCYWNrZW5kKHRoaXMucnVudGltZSwgcmVhZEJhY2tlbmQpO1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBiYWNrZW5kOiByZWFkQmFja2VuZC5zdXBwb3J0c0xpZmVjeWNsZSA/IFwiYXBwa2l0LWFpLXNlYXJjaFwiIDogXCJsYWtlYmFzZS1haS1zZWFyY2hcIixcbiAgICAgIGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIihub25lIC0gcGFzcyBwZXIgcmVxdWVzdClcIixcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaSkgPT4gaS5hbGlhcyksXG4gICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2VTaXplLFxuICAgICAgbW9kZTogY29uZmlnLm1vZGUsXG4gICAgICBhbGxvd1dyaXRlOiBjb25maWcuYWxsb3dXcml0ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgZW5zdXJlT25TZXR1cDogY29uZmlnLmVuc3VyZU9uU2V0dXBcbiAgICAgICAgPyAoY29uZmlnLmVuc3VyZU9uU2V0dXAuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleClcbiAgICAgICAgOiBcIm9mZlwiLFxuICAgIH0pO1xuICAgIC8vIFByb3Zpc2lvbiBhIHJlYWwgaW5kZXggaW4gdGhlIEJBQ0tHUk9VTkQgc28gYSBzbG93IGZpcnN0LXRpbWUgZW5kcG9pbnQgb3JcbiAgICAvLyBpbmRleCBidWlsZCBuZXZlciBibG9ja3MgdGhlIHNlcnZlciBmcm9tIGNvbWluZyB1cC5cbiAgICBpZiAoY29uZmlnLmVuc3VyZU9uU2V0dXAgJiYgcmVhZEJhY2tlbmQuc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgIHZvaWQgdGhpcy5ydW5FbnN1cmVPblNldHVwKGNvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc29sdmUgdGhlIHJlZ2lzdGVyZWQgQXBwS2l0LWNvbXBhdGlibGUgQUkgU2VhcmNoIHByb3ZpZGVyLiAqL1xuICBwcml2YXRlIHJlc29sdmVQcm92aWRlckJhY2tlbmQoKTogUmV0dXJuVHlwZTx0eXBlb2YgbmF0aXZlQWlTZWFyY2hCYWNrZW5kPiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBhcHBraXRQbHVnaW4ucmVxdWlyZSh0aGlzLmNvbnRleHQsIGFpU2VhcmNoLCB0aGlzKS5leHBvcnRzKCk7XG4gICAgcmV0dXJuIG5hdGl2ZUFpU2VhcmNoQmFja2VuZChwcm92aWRlciwgcmVzb2x2ZVNlYXJjaENvbmZpZyh0aGlzLmNvbmZpZykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSB0aGUgZW5kcG9pbnQgKyBpbmRleCBleGlzdCBhbmQgc2VlZCB0aGVtLCBob25vcmluZyBgZW5zdXJlT25TZXR1cGAuXG4gICAqIFVzZXMgYm9vdC10aW1lIFNESyBhdXRoIChlbnYgLyBjb25maWcgcHJvZmlsZSkgdmlhIHRoZSBjbGllbnQnc1xuICAgKiBvdXQtb2YtcmVxdWVzdCBmYWxsYmFjay4gRmFpbHVyZXMgYXJlIGxvZ2dlZCwgbmV2ZXIgdGhyb3duIC0gYSBzZWFyY2ggYXBwXG4gICAqIHNob3VsZCBzdGlsbCBzdGFydCBldmVuIGlmIHByb3Zpc2lvbmluZyBpcyBzbG93IG9yIGEgcGVybWlzc2lvbiBpcyBtaXNzaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5FbnN1cmVPblNldHVwKGNvbmZpZzogU2VhcmNoUnVudGltZVtcImNvbmZpZ1wiXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNwZWMgPSBjb25maWcuZW5zdXJlT25TZXR1cDtcbiAgICBpZiAoIXNwZWMpIHJldHVybjtcbiAgICBjb25zdCBpbmRleCA9IHN0cmluZy50cmltVG9OdWxsKHNwZWMuaW5kZXgpID8/IGNvbmZpZy5kZWZhdWx0SW5kZXg7XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJlbnN1cmUtc2tpcHBlZFwiLCB7XG4gICAgICAgIHJlYXNvbjogXCJubyBpbmRleCBuYW1lIChzZXQgYGluZGV4YCBvciBgZW5zdXJlT25TZXR1cC5pbmRleGApXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZG9jdW1lbnRzID0gc3BlYy5kb2N1bWVudHMgPz8gW107XG4gICAgLy8gSW5mZXIgYSBtYW5hZ2VkLWRpcmVjdC1hY2Nlc3Mgc2NoZW1hIGZyb20gdGhlIGZpcnN0IHNlZWQgcm93IHdoZW4gbm90IGdpdmVuLlxuICAgIGNvbnN0IHNjaGVtYSA9XG4gICAgICBzcGVjLnNjaGVtYSA/P1xuICAgICAgKGRvY3VtZW50cy5sZW5ndGggPiAwICYmICFzcGVjLnNvdXJjZVRhYmxlXG4gICAgICAgID8gdGhpcy5pbmZlclNjaGVtYShkb2N1bWVudHNbMF0sIHNwZWMucHJpbWFyeUtleSA/PyBcImlkXCIsIHNwZWMudGV4dENvbHVtbiA/PyBcInRleHRcIilcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICAgIHRyeSB7XG4gICAgICBsb2dnZXIuaW5mbyhcImVuc3VyZS1zdGFydFwiLCB7IGluZGV4IH0pO1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMucnVudGltZTtcbiAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBjbGllbnQucHJvdmlzaW9uKGluZGV4LCB7XG4gICAgICAgIC4uLihzcGVjLmVuZHBvaW50ID8geyBlbmRwb2ludDogc3BlYy5lbmRwb2ludCB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5wcmltYXJ5S2V5ID8geyBwcmltYXJ5S2V5OiBzcGVjLnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMudGV4dENvbHVtbiA/IHsgZW1iZWRkaW5nU291cmNlQ29sdW1uOiBzcGVjLnRleHRDb2x1bW4gfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMuZW1iZWRkaW5nTW9kZWwgPyB7IGVtYmVkZGluZ01vZGVsOiBzcGVjLmVtYmVkZGluZ01vZGVsIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnNvdXJjZVRhYmxlID8geyBzb3VyY2VUYWJsZTogc3BlYy5zb3VyY2VUYWJsZSB9IDoge30pLFxuICAgICAgICAuLi4oc2NoZW1hID8geyBzY2hlbWEgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMudGltZW91dE1zID8geyB0aW1lb3V0TXM6IHNwZWMudGltZW91dE1zIH0gOiB7fSksXG4gICAgICAgIC4uLihkb2N1bWVudHMubGVuZ3RoID4gMCA/IHsgc2VlZDogZG9jdW1lbnRzIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5pbmZvKFwiZW5zdXJlLXJlYWR5XCIsIHtcbiAgICAgICAgaW5kZXg6IGluZm8ubmFtZSxcbiAgICAgICAgcmVhZHk6IGluZm8ucmVhZHksXG4gICAgICAgIHJvd0NvdW50OiBpbmZvLnJvd0NvdW50ID8/IDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJlbnN1cmUtZmFpbGVkXCIsIHsgaW5kZXgsIG1lc3NhZ2U6IHNoYXJlZEVycm9yLmVycm9yTWVzc2FnZShjYXVzZSkgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIGEgVmVjdG9yIFNlYXJjaCBgc2NoZW1hX2pzb25gIG1hcCBmcm9tIGEgc2VlZCBkb2N1bWVudCdzIHZhbHVlIHR5cGVzLiAqL1xuICBwcml2YXRlIGluZmVyU2NoZW1hKFxuICAgIGRvYzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcHJpbWFyeUtleTogc3RyaW5nLFxuICAgIHRleHRDb2x1bW46IHN0cmluZyxcbiAgKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsIFt0ZXh0Q29sdW1uXTogXCJzdHJpbmdcIiB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRvYykpIHtcbiAgICAgIGlmIChrZXkgaW4gc2NoZW1hKSBjb250aW51ZTtcbiAgICAgIHNjaGVtYVtrZXldID1cbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgPyBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKVxuICAgICAgICAgICAgPyBcImludFwiXG4gICAgICAgICAgICA6IFwiZG91YmxlXCJcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgICAgID8gXCJib29sZWFuXCJcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIjtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKiBSZWxlYXNlIHRoaXMgcGx1Z2luJ3MgaW5zdGFuY2Utb3duZWQgcnVudGltZS4gKi9cbiAgc2h1dGRvd24oKTogdm9pZCB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IGV4dGVuc2lvbiByb3V0ZXMgdW5kZXIgYC9hcGkvc2VhcmNoYC4gU2luZ2xlLWluZGV4IHF1ZXJpZXMgc3RheSBvblxuICAgKiB0aGUgcHJvdmlkZXIncyBuYXRpdmUgYC9hcGkvYWktc2VhcmNoLzphbGlhcy9xdWVyeWAgc3VyZmFjZS5cbiAgICovXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJ1bml2ZXJzYWxTZWFyY2hcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBVTklWRVJTQUxfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJ1bml2ZXJzYWxTZWFyY2hcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2gudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShyZXEuYm9keSA/PyB7fSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXNVc2VyKHJlcSkucnVuVW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiaW5kZXhlc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogSU5ERVhFU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLmpzb24odGhpcy5jbGllbnRDb25maWcoKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRvY3VtZW50c1wiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IERPQ1VNRU5UU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZyB9ID0gdGhpcy5ydW50aW1lO1xuICAgICAgICBpZiAoIWNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgZG9jdW1lbnQgd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcImFkZERvY3VtZW50c1wiLCAoKSA9PlxuICAgICAgICAgIHRoaXMuYXNVc2VyKHJlcSkucnVuQWRkRG9jdW1lbnRzKHJlcS5ib2R5ID8/IHt9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiY3JlYXRlSW5kZXhcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBJTkRFWF9ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZywgcmVhZEJhY2tlbmQgfSA9IHRoaXMucnVudGltZTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSB8fCAhcmVhZEJhY2tlbmQ/LnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgaW5kZXggd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcImNyZWF0ZUluZGV4XCIsICgpID0+XG4gICAgICAgICAgdGhpcy5hc1VzZXIocmVxKS5ydW5DcmVhdGVJbmRleChyZXEuYm9keSA/PyB7fSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcInN5bmNJbmRleFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IElOREVYX1NZTkNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUgfHwgIXJlYWRCYWNrZW5kPy5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGluZGV4IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJzeW5jSW5kZXhcIiwgKCkgPT4gdGhpcy5hc1VzZXIocmVxKS5ydW5TeW5jSW5kZXgocmVxLmJvZHkgPz8ge30pKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgcm91dGUgYm9keSwgdHVybmluZyBhIGZhaWx1cmUgaW50byBhIEpTT04gZXJyb3IgcmVzcG9uc2UuXG4gICAqXG4gICAqIEFwcEtpdCdzIGByb3V0ZSgpYCByZWdpc3RlcnMgdGhlIGhhbmRsZXIgYXMtaXMsIHNvIGEgcmVqZWN0aW9uIGVzY2FwZXMgYXNcbiAgICogYW4gdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIGFuZCB0YWtlcyB0aGUgd2hvbGUgcHJvY2VzcyBkb3duIHJhdGhlciB0aGFuXG4gICAqIGZhaWxpbmcgdGhlIG9uZSByZXF1ZXN0LiBFdmVyeSByb3V0ZSBoZXJlIGdvZXMgdGhyb3VnaCB0aGlzLCBzbyBhIGJhZCBpbmRleFxuICAgKiBuYW1lIG9yIGEgVmVjdG9yIFNlYXJjaCBBUEkgZXJyb3IgcmV0dXJucyA1MDAgd2l0aCBhIG1lc3NhZ2UgaW5zdGVhZCBvZlxuICAgKiBraWxsaW5nIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc3BvbmQoXG4gICAgcmVzOiBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8SUFwcFJvdXRlcltcInBvc3RcIl0+WzFdPlsxXSxcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBydW46ICgpID0+IFByb21pc2U8dW5rbm93bj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXMuanNvbihhd2FpdCBydW4oKSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBzaGFyZWRFcnJvci5lcnJvck1lc3NhZ2UoY2F1c2UpO1xuICAgICAgbG9nZ2VyLndhcm4oXCJyb3V0ZS1mYWlsZWRcIiwgeyBvcGVyYXRpb24sIG1lc3NhZ2UgfSk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBtZXNzYWdlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdXJmYWNlIHRoZSBpbmRleCBjYXRhbG9ndWUgKyBkZWZhdWx0cyBzbyBhIHNlYXJjaCBib3ggbmVlZHMgbm8gcm91bmQtdHJpcC4gKi9cbiAgb3ZlcnJpZGUgY2xpZW50Q29uZmlnKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCB7IGNvbmZpZyB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaENsaWVudENvbmZpZyA9IHtcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgIG5hbWU6IGluZGV4Lm5hbWUsXG4gICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgLi4uKGluZGV4LnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IGluZGV4LnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4LmNvbHVtbnMgPyB7IGNvbHVtbnM6IGluZGV4LmNvbHVtbnMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4Lm5hbWUgPT09IGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGlzRGVmYXVsdDogdHJ1ZSB9IDoge30pLFxuICAgICAgfSkpLFxuICAgICAgLi4uKGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCB9IDoge30pLFxuICAgICAgcGFnZVNpemU6IGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgIH07XG4gICAgcmV0dXJuIHBheWxvYWQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIC8qKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHRoZSB0b29sIGRlZmluaXRpb25zIG9mZmVyZWQgdG8gYW4gYWdlbnQuICovXG4gIGdldEFnZW50VG9vbHMoKTogQWdlbnRUb29sRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdG9vbHNGcm9tUmVnaXN0cnkodGhpcy50b29scyk7XG4gIH1cblxuICAvKiogQXBwS2l0IGBUb29sUHJvdmlkZXJgOiBydW4gb25lIHRvb2wgY2FsbCwgdmFsaWRhdGluZyBpbnB1dCBhZ2FpbnN0IGl0cyBzY2hlbWEuICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudFRvb2wobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBleGVjdXRlRnJvbVJlZ2lzdHJ5KHRoaXMudG9vbHMsIG5hbWUsIGFyZ3MsIHNpZ25hbCk7XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvKiogU2VhcmNoIG9uZSBpbmRleCAoZGVmYXVsdCB3aGVuIG9taXR0ZWQpLiBSdW5zIGFzIHRoZSBjdXJyZW50IGNvbnRleHQgdXNlci4gKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IHNoYXJlZFNlYXJjaC5TZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5TZWFyY2gocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBTZWFyY2ggYWNyb3NzIGV2ZXJ5IGNvbmZpZ3VyZWQgaW5kZXggYW5kIG1lcmdlIHRoZSBoaXRzLiAqL1xuICAgICAgdW5pdmVyc2FsU2VhcmNoOiAocmVxdWVzdDogc2hhcmVkU2VhcmNoLlVuaXZlcnNhbFNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBpbmRleCAodGhyb3dzIHdoZW4gd3JpdGVzIGFyZSBkaXNhYmxlZCkuICovXG4gICAgICBhZGREb2N1bWVudHM6IChyZXF1ZXN0OiB7IGluZGV4Pzogc3RyaW5nOyBkb2N1bWVudHM6IHVua25vd24gfSwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuQWRkRG9jdW1lbnRzKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogQ3JlYXRlIGEgVmVjdG9yIFNlYXJjaCBpbmRleCAodGhyb3dzIHdoZW4gd3JpdGVzIGFyZSBkaXNhYmxlZCkuICovXG4gICAgICBjcmVhdGVJbmRleDogKHJlcXVlc3Q6IHNoYXJlZFNlYXJjaC5DcmVhdGVJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkNyZWF0ZUluZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU3luYyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIHN5bmNJbmRleDogKHJlcXVlc3Q6IHNoYXJlZFNlYXJjaC5TeW5jSW5kZXhSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5TeW5jSW5kZXgocmVxdWVzdCwgc2lnbmFsKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TZWFyY2goYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2hhcmVkU2VhcmNoLnNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMucnVudGltZTtcbiAgICByZXR1cm4gY2xpZW50LnNlYXJjaChyZXF1ZXN0LnF1ZXJ5LCB0b1NlYXJjaE9wdGlvbnMocmVxdWVzdCwgc2lnbmFsKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blVuaXZlcnNhbFNlYXJjaChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2gudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gdGhpcy5ydW50aW1lO1xuICAgIHJldHVybiBjbGllbnQudW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QucXVlcnksIHRvVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyhyZXF1ZXN0LCBzaWduYWwpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWRkRG9jdW1lbnRzKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVjb3JkID0gKGFyZ3MgPz8ge30pIGFzIHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9O1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBjb25zdCBkb2N1bWVudHMgPSB0b0RvY3VtZW50QXJyYXkocmVjb3JkLmRvY3VtZW50cyk7XG4gICAgY29uc3QgaW5kZXggPSByZWNvcmQuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIHJldHVybiBjbGllbnQuYWRkRG9jdW1lbnRzKGluZGV4LCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkNyZWF0ZUluZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNoYXJlZFNlYXJjaC5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMucnVudGltZTtcbiAgICByZXR1cm4gY2xpZW50LmNyZWF0ZUluZGV4KHJlcXVlc3QubmFtZSwgdG9DcmVhdGVJbmRleE9wdGlvbnMocmVxdWVzdCwgc2lnbmFsKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blN5bmNJbmRleChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2guc3luY0luZGV4UmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCwgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgY29uc3QgaW5kZXggPSByZXF1ZXN0LmluZGV4ID8/IGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gXCJcIjtcbiAgICBhd2FpdCBjbGllbnQuc3luY0luZGV4KGluZGV4LCBzaWduYWwpO1xuICAgIHJldHVybiB7IGluZGV4LCBzeW5jZWQ6IHRydWUgfTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBBSSBTZWFyY2ggcGx1Z2luIHdpdGggQXBwS2l0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBwbHVnaW4gYXMgc2VhcmNoUGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG4gKiBpbXBvcnQgeyBhZ2VudHMsIHBsdWdpbiBhcyBtYXN0cmFQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogY29uc3Qgc3VwcG9ydCA9IGFnZW50cy5jcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCJBbnN3ZXIgZnJvbSB0aGUgZG9jczsgdXNlIGBzZWFyY2hgIHRvIGZpbmQgdGhlbS5cIixcbiAqICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7IC4uLihhd2FpdCBwbHVnaW5zLnNlYXJjaC50b29sa2l0KCkpIH07XG4gKiAgIH0sXG4gKiB9KTtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgc2VhcmNoUGx1Z2luLnNlYXJjaCh7IGluZGV4OiBcIm1haW4uc3VwcG9ydC5kb2NzXCIgfSksXG4gKiAgICAgbWFzdHJhUGx1Z2luLm1hc3RyYSh7IGFnZW50czogc3VwcG9ydCB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBzZWFyY2ggPSB0b1BsdWdpbihTZWFyY2hQbHVnaW4pO1xuIl19
417
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBd0MsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBcUIsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRixPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBMkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUEyQixNQUFNLGFBQWEsQ0FBQztBQUNqRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQXNCLE1BQU0sY0FBYyxDQUFDO0FBQzdGLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsNkJBQTZCLEVBQzdCLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFDM0IsaUNBQWlDLEdBQ2xDLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztBQUVyQywyRUFBMkU7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LE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2pDLENBQUM7O0FBR0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcEtpdCBleHRlbnNpb24gcGx1Z2luIChyZWdpc3RlcmVkIG5hbWU6IGBzZWFyY2hgKSBhcm91bmQgYSBzaWJsaW5nXG4gKiBgYWlTZWFyY2hgIHByb3ZpZGVyLiBOYXRpdmUgQXBwS2l0IG93bnMgVmVjdG9yIFNlYXJjaCBxdWVyeSBleGVjdXRpb247IHRoaXNcbiAqIHBsdWdpbiBhZGRzIHRoZSBzdXJmYWNlcyB0aGF0IHJlbWFpbiB1c2VmdWwgYWNyb3NzIG5hdGl2ZSBhbmQgTGFrZWJhc2VcbiAqIHByb3ZpZGVyczpcbiAqXG4gKiAgIC0gYSBgc2VhcmNoYCAvIGB1bml2ZXJzYWxfc2VhcmNoYCAvIChvcHQtaW4pIGBhZGRfZG9jdW1lbnRzYCB0b29sIHNldCBmb3JcbiAqICAgICBib3RoIE1hc3RyYSBhbmQgQXBwS2l0IGFnZW50cyAoYXV0b2NvbXBsZXRlIGlzIGEgc21hbGwtYGxpbWl0YCBzZWFyY2gpO1xuICogICAtIGNvbXBhdGliaWxpdHkgYW5kIGV4dGVuc2lvbiByb3V0ZXMgdW5kZXIgYC9hcGkvc2VhcmNoYFxuICogICAgIChgUE9TVCAvYCBzZWFyY2gsIGBQT1NUIC91bml2ZXJzYWxgIGZlZGVyYXRlZCwgYEdFVCAvaW5kZXhlc2AgY2F0YWxvZ3VlLFxuICogICAgIGFuZCBgUE9TVCAvZG9jdW1lbnRzYCB3aGVuIHdyaXRlcyBhcmUgZW5hYmxlZCk7XG4gKiAgIC0gYSBgY2xpZW50Q29uZmlnKClgIHBheWxvYWQgc28gYSBVSSBrbm93cyB0aGUgaW5kZXhlcywgZGVmYXVsdCwgYW5kIHBhZ2VcbiAqICAgICBzaXplIGF0IGJvb3Qgd2l0aCBubyByb3VuZC10cmlwO1xuICogICAtIGBleHBvcnRzKClgIHNvIGFwcCBjb2RlIGNhbiBgYXBwa2l0LnNlYXJjaC5zZWFyY2goLi4uKWAgZGlyZWN0bHkuXG4gKlxuICogVmVjdG9yIFNlYXJjaCByZWFkcyBkZWxlZ2F0ZSB0byB0aGUgcmVnaXN0ZXJlZCBuYXRpdmUgQXBwS2l0IGBhaVNlYXJjaGBcbiAqIHBsdWdpbiwgcHJlc2VydmluZyBpdHMgT0JPLCBjYWNoaW5nLCByZXJhbmtpbmcsIGFuZCByZXNwb25zZSBoYW5kbGluZy4gVGhlXG4gKiBhbHRlcm5hdGl2ZSBgbGFrZWJhc2VBaVNlYXJjaGAgcHJvdmlkZXIgc3VwcGxpZXMgdGhlIHNhbWUgcXVlcnkgY29udHJhY3RcbiAqIG92ZXIgUG9zdGdyZVNRTCBmdWxsLXRleHQgc2VhcmNoLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyB0b1BsdWdpbiwgdHlwZSBJQXBwUm91dGVyLCB0eXBlIFBsdWdpbk1hbmlmZXN0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYWlTZWFyY2gsIGRlZmluZVRvb2wsIHR5cGUgVG9vbFJlZ2lzdHJ5IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSwgVG9vbFJlZ2lzdHJ5UGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHNlYXJjaFNjaGVtYXMsIHR5cGUgU2VhcmNoQ2xpZW50Q29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHsgdG9TZWFyY2hPcHRpb25zLCB0b1VuaXZlcnNhbFNlYXJjaE9wdGlvbnMgfSBmcm9tIFwiLi9fc2VhcmNoLW9wdGlvbnMudHNcIjtcbmltcG9ydCB7IFNFQVJDSF9DT05GSUdfU0NIRU1BLCByZXNvbHZlU2VhcmNoQ29uZmlnLCB0eXBlIFNlYXJjaFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgdG9DcmVhdGVJbmRleE9wdGlvbnMgfSBmcm9tIFwiLi9pbmRleC1vcHRpb25zLnRzXCI7XG5pbXBvcnQgeyBuYXRpdmVBaVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9uYXRpdmUudHNcIjtcbmltcG9ydCB7IHRvRG9jdW1lbnRBcnJheSB9IGZyb20gXCIuL3F1ZXJ5LnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVTZWFyY2hSdW50aW1lLCBzZXRTZWFyY2hSZWFkQmFja2VuZCwgdHlwZSBTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHtcbiAgQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxufSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInNlYXJjaFwiKTtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBhIHVuaXZlcnNhbCAoZmVkZXJhdGVkKSBzZWFyY2ggYWNyb3NzIGluZGV4ZXMuICovXG5jb25zdCBVTklWRVJTQUxfUk9VVEUgPSBcIi91bml2ZXJzYWxcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIHNlcnZpbmcgdGhlIGluZGV4IGNhdGFsb2d1ZSBhIHNlYXJjaCBib3ggcmVhZHMuICovXG5jb25zdCBJTkRFWEVTX1JPVVRFID0gXCIvaW5kZXhlc1wiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIGFkZGluZyBkb2N1bWVudHMgdG8gYSBkaXJlY3QtYWNjZXNzIGluZGV4LiAqL1xuY29uc3QgRE9DVU1FTlRTX1JPVVRFID0gXCIvZG9jdW1lbnRzXCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3IgY3JlYXRpbmcgYSBWZWN0b3IgU2VhcmNoIGluZGV4LiAqL1xuY29uc3QgSU5ERVhfUk9VVEUgPSBcIi9pbmRleFwiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIHN5bmNpbmcgYSBEZWx0YSBTeW5jIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZS4gKi9cbmNvbnN0IElOREVYX1NZTkNfUk9VVEUgPSBcIi9pbmRleC9zeW5jXCI7XG5cbi8qKlxuICogQXBwS2l0IGV4dGVuc2lvbiBwbHVnaW4gZm9yIGFnZW50IHRvb2xzLCBmZWRlcmF0ZWQgc2VhcmNoLCBhbmQgb3B0aW9uYWxcbiAqIFZlY3RvciBTZWFyY2ggbGlmZWN5Y2xlIG9wZXJhdGlvbnMuIFJlZ2lzdGVyIGBhaVNlYXJjaCgpYCBvclxuICogYGxha2ViYXNlQWlTZWFyY2goKWAgYmVmb3JlIHRoaXMgcGx1Z2luLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBhaVNlYXJjaCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuICogaW1wb3J0IHsgc2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIGFpU2VhcmNoKHtcbiAqICAgICAgIGluZGV4ZXM6IHtcbiAqICAgICAgICAgZG9jczoge1xuICogICAgICAgICAgIGluZGV4TmFtZTogXCJtYWluLnN1cHBvcnQuZG9jc1wiLFxuICogICAgICAgICAgIGNvbHVtbnM6IFtcImlkXCIsIFwidGl0bGVcIiwgXCJib2R5XCJdLFxuICogICAgICAgICB9LFxuICogICAgICAgfSxcbiAqICAgICB9KSxcbiAqICAgICBzZWFyY2goe1xuICogICAgICAgaW5kZXg6IFwibWFpbi5zdXBwb3J0LmRvY3NcIixcbiAqICAgICAgIGluZGV4ZXM6IFt7IG5hbWU6IFwibWFpbi5zdXBwb3J0LmRvY3NcIiwgYWxpYXM6IFwiZG9jc1wiIH1dLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIFRvb2xSZWdpc3RyeVBsdWdpbjxTZWFyY2hQbHVnaW5Db25maWc+IHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwic2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQUkgU2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXhlczogYWdlbnQgdG9vbHMsIEhUVFAgcm91dGVzIGZvciBhIFwiICtcbiAgICAgIFwic2VhcmNoIGJveCwgdW5pdmVyc2FsIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcywgYW5kIGFuIG9wdC1pbiBkb2N1bWVudCB3cml0ZSBzdXJmYWNlLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW10sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBTRUFSQ0hfQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcInNlYXJjaFwiPjtcblxuICAvKiogUnVudGltZSBvd25lZCBleGNsdXNpdmVseSBieSB0aGlzIHBsdWdpbiBpbnN0YW5jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lOiBTZWFyY2hSdW50aW1lID0gY3JlYXRlU2VhcmNoUnVudGltZSh7IGNvbmZpZzogdGhpcy5jb25maWcgfSk7XG5cbiAgLyoqIFRoZSBiYXNlIHBhdGggQXBwS2l0IG1vdW50cyB0aGlzIHBsdWdpbidzIHJvdXRlcyB1bmRlci4gKi9cbiAgcHJpdmF0ZSBnZXQgYmFzZVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC9hcGkvJHtTZWFyY2hQbHVnaW4ubWFuaWZlc3QubmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b29scyB0aGlzIHBsdWdpbiBvZmZlcnMgdG8gYW4gQXBwS2l0IGFnZW50LiBgc2VhcmNoYCAvXG4gICAqIGB1bml2ZXJzYWxfc2VhcmNoYCBhcmUgcmVhZHM7IGBhZGRfZG9jdW1lbnRzYCAvIGBjcmVhdGVfaW5kZXhgIC9cbiAgICogYHN5bmNfaW5kZXhgIGFyZSBvbmx5IG9mZmVyZWQgd2hlbiB0aGUgd3JpdGUgc3VyZmFjZSBpcyBlbmFibGVkLiBOb25lIGlzXG4gICAqIGF1dG9Jbmhlcml0YWJsZTogZXZlcnkgdG9vbCBydW5zIHVuZGVyIHRoZSBjYWxsZXIncyBpZGVudGl0eSwgc28gaXQgbXVzdCBiZVxuICAgKiBncmFudGVkIGV4cGxpY2l0bHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRvb2xSZWdpc3RyeSgpOiBUb29sUmVnaXN0cnkge1xuICAgIGNvbnN0IHsgY29uZmlnLCByZWFkQmFja2VuZCB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IHJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgICBzZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2VhcmNoU2NoZW1hcy5zZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICAgIHVuaXZlcnNhbF9zZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNlYXJjaFNjaGVtYXMudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcInJlYWRcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1blVuaXZlcnNhbFNlYXJjaChhcmdzLCBzaWduYWwpLFxuICAgICAgfSksXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmFsbG93V3JpdGUpIHtcbiAgICAgIHJlZ2lzdHJ5LmFkZF9kb2N1bWVudHMgPSBkZWZpbmVUb29sKHtcbiAgICAgICAgZGVzY3JpcHRpb246IEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgc2NoZW1hOiBzZWFyY2hTY2hlbWFzLnNlYXJjaFJlcXVlc3RTY2hlbWFcbiAgICAgICAgICAucGljayh7IGluZGV4OiB0cnVlIH0pXG4gICAgICAgICAgLmV4dGVuZCh7IGRvY3VtZW50czogc2VhcmNoU2NoZW1hcy5zZWFyY2hEb2N1bWVudFNjaGVtYS5hcnJheSgpIH0pLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1bkFkZERvY3VtZW50cyhhcmdzLCBzaWduYWwpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVhZEJhY2tlbmQ/LnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICAgIHJlZ2lzdHJ5LmNyZWF0ZV9pbmRleCA9IGRlZmluZVRvb2woe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgICBzY2hlbWE6IHNlYXJjaFNjaGVtYXMuY3JlYXRlSW5kZXhSZXF1ZXN0U2NoZW1hLFxuICAgICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1bkNyZWF0ZUluZGV4KGFyZ3MsIHNpZ25hbCksXG4gICAgICAgIH0pO1xuICAgICAgICByZWdpc3RyeS5zeW5jX2luZGV4ID0gZGVmaW5lVG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgICBzY2hlbWE6IHNlYXJjaFNjaGVtYXMuc3luY0luZGV4UmVxdWVzdFNjaGVtYSxcbiAgICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5TeW5jSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyeTtcbiAgfVxuXG4gIC8qKiBBdHRhY2ggdGhlIHJlZ2lzdGVyZWQgcHJvdmlkZXIgYW5kIGxvZyB0aGUgZWZmZWN0aXZlIHBvbGljeSBhdCBib290LiAqL1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWFkQmFja2VuZCA9IHRoaXMucmVzb2x2ZVByb3ZpZGVyQmFja2VuZCgpO1xuICAgIHNldFNlYXJjaFJlYWRCYWNrZW5kKHRoaXMucnVudGltZSwgcmVhZEJhY2tlbmQpO1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBiYWNrZW5kOiByZWFkQmFja2VuZC5zdXBwb3J0c0xpZmVjeWNsZSA/IFwiYXBwa2l0LWFpLXNlYXJjaFwiIDogXCJsYWtlYmFzZS1haS1zZWFyY2hcIixcbiAgICAgIGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIihub25lIC0gcGFzcyBwZXIgcmVxdWVzdClcIixcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaSkgPT4gaS5hbGlhcyksXG4gICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2VTaXplLFxuICAgICAgbW9kZTogY29uZmlnLm1vZGUsXG4gICAgICBhbGxvd1dyaXRlOiBjb25maWcuYWxsb3dXcml0ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgZW5zdXJlT25TZXR1cDogY29uZmlnLmVuc3VyZU9uU2V0dXBcbiAgICAgICAgPyAoY29uZmlnLmVuc3VyZU9uU2V0dXAuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleClcbiAgICAgICAgOiBcIm9mZlwiLFxuICAgIH0pO1xuICAgIC8vIFByb3Zpc2lvbiBhIHJlYWwgaW5kZXggaW4gdGhlIEJBQ0tHUk9VTkQgc28gYSBzbG93IGZpcnN0LXRpbWUgZW5kcG9pbnQgb3JcbiAgICAvLyBpbmRleCBidWlsZCBuZXZlciBibG9ja3MgdGhlIHNlcnZlciBmcm9tIGNvbWluZyB1cC5cbiAgICBpZiAoY29uZmlnLmVuc3VyZU9uU2V0dXAgJiYgcmVhZEJhY2tlbmQuc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgIHZvaWQgdGhpcy5ydW5FbnN1cmVPblNldHVwKGNvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc29sdmUgdGhlIHJlZ2lzdGVyZWQgQXBwS2l0LWNvbXBhdGlibGUgQUkgU2VhcmNoIHByb3ZpZGVyLiAqL1xuICBwcml2YXRlIHJlc29sdmVQcm92aWRlckJhY2tlbmQoKTogUmV0dXJuVHlwZTx0eXBlb2YgbmF0aXZlQWlTZWFyY2hCYWNrZW5kPiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBwbHVnaW5SZWdpc3RyeS5yZXF1aXJlKHRoaXMuY29udGV4dCwgYWlTZWFyY2gsIHRoaXMpLmV4cG9ydHMoKTtcbiAgICByZXR1cm4gbmF0aXZlQWlTZWFyY2hCYWNrZW5kKHByb3ZpZGVyLCByZXNvbHZlU2VhcmNoQ29uZmlnKHRoaXMuY29uZmlnKSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIHRoZW0sIGhvbm9yaW5nIGBlbnN1cmVPblNldHVwYC5cbiAgICogVXNlcyBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKSB2aWEgdGhlIGNsaWVudCdzXG4gICAqIG91dC1vZi1yZXF1ZXN0IGZhbGxiYWNrLiBGYWlsdXJlcyBhcmUgbG9nZ2VkLCBuZXZlciB0aHJvd24gLSBhIHNlYXJjaCBhcHBcbiAgICogc2hvdWxkIHN0aWxsIHN0YXJ0IGV2ZW4gaWYgcHJvdmlzaW9uaW5nIGlzIHNsb3cgb3IgYSBwZXJtaXNzaW9uIGlzIG1pc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnOiBTZWFyY2hSdW50aW1lW1wiY29uZmlnXCJdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbmZpZy5lbnN1cmVPblNldHVwO1xuICAgIGlmICghc3BlYykgcmV0dXJuO1xuICAgIGNvbnN0IGluZGV4ID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChzcGVjLmluZGV4KSA/PyBjb25maWcuZGVmYXVsdEluZGV4O1xuICAgIGlmICghaW5kZXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiZW5zdXJlLXNraXBwZWRcIiwge1xuICAgICAgICByZWFzb246IFwibm8gaW5kZXggbmFtZSAoc2V0IGBpbmRleGAgb3IgYGVuc3VyZU9uU2V0dXAuaW5kZXhgKVwiLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRvY3VtZW50cyA9IHNwZWMuZG9jdW1lbnRzID8/IFtdO1xuICAgIC8vIEluZmVyIGEgbWFuYWdlZC1kaXJlY3QtYWNjZXNzIHNjaGVtYSBmcm9tIHRoZSBmaXJzdCBzZWVkIHJvdyB3aGVuIG5vdCBnaXZlbi5cbiAgICBjb25zdCBzY2hlbWEgPVxuICAgICAgc3BlYy5zY2hlbWEgPz9cbiAgICAgIChkb2N1bWVudHMubGVuZ3RoID4gMCAmJiAhc3BlYy5zb3VyY2VUYWJsZVxuICAgICAgICA/IHRoaXMuaW5mZXJTY2hlbWEoZG9jdW1lbnRzWzBdLCBzcGVjLnByaW1hcnlLZXkgPz8gXCJpZFwiLCBzcGVjLnRleHRDb2x1bW4gPz8gXCJ0ZXh0XCIpXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgICB0cnkge1xuICAgICAgbG9nZ2VyLmluZm8oXCJlbnN1cmUtc3RhcnRcIiwgeyBpbmRleCB9KTtcbiAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICBjb25zdCBpbmZvID0gYXdhaXQgY2xpZW50LnByb3Zpc2lvbihpbmRleCwge1xuICAgICAgICAuLi4oc3BlYy5lbmRwb2ludCA/IHsgZW5kcG9pbnQ6IHNwZWMuZW5kcG9pbnQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMucHJpbWFyeUtleSA/IHsgcHJpbWFyeUtleTogc3BlYy5wcmltYXJ5S2V5IH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnRleHRDb2x1bW4gPyB7IGVtYmVkZGluZ1NvdXJjZUNvbHVtbjogc3BlYy50ZXh0Q29sdW1uIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLmVtYmVkZGluZ01vZGVsID8geyBlbWJlZGRpbmdNb2RlbDogc3BlYy5lbWJlZGRpbmdNb2RlbCB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5zb3VyY2VUYWJsZSA/IHsgc291cmNlVGFibGU6IHNwZWMuc291cmNlVGFibGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNjaGVtYSA/IHsgc2NoZW1hIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnRpbWVvdXRNcyA/IHsgdGltZW91dE1zOiBzcGVjLnRpbWVvdXRNcyB9IDoge30pLFxuICAgICAgICAuLi4oZG9jdW1lbnRzLmxlbmd0aCA+IDAgPyB7IHNlZWQ6IGRvY3VtZW50cyB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBsb2dnZXIuaW5mbyhcImVuc3VyZS1yZWFkeVwiLCB7XG4gICAgICAgIGluZGV4OiBpbmZvLm5hbWUsXG4gICAgICAgIHJlYWR5OiBpbmZvLnJlYWR5LFxuICAgICAgICByb3dDb3VudDogaW5mby5yb3dDb3VudCA/PyAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiZW5zdXJlLWZhaWxlZFwiLCB7IGluZGV4LCBtZXNzYWdlOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVzZSkgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIGEgVmVjdG9yIFNlYXJjaCBgc2NoZW1hX2pzb25gIG1hcCBmcm9tIGEgc2VlZCBkb2N1bWVudCdzIHZhbHVlIHR5cGVzLiAqL1xuICBwcml2YXRlIGluZmVyU2NoZW1hKFxuICAgIGRvYzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcHJpbWFyeUtleTogc3RyaW5nLFxuICAgIHRleHRDb2x1bW46IHN0cmluZyxcbiAgKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsIFt0ZXh0Q29sdW1uXTogXCJzdHJpbmdcIiB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRvYykpIHtcbiAgICAgIGlmIChrZXkgaW4gc2NoZW1hKSBjb250aW51ZTtcbiAgICAgIHNjaGVtYVtrZXldID1cbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgPyBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKVxuICAgICAgICAgICAgPyBcImludFwiXG4gICAgICAgICAgICA6IFwiZG91YmxlXCJcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgICAgID8gXCJib29sZWFuXCJcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIjtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKiBSZWxlYXNlIHRoaXMgcGx1Z2luJ3MgaW5zdGFuY2Utb3duZWQgcnVudGltZS4gKi9cbiAgc2h1dGRvd24oKTogdm9pZCB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IGV4dGVuc2lvbiByb3V0ZXMgdW5kZXIgYC9hcGkvc2VhcmNoYC4gU2luZ2xlLWluZGV4IHF1ZXJpZXMgc3RheSBvblxuICAgKiB0aGUgcHJvdmlkZXIncyBuYXRpdmUgYC9hcGkvYWktc2VhcmNoLzphbGlhcy9xdWVyeWAgc3VyZmFjZS5cbiAgICovXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJ1bml2ZXJzYWxTZWFyY2hcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBVTklWRVJTQUxfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJ1bml2ZXJzYWxTZWFyY2hcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzZWFyY2hTY2hlbWFzLnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UocmVxLmJvZHkgPz8ge30pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmFzVXNlcihyZXEpLnJ1blVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImluZGV4ZXNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IElOREVYRVNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoX3JlcSwgcmVzKSA9PiB7XG4gICAgICAgIHJlcy5qc29uKHRoaXMuY2xpZW50Q29uZmlnKCkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkb2N1bWVudHNcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBET0NVTUVOVFNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGRvY3VtZW50IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJhZGREb2N1bWVudHNcIiwgKCkgPT5cbiAgICAgICAgICB0aGlzLmFzVXNlcihyZXEpLnJ1bkFkZERvY3VtZW50cyhyZXEuYm9keSA/PyB7fSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImNyZWF0ZUluZGV4XCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogSU5ERVhfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUgfHwgIXJlYWRCYWNrZW5kPy5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGluZGV4IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJjcmVhdGVJbmRleFwiLCAoKSA9PlxuICAgICAgICAgIHRoaXMuYXNVc2VyKHJlcSkucnVuQ3JlYXRlSW5kZXgocmVxLmJvZHkgPz8ge30pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzeW5jSW5kZXhcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBJTkRFWF9TWU5DX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnLCByZWFkQmFja2VuZCB9ID0gdGhpcy5ydW50aW1lO1xuICAgICAgICBpZiAoIWNvbmZpZy5hbGxvd1dyaXRlIHx8ICFyZWFkQmFja2VuZD8uc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcInRoZSBpbmRleCB3cml0ZSBzdXJmYWNlIGlzIGRpc2FibGVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwic3luY0luZGV4XCIsICgpID0+IHRoaXMuYXNVc2VyKHJlcSkucnVuU3luY0luZGV4KHJlcS5ib2R5ID8/IHt9KSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIHJvdXRlIGJvZHksIHR1cm5pbmcgYSBmYWlsdXJlIGludG8gYSBKU09OIGVycm9yIHJlc3BvbnNlLlxuICAgKlxuICAgKiBBcHBLaXQncyBgcm91dGUoKWAgcmVnaXN0ZXJzIHRoZSBoYW5kbGVyIGFzLWlzLCBzbyBhIHJlamVjdGlvbiBlc2NhcGVzIGFzXG4gICAqIGFuIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiBhbmQgdGFrZXMgdGhlIHdob2xlIHByb2Nlc3MgZG93biByYXRoZXIgdGhhblxuICAgKiBmYWlsaW5nIHRoZSBvbmUgcmVxdWVzdC4gRXZlcnkgcm91dGUgaGVyZSBnb2VzIHRocm91Z2ggdGhpcywgc28gYSBiYWQgaW5kZXhcbiAgICogbmFtZSBvciBhIFZlY3RvciBTZWFyY2ggQVBJIGVycm9yIHJldHVybnMgNTAwIHdpdGggYSBtZXNzYWdlIGluc3RlYWQgb2ZcbiAgICoga2lsbGluZyB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNwb25kKFxuICAgIHJlczogUGFyYW1ldGVyczxQYXJhbWV0ZXJzPElBcHBSb3V0ZXJbXCJwb3N0XCJdPlsxXT5bMV0sXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgcnVuOiAoKSA9PiBQcm9taXNlPHVua25vd24+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmVzLmpzb24oYXdhaXQgcnVuKCkpO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoY2F1c2UpO1xuICAgICAgbG9nZ2VyLndhcm4oXCJyb3V0ZS1mYWlsZWRcIiwgeyBvcGVyYXRpb24sIG1lc3NhZ2UgfSk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBtZXNzYWdlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdXJmYWNlIHRoZSBpbmRleCBjYXRhbG9ndWUgKyBkZWZhdWx0cyBzbyBhIHNlYXJjaCBib3ggbmVlZHMgbm8gcm91bmQtdHJpcC4gKi9cbiAgb3ZlcnJpZGUgY2xpZW50Q29uZmlnKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCB7IGNvbmZpZyB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaENsaWVudENvbmZpZyA9IHtcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgIG5hbWU6IGluZGV4Lm5hbWUsXG4gICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgLi4uKGluZGV4LnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IGluZGV4LnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4LmNvbHVtbnMgPyB7IGNvbHVtbnM6IGluZGV4LmNvbHVtbnMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4Lm5hbWUgPT09IGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGlzRGVmYXVsdDogdHJ1ZSB9IDoge30pLFxuICAgICAgfSkpLFxuICAgICAgLi4uKGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCB9IDoge30pLFxuICAgICAgcGFnZVNpemU6IGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgIH07XG4gICAgcmV0dXJuIHBheWxvYWQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKiBTZWFyY2ggb25lIGluZGV4IChkZWZhdWx0IHdoZW4gb21pdHRlZCkuIFJ1bnMgYXMgdGhlIGN1cnJlbnQgY29udGV4dCB1c2VyLiAqL1xuICAgICAgc2VhcmNoOiAocmVxdWVzdDogc2VhcmNoU2NoZW1hcy5TZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5TZWFyY2gocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBTZWFyY2ggYWNyb3NzIGV2ZXJ5IGNvbmZpZ3VyZWQgaW5kZXggYW5kIG1lcmdlIHRoZSBoaXRzLiAqL1xuICAgICAgdW5pdmVyc2FsU2VhcmNoOiAocmVxdWVzdDogc2VhcmNoU2NoZW1hcy5Vbml2ZXJzYWxTZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5Vbml2ZXJzYWxTZWFyY2gocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBpbiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgYWRkRG9jdW1lbnRzOiAocmVxdWVzdDogeyBpbmRleD86IHN0cmluZzsgZG9jdW1lbnRzOiB1bmtub3duIH0sIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkFkZERvY3VtZW50cyhyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIENyZWF0ZSBhIFZlY3RvciBTZWFyY2ggaW5kZXggKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgY3JlYXRlSW5kZXg6IChyZXF1ZXN0OiBzZWFyY2hTY2hlbWFzLkNyZWF0ZUluZGV4UmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuQ3JlYXRlSW5kZXgocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBTeW5jIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUgKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgc3luY0luZGV4OiAocmVxdWVzdDogc2VhcmNoU2NoZW1hcy5TeW5jSW5kZXhSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5TeW5jSW5kZXgocmVxdWVzdCwgc2lnbmFsKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TZWFyY2goYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoU2NoZW1hcy5zZWFyY2hSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIGNsaWVudC5zZWFyY2gocmVxdWVzdC5xdWVyeSwgdG9TZWFyY2hPcHRpb25zKHJlcXVlc3QsIHNpZ25hbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5Vbml2ZXJzYWxTZWFyY2goYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoU2NoZW1hcy51bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIGNsaWVudC51bml2ZXJzYWxTZWFyY2gocmVxdWVzdC5xdWVyeSwgdG9Vbml2ZXJzYWxTZWFyY2hPcHRpb25zKHJlcXVlc3QsIHNpZ25hbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5BZGREb2N1bWVudHMoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZWNvcmQgPSAoYXJncyA/PyB7fSkgYXMgeyBpbmRleD86IHN0cmluZzsgZG9jdW1lbnRzOiB1bmtub3duIH07XG4gICAgY29uc3QgeyBjbGllbnQsIGNvbmZpZyB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IGRvY3VtZW50cyA9IHRvRG9jdW1lbnRBcnJheShyZWNvcmQuZG9jdW1lbnRzKTtcbiAgICBjb25zdCBpbmRleCA9IHJlY29yZC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiXCI7XG4gICAgcmV0dXJuIGNsaWVudC5hZGREb2N1bWVudHMoaW5kZXgsIGRvY3VtZW50cywgc2lnbmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQ3JlYXRlSW5kZXgoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoU2NoZW1hcy5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMucnVudGltZTtcbiAgICByZXR1cm4gY2xpZW50LmNyZWF0ZUluZGV4KHJlcXVlc3QubmFtZSwgdG9DcmVhdGVJbmRleE9wdGlvbnMocmVxdWVzdCwgc2lnbmFsKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blN5bmNJbmRleChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzZWFyY2hTY2hlbWFzLnN5bmNJbmRleFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQsIGNvbmZpZyB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IGluZGV4ID0gcmVxdWVzdC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiXCI7XG4gICAgYXdhaXQgY2xpZW50LnN5bmNJbmRleChpbmRleCwgc2lnbmFsKTtcbiAgICByZXR1cm4geyBpbmRleCwgc3luY2VkOiB0cnVlIH07XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgQUkgU2VhcmNoIHBsdWdpbiB3aXRoIEFwcEtpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgc2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG4gKiBpbXBvcnQgeyBhZ2VudHMsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiBjb25zdCBzdXBwb3J0ID0gYWdlbnRzLmNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIkFuc3dlciBmcm9tIHRoZSBkb2NzOyB1c2UgYHNlYXJjaGAgdG8gZmluZCB0aGVtLlwiLFxuICogICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHsgLi4uKGF3YWl0IHBsdWdpbnMuc2VhcmNoLnRvb2xraXQoKSkgfTtcbiAqICAgfSxcbiAqIH0pO1xuICpcbiAqIGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBzZXJ2ZXIoKSxcbiAqICAgICBzZWFyY2goeyBpbmRleDogXCJtYWluLnN1cHBvcnQuZG9jc1wiIH0pLFxuICogICAgIG1hc3RyYSh7IGFnZW50czogc3VwcG9ydCB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBzZWFyY2ggPSB0b1BsdWdpbihTZWFyY2hQbHVnaW4pO1xuIl19
@@ -24,15 +24,3 @@ export interface SearchRuntime {
24
24
  export declare function createSearchRuntime(options?: SearchRuntimeOptions): SearchRuntime;
25
25
  /** Attach a provider to one runtime while preserving its object identity. */
26
26
  export declare function setSearchReadBackend(runtime: SearchRuntime, readBackend: SearchReadBackend): void;
27
- /**
28
- * Build an isolated standalone runtime.
29
- *
30
- * @deprecated Use {@link createSearchRuntime}. This compatibility helper
31
- * returns a new runtime on every call and never reads or updates plugin state.
32
- */
33
- export declare function getSearchRuntime(options?: SearchRuntimeOptions): SearchRuntime;
34
- /**
35
- * @deprecated Plugin runtimes are instance-owned and need no global reset.
36
- * This compatibility helper is intentionally a no-op.
37
- */
38
- export declare function resetSearchRuntime(): void;
@@ -23,20 +23,4 @@ export function setSearchReadBackend(runtime, readBackend) {
23
23
  runtime.readBackend = readBackend;
24
24
  runtime.client = createSearchClient(runtime.config, undefined, readBackend);
25
25
  }
26
- /**
27
- * Build an isolated standalone runtime.
28
- *
29
- * @deprecated Use {@link createSearchRuntime}. This compatibility helper
30
- * returns a new runtime on every call and never reads or updates plugin state.
31
- */
32
- export function getSearchRuntime(options) {
33
- return createSearchRuntime(options);
34
- }
35
- /**
36
- * @deprecated Plugin runtimes are instance-owned and need no global reset.
37
- * This compatibility helper is intentionally a no-op.
38
- */
39
- export function resetSearchRuntime() {
40
- return;
41
- }
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUF3QyxNQUFNLGFBQWEsQ0FBQztBQUN2RixPQUFPLEVBQ0wsbUJBQW1CLEdBR3BCLE1BQU0sYUFBYSxDQUFDO0FBZXJCLGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsbUJBQW1CLENBQUMsVUFBZ0MsRUFBRTtJQUNwRSxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkQsT0FBTztRQUNMLE1BQU07UUFDTixNQUFNLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ2xFLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNyRSxDQUFDO0FBQ0osQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBc0IsRUFBRSxXQUE4QjtJQUN6RixPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNsQyxPQUFPLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUE4QjtJQUM3RCxPQUFPLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCO0lBQ2hDLE9BQU87QUFDVCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBSSBTZWFyY2ggcnVudGltZSBjb25zdHJ1Y3Rpb24gaGVscGVycy5cbiAqXG4gKiBFYWNoIHBsdWdpbiBhbmQgc3RhbmRhbG9uZSB0b29sIHNldCBvd25zIGl0cyBydW50aW1lIGFuZCBjbGllbnQuIFByb3ZpZGVyXG4gKiBhdHRhY2htZW50IHVwZGF0ZXMgb25seSB0aGF0IHJ1bnRpbWUsIHNvIHR3byBhcHBzIGluIG9uZSBwcm9jZXNzIGNhbiB1c2VcbiAqIGRpZmZlcmVudCBiYWNrZW5kcyB3aXRob3V0IHNoYXJpbmcgc3RhdGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZVNlYXJjaENsaWVudCwgU2VhcmNoQ2xpZW50LCB0eXBlIFNlYXJjaFJlYWRCYWNrZW5kIH0gZnJvbSBcIi4vY2xpZW50LnRzXCI7XG5pbXBvcnQge1xuICByZXNvbHZlU2VhcmNoQ29uZmlnLFxuICB0eXBlIFNlYXJjaFBsdWdpbkNvbmZpZyxcbiAgdHlwZSBSZXNvbHZlZFNlYXJjaENvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbi8qKiBDb25maWd1cmF0aW9uIGFuZCBwcm92aWRlciB1c2VkIHRvIGJ1aWxkIGFuIGV4dGVuc2lvbiBydW50aW1lLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSdW50aW1lT3B0aW9ucyB7XG4gIGNvbmZpZz86IFNlYXJjaFBsdWdpbkNvbmZpZztcbiAgcmVhZEJhY2tlbmQ/OiBTZWFyY2hSZWFkQmFja2VuZDtcbn1cblxuLyoqIFRoZSByZXNvbHZlZCBjb25maWcgcGx1cyB0aGUgY2xpZW50IHJlYWRzIHJ1biB0aHJvdWdoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSdW50aW1lIHtcbiAgY29uZmlnOiBSZXNvbHZlZFNlYXJjaENvbmZpZztcbiAgY2xpZW50OiBTZWFyY2hDbGllbnQ7XG4gIHJlYWRCYWNrZW5kPzogU2VhcmNoUmVhZEJhY2tlbmQ7XG59XG5cbi8qKiBCdWlsZCBhbiBpc29sYXRlZCBydW50aW1lIGZvciBvbmUgcGx1Z2luIGluc3RhbmNlIG9yIHN0YW5kYWxvbmUgdG9vbCBzZXQuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VhcmNoUnVudGltZShvcHRpb25zOiBTZWFyY2hSdW50aW1lT3B0aW9ucyA9IHt9KTogU2VhcmNoUnVudGltZSB7XG4gIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVTZWFyY2hDb25maWcob3B0aW9ucy5jb25maWcpO1xuICByZXR1cm4ge1xuICAgIGNvbmZpZyxcbiAgICBjbGllbnQ6IGNyZWF0ZVNlYXJjaENsaWVudChjb25maWcsIHVuZGVmaW5lZCwgb3B0aW9ucy5yZWFkQmFja2VuZCksXG4gICAgLi4uKG9wdGlvbnMucmVhZEJhY2tlbmQgPyB7IHJlYWRCYWNrZW5kOiBvcHRpb25zLnJlYWRCYWNrZW5kIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBBdHRhY2ggYSBwcm92aWRlciB0byBvbmUgcnVudGltZSB3aGlsZSBwcmVzZXJ2aW5nIGl0cyBvYmplY3QgaWRlbnRpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2VhcmNoUmVhZEJhY2tlbmQocnVudGltZTogU2VhcmNoUnVudGltZSwgcmVhZEJhY2tlbmQ6IFNlYXJjaFJlYWRCYWNrZW5kKTogdm9pZCB7XG4gIHJ1bnRpbWUucmVhZEJhY2tlbmQgPSByZWFkQmFja2VuZDtcbiAgcnVudGltZS5jbGllbnQgPSBjcmVhdGVTZWFyY2hDbGllbnQocnVudGltZS5jb25maWcsIHVuZGVmaW5lZCwgcmVhZEJhY2tlbmQpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGFuIGlzb2xhdGVkIHN0YW5kYWxvbmUgcnVudGltZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGNyZWF0ZVNlYXJjaFJ1bnRpbWV9LiBUaGlzIGNvbXBhdGliaWxpdHkgaGVscGVyXG4gKiByZXR1cm5zIGEgbmV3IHJ1bnRpbWUgb24gZXZlcnkgY2FsbCBhbmQgbmV2ZXIgcmVhZHMgb3IgdXBkYXRlcyBwbHVnaW4gc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWFyY2hSdW50aW1lKG9wdGlvbnM/OiBTZWFyY2hSdW50aW1lT3B0aW9ucyk6IFNlYXJjaFJ1bnRpbWUge1xuICByZXR1cm4gY3JlYXRlU2VhcmNoUnVudGltZShvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBQbHVnaW4gcnVudGltZXMgYXJlIGluc3RhbmNlLW93bmVkIGFuZCBuZWVkIG5vIGdsb2JhbCByZXNldC5cbiAqIFRoaXMgY29tcGF0aWJpbGl0eSBoZWxwZXIgaXMgaW50ZW50aW9uYWxseSBhIG5vLW9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRTZWFyY2hSdW50aW1lKCk6IHZvaWQge1xuICByZXR1cm47XG59XG4iXX0=
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUF3QyxNQUFNLGFBQWEsQ0FBQztBQUN2RixPQUFPLEVBQ0wsbUJBQW1CLEdBR3BCLE1BQU0sYUFBYSxDQUFDO0FBZXJCLGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsbUJBQW1CLENBQUMsVUFBZ0MsRUFBRTtJQUNwRSxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkQsT0FBTztRQUNMLE1BQU07UUFDTixNQUFNLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ2xFLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNyRSxDQUFDO0FBQ0osQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBc0IsRUFBRSxXQUE4QjtJQUN6RixPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNsQyxPQUFPLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFJIFNlYXJjaCBydW50aW1lIGNvbnN0cnVjdGlvbiBoZWxwZXJzLlxuICpcbiAqIEVhY2ggcGx1Z2luIGFuZCBzdGFuZGFsb25lIHRvb2wgc2V0IG93bnMgaXRzIHJ1bnRpbWUgYW5kIGNsaWVudC4gUHJvdmlkZXJcbiAqIGF0dGFjaG1lbnQgdXBkYXRlcyBvbmx5IHRoYXQgcnVudGltZSwgc28gdHdvIGFwcHMgaW4gb25lIHByb2Nlc3MgY2FuIHVzZVxuICogZGlmZmVyZW50IGJhY2tlbmRzIHdpdGhvdXQgc2hhcmluZyBzdGF0ZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlU2VhcmNoQ2xpZW50LCBTZWFyY2hDbGllbnQsIHR5cGUgU2VhcmNoUmVhZEJhY2tlbmQgfSBmcm9tIFwiLi9jbGllbnQudHNcIjtcbmltcG9ydCB7XG4gIHJlc29sdmVTZWFyY2hDb25maWcsXG4gIHR5cGUgU2VhcmNoUGx1Z2luQ29uZmlnLFxuICB0eXBlIFJlc29sdmVkU2VhcmNoQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcblxuLyoqIENvbmZpZ3VyYXRpb24gYW5kIHByb3ZpZGVyIHVzZWQgdG8gYnVpbGQgYW4gZXh0ZW5zaW9uIHJ1bnRpbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJ1bnRpbWVPcHRpb25zIHtcbiAgY29uZmlnPzogU2VhcmNoUGx1Z2luQ29uZmlnO1xuICByZWFkQmFja2VuZD86IFNlYXJjaFJlYWRCYWNrZW5kO1xufVxuXG4vKiogVGhlIHJlc29sdmVkIGNvbmZpZyBwbHVzIHRoZSBjbGllbnQgcmVhZHMgcnVuIHRocm91Z2guICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJ1bnRpbWUge1xuICBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnO1xuICBjbGllbnQ6IFNlYXJjaENsaWVudDtcbiAgcmVhZEJhY2tlbmQ/OiBTZWFyY2hSZWFkQmFja2VuZDtcbn1cblxuLyoqIEJ1aWxkIGFuIGlzb2xhdGVkIHJ1bnRpbWUgZm9yIG9uZSBwbHVnaW4gaW5zdGFuY2Ugb3Igc3RhbmRhbG9uZSB0b29sIHNldC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWFyY2hSdW50aW1lKG9wdGlvbnM6IFNlYXJjaFJ1bnRpbWVPcHRpb25zID0ge30pOiBTZWFyY2hSdW50aW1lIHtcbiAgY29uc3QgY29uZmlnID0gcmVzb2x2ZVNlYXJjaENvbmZpZyhvcHRpb25zLmNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgY29uZmlnLFxuICAgIGNsaWVudDogY3JlYXRlU2VhcmNoQ2xpZW50KGNvbmZpZywgdW5kZWZpbmVkLCBvcHRpb25zLnJlYWRCYWNrZW5kKSxcbiAgICAuLi4ob3B0aW9ucy5yZWFkQmFja2VuZCA/IHsgcmVhZEJhY2tlbmQ6IG9wdGlvbnMucmVhZEJhY2tlbmQgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIEF0dGFjaCBhIHByb3ZpZGVyIHRvIG9uZSBydW50aW1lIHdoaWxlIHByZXNlcnZpbmcgaXRzIG9iamVjdCBpZGVudGl0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTZWFyY2hSZWFkQmFja2VuZChydW50aW1lOiBTZWFyY2hSdW50aW1lLCByZWFkQmFja2VuZDogU2VhcmNoUmVhZEJhY2tlbmQpOiB2b2lkIHtcbiAgcnVudGltZS5yZWFkQmFja2VuZCA9IHJlYWRCYWNrZW5kO1xuICBydW50aW1lLmNsaWVudCA9IGNyZWF0ZVNlYXJjaENsaWVudChydW50aW1lLmNvbmZpZywgdW5kZWZpbmVkLCByZWFkQmFja2VuZCk7XG59XG4iXX0=
package/lib/src/schema.js CHANGED
@@ -6,10 +6,10 @@
6
6
  *
7
7
  * @module
8
8
  */
9
- import { string } from "@dbx-tools/shared-core";
10
- import { search } from "@dbx-tools/shared-search";
9
+ import { stringUtils } from "@dbx-tools/shared-core";
10
+ import { searchSchemas } from "@dbx-tools/shared-search";
11
11
  /** Description the model reads for the `search` tool. */
12
- export const SEARCH_TOOL_DESCRIPTION = string.toDescription(`
12
+ export const SEARCH_TOOL_DESCRIPTION = stringUtils.toDescription(`
13
13
  Search a Databricks AI Search (Vector Search) index for the documents most
14
14
  relevant to a query. Pass a natural-language question or keywords; hybrid
15
15
  matching combines semantic similarity with keyword ranking, so exact terms
@@ -19,21 +19,21 @@ export const SEARCH_TOOL_DESCRIPTION = string.toDescription(`
19
19
  indexed content before answering.
20
20
  `);
21
21
  /** Description the model reads for the `universal_search` tool. */
22
- export const UNIVERSAL_SEARCH_TOOL_DESCRIPTION = string.toDescription(`
22
+ export const UNIVERSAL_SEARCH_TOOL_DESCRIPTION = stringUtils.toDescription(`
23
23
  Search across every configured AI Search index at once and return the best
24
24
  matches from all of them, merged and ranked. Use it when the right index
25
25
  isn't known in advance or when an answer may live in any of several
26
26
  collections (docs, tickets, products).
27
27
  `);
28
28
  /** Description the model reads for the `add_documents` tool. */
29
- export const ADD_DOCUMENTS_TOOL_DESCRIPTION = string.toDescription(`
29
+ export const ADD_DOCUMENTS_TOOL_DESCRIPTION = stringUtils.toDescription(`
30
30
  Add or update documents in a direct-access AI Search index. Pass an array of
31
31
  documents as JSON objects; each MUST include the index's primary-key column.
32
32
  Only available when the app enables the write surface. Use it to index new
33
33
  content the user provides.
34
34
  `);
35
35
  /** Description the model reads for the `create_index` tool. */
36
- export const CREATE_INDEX_TOOL_DESCRIPTION = string.toDescription(`
36
+ export const CREATE_INDEX_TOOL_DESCRIPTION = stringUtils.toDescription(`
37
37
  Create a Databricks AI Search (Vector Search) index. For the common case pass
38
38
  a Delta source table (catalog.schema.table): Databricks computes embeddings
39
39
  from its text column and keeps the index synced. To create a direct-access
@@ -44,21 +44,21 @@ export const CREATE_INDEX_TOOL_DESCRIPTION = string.toDescription(`
44
44
  explicitly asks to set up a new index.
45
45
  `);
46
46
  /** Description the model reads for the `sync_index` tool. */
47
- export const SYNC_INDEX_TOOL_DESCRIPTION = string.toDescription(`
47
+ export const SYNC_INDEX_TOOL_DESCRIPTION = stringUtils.toDescription(`
48
48
  Refresh a Delta Sync AI Search index from its source table so newly added or
49
49
  changed rows become searchable. Optionally name the index (defaults to the
50
50
  app's default index). Only available when the app enables the write surface.
51
51
  `);
52
52
  /** Schema for the `search` tool input (the shared request schema). */
53
- export const searchToolSchema = search.searchRequestSchema;
53
+ export const searchToolSchema = searchSchemas.searchRequestSchema;
54
54
  /** Schema for the `universal_search` tool input. */
55
- export const universalSearchToolSchema = search.universalSearchRequestSchema;
55
+ export const universalSearchToolSchema = searchSchemas.universalSearchRequestSchema;
56
56
  /** Schema for the `search` / `universal_search` tool output. */
57
- export const searchResultSchema = search.searchResultSchema;
57
+ export const searchResultSchema = searchSchemas.searchResultSchema;
58
58
  /** Schema for the `create_index` tool input. */
59
- export const createIndexToolSchema = search.createIndexRequestSchema;
59
+ export const createIndexToolSchema = searchSchemas.createIndexRequestSchema;
60
60
  /** Schema for the `create_index` tool output (a resolved index definition). */
61
- export const indexInfoSchema = search.indexInfoSchema;
61
+ export const indexInfoSchema = searchSchemas.indexInfoSchema;
62
62
  /** Schema for the `sync_index` tool input. */
63
- export const syncIndexToolSchema = search.syncIndexRequestSchema;
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVsRCx5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7Q0FRM0QsQ0FBQyxDQUFDO0FBRUgsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7Ozs7O0NBS3JFLENBQUMsQ0FBQztBQUVILGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDOzs7OztDQUtsRSxDQUFDLENBQUM7QUFFSCwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7O0NBU2pFLENBQUMsQ0FBQztBQUVILDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDOzs7O0NBSS9ELENBQUMsQ0FBQztBQUVILHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUM7QUFFM0Qsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQztBQUU3RSxnRUFBZ0U7QUFDaEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0FBRTVELGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUM7QUFFckUsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO0FBRXRELDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRvb2wtZmFjaW5nIGRlc2NyaXB0aW9ucyBhbmQgdGhlIHJlcXVlc3Qgc2NoZW1hcyB0aGUgTWFzdHJhIHRvb2xzICsgQXBwS2l0XG4gKiB0b29sIHByb3ZpZGVyIHZhbGlkYXRlIGFnYWluc3QuIFRoZSB3aXJlIHNoYXBlcyB0aGVtc2VsdmVzIGxpdmUgaW5cbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgOyB0aGlzIG1vZHVsZSBhZGRzIHRoZSBtb2RlbC1yZWFkYWJsZVxuICogZGVzY3JpcHRpb25zIHNvIGJvdGggaG9zdHMgZGVzY3JpYmUgdGhlIHRvb2xzIGlkZW50aWNhbGx5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgc2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHNlYXJjaGAgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTiA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgU2VhcmNoIGEgRGF0YWJyaWNrcyBBSSBTZWFyY2ggKFZlY3RvciBTZWFyY2gpIGluZGV4IGZvciB0aGUgZG9jdW1lbnRzIG1vc3RcbiAgcmVsZXZhbnQgdG8gYSBxdWVyeS4gUGFzcyBhIG5hdHVyYWwtbGFuZ3VhZ2UgcXVlc3Rpb24gb3Iga2V5d29yZHM7IGh5YnJpZFxuICBtYXRjaGluZyBjb21iaW5lcyBzZW1hbnRpYyBzaW1pbGFyaXR5IHdpdGgga2V5d29yZCByYW5raW5nLCBzbyBleGFjdCB0ZXJtc1xuICAocHJvZHVjdCBuYW1lcywgZXJyb3IgY29kZXMpIGFuZCBwYXJhcGhyYXNlcyBib3RoIHdvcmsuIE9wdGlvbmFsbHkgbmFtZSBhblxuICBpbmRleCAoZGVmYXVsdHMgdG8gdGhlIGFwcCdzIGNvbmZpZ3VyZWQgaW5kZXgpLCBhIHJlc3VsdCBsaW1pdCwgYW5kIGF0dHJpYnV0ZVxuICBmaWx0ZXJzLiBVc2UgaXQgdG8gbG9vayB1cCBkb2NzLCBrbm93bGVkZ2UtYmFzZSBhcnRpY2xlcywgcHJvZHVjdHMsIG9yIGFueVxuICBpbmRleGVkIGNvbnRlbnQgYmVmb3JlIGFuc3dlcmluZy5cbmApO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHVuaXZlcnNhbF9zZWFyY2hgIHRvb2wuICovXG5leHBvcnQgY29uc3QgVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICBTZWFyY2ggYWNyb3NzIGV2ZXJ5IGNvbmZpZ3VyZWQgQUkgU2VhcmNoIGluZGV4IGF0IG9uY2UgYW5kIHJldHVybiB0aGUgYmVzdFxuICBtYXRjaGVzIGZyb20gYWxsIG9mIHRoZW0sIG1lcmdlZCBhbmQgcmFua2VkLiBVc2UgaXQgd2hlbiB0aGUgcmlnaHQgaW5kZXhcbiAgaXNuJ3Qga25vd24gaW4gYWR2YW5jZSBvciB3aGVuIGFuIGFuc3dlciBtYXkgbGl2ZSBpbiBhbnkgb2Ygc2V2ZXJhbFxuICBjb2xsZWN0aW9ucyAoZG9jcywgdGlja2V0cywgcHJvZHVjdHMpLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgYWRkX2RvY3VtZW50c2AgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBBRERfRE9DVU1FTlRTX1RPT0xfREVTQ1JJUFRJT04gPSBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBBSSBTZWFyY2ggaW5kZXguIFBhc3MgYW4gYXJyYXkgb2ZcbiAgZG9jdW1lbnRzIGFzIEpTT04gb2JqZWN0czsgZWFjaCBNVVNUIGluY2x1ZGUgdGhlIGluZGV4J3MgcHJpbWFyeS1rZXkgY29sdW1uLlxuICBPbmx5IGF2YWlsYWJsZSB3aGVuIHRoZSBhcHAgZW5hYmxlcyB0aGUgd3JpdGUgc3VyZmFjZS4gVXNlIGl0IHRvIGluZGV4IG5ld1xuICBjb250ZW50IHRoZSB1c2VyIHByb3ZpZGVzLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sLiAqL1xuZXhwb3J0IGNvbnN0IENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICBDcmVhdGUgYSBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXguIEZvciB0aGUgY29tbW9uIGNhc2UgcGFzc1xuICBhIERlbHRhIHNvdXJjZSB0YWJsZSAoY2F0YWxvZy5zY2hlbWEudGFibGUpOiBEYXRhYnJpY2tzIGNvbXB1dGVzIGVtYmVkZGluZ3NcbiAgZnJvbSBpdHMgdGV4dCBjb2x1bW4gYW5kIGtlZXBzIHRoZSBpbmRleCBzeW5jZWQuIFRvIGNyZWF0ZSBhIGRpcmVjdC1hY2Nlc3NcbiAgaW5kZXggeW91IHdyaXRlIHZlY3RvcnMgdG8geW91cnNlbGYsIHBhc3MgYW4gZW1iZWRkaW5nIGRpbWVuc2lvbiBpbnN0ZWFkIG9mIGFcbiAgc291cmNlIHRhYmxlLiBUaGUgZW5kcG9pbnQsIGVtYmVkZGluZyBtb2RlbCwgcHJpbWFyeSBrZXksIGFuZCB0ZXh0IGNvbHVtbiBhcmVcbiAgaW5mZXJyZWQgd2hlbiBvbWl0dGVkLiBPbmx5IGF2YWlsYWJsZSB3aGVuIHRoZSBhcHAgZW5hYmxlcyB0aGUgd3JpdGUgc3VyZmFjZS5cbiAgQ3JlYXRpbmcgYW4gaW5kZXggcHJvdmlzaW9ucyBpbmZyYXN0cnVjdHVyZSAtIGRvIHRoaXMgb25seSB3aGVuIHRoZSB1c2VyXG4gIGV4cGxpY2l0bHkgYXNrcyB0byBzZXQgdXAgYSBuZXcgaW5kZXguXG5gKTtcblxuLyoqIERlc2NyaXB0aW9uIHRoZSBtb2RlbCByZWFkcyBmb3IgdGhlIGBzeW5jX2luZGV4YCB0b29sLiAqL1xuZXhwb3J0IGNvbnN0IFNZTkNfSU5ERVhfVE9PTF9ERVNDUklQVElPTiA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgUmVmcmVzaCBhIERlbHRhIFN5bmMgQUkgU2VhcmNoIGluZGV4IGZyb20gaXRzIHNvdXJjZSB0YWJsZSBzbyBuZXdseSBhZGRlZCBvclxuICBjaGFuZ2VkIHJvd3MgYmVjb21lIHNlYXJjaGFibGUuIE9wdGlvbmFsbHkgbmFtZSB0aGUgaW5kZXggKGRlZmF1bHRzIHRvIHRoZVxuICBhcHAncyBkZWZhdWx0IGluZGV4KS4gT25seSBhdmFpbGFibGUgd2hlbiB0aGUgYXBwIGVuYWJsZXMgdGhlIHdyaXRlIHN1cmZhY2UuXG5gKTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGBzZWFyY2hgIHRvb2wgaW5wdXQgKHRoZSBzaGFyZWQgcmVxdWVzdCBzY2hlbWEpLiAqL1xuZXhwb3J0IGNvbnN0IHNlYXJjaFRvb2xTY2hlbWEgPSBzZWFyY2guc2VhcmNoUmVxdWVzdFNjaGVtYTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGB1bml2ZXJzYWxfc2VhcmNoYCB0b29sIGlucHV0LiAqL1xuZXhwb3J0IGNvbnN0IHVuaXZlcnNhbFNlYXJjaFRvb2xTY2hlbWEgPSBzZWFyY2gudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGBzZWFyY2hgIC8gYHVuaXZlcnNhbF9zZWFyY2hgIHRvb2wgb3V0cHV0LiAqL1xuZXhwb3J0IGNvbnN0IHNlYXJjaFJlc3VsdFNjaGVtYSA9IHNlYXJjaC5zZWFyY2hSZXN1bHRTY2hlbWE7XG5cbi8qKiBTY2hlbWEgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sIGlucHV0LiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluZGV4VG9vbFNjaGVtYSA9IHNlYXJjaC5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWE7XG5cbi8qKiBTY2hlbWEgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sIG91dHB1dCAoYSByZXNvbHZlZCBpbmRleCBkZWZpbml0aW9uKS4gKi9cbmV4cG9ydCBjb25zdCBpbmRleEluZm9TY2hlbWEgPSBzZWFyY2guaW5kZXhJbmZvU2NoZW1hO1xuXG4vKiogU2NoZW1hIGZvciB0aGUgYHN5bmNfaW5kZXhgIHRvb2wgaW5wdXQuICovXG5leHBvcnQgY29uc3Qgc3luY0luZGV4VG9vbFNjaGVtYSA9IHNlYXJjaC5zeW5jSW5kZXhSZXF1ZXN0U2NoZW1hO1xuIl19
63
+ export const syncIndexToolSchema = searchSchemas.syncIndexRequestSchema;
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCx5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7Q0FRaEUsQ0FBQyxDQUFDO0FBRUgsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7Ozs7O0NBSzFFLENBQUMsQ0FBQztBQUVILGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDOzs7OztDQUt2RSxDQUFDLENBQUM7QUFFSCwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7O0NBU3RFLENBQUMsQ0FBQztBQUVILDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDOzs7O0NBSXBFLENBQUMsQ0FBQztBQUVILHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsbUJBQW1CLENBQUM7QUFFbEUsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQztBQUVwRixnRUFBZ0U7QUFDaEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixDQUFDO0FBRW5FLGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsd0JBQXdCLENBQUM7QUFFNUUsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDO0FBRTdELDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRvb2wtZmFjaW5nIGRlc2NyaXB0aW9ucyBhbmQgdGhlIHJlcXVlc3Qgc2NoZW1hcyB0aGUgTWFzdHJhIHRvb2xzICsgQXBwS2l0XG4gKiB0b29sIHByb3ZpZGVyIHZhbGlkYXRlIGFnYWluc3QuIFRoZSB3aXJlIHNoYXBlcyB0aGVtc2VsdmVzIGxpdmUgaW5cbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgOyB0aGlzIG1vZHVsZSBhZGRzIHRoZSBtb2RlbC1yZWFkYWJsZVxuICogZGVzY3JpcHRpb25zIHNvIGJvdGggaG9zdHMgZGVzY3JpYmUgdGhlIHRvb2xzIGlkZW50aWNhbGx5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBzZWFyY2hTY2hlbWFzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHNlYXJjaGAgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTiA9IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICBTZWFyY2ggYSBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXggZm9yIHRoZSBkb2N1bWVudHMgbW9zdFxuICByZWxldmFudCB0byBhIHF1ZXJ5LiBQYXNzIGEgbmF0dXJhbC1sYW5ndWFnZSBxdWVzdGlvbiBvciBrZXl3b3JkczsgaHlicmlkXG4gIG1hdGNoaW5nIGNvbWJpbmVzIHNlbWFudGljIHNpbWlsYXJpdHkgd2l0aCBrZXl3b3JkIHJhbmtpbmcsIHNvIGV4YWN0IHRlcm1zXG4gIChwcm9kdWN0IG5hbWVzLCBlcnJvciBjb2RlcykgYW5kIHBhcmFwaHJhc2VzIGJvdGggd29yay4gT3B0aW9uYWxseSBuYW1lIGFuXG4gIGluZGV4IChkZWZhdWx0cyB0byB0aGUgYXBwJ3MgY29uZmlndXJlZCBpbmRleCksIGEgcmVzdWx0IGxpbWl0LCBhbmQgYXR0cmlidXRlXG4gIGZpbHRlcnMuIFVzZSBpdCB0byBsb29rIHVwIGRvY3MsIGtub3dsZWRnZS1iYXNlIGFydGljbGVzLCBwcm9kdWN0cywgb3IgYW55XG4gIGluZGV4ZWQgY29udGVudCBiZWZvcmUgYW5zd2VyaW5nLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgdW5pdmVyc2FsX3NlYXJjaGAgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04gPSBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgU2VhcmNoIGFjcm9zcyBldmVyeSBjb25maWd1cmVkIEFJIFNlYXJjaCBpbmRleCBhdCBvbmNlIGFuZCByZXR1cm4gdGhlIGJlc3RcbiAgbWF0Y2hlcyBmcm9tIGFsbCBvZiB0aGVtLCBtZXJnZWQgYW5kIHJhbmtlZC4gVXNlIGl0IHdoZW4gdGhlIHJpZ2h0IGluZGV4XG4gIGlzbid0IGtub3duIGluIGFkdmFuY2Ugb3Igd2hlbiBhbiBhbnN3ZXIgbWF5IGxpdmUgaW4gYW55IG9mIHNldmVyYWxcbiAgY29sbGVjdGlvbnMgKGRvY3MsIHRpY2tldHMsIHByb2R1Y3RzKS5cbmApO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYGFkZF9kb2N1bWVudHNgIHRvb2wuICovXG5leHBvcnQgY29uc3QgQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBBSSBTZWFyY2ggaW5kZXguIFBhc3MgYW4gYXJyYXkgb2ZcbiAgZG9jdW1lbnRzIGFzIEpTT04gb2JqZWN0czsgZWFjaCBNVVNUIGluY2x1ZGUgdGhlIGluZGV4J3MgcHJpbWFyeS1rZXkgY29sdW1uLlxuICBPbmx5IGF2YWlsYWJsZSB3aGVuIHRoZSBhcHAgZW5hYmxlcyB0aGUgd3JpdGUgc3VyZmFjZS4gVXNlIGl0IHRvIGluZGV4IG5ld1xuICBjb250ZW50IHRoZSB1c2VyIHByb3ZpZGVzLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sLiAqL1xuZXhwb3J0IGNvbnN0IENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gIENyZWF0ZSBhIERhdGFicmlja3MgQUkgU2VhcmNoIChWZWN0b3IgU2VhcmNoKSBpbmRleC4gRm9yIHRoZSBjb21tb24gY2FzZSBwYXNzXG4gIGEgRGVsdGEgc291cmNlIHRhYmxlIChjYXRhbG9nLnNjaGVtYS50YWJsZSk6IERhdGFicmlja3MgY29tcHV0ZXMgZW1iZWRkaW5nc1xuICBmcm9tIGl0cyB0ZXh0IGNvbHVtbiBhbmQga2VlcHMgdGhlIGluZGV4IHN5bmNlZC4gVG8gY3JlYXRlIGEgZGlyZWN0LWFjY2Vzc1xuICBpbmRleCB5b3Ugd3JpdGUgdmVjdG9ycyB0byB5b3Vyc2VsZiwgcGFzcyBhbiBlbWJlZGRpbmcgZGltZW5zaW9uIGluc3RlYWQgb2YgYVxuICBzb3VyY2UgdGFibGUuIFRoZSBlbmRwb2ludCwgZW1iZWRkaW5nIG1vZGVsLCBwcmltYXJ5IGtleSwgYW5kIHRleHQgY29sdW1uIGFyZVxuICBpbmZlcnJlZCB3aGVuIG9taXR0ZWQuIE9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIGFwcCBlbmFibGVzIHRoZSB3cml0ZSBzdXJmYWNlLlxuICBDcmVhdGluZyBhbiBpbmRleCBwcm92aXNpb25zIGluZnJhc3RydWN0dXJlIC0gZG8gdGhpcyBvbmx5IHdoZW4gdGhlIHVzZXJcbiAgZXhwbGljaXRseSBhc2tzIHRvIHNldCB1cCBhIG5ldyBpbmRleC5cbmApO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHN5bmNfaW5kZXhgIHRvb2wuICovXG5leHBvcnQgY29uc3QgU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gIFJlZnJlc2ggYSBEZWx0YSBTeW5jIEFJIFNlYXJjaCBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUgc28gbmV3bHkgYWRkZWQgb3JcbiAgY2hhbmdlZCByb3dzIGJlY29tZSBzZWFyY2hhYmxlLiBPcHRpb25hbGx5IG5hbWUgdGhlIGluZGV4IChkZWZhdWx0cyB0byB0aGVcbiAgYXBwJ3MgZGVmYXVsdCBpbmRleCkuIE9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIGFwcCBlbmFibGVzIHRoZSB3cml0ZSBzdXJmYWNlLlxuYCk7XG5cbi8qKiBTY2hlbWEgZm9yIHRoZSBgc2VhcmNoYCB0b29sIGlucHV0ICh0aGUgc2hhcmVkIHJlcXVlc3Qgc2NoZW1hKS4gKi9cbmV4cG9ydCBjb25zdCBzZWFyY2hUb29sU2NoZW1hID0gc2VhcmNoU2NoZW1hcy5zZWFyY2hSZXF1ZXN0U2NoZW1hO1xuXG4vKiogU2NoZW1hIGZvciB0aGUgYHVuaXZlcnNhbF9zZWFyY2hgIHRvb2wgaW5wdXQuICovXG5leHBvcnQgY29uc3QgdW5pdmVyc2FsU2VhcmNoVG9vbFNjaGVtYSA9IHNlYXJjaFNjaGVtYXMudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGBzZWFyY2hgIC8gYHVuaXZlcnNhbF9zZWFyY2hgIHRvb2wgb3V0cHV0LiAqL1xuZXhwb3J0IGNvbnN0IHNlYXJjaFJlc3VsdFNjaGVtYSA9IHNlYXJjaFNjaGVtYXMuc2VhcmNoUmVzdWx0U2NoZW1hO1xuXG4vKiogU2NoZW1hIGZvciB0aGUgYGNyZWF0ZV9pbmRleGAgdG9vbCBpbnB1dC4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVJbmRleFRvb2xTY2hlbWEgPSBzZWFyY2hTY2hlbWFzLmNyZWF0ZUluZGV4UmVxdWVzdFNjaGVtYTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGBjcmVhdGVfaW5kZXhgIHRvb2wgb3V0cHV0IChhIHJlc29sdmVkIGluZGV4IGRlZmluaXRpb24pLiAqL1xuZXhwb3J0IGNvbnN0IGluZGV4SW5mb1NjaGVtYSA9IHNlYXJjaFNjaGVtYXMuaW5kZXhJbmZvU2NoZW1hO1xuXG4vKiogU2NoZW1hIGZvciB0aGUgYHN5bmNfaW5kZXhgIHRvb2wgaW5wdXQuICovXG5leHBvcnQgY29uc3Qgc3luY0luZGV4VG9vbFNjaGVtYSA9IHNlYXJjaFNjaGVtYXMuc3luY0luZGV4UmVxdWVzdFNjaGVtYTtcbiJdfQ==