@dbx-tools/appkit-mastra 0.9.153 → 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.
Files changed (76) hide show
  1. package/README.md +4 -3
  2. package/index.ts +32 -24
  3. package/lib/index.d.ts +32 -24
  4. package/lib/index.js +32 -23
  5. package/lib/src/agents.d.ts +5 -6
  6. package/lib/src/agents.js +12 -15
  7. package/lib/src/chart.js +33 -33
  8. package/lib/src/chat.js +10 -13
  9. package/lib/src/config.d.ts +12 -13
  10. package/lib/src/config.js +4 -4
  11. package/lib/src/evaluation.js +7 -9
  12. package/lib/src/feedback-mode.d.ts +1 -1
  13. package/lib/src/feedback-mode.js +1 -1
  14. package/lib/src/filesystems.js +6 -6
  15. package/lib/src/follow-up-suggestions.js +10 -10
  16. package/lib/src/genie-chat.js +27 -29
  17. package/lib/src/genie.d.ts +2 -2
  18. package/lib/src/genie.js +29 -29
  19. package/lib/src/identity.d.ts +3 -30
  20. package/lib/src/identity.js +2 -27
  21. package/lib/src/memory.d.ts +1 -1
  22. package/lib/src/memory.js +24 -6
  23. package/lib/src/mlflow.d.ts +4 -4
  24. package/lib/src/mlflow.js +15 -18
  25. package/lib/src/model.d.ts +3 -3
  26. package/lib/src/model.js +6 -6
  27. package/lib/src/monty-sandbox.js +8 -8
  28. package/lib/src/observability.d.ts +6 -5
  29. package/lib/src/observability.js +8 -6
  30. package/lib/src/plugin.d.ts +1 -1
  31. package/lib/src/plugin.js +49 -51
  32. package/lib/src/remote-skills.d.ts +3 -4
  33. package/lib/src/remote-skills.js +46 -46
  34. package/lib/src/rest.d.ts +2 -2
  35. package/lib/src/rest.js +3 -3
  36. package/lib/src/server.js +17 -20
  37. package/lib/src/serving.js +10 -11
  38. package/lib/src/statement.js +7 -7
  39. package/lib/src/storage-schema.js +4 -4
  40. package/lib/src/summarize.js +5 -5
  41. package/lib/src/telemetry.d.ts +0 -6
  42. package/lib/src/telemetry.js +34 -41
  43. package/lib/src/validation.js +3 -4
  44. package/lib/src/workspaces.d.ts +2 -2
  45. package/lib/src/workspaces.js +34 -36
  46. package/lib/src/writer.d.ts +2 -2
  47. package/lib/src/writer.js +3 -3
  48. package/package.json +17 -305
  49. package/src/agents.ts +27 -21
  50. package/src/chart.ts +43 -37
  51. package/src/chat.ts +10 -12
  52. package/src/config.ts +14 -15
  53. package/src/evaluation.ts +6 -8
  54. package/src/feedback-mode.ts +1 -1
  55. package/src/filesystems.ts +5 -5
  56. package/src/follow-up-suggestions.ts +9 -9
  57. package/src/genie-chat.ts +32 -31
  58. package/src/genie.ts +29 -29
  59. package/src/identity.ts +3 -38
  60. package/src/memory.ts +24 -6
  61. package/src/mlflow.ts +21 -21
  62. package/src/model.ts +7 -7
  63. package/src/monty-sandbox.ts +7 -7
  64. package/src/observability.ts +8 -6
  65. package/src/plugin.ts +78 -65
  66. package/src/remote-skills.ts +63 -55
  67. package/src/rest.ts +4 -4
  68. package/src/server.ts +32 -20
  69. package/src/serving.ts +14 -11
  70. package/src/statement.ts +10 -6
  71. package/src/storage-schema.ts +3 -3
  72. package/src/summarize.ts +4 -4
  73. package/src/telemetry.ts +49 -55
  74. package/src/validation.ts +2 -3
  75. package/src/workspaces.ts +52 -42
  76. package/src/writer.ts +3 -3
package/lib/src/rest.d.ts CHANGED
@@ -9,9 +9,9 @@
9
9
  *
10
10
  * @module
11
11
  */
12
- import { appkit } from "@dbx-tools/appkit";
12
+ import { type WorkspaceClientLike } from "@dbx-tools/appkit";
13
13
  /** Workspace client carried on an AppKit execution context. */
14
- type WorkspaceClient = appkit.WorkspaceClientLike;
14
+ type WorkspaceClient = WorkspaceClientLike;
15
15
  /** Request options for {@link databricksFetch}. */
16
16
  export interface DatabricksFetchInit {
17
17
  method: string;
package/lib/src/rest.js CHANGED
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * @module
11
11
  */
12
- import { json } from "@dbx-tools/shared-core";
12
+ import { parse } from "@dbx-tools/shared-core";
13
13
  /**
14
14
  * Resolve the workspace host + an authenticated header set off the
15
15
  * client and issue a `fetch` against `path` (mounted on the host).
@@ -41,6 +41,6 @@ export async function readResponseText(res) {
41
41
  /** Parse a response body as JSON, returning `{}` on empty / invalid bodies. */
42
42
  export async function readResponseJson(res) {
43
43
  const text = await readResponseText(res);
44
- return json.parse(text, {});
44
+ return parse(text, {});
45
45
  }
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFHSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFlOUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQ25DLE1BQXVCLEVBQ3ZCLElBQVksRUFDWixJQUF5QjtJQUV6QixNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDckYsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0MsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFO1FBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNuQixPQUFPO1FBQ1AsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ2hELENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxHQUFhO0lBQ2xELElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxHQUFhO0lBQ2xELE1BQU0sSUFBSSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFVLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNaW5pbWFsIGF1dGhlbnRpY2F0ZWQgRGF0YWJyaWNrcyBSRVNUIGhlbHBlci4gUHVsbHMgdGhlIHdvcmtzcGFjZVxuICogaG9zdCBhbmQgYSBmcmVzaCBiZWFyZXIgaGVhZGVyIG9mZiBhbiBPQk8tc2NvcGVkIGBXb3Jrc3BhY2VDbGllbnRgXG4gKiAoYGNsaWVudC5jb25maWcuZ2V0SG9zdCgpYCArIGBhdXRoZW50aWNhdGUoKWApLCB0aGVuIGlzc3VlcyBhIHBsYWluXG4gKiBgZmV0Y2hgLiBVc2VkIGJ5IG1vZHVsZXMgdGhhdCBoaXQgUkVTVCBzdXJmYWNlcyB3aXRob3V0IGEgdHlwZWQgU0RLXG4gKiBtZXRob2QgKGUuZy4gdGhlIE1MZmxvdyBhc3Nlc3NtZW50cyBBUEkpOyByZXR1cm5zIHRoZSByYXcgYFJlc3BvbnNlYFxuICogc28gY2FsbGVycyBkZWNpZGUgaG93IHRvIHRyZWF0IHN0YXR1cyBjb2Rlcy4gQWxzbyBjYXJyaWVzIHRoZVxuICogZGVmZW5zaXZlIGBSZXNwb25zZWAgYm9keSByZWFkZXJzIHRob3NlIGNhbGxlcnMgc2hhcmUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsganNvbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbi8qKiBXb3Jrc3BhY2UgY2xpZW50IGNhcnJpZWQgb24gYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xudHlwZSBXb3Jrc3BhY2VDbGllbnQgPSBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZTtcblxuLyoqIFJlcXVlc3Qgb3B0aW9ucyBmb3Ige0BsaW5rIGRhdGFicmlja3NGZXRjaH0uICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NGZXRjaEluaXQge1xuICBtZXRob2Q6IHN0cmluZztcbiAgLyoqIEpTT04tc2VyaWFsaXplZCBhcyB0aGUgcmVxdWVzdCBib2R5IHdoZW4gcHJlc2VudC4gKi9cbiAgYm9keT86IHVua25vd247XG4gIC8qKiBFeHRyYSBoZWFkZXJzIG1lcmdlZCBvdmVyIHRoZSBkZWZhdWx0IGBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25gLiAqL1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgd29ya3NwYWNlIGhvc3QgKyBhbiBhdXRoZW50aWNhdGVkIGhlYWRlciBzZXQgb2ZmIHRoZVxuICogY2xpZW50IGFuZCBpc3N1ZSBhIGBmZXRjaGAgYWdhaW5zdCBgcGF0aGAgKG1vdW50ZWQgb24gdGhlIGhvc3QpLlxuICogUnVucyBhcyB3aGF0ZXZlciBpZGVudGl0eSB0aGUgY2xpZW50IGNhcnJpZXMgLSB0aGUgcGVyLXJlcXVlc3QgT0JPXG4gKiB1c2VyIHdoZW4gY2FsbGVkIGZyb20gYSByZXF1ZXN0IHNjb3BlLCB0aGUgc2VydmljZSBwcmluY2lwYWxcbiAqIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRhdGFicmlja3NGZXRjaChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHBhdGg6IHN0cmluZyxcbiAgaW5pdDogRGF0YWJyaWNrc0ZldGNoSW5pdCxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsIC4uLmluaXQuaGVhZGVycyB9KTtcbiAgYXdhaXQgY2xpZW50LmNvbmZpZy5hdXRoZW50aWNhdGUoaGVhZGVycyk7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aCwgaG9zdCkudG9TdHJpbmcoKTtcbiAgcmV0dXJuIGZldGNoKHVybCwge1xuICAgIG1ldGhvZDogaW5pdC5tZXRob2QsXG4gICAgaGVhZGVycyxcbiAgICAuLi4oaW5pdC5ib2R5ICE9PSB1bmRlZmluZWQgPyB7IGJvZHk6IEpTT04uc3RyaW5naWZ5KGluaXQuYm9keSkgfSA6IHt9KSxcbiAgICAuLi4oaW5pdC5zaWduYWwgPyB7IHNpZ25hbDogaW5pdC5zaWduYWwgfSA6IHt9KSxcbiAgfSk7XG59XG5cbi8qKiBSZWFkIGEgcmVzcG9uc2UgYm9keSBhcyB0ZXh0LCBzd2FsbG93aW5nIHJlYWQgZXJyb3JzIChyZXR1cm5zIGBcIlwiYCkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFJlc3BvbnNlVGV4dChyZXM6IFJlc3BvbnNlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVzLnRleHQoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbn1cblxuLyoqIFBhcnNlIGEgcmVzcG9uc2UgYm9keSBhcyBKU09OLCByZXR1cm5pbmcgYHt9YCBvbiBlbXB0eSAvIGludmFsaWQgYm9kaWVzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRSZXNwb25zZUpzb24ocmVzOiBSZXNwb25zZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVhZFJlc3BvbnNlVGV4dChyZXMpO1xuICByZXR1cm4ganNvbi5wYXJzZTx1bmtub3duPih0ZXh0LCB7fSk7XG59XG4iXX0=
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFHSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFlL0M7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQ25DLE1BQXVCLEVBQ3ZCLElBQVksRUFDWixJQUF5QjtJQUV6QixNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDckYsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0MsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFO1FBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNuQixPQUFPO1FBQ1AsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ2hELENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxHQUFhO0lBQ2xELElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxHQUFhO0lBQ2xELE1BQU0sSUFBSSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsT0FBTyxLQUFLLENBQVUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1pbmltYWwgYXV0aGVudGljYXRlZCBEYXRhYnJpY2tzIFJFU1QgaGVscGVyLiBQdWxscyB0aGUgd29ya3NwYWNlXG4gKiBob3N0IGFuZCBhIGZyZXNoIGJlYXJlciBoZWFkZXIgb2ZmIGFuIE9CTy1zY29wZWQgYFdvcmtzcGFjZUNsaWVudGBcbiAqIChgY2xpZW50LmNvbmZpZy5nZXRIb3N0KClgICsgYGF1dGhlbnRpY2F0ZSgpYCksIHRoZW4gaXNzdWVzIGEgcGxhaW5cbiAqIGBmZXRjaGAuIFVzZWQgYnkgbW9kdWxlcyB0aGF0IGhpdCBSRVNUIHN1cmZhY2VzIHdpdGhvdXQgYSB0eXBlZCBTREtcbiAqIG1ldGhvZCAoZS5nLiB0aGUgTUxmbG93IGFzc2Vzc21lbnRzIEFQSSk7IHJldHVybnMgdGhlIHJhdyBgUmVzcG9uc2VgXG4gKiBzbyBjYWxsZXJzIGRlY2lkZSBob3cgdG8gdHJlYXQgc3RhdHVzIGNvZGVzLiBBbHNvIGNhcnJpZXMgdGhlXG4gKiBkZWZlbnNpdmUgYFJlc3BvbnNlYCBib2R5IHJlYWRlcnMgdGhvc2UgY2FsbGVycyBzaGFyZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbi8qKiBXb3Jrc3BhY2UgY2xpZW50IGNhcnJpZWQgb24gYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xudHlwZSBXb3Jrc3BhY2VDbGllbnQgPSBXb3Jrc3BhY2VDbGllbnRMaWtlO1xuXG4vKiogUmVxdWVzdCBvcHRpb25zIGZvciB7QGxpbmsgZGF0YWJyaWNrc0ZldGNofS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc0ZldGNoSW5pdCB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICAvKiogSlNPTi1zZXJpYWxpemVkIGFzIHRoZSByZXF1ZXN0IGJvZHkgd2hlbiBwcmVzZW50LiAqL1xuICBib2R5PzogdW5rbm93bjtcbiAgLyoqIEV4dHJhIGhlYWRlcnMgbWVyZ2VkIG92ZXIgdGhlIGRlZmF1bHQgYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbmAuICovXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSB3b3Jrc3BhY2UgaG9zdCArIGFuIGF1dGhlbnRpY2F0ZWQgaGVhZGVyIHNldCBvZmYgdGhlXG4gKiBjbGllbnQgYW5kIGlzc3VlIGEgYGZldGNoYCBhZ2FpbnN0IGBwYXRoYCAobW91bnRlZCBvbiB0aGUgaG9zdCkuXG4gKiBSdW5zIGFzIHdoYXRldmVyIGlkZW50aXR5IHRoZSBjbGllbnQgY2FycmllcyAtIHRoZSBwZXItcmVxdWVzdCBPQk9cbiAqIHVzZXIgd2hlbiBjYWxsZWQgZnJvbSBhIHJlcXVlc3Qgc2NvcGUsIHRoZSBzZXJ2aWNlIHByaW5jaXBhbFxuICogb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGF0YWJyaWNrc0ZldGNoKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgcGF0aDogc3RyaW5nLFxuICBpbml0OiBEYXRhYnJpY2tzRmV0Y2hJbml0LFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiwgLi4uaW5pdC5oZWFkZXJzIH0pO1xuICBhd2FpdCBjbGllbnQuY29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBob3N0KS50b1N0cmluZygpO1xuICByZXR1cm4gZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kOiBpbml0Lm1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIC4uLihpbml0LmJvZHkgIT09IHVuZGVmaW5lZCA/IHsgYm9keTogSlNPTi5zdHJpbmdpZnkoaW5pdC5ib2R5KSB9IDoge30pLFxuICAgIC4uLihpbml0LnNpZ25hbCA/IHsgc2lnbmFsOiBpbml0LnNpZ25hbCB9IDoge30pLFxuICB9KTtcbn1cblxuLyoqIFJlYWQgYSByZXNwb25zZSBib2R5IGFzIHRleHQsIHN3YWxsb3dpbmcgcmVhZCBlcnJvcnMgKHJldHVybnMgYFwiXCJgKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUmVzcG9uc2VUZXh0KHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZXMudGV4dCgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxufVxuXG4vKiogUGFyc2UgYSByZXNwb25zZSBib2R5IGFzIEpTT04sIHJldHVybmluZyBge31gIG9uIGVtcHR5IC8gaW52YWxpZCBib2RpZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFJlc3BvbnNlSnNvbihyZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IHRleHQgPSBhd2FpdCByZWFkUmVzcG9uc2VUZXh0KHJlcyk7XG4gIHJldHVybiBwYXJzZTx1bmtub3duPih0ZXh0LCB7fSk7XG59XG4iXX0=
package/lib/src/server.js CHANGED
@@ -5,15 +5,14 @@
5
5
  * @module
6
6
  */
7
7
  import { getExecutionContext } from "@databricks/appkit";
8
- import { errorUtils, hash, http, log, object, stringUtils, token } from "@dbx-tools/shared-core";
9
- import { feedback, thread } from "@dbx-tools/shared-mastra";
10
- import { isStaleMastraResumeError } from "@dbx-tools/shared-mastra/resume";
8
+ import { requestUserEmail, requestUserId } from "@dbx-tools/appkit";
9
+ import { log, toError, id, parseCookies, sequence, toIdentifierWithOptions, trimToNull, getAccessTokenScopes, } from "@dbx-tools/shared-core";
10
+ import { MLFLOW_TRACE_ID_HEADER, THREAD_ID_HEADER, THREAD_ID_QUERY, isStaleMastraResumeError, } from "@dbx-tools/shared-mastra";
11
11
  import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY, RequestContext, } from "@mastra/core/request-context";
12
12
  import { MastraServer as ExpressMastraServer } from "@mastra/express";
13
13
  import { trace } from "@opentelemetry/api";
14
14
  import { attributedUserId, MASTRA_AUTH_MODE_KEY, MASTRA_REQUEST_ID_KEY, MASTRA_SCOPES_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_KEY, MASTRA_USER_NAME_KEY, } from "./config.js";
15
15
  import { FOLLOW_UP_NATIVE_QUESTIONS_KEY, FOLLOW_UP_RUN_ID_KEY, FOLLOW_UP_USER_TEXT_KEY, } from "./follow-up-suggestions.js";
16
- import { requestUserEmail, requestUserId } from "./identity.js";
17
16
  import { initializeRequestMlflowTraceInfo } from "./mlflow.js";
18
17
  import { MASTRA_ORIGIN_KEY } from "./request-context.js";
19
18
  import { extractModelOverride, MASTRA_MODEL_OVERRIDE_KEY, MASTRA_RESOLVED_MODEL_KEY, resolveServingConfig, } from "./serving.js";
@@ -157,7 +156,7 @@ export async function createRequestContext(options = {}) {
157
156
  // identity `stampRequestContextUser` defaulted to.
158
157
  if (options.resourceId)
159
158
  requestContext.set(MASTRA_RESOURCE_ID_KEY, options.resourceId);
160
- requestContext.set(MASTRA_REQUEST_ID_KEY, options.requestId ?? hash.id());
159
+ requestContext.set(MASTRA_REQUEST_ID_KEY, options.requestId ?? id());
161
160
  return requestContext;
162
161
  }
163
162
  /**
@@ -247,7 +246,7 @@ export class MastraServer extends ExpressMastraServer {
247
246
  return;
248
247
  const headerValue = req.headers["x-request-id"];
249
248
  const upstream = Array.isArray(headerValue) ? headerValue[0] : headerValue;
250
- const requestId = upstream?.trim() || hash.id();
249
+ const requestId = upstream?.trim() || id();
251
250
  requestContext.set(MASTRA_REQUEST_ID_KEY, requestId);
252
251
  res.setHeader("X-Request-Id", requestId);
253
252
  }
@@ -257,9 +256,7 @@ export class MastraServer extends ExpressMastraServer {
257
256
  */
258
257
  configureRequestContextScopes(req, requestContext) {
259
258
  const scopes = [
260
- ...object
261
- .sequence(token.getAccessTokenScopes(req), token.getAccessTokenScopes(req, "authorization"))
262
- .distinct(),
259
+ ...sequence(getAccessTokenScopes(req), getAccessTokenScopes(req, "authorization")).distinct(),
263
260
  ];
264
261
  requestContext.set(MASTRA_SCOPES_KEY, scopes);
265
262
  }
@@ -279,12 +276,12 @@ export class MastraServer extends ExpressMastraServer {
279
276
  configureMlflowTraceId(res) {
280
277
  if (!this.mlflowFeedback || res.headersSent)
281
278
  return;
282
- if (res.getHeader(feedback.MLFLOW_TRACE_ID_HEADER))
279
+ if (res.getHeader(MLFLOW_TRACE_ID_HEADER))
283
280
  return;
284
281
  const traceId = trace.getActiveSpan()?.spanContext().traceId;
285
282
  if (!traceId || traceId === INVALID_TRACE_ID)
286
283
  return;
287
- res.setHeader(feedback.MLFLOW_TRACE_ID_HEADER, `tr-${traceId}`);
284
+ res.setHeader(MLFLOW_TRACE_ID_HEADER, `tr-${traceId}`);
288
285
  }
289
286
  /**
290
287
  * Resolve the thread id this request targets and pin it on
@@ -312,11 +309,11 @@ export class MastraServer extends ExpressMastraServer {
312
309
  requestContext.set(MASTRA_THREAD_ID_KEY, requested);
313
310
  return;
314
311
  }
315
- const cookies = http.parseCookies(req.headers.cookie);
316
- const cookieName = stringUtils.toIdentifierWithOptions({ delimiter: "_", distinct: true }, "appkit", this.config.name, "sessionId");
312
+ const cookies = parseCookies(req.headers.cookie);
313
+ const cookieName = toIdentifierWithOptions({ delimiter: "_", distinct: true }, "appkit", this.config.name, "sessionId");
317
314
  let sessionId = cookies[cookieName];
318
315
  if (!sessionId) {
319
- sessionId = hash.id();
316
+ sessionId = id();
320
317
  res.cookie(cookieName, sessionId, {
321
318
  httpOnly: true,
322
319
  sameSite: "lax",
@@ -333,10 +330,10 @@ export class MastraServer extends ExpressMastraServer {
333
330
  * back to the session cookie.
334
331
  */
335
332
  readRequestedThreadId(req) {
336
- const headerValue = req.headers[thread.THREAD_ID_HEADER];
337
- const queryValue = req.query[thread.THREAD_ID_QUERY];
338
- return (stringUtils.trimToNull(Array.isArray(headerValue) ? headerValue[0] : headerValue) ??
339
- stringUtils.trimToNull(Array.isArray(queryValue) ? queryValue[0] : queryValue));
333
+ const headerValue = req.headers[THREAD_ID_HEADER];
334
+ const queryValue = req.query[THREAD_ID_QUERY];
335
+ return (trimToNull(Array.isArray(headerValue) ? headerValue[0] : headerValue) ??
336
+ trimToNull(Array.isArray(queryValue) ? queryValue[0] : queryValue));
340
337
  }
341
338
  configureRequestContextModelOverride(req, requestContext) {
342
339
  // Per-request model override: only honored when the plugin
@@ -455,7 +452,7 @@ export function attachStaleResumeRecovery(app) {
455
452
  }
456
453
  logger.warn("ignored stale mastra resume", {
457
454
  path: req.path,
458
- error: errorUtils.toError(error),
455
+ error: toError(error),
459
456
  });
460
457
  if (res.headersSent) {
461
458
  res.end();
@@ -470,4 +467,4 @@ export function attachStaleResumeRecovery(app) {
470
467
  res.end();
471
468
  });
472
469
  }
473
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDZixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLElBQUksbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHM0MsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsZUFBZSxFQUNmLG9CQUFvQixHQUdyQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLG9CQUFvQixFQUNwQix1QkFBdUIsR0FDeEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFOzs7OztHQUtHO0FBQ0gsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUMzQyxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEMsTUFBTSw0QkFBNEIsR0FBRztJQUNuQyxzQkFBc0I7SUFDdEIsb0JBQW9CO0lBQ3BCLGVBQWU7SUFDZixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQix5QkFBeUI7SUFDekIseUJBQXlCO0lBQ3pCLHVCQUF1QjtJQUN2Qiw4QkFBOEI7SUFDOUIsb0JBQW9CO0NBQ1osQ0FBQztBQUVYLG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsMEJBQTBCLENBQUMsY0FBOEI7SUFDdkUsS0FBSyxNQUFNLEdBQUcsSUFBSSw0QkFBNEIsRUFBRSxDQUFDO1FBQy9DLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztBQUNILENBQUM7QUFFRCxvRkFBb0Y7QUFDcEYsTUFBTSxVQUFVLGFBQWEsQ0FBQyxHQUFvQjtJQUNoRCxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsS0FBSztZQUFFLFNBQVM7UUFDckIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQy9FLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCw2QkFBNkI7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzlGLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUIsTUFBTSxRQUFRLEdBQ1osR0FBRyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUM7SUFDcEYsSUFBSSxRQUFRLEtBQUssTUFBTSxJQUFJLFFBQVEsS0FBSyxPQUFPO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEUsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLEdBQUcsQ0FBQyxHQUFHLFFBQVEsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFpQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsY0FBOEIsRUFDOUIsYUFBaUMsRUFBRTtJQUVuQyxJQUFJLENBQUMsZUFBZSxFQUFFLHNCQUFzQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQUUsT0FBTztJQUM5RixNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDL0MsTUFBTSxnQ0FBZ0MsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRSxNQUFNLGFBQWEsR0FBRyxlQUFlLElBQUksZ0JBQWdCLENBQUM7SUFDMUQsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUM5RSxNQUFNLElBQUksR0FBUztRQUNqQixFQUFFLEVBQUUsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUN6RCxnQkFBZ0I7S0FDakIsQ0FBQztJQUNGLGNBQWMsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEYsK0RBQStEO0lBQy9ELGdFQUFnRTtJQUNoRSwyREFBMkQ7SUFDM0QsK0RBQStEO0lBQy9ELDRFQUE0RTtJQUM1RSxxRUFBcUU7SUFDckUsSUFBSSxRQUE0QixDQUFDO0lBQ2pDLElBQUksS0FBSyxHQUF1QixVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ2pELElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztRQUNyQyxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztJQUM5QyxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxhQUFhLEVBQUUsQ0FBQztRQUNsRCxNQUFNLFdBQVcsR0FBRyxNQUFNLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkUsUUFBUSxHQUFHLFdBQVcsRUFBRSxRQUFRLENBQUM7UUFDakMsS0FBSyxHQUFHLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3hGLEVBQUUsS0FBZSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsY0FBYyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLGNBQWMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLFVBQTBFLEVBQUU7SUFFNUUsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUM1QyxNQUFNLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlDLElBQUksT0FBTyxDQUFDLFFBQVE7UUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRiwwRUFBMEU7SUFDMUUsbURBQW1EO0lBQ25ELElBQUksT0FBTyxDQUFDLFVBQVU7UUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2RixjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUUsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sWUFBYSxTQUFRLG1CQUFtQjtJQVF6QztJQVBGLEdBQUcsQ0FBYTtJQUN4Qjs7T0FFRztJQUNLLGNBQWMsQ0FBVTtJQUVoQyxZQUNVLE1BQTBCLEVBQ2xDLEdBQUcsSUFBdUQ7UUFFMUQsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFIUCxXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUlsQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FBQztJQUN6RCxDQUFDO0lBRVEsc0JBQXNCO1FBQzdCLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3BDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBaUMsQ0FBQztZQUNwRSwwQkFBMEIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMzQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLCtCQUErQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsZ0NBQWdDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFFeEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFO2dCQUNoQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07Z0JBQ2xCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtnQkFDZCxTQUFTLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDcEQsUUFBUSxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7Z0JBQ2xELFVBQVUsRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDO2dCQUN0RCxRQUFRLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDbEQsU0FBUyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUM7Z0JBQ3BELGFBQWEsRUFBRSxjQUFjLENBQUMsR0FBRztnQkFDL0Isc0RBQXNEO2dCQUN0RCx5REFBeUQ7Z0JBQ3pELHdCQUF3QixDQUN6QjthQUNGLENBQUMsQ0FBQztZQUNILElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLDJCQUEyQixDQUFDLEdBQW9CLEVBQUUsY0FBOEI7UUFDcEYsNEVBQTRFO1FBQzVFLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsTUFBTSx1QkFBdUIsQ0FBQyxjQUFjLEVBQUU7WUFDNUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDMUIsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztTQUM3QixDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBcUIsQ0FBQztRQUNyRSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QscUJBQXFCLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRztZQUNoQixjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1lBQ3pDLGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztTQUMzQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBbUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsNkJBQTZCLENBQUMsR0FBb0IsRUFBRSxjQUE4QjtRQUNoRixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxNQUFNO1lBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILGdDQUFnQyxDQUM5QixHQUFvQixFQUNwQixHQUFxQixFQUNyQixjQUE4QjtRQUU5QixJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUM7WUFBRSxPQUFPO1FBQ3RELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDM0UsTUFBTSxTQUFTLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoRCxjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7O09BR0c7SUFDSCw2QkFBNkIsQ0FBQyxHQUFvQixFQUFFLGNBQThCO1FBQ2hGLE1BQU0sTUFBTSxHQUFHO1lBQ2IsR0FBRyxNQUFNO2lCQUNOLFFBQVEsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztpQkFDM0YsUUFBUSxFQUFFO1NBQ2QsQ0FBQztRQUNGLGNBQWMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILHNCQUFzQixDQUFDLEdBQXFCO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLEdBQUcsQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUNwRCxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO1lBQUUsT0FBTztRQUMzRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQzdELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLGdCQUFnQjtZQUFFLE9BQU87UUFDckQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDSCwrQkFBK0IsQ0FDN0IsR0FBb0IsRUFDcEIsR0FBcUIsRUFDckIsY0FBOEI7UUFFOUIsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDO1lBQUUsT0FBTztRQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDcEQsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLHVCQUF1QixDQUNwRCxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUNsQyxRQUFRLEVBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFLLEVBQ2pCLFdBQVcsQ0FDWixDQUFDO1FBQ0YsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFO2dCQUNoQyxRQUFRLEVBQUUsSUFBSTtnQkFDZCxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07Z0JBQ2xCLElBQUksRUFBRSxHQUFHO2FBQ1YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0sscUJBQXFCLENBQUMsR0FBb0I7UUFDaEQsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN6RCxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRCxPQUFPLENBQ0wsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUNqRixXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQy9FLENBQUM7SUFDSixDQUFDO0lBRUQsb0NBQW9DLENBQUMsR0FBb0IsRUFBRSxjQUE4QjtRQUN2RiwyREFBMkQ7UUFDM0QscURBQXFEO1FBQ3JELDBEQUEwRDtRQUMxRCwwQ0FBMEM7UUFDMUMsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDO2dCQUNwQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQXdEO2dCQUNyRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQWdDO2dCQUMzQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7YUFDZixDQUFDLENBQUM7WUFDSCxJQUFJLFFBQVE7Z0JBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBVUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLGVBQWUsR0FDbkIsb0pBQW9KLENBQUM7QUFFdkosMEVBQTBFO0FBQzFFLE1BQU0sY0FBYyxHQUFHLHNCQUFzQixDQUFDO0FBQzlDLGtEQUFrRDtBQUNsRCxNQUFNLG9CQUFvQixHQUFHLG9DQUFvQyxDQUFDO0FBQ2xFLDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztBQUN0QywrREFBK0Q7QUFDL0QsTUFBTSxjQUFjLEdBQUcsK0JBQStCLENBQUM7QUFDdkQsc0RBQXNEO0FBQ3RELE1BQU0sb0JBQW9CLEdBQUcsc0NBQXNDLENBQUM7QUFDcEUsK0VBQStFO0FBQy9FLE1BQU0sV0FBVyxHQUFHLGlEQUFpRCxDQUFDO0FBQ3RFLDBDQUEwQztBQUMxQyxNQUFNLHNCQUFzQixHQUFHLDZCQUE2QixDQUFDO0FBRTdEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLE1BQWMsRUFDZCxJQUFZLEVBQ1osSUFBMEI7SUFFMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUN4QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7SUFDbkQsMEVBQTBFO0lBQzFFLDJEQUEyRDtJQUMzRCxJQUFJLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMzRCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM1RSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0IsSUFBSSxDQUFDLEtBQUssTUFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEQsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkQsSUFBSSxDQUFDLEtBQUssTUFBTSxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM5RCxJQUFJLENBQUMsS0FBSyxNQUFNLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN6RCxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3pGLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BELElBQUksQ0FBQyxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsS0FBSyxRQUFRLENBQUMsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDckYsSUFBSSxDQUFDLEtBQUssTUFBTSxJQUFJLENBQUMsS0FBSyx5QkFBeUI7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNqRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsR0FBb0I7SUFDN0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDMUIsTUFBTSxhQUFhLEdBQ2pCLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTztZQUNwQixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDN0IsR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxHQUFHLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDM0IsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxHQUFvQjtJQUM1RCxHQUFHLENBQUMsR0FBRyxDQUNMLENBQUMsS0FBYyxFQUFFLEdBQW9CLEVBQUUsR0FBcUIsRUFBRSxJQUEwQixFQUFFLEVBQUU7UUFDMUYsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQ3pDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztTQUNqQyxDQUFDLENBQUM7UUFDSCxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixPQUFPO1FBQ1QsQ0FBQztRQUNELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztRQUNsRSxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeHByZXNzLWxheWVyIHBsdW1iaW5nIGZvciB0aGUgTWFzdHJhIHBsdWdpbjogYSBgTWFzdHJhU2VydmVyYCB0aGF0XG4gKiBzdGFtcHMgdGhlIHBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAgYW5kIGEgc2NvcGVkIG5hdGl2ZSBBUEkgZ2F0ZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGhhc2gsIGh0dHAsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscywgdG9rZW4gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZmVlZGJhY2ssIHRocmVhZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IGlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvciB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmEvcmVzdW1lXCI7XG5pbXBvcnQge1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgUmVxdWVzdENvbnRleHQsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNYXN0cmFTZXJ2ZXIgYXMgRXhwcmVzc01hc3RyYVNlcnZlciB9IGZyb20gXCJAbWFzdHJhL2V4cHJlc3NcIjtcbmltcG9ydCB7IHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQge1xuICBhdHRyaWJ1dGVkVXNlcklkLFxuICBNQVNUUkFfQVVUSF9NT0RFX0tFWSxcbiAgTUFTVFJBX1JFUVVFU1RfSURfS0VZLFxuICBNQVNUUkFfU0NPUEVTX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfVVNFUl9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgdHlwZSBVc2VyLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIEZPTExPV19VUF9OQVRJVkVfUVVFU1RJT05TX0tFWSxcbiAgRk9MTE9XX1VQX1JVTl9JRF9LRVksXG4gIEZPTExPV19VUF9VU0VSX1RFWFRfS0VZLFxufSBmcm9tIFwiLi9mb2xsb3ctdXAtc3VnZ2VzdGlvbnMudHNcIjtcbmltcG9ydCB7IHJlcXVlc3RVc2VyRW1haWwsIHJlcXVlc3RVc2VySWQgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZVJlcXVlc3RNbGZsb3dUcmFjZUluZm8gfSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7IE1BU1RSQV9PUklHSU5fS0VZIH0gZnJvbSBcIi4vcmVxdWVzdC1jb250ZXh0LnRzXCI7XG5pbXBvcnQge1xuICBleHRyYWN0TW9kZWxPdmVycmlkZSxcbiAgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSxcbiAgTUFTVFJBX1JFU09MVkVEX01PREVMX0tFWSxcbiAgcmVzb2x2ZVNlcnZpbmdDb25maWcsXG59IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbmltcG9ydCB7IHJlY29yZEFjdGl2ZVRyYWNlQXV0aCwgcmVjb3JkQWN0aXZlVHJhY2VVc2VyIH0gZnJvbSBcIi4vdGVsZW1ldHJ5LnRzXCI7XG4vKipcbiAqIE9wZW5UZWxlbWV0cnkncyBzZW50aW5lbCBmb3IgXCJubyB2YWxpZCB0cmFjZVwiIC0gMzIgemVybyBoZXggY2hhcnMuXG4gKiBgdHJhY2UuZ2V0QWN0aXZlU3BhbigpYCByZXR1cm5zIGEgbm9uLXJlY29yZGluZyBzcGFuIHdpdGggdGhpcyBpZFxuICogd2hlbiBubyBTREsgaXMgcmVnaXN0ZXJlZCwgd2hpY2ggbXVzdCBuZXZlciBiZSBzdXJmYWNlZCBhcyBhIHRyYWNlIHRvXG4gKiBhdHRhY2ggZmVlZGJhY2sgdG8uXG4gKi9cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvc2VydmVyXCIpO1xuY29uc3QgSU5WQUxJRF9UUkFDRV9JRCA9IFwiMFwiLnJlcGVhdCgzMik7XG5jb25zdCBUUlVTVEVEX1JFUVVFU1RfQ09OVEVYVF9LRVlTID0gW1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgTUFTVFJBX1VTRVJfS0VZLFxuICBNQVNUUkFfVVNFUl9OQU1FX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfQVVUSF9NT0RFX0tFWSxcbiAgTUFTVFJBX1JFUVVFU1RfSURfS0VZLFxuICBNQVNUUkFfT1JJR0lOX0tFWSxcbiAgTUFTVFJBX1NDT1BFU19LRVksXG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG4gIE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVksXG4gIEZPTExPV19VUF9VU0VSX1RFWFRfS0VZLFxuICBGT0xMT1dfVVBfTkFUSVZFX1FVRVNUSU9OU19LRVksXG4gIEZPTExPV19VUF9SVU5fSURfS0VZLFxuXSBhcyBjb25zdDtcblxuLyoqIFJlbW92ZSBicm93c2VyLXN1cHBsaWVkIHZhbHVlcyBmb3IgZmllbGRzIG93bmVkIGJ5IHRydXN0ZWQgc2VydmVyIG1pZGRsZXdhcmUuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5kZWxldGVSYXcoa2V5KTtcbiAgfVxufVxuXG4vKiogUmVzb2x2ZSB0aGUgY2Fub25pY2FsIGJyb3dzZXIgb3JpZ2luIGZyb20gc3RhbmRhcmQgcHJveHkgYW5kIGJyb3dzZXIgaGVhZGVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0T3JpZ2luKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbcmVxLmdldChcIm9yaWdpblwiKSwgcmVxLmdldChcInJlZmVyZXJcIildKSB7XG4gICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodmFsdWUpO1xuICAgICAgaWYgKHVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHVybC5wcm90b2NvbCA9PT0gXCJodHRwczpcIikgcmV0dXJuIHVybC5vcmlnaW47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDb250aW51ZSB0byBwcm94eSBoZWFkZXJzLlxuICAgIH1cbiAgfVxuICBjb25zdCBob3N0ID0gcmVxLmdldChcIngtZm9yd2FyZGVkLWhvc3RcIik/LnNwbGl0KFwiLFwiLCAxKVswXT8udHJpbSgpIHx8IHJlcS5nZXQoXCJob3N0XCIpPy50cmltKCk7XG4gIGlmICghaG9zdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcHJvdG9jb2wgPVxuICAgIHJlcS5nZXQoXCJ4LWZvcndhcmRlZC1wcm90b1wiKT8uc3BsaXQoXCIsXCIsIDEpWzBdPy50cmltKCkgfHwgcmVxLnByb3RvY29sIHx8IFwiaHR0cHNcIjtcbiAgaWYgKHByb3RvY29sICE9PSBcImh0dHBcIiAmJiBwcm90b2NvbCAhPT0gXCJodHRwc1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKGAke3Byb3RvY29sfTovLyR7aG9zdH1gKS5vcmlnaW47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXaG8gYSB0dXJuIGlzIEFUVFJJQlVURUQgdG8sIGluZGVwZW5kZW50IG9mIHdoaWNoIERhdGFicmlja3MgY3JlZGVudGlhbCBydW5zXG4gKiBpdHMgY2FsbHMuIFN1cHBsaWVkIGJ5IHRoZSBIVFRQIG1pZGRsZXdhcmUgZnJvbSB0aGUgZm9yd2FyZGVkIHVzZXIgaGVhZGVycyBzb1xuICogdGhhdCBpbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgLSB3aGVyZSBldmVyeSByZXF1ZXN0IHNoYXJlcyB0aGUgYXBwIFNQJ3NcbiAqIGNsaWVudCAtIHRoZSBtZW1vcnkgdGhyZWFkLCBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2UsIGFuZCB0cmFjZSBtZXRhZGF0YVxuICogc3RpbGwga2V5IG9mZiB0aGUgcmVhbCBjYWxsZXIuIElnbm9yZWQgaW4gYW4gT0JPICh1c2VyKSBjb250ZXh0LCB3aG9zZSBvd25cbiAqIHVzZXIgaWQgLyBlbWFpbCBhcmUgYXV0aG9yaXRhdGl2ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRyaWJ1dGVkSWRlbnRpdHkge1xuICAvKiogRm9yd2FyZGVkIGB4LWZvcndhcmRlZC11c2VyYCBpZCwgdXNlZCB3aGVuIHRoZSBjbGllbnQgaXMgdGhlIHNlcnZpY2UgcHJpbmNpcGFsLiAqL1xuICB1c2VySWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBGb3J3YXJkZWQgYHgtZm9yd2FyZGVkLWVtYWlsYCwgdXNlZCBmb3IgdHJhY2UgbWV0YWRhdGEgdW5kZXIgdGhlIHNlcnZpY2UgcHJpbmNpcGFsLiAqL1xuICBlbWFpbD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTdGFtcCB0aGUgQXBwS2l0IHVzZXIgKHBsdXMgdGhlIHJlc291cmNlIGlkIGFuZCB0cmFjZSBtZXRhZGF0YSkgb250b1xuICogYHJlcXVlc3RDb250ZXh0YC5cbiAqXG4gKiBTcGxpdCBvdXQgb2Yge0BsaW5rIE1hc3RyYVNlcnZlcn0gYmVjYXVzZSB0aGUgSFRUUCBtaWRkbGV3YXJlIGlzIG5vdCB0aGUgb25seVxuICogY2FsbGVyIHRoYXQgbmVlZHMgaXQ6IGFuIG91dC1vZi1iYW5kIHR1cm4gZnJvbSBhbm90aGVyIHBsdWdpbiByb3V0ZSBvciBhXG4gKiBzY2hlZHVsZWQgam9iIGRyaXZlcyBgYWdlbnQuZ2VuZXJhdGVgIGRpcmVjdGx5LCBhbmQgd2l0aG91dCB0aGlzIHN0YW1wIGV2ZXJ5XG4gKiB1c2VyLXNjb3BlZCB0b29sIC0gYGFza19nZW5pZWAgYWJvdmUgYWxsIC0gZmFpbHMgd2l0aCBcImludm9rZSB0aGUgdG9vbCBmcm9tIGFuXG4gKiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgbWFzdHJhIHBsdWdpblwiLiBUaG9zZSBjYWxsZXJzIGJ1aWxkIGEgY29udGV4dCB3aXRoXG4gKiB7QGxpbmsgY3JlYXRlUmVxdWVzdENvbnRleHR9IGluc3RlYWQgb2YgYSByZXF1ZXN0LlxuICpcbiAqIFRoZSBEYXRhYnJpY2tzIGNyZWRlbnRpYWwgYWx3YXlzIGNvbWVzIGZyb20gdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHQ7XG4gKiBgYXR0cmlidXRlZGAgb25seSBjaGFuZ2VzIFdITyB0aGUgdHVybiBpcyBhdHRyaWJ1dGVkIHRvIHdoZW4gdGhhdCBjb250ZXh0IGlzXG4gKiB0aGUgc2VydmljZSBwcmluY2lwYWwgKHNlZSB7QGxpbmsgQXR0cmlidXRlZElkZW50aXR5fSkuXG4gKlxuICogSWRlbXBvdGVudDogcmV0dXJucyBpbW1lZGlhdGVseSB3aGVuIHRoZSB1c2VyIGFuZCByZXNvdXJjZSBpZCBhcmUgYWxyZWFkeVxuICogcHJlc2VudCwgc28gdGhlIG1pZGRsZXdhcmUgY2FuIGNhbGwgaXQgb3ZlciBhIGNvbnRleHQgYW5vdGhlciBsYXllciBzdGFtcGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIoXG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgYXR0cmlidXRlZDogQXR0cmlidXRlZElkZW50aXR5ID0ge30sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKFtNQVNUUkFfVVNFUl9LRVksIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVldLmV2ZXJ5KChrZXkpID0+IHJlcXVlc3RDb250ZXh0LmdldChrZXkpKSkgcmV0dXJuO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBhd2FpdCBpbml0aWFsaXplUmVxdWVzdE1sZmxvd1RyYWNlSW5mbyhleGVjdXRpb25Db250ZXh0LmNsaWVudCk7XG4gIGNvbnN0IGlzVXNlckNvbnRleHQgPSBcImlzVXNlckNvbnRleHRcIiBpbiBleGVjdXRpb25Db250ZXh0O1xuICAvLyBUaGUgRGF0YWJyaWNrcyBDUkVERU5USUFMIGlzIGFsd2F5cyB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dCdzIGNsaWVudFxuICAvLyAoT0JPIGluIGEgdXNlciBjb250ZXh0LCB0aGUgc2VydmljZSBwcmluY2lwYWwgb3RoZXJ3aXNlKS4gV0hPIHRoZSB0dXJuIGlzXG4gIC8vIGF0dHJpYnV0ZWQgdG8gY2FuIGRpZmZlcjogaW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzXG4gIC8vIHRoZSBTUCBjbGllbnQsIGJ1dCB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgbXVzdCBzdGlsbCBrZXkgdGhlIG1lbW9yeSB0aHJlYWRcbiAgLy8gYW5kIHRoZSBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2Ugc28gdHdvIGNhbGxlcnMgZG9uJ3Qgc2hhcmUgYSBjb252ZXJzYXRpb24uXG4gIGNvbnN0IHVzZXI6IFVzZXIgPSB7XG4gICAgaWQ6IGF0dHJpYnV0ZWRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCwgYXR0cmlidXRlZC51c2VySWQpLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gIH07XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9LRVksIHVzZXIpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgdXNlci5pZCk7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfQVVUSF9NT0RFX0tFWSwgaXNVc2VyQ29udGV4dCA/IFwib2JvXCIgOiBcInNlcnZpY2UtcHJpbmNpcGFsXCIpO1xuICAvLyBBcHBLaXQncyBgVXNlckNvbnRleHRgIHN1cmZhY2VzIGRpc3BsYXkgbmFtZSAvIGVtYWlsIG9ubHkgb25cbiAgLy8gT0JPIHJlcXVlc3RzLiBTZXJ2aWNlLWNvbnRleHQgY2FsbHMgKGJhY2tncm91bmQgdGFza3MsIHNlcnZlclxuICAvLyBzdGFydC11cCkgbGVhdmUgdGhlc2UgdW5kZWZpbmVkIGFuZCB3ZSBza2lwIHRoZSBzdGFtcCBzb1xuICAvLyBkb3duc3RyZWFtIHRyYWNlIG1ldGFkYXRhIHN0YXlzIGFic2VudCByYXRoZXIgdGhhbiBlbXB0eS4gSW5cbiAgLy8gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBmb3J3YXJkZWQgZW1haWwgc3RpbGwgaWRlbnRpZmllcyB0aGUgY2FsbGVyLFxuICAvLyBzbyBpdCBpcyB1c2VkIGZvciB0cmFjZSBtZXRhZGF0YSBldmVuIHRob3VnaCB0aGUgY2xpZW50IGlzIHRoZSBTUC5cbiAgbGV0IHVzZXJOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBlbWFpbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gYXR0cmlidXRlZC5lbWFpbDtcbiAgaWYgKGlzVXNlckNvbnRleHQpIHtcbiAgICB1c2VyTmFtZSA9IGV4ZWN1dGlvbkNvbnRleHQudXNlck5hbWU7XG4gICAgZW1haWwgPSBleGVjdXRpb25Db250ZXh0LnVzZXJFbWFpbCA/PyBlbWFpbDtcbiAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBleGVjdXRpb25Db250ZXh0LmNsaWVudC5jdXJyZW50VXNlci5tZSgpO1xuICAgIHVzZXJOYW1lID0gY3VycmVudFVzZXI/LnVzZXJOYW1lO1xuICAgIGVtYWlsID0gY3VycmVudFVzZXI/LmVtYWlscz8uZmlsdGVyKChlbWFpbCkgPT4gZW1haWwucHJpbWFyeSkuZmluZCgoZW1haWwpID0+IGVtYWlsLnZhbHVlKVxuICAgICAgPy52YWx1ZSBhcyBzdHJpbmc7XG4gIH1cbiAgaWYgKHVzZXJOYW1lKSB7XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9VU0VSX05BTUVfS0VZLCB1c2VyTmFtZSk7XG4gIH1cbiAgaWYgKGVtYWlsKSB7XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgZW1haWwpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGBSZXF1ZXN0Q29udGV4dGAgYSBOT04tSFRUUCBhZ2VudCB0dXJuIG5lZWRzLlxuICpcbiAqIEV2ZXJ5dGhpbmcgTWFzdHJhJ3MgdG9vbHMgcmVhZCBvZmYgdGhlIGNvbnRleHQgaXMgc3RhbXBlZCB0aGUgc2FtZSB3YXkgdGhlXG4gKiByZXF1ZXN0IG1pZGRsZXdhcmUgc3RhbXBzIGl0IC0gdGhlIEFwcEtpdCB1c2VyIChzbyBgYXNrX2dlbmllYCBhbmQgdGhlIG1vZGVsXG4gKiByZXNvbHZlciBjYW4gbWludCB1c2VyLXNjb3BlZCB0b2tlbnMpLCB0aGUgbWVtb3J5IHRocmVhZCAvIHJlc291cmNlIHBhaXIsIGFuZFxuICogYSByZXF1ZXN0IGlkIHNvIHRoZSB0dXJuJ3Mgc3BhbnMgam9pbiB1cCBpbiB0cmFjZXMuIFRoZSByZXN1bHQgaXMgcGFzc2VkIGFzXG4gKiBgcmVxdWVzdENvbnRleHRgIHRvIGBhZ2VudC5nZW5lcmF0ZWAgLyBgYWdlbnQuc3RyZWFtYC5cbiAqXG4gKiBUaGlzIGdpdmVzIGFuIG91dC1vZi1iYW5kIHR1cm4gdGhlIHNhbWUgZGF0YSBhbmQgdG9vbCBjYXBhYmlsaXR5IGFzIGEgY2hhdFxuICogdHVybi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RDb250ZXh0KFxuICBvcHRpb25zOiB7IHRocmVhZElkPzogc3RyaW5nOyByZXNvdXJjZUlkPzogc3RyaW5nOyByZXF1ZXN0SWQ/OiBzdHJpbmcgfSA9IHt9LFxuKTogUHJvbWlzZTxSZXF1ZXN0Q29udGV4dD4ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dCgpO1xuICBhd2FpdCBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihyZXF1ZXN0Q29udGV4dCk7XG4gIGlmIChvcHRpb25zLnRocmVhZElkKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIG9wdGlvbnMudGhyZWFkSWQpO1xuICAvLyBTdGFtcGVkIEFGVEVSIHRoZSB1c2VyIHNvIGFuIGV4cGxpY2l0IHJlc291cmNlIGlkIHdpbnMgb3ZlciB0aGUgYW1iaWVudFxuICAvLyBpZGVudGl0eSBgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXJgIGRlZmF1bHRlZCB0by5cbiAgaWYgKG9wdGlvbnMucmVzb3VyY2VJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIG9wdGlvbnMucmVzb3VyY2VJZCk7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIG9wdGlvbnMucmVxdWVzdElkID8/IGhhc2guaWQoKSk7XG4gIHJldHVybiByZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBgQG1hc3RyYS9leHByZXNzYCBzdWJjbGFzcyB0aGF0IHN0YW1wcyBgUmVxdWVzdENvbnRleHRgIHdpdGggdGhlXG4gKiBBcHBLaXQgdXNlciwgcmVzb3VyY2UgaWQsIGFuZCBhIHRocmVhZCBpZCBiYWNrZWQgYnkgYW4gSFRUUC1vbmx5XG4gKiBzZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hc3RyYVNlcnZlciBleHRlbmRzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIge1xuICBwcml2YXRlIGxvZzogbG9nLkxvZ2dlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RhbXAgdGhlIE1MZmxvdyB0cmFjZS1pZCBoZWFkZXIgb24gcmVzcG9uc2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBtbGZsb3dGZWVkYmFjazogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgRXhwcmVzc01hc3RyYVNlcnZlcj5cbiAgKSB7XG4gICAgc3VwZXIoLi4uYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cubG9nZ2VyKGNvbmZpZyk7XG4gICAgdGhpcy5tbGZsb3dGZWVkYmFjayA9IGNvbmZpZy5mZWVkYmFja01vZGUgPT09IFwibWxmbG93XCI7XG4gIH1cblxuICBvdmVycmlkZSByZWdpc3RlckF1dGhNaWRkbGV3YXJlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTtcbiAgICB0aGlzLmFwcC51c2UoYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcy5sb2NhbHMucmVxdWVzdENvbnRleHQhIGFzIFJlcXVlc3RDb250ZXh0O1xuICAgICAgY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQpO1xuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFVzZXIocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQocmVxLCByZXMsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRNb2RlbE92ZXJyaWRlKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dE9yaWdpbihyZXEsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRTY29wZXMocmVxLCByZXF1ZXN0Q29udGV4dCk7XG5cbiAgICAgIHRoaXMuY29uZmlndXJlTWxmbG93VHJhY2VJZChyZXMpO1xuICAgICAgdGhpcy5sb2cuZGVidWcoXCJhdXRoOm1pZGRsZXdhcmVcIiwge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVRVUVTVF9JRF9LRVkpLFxuICAgICAgICB0aHJlYWRJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKSxcbiAgICAgICAgcmVzb3VyY2VJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpLFxuICAgICAgICB1c2VyTmFtZTogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX05BTUVfS0VZKSxcbiAgICAgICAgdXNlckVtYWlsOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZKSxcbiAgICAgICAgbW9kZWxPdmVycmlkZTogcmVxdWVzdENvbnRleHQuZ2V0KFxuICAgICAgICAgIC8vIGltcG9ydGVkIGJlbG93OyBsb2dnZWQgc28gYSBtaXNyb3V0ZWQgcmVxdWVzdCBzaG93c1xuICAgICAgICAgIC8vIHVwIGFsb25nc2lkZSBpdHMgbW9kZWwgc2VsZWN0aW9uIGluIGBMT0dfTEVWRUw9ZGVidWdgLlxuICAgICAgICAgIFwibWFzdHJhX19tb2RlbF9vdmVycmlkZVwiLFxuICAgICAgICApLFxuICAgICAgfSk7XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFVzZXIocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIC8vIFBhc3MgdGhlIGZvcndhcmRlZCBjYWxsZXIgaWRlbnRpdHkgc28gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHN0aWxsIGtleXNcbiAgICAvLyBtZW1vcnkgLyBjYWNoZSAvIHRyYWNlcyBwZXIgdXNlciBldmVuIHRob3VnaCB0aGUgY2xpZW50IGlzIHRoZSBhcHAgU1AuXG4gICAgLy8gSW4gYW4gT0JPIGNvbnRleHQgdGhlc2UgYXJlIGlnbm9yZWQgaW4gZmF2b3Igb2YgdGhlIGNvbnRleHQncyBvd24gdXNlci5cbiAgICBhd2FpdCBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihyZXF1ZXN0Q29udGV4dCwge1xuICAgICAgdXNlcklkOiByZXF1ZXN0VXNlcklkKHJlcSksXG4gICAgICBlbWFpbDogcmVxdWVzdFVzZXJFbWFpbChyZXEpLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICByZWNvcmRBY3RpdmVUcmFjZUF1dGgoXCJpc1VzZXJDb250ZXh0XCIgaW4gdXNlci5leGVjdXRpb25Db250ZXh0ID8gXCJvYm9cIiA6IFwic2VydmljZS1wcmluY2lwYWxcIik7XG4gICAgfVxuICAgIGNvbnN0IHRyYWNlVXNlciA9IFtcbiAgICAgIHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpLFxuICAgICAgcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX05BTUVfS0VZKSxcbiAgICAgIHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSxcbiAgICBdLmZpbmQoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgcmVjb3JkQWN0aXZlVHJhY2VVc2VyKHRyYWNlVXNlcik7XG4gIH1cblxuICAvKiogU3RhbXAgdGhlIHB1YmxpYyBicm93c2VyIG9yaWdpbiBzbyBwbHVnaW4gdG9vbHMgY2FuIHJldHVybiBjYW5vbmljYWwgYXBwIGxpbmtzLiAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dE9yaWdpbihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogdm9pZCB7XG4gICAgY29uc3Qgb3JpZ2luID0gcmVxdWVzdE9yaWdpbihyZXEpO1xuICAgIGlmIChvcmlnaW4pIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfT1JJR0lOX0tFWSwgb3JpZ2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCBhIHBlci1yZXF1ZXN0IGlkIGFuZCBlY2hvIGl0IG9uIHRoZSByZXNwb25zZSBzbyBhbiB1cHN0cmVhbVxuICAgKiBwcm94eSAvIGN1cmwgY2xpZW50IC8gYnJvd3Nlci1zaWRlIGxvZyBsaW5lIGNhbiBwYWlyIGl0cyB2aWV3IG9mXG4gICAqIHRoZSByZXF1ZXN0IHdpdGggdGhlIG1hdGNoaW5nIHRyYWNlIHNwYW4uIFJldXNlcyBgWC1SZXF1ZXN0LUlkYFxuICAgKiB3aGVuIHRoZSB1cHN0cmVhbSBhbHJlYWR5IHN1cHBsaWVzIG9uZSBzbyBtdWx0aS1ob3AgdHJhY2VzIHN0YXlcbiAgICogam9pbmVkOyBvdGhlcndpc2UgbWludHMgYSBVVUlEdjQuXG4gICAqXG4gICAqIFRoZSBpZCBpcyBzdXJmYWNlZCBhcyBgbWFzdHJhX19yZXF1ZXN0SWRgIHNwYW4gbWV0YWRhdGEgdmlhXG4gICAqIHtAbGluayBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZU30gYW5kIGFzIHRoZSBgWC1SZXF1ZXN0LUlkYFxuICAgKiByZXNwb25zZSBoZWFkZXIgc28gZGV2IHRvb2xzIGNhbiBjb3B5IGl0IGZyb20gZWl0aGVyIHNpZGUuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICApIHtcbiAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IHJlcS5oZWFkZXJzW1wieC1yZXF1ZXN0LWlkXCJdO1xuICAgIGNvbnN0IHVwc3RyZWFtID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHVwc3RyZWFtPy50cmltKCkgfHwgaGFzaC5pZCgpO1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIHJlcXVlc3RJZCk7XG4gICAgcmVzLnNldEhlYWRlcihcIlgtUmVxdWVzdC1JZFwiLCByZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIE9BdXRoIHNjb3BlcyBmcm9tIHRoZSBmb3J3YXJkZWQgYWNjZXNzIHRva2VuIG9uXG4gICAqIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0gZm9yIHdvcmtzcGFjZSBtb3VudCBnYXRpbmcuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgY29uc3Qgc2NvcGVzID0gW1xuICAgICAgLi4ub2JqZWN0XG4gICAgICAgIC5zZXF1ZW5jZSh0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEpLCB0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEsIFwiYXV0aG9yaXphdGlvblwiKSlcbiAgICAgICAgLmRpc3RpbmN0KCksXG4gICAgXTtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1NDT1BFU19LRVksIHNjb3Blcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIHR1cm4ncyBNTGZsb3cgdHJhY2UgaWQgb24gdGhlIHJlc3BvbnNlIHNvIHRoZSBjaGF0IGNsaWVudFxuICAgKiBjYW4gYXR0YWNoIHRodW1icyAvIGNvbW1lbnQgZmVlZGJhY2sgdG8gaXQgbGF0ZXIuIE1MZmxvdyBkZXJpdmVzXG4gICAqIGl0cyB0cmFjZSBpZCBmcm9tIHRoZSBPcGVuVGVsZW1ldHJ5IHRyYWNlIGlkIChgdHItPGhleD5gKSwgYW5kIGV2ZXJ5XG4gICAqIE1hc3RyYSBzcGFuIGZvciB0aGlzIHJlcXVlc3QgaW5oZXJpdHMgdGhlIGFtYmllbnQgT1RlbCBjb250ZXh0IChzZWVcbiAgICogYG9ic2VydmFiaWxpdHkudHNgKSwgc28gdGhlIGFjdGl2ZSBzcGFuJ3MgdHJhY2UgaWQgaGVyZSBpcyB0aGUgaWRcbiAgICogTUxmbG93IHdpbGwgcmVjb3JkIGZvciB0aGUgdHVybi5cbiAgICpcbiAgICogTm8tb3AgdW5sZXNzIGZlZWRiYWNrIGlzIGVuYWJsZWQsIGFuZCB3aGVuIG5vIGxpdmUgT1RlbCBzcGFuIGlzXG4gICAqIGFjdGl2ZSAoZS5nLiB0aGUgT1RMUCBTREsgaXNuJ3QgcmVnaXN0ZXJlZCk6IGluIHRoYXQgY2FzZSB0aGUgaGVhZGVyXG4gICAqIGlzIHNpbXBseSBhYnNlbnQgYW5kIHRoZSBjbGllbnQgaGlkZXMgZmVlZGJhY2sgZm9yIHRoYXQgbWVzc2FnZSxcbiAgICogZGVncmFkaW5nIGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW1pdHRpbmcgYSBib2d1cyB0cmFjZSBpZC5cbiAgICovXG4gIGNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzOiBleHByZXNzLlJlc3BvbnNlKSB7XG4gICAgaWYgKCF0aGlzLm1sZmxvd0ZlZWRiYWNrIHx8IHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xuICAgIGlmIChyZXMuZ2V0SGVhZGVyKGZlZWRiYWNrLk1MRkxPV19UUkFDRV9JRF9IRUFERVIpKSByZXR1cm47XG4gICAgY29uc3QgdHJhY2VJZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKT8uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGlmICghdHJhY2VJZCB8fCB0cmFjZUlkID09PSBJTlZBTElEX1RSQUNFX0lEKSByZXR1cm47XG4gICAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHRocmVhZCBpZCB0aGlzIHJlcXVlc3QgdGFyZ2V0cyBhbmQgcGluIGl0IG9uXG4gICAqIGBSZXF1ZXN0Q29udGV4dGAgKGNvbnN1bWVkIGJ5IHRoZSBhZ2VudCBzdHJlYW0gZm9yIHBlcnNpc3RlbmNlIGFuZFxuICAgKiBieSBuYXRpdmUgbWVtb3J5IHJvdXRlcykuIFJlc29sdXRpb24gb3JkZXI6XG4gICAqXG4gICAqICAgMS4gQSBjbGllbnQtc3VwcGxpZWQgdGhyZWFkIGlkICh0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgL1xuICAgKiAgICAgIGA/dGhyZWFkSWQ9YCBxdWVyeSkuIFRoaXMgaXMgaG93IHRoZSBjaGF0IFVJIHJlZmVyZW5jZXMgYVxuICAgKiAgICAgIHNwZWNpZmljIGNvbnZlcnNhdGlvbiBhbW9uZyB0aGUgbWFueSBhIHVzZXIgb3ducyAtIGl0IHBpY2tzIGFcbiAgICogICAgICB0aHJlYWQgaWQgZnJvbSB0aGUgYC90aHJlYWRzYCBsaXN0aW5nIChvciBtaW50cyBvbmUgZm9yIGEgbmV3XG4gICAqICAgICAgY29udmVyc2F0aW9uKSBhbmQgc3RhbXBzIGl0IGhlcmUuIFRoZSBpZCBpcyBzY29wZWQgdG8gdGhlXG4gICAqICAgICAgY2FsbGVyJ3MgcmVzb3VyY2UgYnkgdGhlIHJlY2FsbCAvIGxpc3Qgcm91dGVzLCBzbyBhIGNsaWVudFxuICAgKiAgICAgIGNhbiBvbmx5IGV2ZXIgcmVhZCBvciB3cml0ZSBpdHMgb3duIHRocmVhZHMuXG4gICAqICAgMi4gVGhlIHBlci1zZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKSxcbiAgICogICAgICBtaW50ZWQgb24gZmlyc3QgY29udGFjdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzaW5nbGUtdGhyZWFkXG4gICAqICAgICAgZmFsbGJhY2sgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBtYW5hZ2UgdGhyZWFkcyBleHBsaWNpdGx5LCBzb1xuICAgKiAgICAgIGV4aXN0aW5nIGVtYmVkcyBrZWVwIG9uZSBzdGFibGUgY29udmVyc2F0aW9uIHBlciBzZXNzaW9uIHdpdGhcbiAgICogICAgICBubyBjbGllbnQgY2hhbmdlcy5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgKSB7XG4gICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSB0aGlzLnJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXEpO1xuICAgIGlmIChyZXF1ZXN0ZWQpIHtcbiAgICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgcmVxdWVzdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29va2llcyA9IGh0dHAucGFyc2VDb29raWVzKHJlcS5oZWFkZXJzLmNvb2tpZSk7XG4gICAgY29uc3QgY29va2llTmFtZSA9IHN0cmluZ1V0aWxzLnRvSWRlbnRpZmllcldpdGhPcHRpb25zKFxuICAgICAgeyBkZWxpbWl0ZXI6IFwiX1wiLCBkaXN0aW5jdDogdHJ1ZSB9LFxuICAgICAgXCJhcHBraXRcIixcbiAgICAgIHRoaXMuY29uZmlnLm5hbWUhLFxuICAgICAgXCJzZXNzaW9uSWRcIixcbiAgICApO1xuICAgIGxldCBzZXNzaW9uSWQgPSBjb29raWVzW2Nvb2tpZU5hbWVdO1xuICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICBzZXNzaW9uSWQgPSBoYXNoLmlkKCk7XG4gICAgICByZXMuY29va2llKGNvb2tpZU5hbWUsIHNlc3Npb25JZCwge1xuICAgICAgICBodHRwT25seTogdHJ1ZSxcbiAgICAgICAgc2FtZVNpdGU6IFwibGF4XCIsXG4gICAgICAgIHNlY3VyZTogcmVxLnNlY3VyZSxcbiAgICAgICAgcGF0aDogXCIvXCIsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCBzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIGNsaWVudC1zZWxlY3RlZCB0aHJlYWQgaWQgZnJvbSB0aGUgcmVxdWVzdCwgcHJlZmVycmluZ1xuICAgKiB0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgb3ZlciB0aGUgYD90aHJlYWRJZD1gIHF1ZXJ5LiBSZXR1cm5zXG4gICAqIGBudWxsYCB3aGVuIG5laXRoZXIgY2FycmllcyBhIG5vbi1lbXB0eSB2YWx1ZSBzbyB0aGUgY2FsbGVyIGZhbGxzXG4gICAqIGJhY2sgdG8gdGhlIHNlc3Npb24gY29va2llLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkUmVxdWVzdGVkVGhyZWFkSWQocmVxOiBleHByZXNzLlJlcXVlc3QpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IHJlcS5oZWFkZXJzW3RocmVhZC5USFJFQURfSURfSEVBREVSXTtcbiAgICBjb25zdCBxdWVyeVZhbHVlID0gcmVxLnF1ZXJ5W3RocmVhZC5USFJFQURfSURfUVVFUlldO1xuICAgIHJldHVybiAoXG4gICAgICBzdHJpbmdVdGlscy50cmltVG9OdWxsKEFycmF5LmlzQXJyYXkoaGVhZGVyVmFsdWUpID8gaGVhZGVyVmFsdWVbMF0gOiBoZWFkZXJWYWx1ZSkgPz9cbiAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShxdWVyeVZhbHVlKSA/IHF1ZXJ5VmFsdWVbMF0gOiBxdWVyeVZhbHVlKVxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIC8vIFBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlOiBvbmx5IGhvbm9yZWQgd2hlbiB0aGUgcGx1Z2luXG4gICAgLy8gb3B0cyBpbiAoZGVmYXVsdCkuIFNvdXJjZXMsIGluIHByaW9yaXR5IG9yZGVyLCBhcmVcbiAgICAvLyBgWC1NYXN0cmEtTW9kZWxgIGhlYWRlciwgYD9tb2RlbD1gIHF1ZXJ5LCBhbmQgYG1vZGVsYCAvXG4gICAgLy8gYG1vZGVsSWRgIGJvZHkgZmllbGQ7IHNlZSBgc2VydmluZy50c2AuXG4gICAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICBpZiAoc2VydmluZy5hbGxvd092ZXJyaWRlKSB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4dHJhY3RNb2RlbE92ZXJyaWRlKHtcbiAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICAgICAgICBxdWVyeTogcmVxLnF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBib2R5OiByZXEuYm9keSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG92ZXJyaWRlKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgb3ZlcnJpZGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogSW5wdXRzIGZvciB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFwaUdhdGVPcHRpb25zIHtcbiAgLyoqIGBjb25maWcuYXBpQWNjZXNzYDsgYFwiZnVsbFwiYCBzaG9ydC1jaXJjdWl0cyB0byBhbGxvdyBldmVyeXRoaW5nLiAqL1xuICBhY2Nlc3M6IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqIFdoZXRoZXIgdGhlIE1DUCB0cmFuc3BvcnQgaXMgbW91bnRlZCAoc28gYC9tY3AvKmAgaXMgbGVnaXRpbWF0ZSkuICovXG4gIG1jcEVuYWJsZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgYWdlbnQgaW5mZXJlbmNlIHBhdGhzIChgL2FnZW50cy86aWQvPHZlcmI+Li4uYCkuIE1hdGNoZWRcbiAqIGJ5IHByZWZpeCBvbiB0aGUgdmVyYiBzbyBmdXR1cmUgdmFyaWFudHMgKGBzdHJlYW1WTmV4dGAsIGBzdHJlYW0vdm5leHRgLFxuICogYGdlbmVyYXRlVk5leHRgKSBzdGF5IGNvdmVyZWQgd2l0aG91dCBhIGNvZGUgY2hhbmdlLlxuICpcbiAqIENvdmVycyB0aGUgcGxhaW4gaW5mZXJlbmNlIHZlcmJzIChgc3RyZWFtYCAvIGBnZW5lcmF0ZWAgLyBgbmV0d29ya2ApIHBsdXNcbiAqIHRoZSBodW1hbi1pbi10aGUtbG9vcCByZXN1bWUgdmVyYnMgYSBwYXVzZWQgYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBuZWVkc1xuICogdG8gY29udGludWU6IGBhcHByb3ZlLXRvb2wtY2FsbGAgLyBgZGVjbGluZS10b29sLWNhbGxgIChzdHJlYW1pbmcsIGFuZCB2aWFcbiAqIHByZWZpeCB0aGVpciBgLWdlbmVyYXRlYCBub24tc3RyZWFtaW5nIHZhcmlhbnRzKSwgdGhlIGAtbmV0d29yay1gIHZhcmlhbnRzLFxuICogYW5kIGByZXN1bWUtc3RyZWFtYCAoY292ZXJzIGByZXN1bWUtc3RyZWFtLXVudGlsLWlkbGVgKS4gV2l0aG91dCB0aGVzZSBhblxuICogYXBwcm92YWwtZ2F0ZWQgdG9vbCAoZS5nLiBgc2VuZF9lbWFpbGApIGNhbiBiZSByZXF1ZXN0ZWQgYnV0IG5ldmVyIGFwcHJvdmVkXG4gKiBmcm9tIHRoZSBicm93c2VyIC0gdGhlIHJlc3VtZSBgUE9TVGAgNDAzcyB1bmRlciBzY29wZWQgbW9kZS4gVG9nZXRoZXIgd2l0aFxuICogdGhlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgbXV0YXRpb25zIGJlbG93LCB0aGVzZSBhcmUgdGhlIG9ubHkgc3RvY2sgTWFzdHJhXG4gKiB3cml0ZXMgdGhlIGJyb3dzZXIgY2xpZW50IGNhbiBtYWtlLlxuICovXG5jb25zdCBBR0VOVF9JTkZFUkVOQ0UgPVxuICAvXlxcL2FnZW50c1xcL1teL10rXFwvKHN0cmVhbXxnZW5lcmF0ZXxuZXR3b3JrfHJlc3VtZS1zdHJlYW18YXBwcm92ZS10b29sLWNhbGx8ZGVjbGluZS10b29sLWNhbGx8YXBwcm92ZS1uZXR3b3JrLXRvb2wtY2FsbHxkZWNsaW5lLW5ldHdvcmstdG9vbC1jYWxsKS9pO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhIChgL2FnZW50c2AsIGAvYWdlbnRzLzppZGApLiAqL1xuY29uc3QgQUdFTlRfTUVUQURBVEEgPSAvXlxcL2FnZW50cyhcXC9bXi9dKyk/JC87XG4vKiogUGVyc2lzdGVkIGFwcHJvdmFsIGRpc2NvdmVyeSBmb3Igb25lIGFnZW50LiAqL1xuY29uc3QgQUdFTlRfU1VTUEVOREVEX1JVTlMgPSAvXlxcL2FnZW50c1xcL1teL10rXFwvc3VzcGVuZGVkLXJ1bnMkL2k7XG4vKiogT2ZmaWNpYWwgQUkgU0RLIFVJIHN0cmVhbSByb3V0ZSwgaW5jbHVkaW5nIGByZXN1bWVEYXRhYCBjb250aW51YXRpb25zLiAqL1xuY29uc3QgQUdFTlRfQ0hBVCA9IC9eXFwvY2hhdFxcL1teL10rJC9pO1xuLyoqIER1cmFibGUgcnVuIG9ic2VydmF0aW9uIGZvciBvbmUgYWdlbnQtb3duZWQgY2hhdCBzdHJlYW0uICovXG5jb25zdCBBR0VOVF9DSEFUX1JVTiA9IC9eXFwvY2hhdFxcL1teL10rXFwvcnVuc1xcL1teL10rJC9pO1xuLyoqIEV4cGxpY2l0IGNhbmNlbGxhdGlvbiBmb3Igb25lIGR1cmFibGUgY2hhdCBydW4uICovXG5jb25zdCBBR0VOVF9DSEFUX1JVTl9BQk9SVCA9IC9eXFwvY2hhdFxcL1teL10rXFwvcnVuc1xcL1teL10rXFwvYWJvcnQkL2k7XG4vKiogTmF0aXZlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgcmVhZHMgdXNlZCBieSBoaXN0b3J5IGFuZCB0aGUgdGhyZWFkIGxpc3QuICovXG5jb25zdCBNRU1PUllfUkVBRCA9IC9eXFwvbWVtb3J5XFwvdGhyZWFkcyg/OlxcL1teL10rKD86XFwvbWVzc2FnZXMpPyk/JC9pO1xuLyoqIE5hdGl2ZSB0aHJlYWQgcmVuYW1lL2RlbGV0ZSByb3V0ZXMuICovXG5jb25zdCBNRU1PUllfVEhSRUFEX01VVEFUSU9OID0gL15cXC9tZW1vcnlcXC90aHJlYWRzXFwvW14vXSskL2k7XG5cbi8qKlxuICogV2hldGhlciBhIHJlcXVlc3QgdG8gdGhlIHN0b2NrIGBAbWFzdHJhL2V4cHJlc3NgIHN1Yi1hcHAgc2hvdWxkIGJlXG4gKiBkaXNwYXRjaGVkLCBnaXZlbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgTWFzdHJhQXBpR2F0ZU9wdGlvbnMuYWNjZXNzfS5cbiAqXG4gKiBgcGF0aGAgaXMgbW91bnQtcmVsYXRpdmUgKHdoYXQgdGhlIHBsdWdpbidzIGNhdGNoLWFsbCBzZWVzLCBlLmcuXG4gKiBgL2NoYXQveGAsIGAvbWVtb3J5L3RocmVhZHNgLCBgL21jcC8uLi5gKS4gSW4gYFwic2NvcGVkXCJgXG4gKiBtb2RlIHRoZSBhbGxvd2xpc3QgaXMgZGVsaWJlcmF0ZWx5IHRpZ2h0IC0gdGhlIGNoYXQgY2xpZW50IG9ubHkgZXZlclxuICogbmVlZHMgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHJlc291cmNlLXNjb3BlZCBtZW1vcnksXG4gKiB0aGlzIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUC4gVGhlIHJlbWFpbmluZ1xuICogYWRtaW4sIG11dGF0aW5nLCBhbmQgYnVsay1leHBvcnQgc3VyZmFjZSBzdGF5cyBkZW5pZWQgYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQoXG4gIG1ldGhvZDogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdHM6IE1hc3RyYUFwaUdhdGVPcHRpb25zLFxuKTogYm9vbGVhbiB7XG4gIGlmIChvcHRzLmFjY2VzcyA9PT0gXCJmdWxsXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBwID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAvLyBUaGUgcGx1Z2luJ3MgYC9yb3V0ZS8qYCBhZGRpdGlvbnMgdmFsaWRhdGUgdGhlaXIgb3duIGlucHV0cyBhbmQgdHJ1c3RlZFxuICAvLyBBcHBLaXQgcmVxdWVzdCBjb250ZXh0IGJlZm9yZSByZWFjaGluZyBwcm9kdWN0IGJlaGF2aW9yLlxuICBpZiAocCA9PT0gXCIvcm91dGVcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvcm91dGUvXCIpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG9wdHMubWNwRW5hYmxlZCAmJiAocCA9PT0gXCIvbWNwXCIgfHwgcC5zdGFydHNXaXRoKFwiL21jcC9cIikpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbSA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgQUdFTlRfQ0hBVC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgQUdFTlRfQ0hBVF9SVU4udGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBBR0VOVF9DSEFUX1JVTl9BQk9SVC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIEFHRU5UX0lORkVSRU5DRS50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgKEFHRU5UX01FVEFEQVRBLnRlc3QocCkgfHwgQUdFTlRfU1VTUEVOREVEX1JVTlMudGVzdChwKSkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJHRVRcIiAmJiBNRU1PUllfUkVBRC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKChtID09PSBcIlBBVENIXCIgfHwgbSA9PT0gXCJERUxFVEVcIikgJiYgTUVNT1JZX1RIUkVBRF9NVVRBVElPTi50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIHAgPT09IFwiL21lbW9yeS9tZXNzYWdlcy9kZWxldGVcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBLZWVwIE1hc3RyYSBjdXN0b20gQVBJIHJvdXRlcyBtb3VudC1yZWxhdGl2ZSB3aGVuIHRoZSBFeHByZXNzIHN1YmFwcCBpc1xuICogaG9zdGVkIHVuZGVyIEFwcEtpdCdzIGAvYXBpLzxwbHVnaW4+YCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUoYXBwOiBleHByZXNzLkV4cHJlc3MpOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCBfcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgaXNDdXN0b21Sb3V0ZSA9XG4gICAgICByZXEucGF0aCA9PT0gXCIvY2hhdFwiIHx8XG4gICAgICByZXEucGF0aC5zdGFydHNXaXRoKFwiL2NoYXQvXCIpIHx8XG4gICAgICByZXEucGF0aCA9PT0gXCIvcm91dGVcIiB8fFxuICAgICAgcmVxLnBhdGguc3RhcnRzV2l0aChcIi9yb3V0ZS9cIik7XG4gICAgaWYgKCFpc0N1c3RvbVJvdXRlKSByZXR1cm4gbmV4dCgpO1xuICAgIHJlcS5vcmlnaW5hbFVybCA9IHJlcS5wYXRoO1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRmluaXNoIGEgY2hhdCByZXF1ZXN0IHdoZW4gTWFzdHJhIHRocm93cyBiZWNhdXNlIHRoZSB3b3JrZmxvdyBpcyBub1xuICogbG9uZ2VyIHN1c3BlbmRlZC4gRHVwbGljYXRlIGFwcHJvdmUvcmVzdW1lIGFuZCBsYXRlIGBjb25zdW1lU3RyZWFtYFxuICogYm90aCBoaXQgdGhhdCBwYXRoOyB0aGUgY2xpZW50IGFscmVhZHkgaGFzIChvciB3aWxsIHJlbG9hZCkgdGhlXG4gKiBjb21wbGV0ZWQgdHVybi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFN0YWxlUmVzdW1lUmVjb3ZlcnkoYXBwOiBleHByZXNzLkV4cHJlc3MpOiB2b2lkIHtcbiAgYXBwLnVzZShcbiAgICAoZXJyb3I6IHVua25vd24sIHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXM6IGV4cHJlc3MuUmVzcG9uc2UsIG5leHQ6IGV4cHJlc3MuTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgICBpZiAoIWlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvcihlcnJvcikpIHtcbiAgICAgICAgbmV4dChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci53YXJuKFwiaWdub3JlZCBzdGFsZSBtYXN0cmEgcmVzdW1lXCIsIHtcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzLnN0YXR1cygyMDApO1xuICAgICAgcmVzLnNldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiLCBcInRleHQvZXZlbnQtc3RyZWFtOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgICAgcmVzLnNldEhlYWRlcihcImNhY2hlLWNvbnRyb2xcIiwgXCJuby1jYWNoZVwiKTtcbiAgICAgIHJlcy53cml0ZShgZGF0YTogJHtKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwic3RhcnRcIiB9KX1cXG5cXG5gKTtcbiAgICAgIHJlcy53cml0ZShgZGF0YTogJHtKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwiZmluaXNoXCIgfSl9XFxuXFxuYCk7XG4gICAgICByZXMud3JpdGUoXCJkYXRhOiBbRE9ORV1cXG5cXG5cIik7XG4gICAgICByZXMuZW5kKCk7XG4gICAgfSxcbiAgKTtcbn1cbiJdfQ==
470
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsR0FBRyxFQUNILE9BQU8sRUFDUCxFQUFFLEVBQ0YsWUFBWSxFQUVaLFFBQVEsRUFDUix1QkFBdUIsRUFDdkIsVUFBVSxFQUNWLG9CQUFvQixHQUNyQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixjQUFjLEdBQ2YsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxJQUFJLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzNDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixvQkFBb0IsR0FHckIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLDhCQUE4QixFQUM5QixvQkFBb0IsRUFDcEIsdUJBQXVCLEdBQ3hCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixvQkFBb0IsR0FDckIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUU7Ozs7O0dBS0c7QUFDSCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzNDLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QyxNQUFNLDRCQUE0QixHQUFHO0lBQ25DLHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIsZUFBZTtJQUNmLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLHlCQUF5QjtJQUN6Qix5QkFBeUI7SUFDekIsdUJBQXVCO0lBQ3ZCLDhCQUE4QjtJQUM5QixvQkFBb0I7Q0FDWixDQUFDO0FBRVgsb0ZBQW9GO0FBQ3BGLE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxjQUE4QjtJQUN2RSxLQUFLLE1BQU0sR0FBRyxJQUFJLDRCQUE0QixFQUFFLENBQUM7UUFDL0MsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0FBQ0gsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQW9CO0lBQ2hELEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxLQUFLO1lBQUUsU0FBUztRQUNyQixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssT0FBTyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssUUFBUTtnQkFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDL0UsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLDZCQUE2QjtRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDOUYsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QixNQUFNLFFBQVEsR0FDWixHQUFHLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQztJQUNwRixJQUFJLFFBQVEsS0FBSyxNQUFNLElBQUksUUFBUSxLQUFLLE9BQU87UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRSxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksR0FBRyxDQUFDLEdBQUcsUUFBUSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2pELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQWlCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxjQUE4QixFQUM5QixhQUFpQyxFQUFFO0lBRW5DLElBQUksQ0FBQyxlQUFlLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFBRSxPQUFPO0lBQzlGLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztJQUMvQyxNQUFNLGdDQUFnQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sYUFBYSxHQUFHLGVBQWUsSUFBSSxnQkFBZ0IsQ0FBQztJQUMxRCw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsOEVBQThFO0lBQzlFLE1BQU0sSUFBSSxHQUFTO1FBQ2pCLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ3pELGdCQUFnQjtLQUNqQixDQUFDO0lBQ0YsY0FBYyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEQsY0FBYyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0RiwrREFBK0Q7SUFDL0QsZ0VBQWdFO0lBQ2hFLDJEQUEyRDtJQUMzRCwrREFBK0Q7SUFDL0QsNEVBQTRFO0lBQzVFLHFFQUFxRTtJQUNyRSxJQUFJLFFBQTRCLENBQUM7SUFDakMsSUFBSSxLQUFLLEdBQXVCLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDakQsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQ3JDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO0lBQzlDLENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLGFBQWEsRUFBRSxDQUFDO1FBQ2xELE1BQU0sV0FBVyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNuRSxRQUFRLEdBQUcsV0FBVyxFQUFFLFFBQVEsQ0FBQztRQUNqQyxLQUFLLEdBQUcsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDeEYsRUFBRSxLQUFlLENBQUM7SUFDdEIsQ0FBQztJQUNELElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixjQUFjLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsY0FBYyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsVUFBMEUsRUFBRTtJQUU1RSxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0lBQzVDLE1BQU0sdUJBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDOUMsSUFBSSxPQUFPLENBQUMsUUFBUTtRQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pGLDBFQUEwRTtJQUMxRSxtREFBbUQ7SUFDbkQsSUFBSSxPQUFPLENBQUMsVUFBVTtRQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZGLGNBQWMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxtQkFBbUI7SUFRekM7SUFQRixHQUFHLENBQVM7SUFDcEI7O09BRUc7SUFDSyxjQUFjLENBQVU7SUFFaEMsWUFDVSxNQUEwQixFQUNsQyxHQUFHLElBQXVEO1FBRTFELEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBSFAsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFJbEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUM7SUFDekQsQ0FBQztJQUVRLHNCQUFzQjtRQUM3QixLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNwQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWlDLENBQUM7WUFDcEUsMEJBQTBCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDM0MsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQywrQkFBK0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBRXhELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtnQkFDaEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO2dCQUNsQixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7Z0JBQ2QsU0FBUyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUM7Z0JBQ3BELFFBQVEsRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDO2dCQUNsRCxVQUFVLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztnQkFDdEQsUUFBUSxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7Z0JBQ2xELFNBQVMsRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO2dCQUNwRCxhQUFhLEVBQUUsY0FBYyxDQUFDLEdBQUc7Z0JBQy9CLHNEQUFzRDtnQkFDdEQseURBQXlEO2dCQUN6RCx3QkFBd0IsQ0FDekI7YUFDRixDQUFDLENBQUM7WUFDSCxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxHQUFvQixFQUFFLGNBQThCO1FBQ3BGLDRFQUE0RTtRQUM1RSx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLE1BQU0sdUJBQXVCLENBQUMsY0FBYyxFQUFFO1lBQzVDLE1BQU0sRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDO1lBQzFCLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7U0FDN0IsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQXFCLENBQUM7UUFDckUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULHFCQUFxQixDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUc7WUFDaEIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztZQUN6QyxjQUFjLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLGNBQWMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7U0FDM0MsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQW1CLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6RixxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsc0ZBQXNGO0lBQ3RGLDZCQUE2QixDQUFDLEdBQW9CLEVBQUUsY0FBOEI7UUFDaEYsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksTUFBTTtZQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxnQ0FBZ0MsQ0FDOUIsR0FBb0IsRUFDcEIsR0FBcUIsRUFDckIsY0FBOEI7UUFFOUIsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1lBQUUsT0FBTztRQUN0RCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQzNFLE1BQU0sU0FBUyxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUMzQyxjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7O09BR0c7SUFDSCw2QkFBNkIsQ0FBQyxHQUFvQixFQUFFLGNBQThCO1FBQ2hGLE1BQU0sTUFBTSxHQUFHO1lBQ2IsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO1NBQzlGLENBQUM7UUFDRixjQUFjLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxzQkFBc0IsQ0FBQyxHQUFxQjtRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxHQUFHLENBQUMsV0FBVztZQUFFLE9BQU87UUFDcEQsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDO1lBQUUsT0FBTztRQUNsRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQzdELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLGdCQUFnQjtZQUFFLE9BQU87UUFDckQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILCtCQUErQixDQUM3QixHQUFvQixFQUNwQixHQUFxQixFQUNyQixjQUE4QjtRQUU5QixJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7WUFBRSxPQUFPO1FBQ3JELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsY0FBYyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNwRCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLHVCQUF1QixDQUN4QyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUNsQyxRQUFRLEVBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFLLEVBQ2pCLFdBQVcsQ0FDWixDQUFDO1FBQ0YsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLFNBQVMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNqQixHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUU7Z0JBQ2hDLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtnQkFDbEIsSUFBSSxFQUFFLEdBQUc7YUFDVixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsY0FBYyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxxQkFBcUIsQ0FBQyxHQUFvQjtRQUNoRCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQ0wsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQ3JFLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUVELG9DQUFvQyxDQUFDLEdBQW9CLEVBQUUsY0FBOEI7UUFDdkYsMkRBQTJEO1FBQzNELHFEQUFxRDtRQUNyRCwwREFBMEQ7UUFDMUQsMENBQTBDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQixNQUFNLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQztnQkFDcEMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUF3RDtnQkFDckUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFnQztnQkFDM0MsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxRQUFRO2dCQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7Q0FDRjtBQVVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxlQUFlLEdBQ25CLG9KQUFvSixDQUFDO0FBRXZKLDBFQUEwRTtBQUMxRSxNQUFNLGNBQWMsR0FBRyxzQkFBc0IsQ0FBQztBQUM5QyxrREFBa0Q7QUFDbEQsTUFBTSxvQkFBb0IsR0FBRyxvQ0FBb0MsQ0FBQztBQUNsRSw2RUFBNkU7QUFDN0UsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUM7QUFDdEMsK0RBQStEO0FBQy9ELE1BQU0sY0FBYyxHQUFHLCtCQUErQixDQUFDO0FBQ3ZELHNEQUFzRDtBQUN0RCxNQUFNLG9CQUFvQixHQUFHLHNDQUFzQyxDQUFDO0FBQ3BFLCtFQUErRTtBQUMvRSxNQUFNLFdBQVcsR0FBRyxpREFBaUQsQ0FBQztBQUN0RSwwQ0FBMEM7QUFDMUMsTUFBTSxzQkFBc0IsR0FBRyw2QkFBNkIsQ0FBQztBQUU3RDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxNQUFjLEVBQ2QsSUFBWSxFQUNaLElBQTBCO0lBRTFCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ25ELDBFQUEwRTtJQUMxRSwyREFBMkQ7SUFDM0QsSUFBSSxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDNUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQy9CLElBQUksQ0FBQyxLQUFLLE1BQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BELElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZELElBQUksQ0FBQyxLQUFLLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDOUQsSUFBSSxDQUFDLEtBQUssTUFBTSxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDekQsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN6RixJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwRCxJQUFJLENBQUMsQ0FBQyxLQUFLLE9BQU8sSUFBSSxDQUFDLEtBQUssUUFBUSxDQUFDLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3JGLElBQUksQ0FBQyxLQUFLLE1BQU0sSUFBSSxDQUFDLEtBQUsseUJBQXlCO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLEdBQW9CO0lBQzdELEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1FBQzFCLE1BQU0sYUFBYSxHQUNqQixHQUFHLENBQUMsSUFBSSxLQUFLLE9BQU87WUFDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzdCLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUNyQixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDbEMsR0FBRyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQzNCLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsR0FBb0I7SUFDNUQsR0FBRyxDQUFDLEdBQUcsQ0FDTCxDQUFDLEtBQWMsRUFBRSxHQUFvQixFQUFFLEdBQXFCLEVBQUUsSUFBMEIsRUFBRSxFQUFFO1FBQzFGLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNaLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRTtZQUN6QyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7WUFDZCxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQztTQUN0QixDQUFDLENBQUM7UUFDSCxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixPQUFPO1FBQ1QsQ0FBQztRQUNELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztRQUNsRSxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeHByZXNzLWxheWVyIHBsdW1iaW5nIGZvciB0aGUgTWFzdHJhIHBsdWdpbjogYSBgTWFzdHJhU2VydmVyYCB0aGF0XG4gKiBzdGFtcHMgdGhlIHBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAgYW5kIGEgc2NvcGVkIG5hdGl2ZSBBUEkgZ2F0ZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IHJlcXVlc3RVc2VyRW1haWwsIHJlcXVlc3RVc2VySWQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGxvZyxcbiAgdG9FcnJvcixcbiAgaWQsXG4gIHBhcnNlQ29va2llcyxcbiAgdHlwZSBMb2dnZXIsXG4gIHNlcXVlbmNlLFxuICB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyxcbiAgdHJpbVRvTnVsbCxcbiAgZ2V0QWNjZXNzVG9rZW5TY29wZXMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBNTEZMT1dfVFJBQ0VfSURfSEVBREVSLFxuICBUSFJFQURfSURfSEVBREVSLFxuICBUSFJFQURfSURfUVVFUlksXG4gIGlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvcixcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHtcbiAgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSxcbiAgTUFTVFJBX1RIUkVBRF9JRF9LRVksXG4gIFJlcXVlc3RDb250ZXh0LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTWFzdHJhU2VydmVyIGFzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIgfSBmcm9tIFwiQG1hc3RyYS9leHByZXNzXCI7XG5pbXBvcnQgeyB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHtcbiAgYXR0cmlidXRlZFVzZXJJZCxcbiAgTUFTVFJBX0FVVEhfTU9ERV9LRVksXG4gIE1BU1RSQV9SRVFVRVNUX0lEX0tFWSxcbiAgTUFTVFJBX1NDT1BFU19LRVksXG4gIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSxcbiAgTUFTVFJBX1VTRVJfS0VZLFxuICBNQVNUUkFfVVNFUl9OQU1FX0tFWSxcbiAgdHlwZSBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHR5cGUgVXNlcixcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICBGT0xMT1dfVVBfTkFUSVZFX1FVRVNUSU9OU19LRVksXG4gIEZPTExPV19VUF9SVU5fSURfS0VZLFxuICBGT0xMT1dfVVBfVVNFUl9URVhUX0tFWSxcbn0gZnJvbSBcIi4vZm9sbG93LXVwLXN1Z2dlc3Rpb25zLnRzXCI7XG5pbXBvcnQgeyBpbml0aWFsaXplUmVxdWVzdE1sZmxvd1RyYWNlSW5mbyB9IGZyb20gXCIuL21sZmxvdy50c1wiO1xuaW1wb3J0IHsgTUFTVFJBX09SSUdJTl9LRVkgfSBmcm9tIFwiLi9yZXF1ZXN0LWNvbnRleHQudHNcIjtcbmltcG9ydCB7XG4gIGV4dHJhY3RNb2RlbE92ZXJyaWRlLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuICBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZLFxuICByZXNvbHZlU2VydmluZ0NvbmZpZyxcbn0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuaW1wb3J0IHsgcmVjb3JkQWN0aXZlVHJhY2VBdXRoLCByZWNvcmRBY3RpdmVUcmFjZVVzZXIgfSBmcm9tIFwiLi90ZWxlbWV0cnkudHNcIjtcbi8qKlxuICogT3BlblRlbGVtZXRyeSdzIHNlbnRpbmVsIGZvciBcIm5vIHZhbGlkIHRyYWNlXCIgLSAzMiB6ZXJvIGhleCBjaGFycy5cbiAqIGB0cmFjZS5nZXRBY3RpdmVTcGFuKClgIHJldHVybnMgYSBub24tcmVjb3JkaW5nIHNwYW4gd2l0aCB0aGlzIGlkXG4gKiB3aGVuIG5vIFNESyBpcyByZWdpc3RlcmVkLCB3aGljaCBtdXN0IG5ldmVyIGJlIHN1cmZhY2VkIGFzIGEgdHJhY2UgdG9cbiAqIGF0dGFjaCBmZWVkYmFjayB0by5cbiAqL1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9zZXJ2ZXJcIik7XG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcbmNvbnN0IFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMgPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfVVNFUl9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9BVVRIX01PREVfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9PUklHSU5fS0VZLFxuICBNQVNUUkFfU0NPUEVTX0tFWSxcbiAgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSxcbiAgTUFTVFJBX1JFU09MVkVEX01PREVMX0tFWSxcbiAgRk9MTE9XX1VQX1VTRVJfVEVYVF9LRVksXG4gIEZPTExPV19VUF9OQVRJVkVfUVVFU1RJT05TX0tFWSxcbiAgRk9MTE9XX1VQX1JVTl9JRF9LRVksXG5dIGFzIGNvbnN0O1xuXG4vKiogUmVtb3ZlIGJyb3dzZXItc3VwcGxpZWQgdmFsdWVzIGZvciBmaWVsZHMgb3duZWQgYnkgdHJ1c3RlZCBzZXJ2ZXIgbWlkZGxld2FyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgVFJVU1RFRF9SRVFVRVNUX0NPTlRFWFRfS0VZUykge1xuICAgIHJlcXVlc3RDb250ZXh0LmRlbGV0ZVJhdyhrZXkpO1xuICB9XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBjYW5vbmljYWwgYnJvd3NlciBvcmlnaW4gZnJvbSBzdGFuZGFyZCBwcm94eSBhbmQgYnJvd3NlciBoZWFkZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RPcmlnaW4ocmVxOiBleHByZXNzLlJlcXVlc3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFtyZXEuZ2V0KFwib3JpZ2luXCIpLCByZXEuZ2V0KFwicmVmZXJlclwiKV0pIHtcbiAgICBpZiAoIXZhbHVlKSBjb250aW51ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh2YWx1ZSk7XG4gICAgICBpZiAodXJsLnByb3RvY29sID09PSBcImh0dHA6XCIgfHwgdXJsLnByb3RvY29sID09PSBcImh0dHBzOlwiKSByZXR1cm4gdXJsLm9yaWdpbjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENvbnRpbnVlIHRvIHByb3h5IGhlYWRlcnMuXG4gICAgfVxuICB9XG4gIGNvbnN0IGhvc3QgPSByZXEuZ2V0KFwieC1mb3J3YXJkZWQtaG9zdFwiKT8uc3BsaXQoXCIsXCIsIDEpWzBdPy50cmltKCkgfHwgcmVxLmdldChcImhvc3RcIik/LnRyaW0oKTtcbiAgaWYgKCFob3N0KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwcm90b2NvbCA9XG4gICAgcmVxLmdldChcIngtZm9yd2FyZGVkLXByb3RvXCIpPy5zcGxpdChcIixcIiwgMSlbMF0/LnRyaW0oKSB8fCByZXEucHJvdG9jb2wgfHwgXCJodHRwc1wiO1xuICBpZiAocHJvdG9jb2wgIT09IFwiaHR0cFwiICYmIHByb3RvY29sICE9PSBcImh0dHBzXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwoYCR7cHJvdG9jb2x9Oi8vJHtob3N0fWApLm9yaWdpbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgaW5kZXBlbmRlbnQgb2Ygd2hpY2ggRGF0YWJyaWNrcyBjcmVkZW50aWFsIHJ1bnNcbiAqIGl0cyBjYWxscy4gU3VwcGxpZWQgYnkgdGhlIEhUVFAgbWlkZGxld2FyZSBmcm9tIHRoZSBmb3J3YXJkZWQgdXNlciBoZWFkZXJzIHNvXG4gKiB0aGF0IGluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSAtIHdoZXJlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzIHRoZSBhcHAgU1Anc1xuICogY2xpZW50IC0gdGhlIG1lbW9yeSB0aHJlYWQsIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSwgYW5kIHRyYWNlIG1ldGFkYXRhXG4gKiBzdGlsbCBrZXkgb2ZmIHRoZSByZWFsIGNhbGxlci4gSWdub3JlZCBpbiBhbiBPQk8gKHVzZXIpIGNvbnRleHQsIHdob3NlIG93blxuICogdXNlciBpZCAvIGVtYWlsIGFyZSBhdXRob3JpdGF0aXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZWRJZGVudGl0eSB7XG4gIC8qKiBGb3J3YXJkZWQgYHgtZm9yd2FyZGVkLXVzZXJgIGlkLCB1c2VkIHdoZW4gdGhlIGNsaWVudCBpcyB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIHVzZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEZvcndhcmRlZCBgeC1mb3J3YXJkZWQtZW1haWxgLCB1c2VkIGZvciB0cmFjZSBtZXRhZGF0YSB1bmRlciB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIGVtYWlsPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YW1wIHRoZSBBcHBLaXQgdXNlciAocGx1cyB0aGUgcmVzb3VyY2UgaWQgYW5kIHRyYWNlIG1ldGFkYXRhKSBvbnRvXG4gKiBgcmVxdWVzdENvbnRleHRgLlxuICpcbiAqIFNwbGl0IG91dCBvZiB7QGxpbmsgTWFzdHJhU2VydmVyfSBiZWNhdXNlIHRoZSBIVFRQIG1pZGRsZXdhcmUgaXMgbm90IHRoZSBvbmx5XG4gKiBjYWxsZXIgdGhhdCBuZWVkcyBpdDogYW4gb3V0LW9mLWJhbmQgdHVybiBmcm9tIGFub3RoZXIgcGx1Z2luIHJvdXRlIG9yIGFcbiAqIHNjaGVkdWxlZCBqb2IgZHJpdmVzIGBhZ2VudC5nZW5lcmF0ZWAgZGlyZWN0bHksIGFuZCB3aXRob3V0IHRoaXMgc3RhbXAgZXZlcnlcbiAqIHVzZXItc2NvcGVkIHRvb2wgLSBgYXNrX2dlbmllYCBhYm92ZSBhbGwgLSBmYWlscyB3aXRoIFwiaW52b2tlIHRoZSB0b29sIGZyb20gYW5cbiAqIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBtYXN0cmEgcGx1Z2luXCIuIFRob3NlIGNhbGxlcnMgYnVpbGQgYSBjb250ZXh0IHdpdGhcbiAqIHtAbGluayBjcmVhdGVSZXF1ZXN0Q29udGV4dH0gaW5zdGVhZCBvZiBhIHJlcXVlc3QuXG4gKlxuICogVGhlIERhdGFicmlja3MgY3JlZGVudGlhbCBhbHdheXMgY29tZXMgZnJvbSB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dDtcbiAqIGBhdHRyaWJ1dGVkYCBvbmx5IGNoYW5nZXMgV0hPIHRoZSB0dXJuIGlzIGF0dHJpYnV0ZWQgdG8gd2hlbiB0aGF0IGNvbnRleHQgaXNcbiAqIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCAoc2VlIHtAbGluayBBdHRyaWJ1dGVkSWRlbnRpdHl9KS5cbiAqXG4gKiBJZGVtcG90ZW50OiByZXR1cm5zIGltbWVkaWF0ZWx5IHdoZW4gdGhlIHVzZXIgYW5kIHJlc291cmNlIGlkIGFyZSBhbHJlYWR5XG4gKiBwcmVzZW50LCBzbyB0aGUgbWlkZGxld2FyZSBjYW4gY2FsbCBpdCBvdmVyIGEgY29udGV4dCBhbm90aGVyIGxheWVyIHN0YW1wZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBhdHRyaWJ1dGVkOiBBdHRyaWJ1dGVkSWRlbnRpdHkgPSB7fSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoW01BU1RSQV9VU0VSX0tFWSwgTUFTVFJBX1JFU09VUkNFX0lEX0tFWV0uZXZlcnkoKGtleSkgPT4gcmVxdWVzdENvbnRleHQuZ2V0KGtleSkpKSByZXR1cm47XG4gIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGF3YWl0IGluaXRpYWxpemVSZXF1ZXN0TWxmbG93VHJhY2VJbmZvKGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50KTtcbiAgY29uc3QgaXNVc2VyQ29udGV4dCA9IFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQ7XG4gIC8vIFRoZSBEYXRhYnJpY2tzIENSRURFTlRJQUwgaXMgYWx3YXlzIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0J3MgY2xpZW50XG4gIC8vIChPQk8gaW4gYSB1c2VyIGNvbnRleHQsIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBvdGhlcndpc2UpLiBXSE8gdGhlIHR1cm4gaXNcbiAgLy8gYXR0cmlidXRlZCB0byBjYW4gZGlmZmVyOiBpbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgZXZlcnkgcmVxdWVzdCBzaGFyZXNcbiAgLy8gdGhlIFNQIGNsaWVudCwgYnV0IHRoZSBmb3J3YXJkZWQgdXNlciBpZCBtdXN0IHN0aWxsIGtleSB0aGUgbWVtb3J5IHRocmVhZFxuICAvLyBhbmQgdGhlIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSBzbyB0d28gY2FsbGVycyBkb24ndCBzaGFyZSBhIGNvbnZlcnNhdGlvbi5cbiAgY29uc3QgdXNlcjogVXNlciA9IHtcbiAgICBpZDogYXR0cmlidXRlZFVzZXJJZChleGVjdXRpb25Db250ZXh0LCBhdHRyaWJ1dGVkLnVzZXJJZCksXG4gICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgfTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9VU0VSX0tFWSwgdXNlcik7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCB1c2VyLmlkKTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9BVVRIX01PREVfS0VZLCBpc1VzZXJDb250ZXh0ID8gXCJvYm9cIiA6IFwic2VydmljZS1wcmluY2lwYWxcIik7XG4gIC8vIEFwcEtpdCdzIGBVc2VyQ29udGV4dGAgc3VyZmFjZXMgZGlzcGxheSBuYW1lIC8gZW1haWwgb25seSBvblxuICAvLyBPQk8gcmVxdWVzdHMuIFNlcnZpY2UtY29udGV4dCBjYWxscyAoYmFja2dyb3VuZCB0YXNrcywgc2VydmVyXG4gIC8vIHN0YXJ0LXVwKSBsZWF2ZSB0aGVzZSB1bmRlZmluZWQgYW5kIHdlIHNraXAgdGhlIHN0YW1wIHNvXG4gIC8vIGRvd25zdHJlYW0gdHJhY2UgbWV0YWRhdGEgc3RheXMgYWJzZW50IHJhdGhlciB0aGFuIGVtcHR5LiBJblxuICAvLyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgdGhlIGZvcndhcmRlZCBlbWFpbCBzdGlsbCBpZGVudGlmaWVzIHRoZSBjYWxsZXIsXG4gIC8vIHNvIGl0IGlzIHVzZWQgZm9yIHRyYWNlIG1ldGFkYXRhIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIFNQLlxuICBsZXQgdXNlck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBhdHRyaWJ1dGVkLmVtYWlsO1xuICBpZiAoaXNVc2VyQ29udGV4dCkge1xuICAgIHVzZXJOYW1lID0gZXhlY3V0aW9uQ29udGV4dC51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGV4ZWN1dGlvbkNvbnRleHQudXNlckVtYWlsID8/IGVtYWlsO1xuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmN1cnJlbnRVc2VyLm1lKCk7XG4gICAgdXNlck5hbWUgPSBjdXJyZW50VXNlcj8udXNlck5hbWU7XG4gICAgZW1haWwgPSBjdXJyZW50VXNlcj8uZW1haWxzPy5maWx0ZXIoKGVtYWlsKSA9PiBlbWFpbC5wcmltYXJ5KS5maW5kKChlbWFpbCkgPT4gZW1haWwudmFsdWUpXG4gICAgICA/LnZhbHVlIGFzIHN0cmluZztcbiAgfVxuICBpZiAodXNlck5hbWUpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVksIHVzZXJOYW1lKTtcbiAgfVxuICBpZiAoZW1haWwpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBlbWFpbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYFJlcXVlc3RDb250ZXh0YCBhIE5PTi1IVFRQIGFnZW50IHR1cm4gbmVlZHMuXG4gKlxuICogRXZlcnl0aGluZyBNYXN0cmEncyB0b29scyByZWFkIG9mZiB0aGUgY29udGV4dCBpcyBzdGFtcGVkIHRoZSBzYW1lIHdheSB0aGVcbiAqIHJlcXVlc3QgbWlkZGxld2FyZSBzdGFtcHMgaXQgLSB0aGUgQXBwS2l0IHVzZXIgKHNvIGBhc2tfZ2VuaWVgIGFuZCB0aGUgbW9kZWxcbiAqIHJlc29sdmVyIGNhbiBtaW50IHVzZXItc2NvcGVkIHRva2VucyksIHRoZSBtZW1vcnkgdGhyZWFkIC8gcmVzb3VyY2UgcGFpciwgYW5kXG4gKiBhIHJlcXVlc3QgaWQgc28gdGhlIHR1cm4ncyBzcGFucyBqb2luIHVwIGluIHRyYWNlcy4gVGhlIHJlc3VsdCBpcyBwYXNzZWQgYXNcbiAqIGByZXF1ZXN0Q29udGV4dGAgdG8gYGFnZW50LmdlbmVyYXRlYCAvIGBhZ2VudC5zdHJlYW1gLlxuICpcbiAqIFRoaXMgZ2l2ZXMgYW4gb3V0LW9mLWJhbmQgdHVybiB0aGUgc2FtZSBkYXRhIGFuZCB0b29sIGNhcGFiaWxpdHkgYXMgYSBjaGF0XG4gKiB0dXJuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdENvbnRleHQoXG4gIG9wdGlvbnM6IHsgdGhyZWFkSWQ/OiBzdHJpbmc7IHJlc291cmNlSWQ/OiBzdHJpbmc7IHJlcXVlc3RJZD86IHN0cmluZyB9ID0ge30sXG4pOiBQcm9taXNlPFJlcXVlc3RDb250ZXh0PiB7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gbmV3IFJlcXVlc3RDb250ZXh0KCk7XG4gIGF3YWl0IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKHJlcXVlc3RDb250ZXh0KTtcbiAgaWYgKG9wdGlvbnMudGhyZWFkSWQpIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgb3B0aW9ucy50aHJlYWRJZCk7XG4gIC8vIFN0YW1wZWQgQUZURVIgdGhlIHVzZXIgc28gYW4gZXhwbGljaXQgcmVzb3VyY2UgaWQgd2lucyBvdmVyIHRoZSBhbWJpZW50XG4gIC8vIGlkZW50aXR5IGBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcmAgZGVmYXVsdGVkIHRvLlxuICBpZiAob3B0aW9ucy5yZXNvdXJjZUlkKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgb3B0aW9ucy5yZXNvdXJjZUlkKTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSwgb3B0aW9ucy5yZXF1ZXN0SWQgPz8gaWQoKSk7XG4gIHJldHVybiByZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBgQG1hc3RyYS9leHByZXNzYCBzdWJjbGFzcyB0aGF0IHN0YW1wcyBgUmVxdWVzdENvbnRleHRgIHdpdGggdGhlXG4gKiBBcHBLaXQgdXNlciwgcmVzb3VyY2UgaWQsIGFuZCBhIHRocmVhZCBpZCBiYWNrZWQgYnkgYW4gSFRUUC1vbmx5XG4gKiBzZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hc3RyYVNlcnZlciBleHRlbmRzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIge1xuICBwcml2YXRlIGxvZzogTG9nZ2VyO1xuICAvKipcbiAgICogV2hldGhlciB0byBzdGFtcCB0aGUgTUxmbG93IHRyYWNlLWlkIGhlYWRlciBvbiByZXNwb25zZXMuXG4gICAqL1xuICBwcml2YXRlIG1sZmxvd0ZlZWRiYWNrOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBFeHByZXNzTWFzdHJhU2VydmVyPlxuICApIHtcbiAgICBzdXBlciguLi5hcmdzKTtcbiAgICB0aGlzLmxvZyA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgICB0aGlzLm1sZmxvd0ZlZWRiYWNrID0gY29uZmlnLmZlZWRiYWNrTW9kZSA9PT0gXCJtbGZsb3dcIjtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTogdm9pZCB7XG4gICAgc3VwZXIucmVnaXN0ZXJBdXRoTWlkZGxld2FyZSgpO1xuICAgIHRoaXMuYXBwLnVzZShhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gcmVzLmxvY2Fscy5yZXF1ZXN0Q29udGV4dCEgYXMgUmVxdWVzdENvbnRleHQ7XG4gICAgICBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXEsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRUaHJlYWRJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0UmVxdWVzdElkKHJlcSwgcmVzLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0T3JpZ2luKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXEsIHJlcXVlc3RDb250ZXh0KTtcblxuICAgICAgdGhpcy5jb25maWd1cmVNbGZsb3dUcmFjZUlkKHJlcyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcImF1dGg6bWlkZGxld2FyZVwiLCB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSksXG4gICAgICAgIHRocmVhZElkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpLFxuICAgICAgICByZXNvdXJjZUlkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSksXG4gICAgICAgIHVzZXJOYW1lOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVkpLFxuICAgICAgICB1c2VyRW1haWw6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpLFxuICAgICAgICBtb2RlbE92ZXJyaWRlOiByZXF1ZXN0Q29udGV4dC5nZXQoXG4gICAgICAgICAgLy8gaW1wb3J0ZWQgYmVsb3c7IGxvZ2dlZCBzbyBhIG1pc3JvdXRlZCByZXF1ZXN0IHNob3dzXG4gICAgICAgICAgLy8gdXAgYWxvbmdzaWRlIGl0cyBtb2RlbCBzZWxlY3Rpb24gaW4gYExPR19MRVZFTD1kZWJ1Z2AuXG4gICAgICAgICAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgLy8gUGFzcyB0aGUgZm9yd2FyZGVkIGNhbGxlciBpZGVudGl0eSBzbyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgc3RpbGwga2V5c1xuICAgIC8vIG1lbW9yeSAvIGNhY2hlIC8gdHJhY2VzIHBlciB1c2VyIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIGFwcCBTUC5cbiAgICAvLyBJbiBhbiBPQk8gY29udGV4dCB0aGVzZSBhcmUgaWdub3JlZCBpbiBmYXZvciBvZiB0aGUgY29udGV4dCdzIG93biB1c2VyLlxuICAgIGF3YWl0IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKHJlcXVlc3RDb250ZXh0LCB7XG4gICAgICB1c2VySWQ6IHJlcXVlc3RVc2VySWQocmVxKSxcbiAgICAgIGVtYWlsOiByZXF1ZXN0VXNlckVtYWlsKHJlcSksXG4gICAgfSk7XG4gICAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChcImlzVXNlckNvbnRleHRcIiBpbiB1c2VyLmV4ZWN1dGlvbkNvbnRleHQgPyBcIm9ib1wiIDogXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgICB9XG4gICAgY29uc3QgdHJhY2VVc2VyID0gW1xuICAgICAgcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSksXG4gICAgICByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVkpLFxuICAgICAgcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpLFxuICAgIF0uZmluZCgodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgICByZWNvcmRBY3RpdmVUcmFjZVVzZXIodHJhY2VVc2VyKTtcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgcHVibGljIGJyb3dzZXIgb3JpZ2luIHNvIHBsdWdpbiB0b29scyBjYW4gcmV0dXJuIGNhbm9uaWNhbCBhcHAgbGlua3MuICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0T3JpZ2luKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW4gPSByZXF1ZXN0T3JpZ2luKHJlcSk7XG4gICAgaWYgKG9yaWdpbikgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9PUklHSU5fS0VZLCBvcmlnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIGEgcGVyLXJlcXVlc3QgaWQgYW5kIGVjaG8gaXQgb24gdGhlIHJlc3BvbnNlIHNvIGFuIHVwc3RyZWFtXG4gICAqIHByb3h5IC8gY3VybCBjbGllbnQgLyBicm93c2VyLXNpZGUgbG9nIGxpbmUgY2FuIHBhaXIgaXRzIHZpZXcgb2ZcbiAgICogdGhlIHJlcXVlc3Qgd2l0aCB0aGUgbWF0Y2hpbmcgdHJhY2Ugc3Bhbi4gUmV1c2VzIGBYLVJlcXVlc3QtSWRgXG4gICAqIHdoZW4gdGhlIHVwc3RyZWFtIGFscmVhZHkgc3VwcGxpZXMgb25lIHNvIG11bHRpLWhvcCB0cmFjZXMgc3RheVxuICAgKiBqb2luZWQ7IG90aGVyd2lzZSBtaW50cyBhIFVVSUR2NC5cbiAgICpcbiAgICogVGhlIGlkIGlzIHN1cmZhY2VkIGFzIGBtYXN0cmFfX3JlcXVlc3RJZGAgc3BhbiBtZXRhZGF0YSB2aWFcbiAgICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBhbmQgYXMgdGhlIGBYLVJlcXVlc3QtSWRgXG4gICAqIHJlc3BvbnNlIGhlYWRlciBzbyBkZXYgdG9vbHMgY2FuIGNvcHkgaXQgZnJvbSBlaXRoZXIgc2lkZS5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0UmVxdWVzdElkKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gICkge1xuICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZKSkgcmV0dXJuO1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gcmVxLmhlYWRlcnNbXCJ4LXJlcXVlc3QtaWRcIl07XG4gICAgY29uc3QgdXBzdHJlYW0gPSBBcnJheS5pc0FycmF5KGhlYWRlclZhbHVlKSA/IGhlYWRlclZhbHVlWzBdIDogaGVhZGVyVmFsdWU7XG4gICAgY29uc3QgcmVxdWVzdElkID0gdXBzdHJlYW0/LnRyaW0oKSB8fCBpZCgpO1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIHJlcXVlc3RJZCk7XG4gICAgcmVzLnNldEhlYWRlcihcIlgtUmVxdWVzdC1JZFwiLCByZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIE9BdXRoIHNjb3BlcyBmcm9tIHRoZSBmb3J3YXJkZWQgYWNjZXNzIHRva2VuIG9uXG4gICAqIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0gZm9yIHdvcmtzcGFjZSBtb3VudCBnYXRpbmcuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgY29uc3Qgc2NvcGVzID0gW1xuICAgICAgLi4uc2VxdWVuY2UoZ2V0QWNjZXNzVG9rZW5TY29wZXMocmVxKSwgZ2V0QWNjZXNzVG9rZW5TY29wZXMocmVxLCBcImF1dGhvcml6YXRpb25cIikpLmRpc3RpbmN0KCksXG4gICAgXTtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1NDT1BFU19LRVksIHNjb3Blcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIHR1cm4ncyBNTGZsb3cgdHJhY2UgaWQgb24gdGhlIHJlc3BvbnNlIHNvIHRoZSBjaGF0IGNsaWVudFxuICAgKiBjYW4gYXR0YWNoIHRodW1icyAvIGNvbW1lbnQgZmVlZGJhY2sgdG8gaXQgbGF0ZXIuIE1MZmxvdyBkZXJpdmVzXG4gICAqIGl0cyB0cmFjZSBpZCBmcm9tIHRoZSBPcGVuVGVsZW1ldHJ5IHRyYWNlIGlkIChgdHItPGhleD5gKSwgYW5kIGV2ZXJ5XG4gICAqIE1hc3RyYSBzcGFuIGZvciB0aGlzIHJlcXVlc3QgaW5oZXJpdHMgdGhlIGFtYmllbnQgT1RlbCBjb250ZXh0IChzZWVcbiAgICogYG9ic2VydmFiaWxpdHkudHNgKSwgc28gdGhlIGFjdGl2ZSBzcGFuJ3MgdHJhY2UgaWQgaGVyZSBpcyB0aGUgaWRcbiAgICogTUxmbG93IHdpbGwgcmVjb3JkIGZvciB0aGUgdHVybi5cbiAgICpcbiAgICogTm8tb3AgdW5sZXNzIGZlZWRiYWNrIGlzIGVuYWJsZWQsIGFuZCB3aGVuIG5vIGxpdmUgT1RlbCBzcGFuIGlzXG4gICAqIGFjdGl2ZSAoZS5nLiB0aGUgT1RMUCBTREsgaXNuJ3QgcmVnaXN0ZXJlZCk6IGluIHRoYXQgY2FzZSB0aGUgaGVhZGVyXG4gICAqIGlzIHNpbXBseSBhYnNlbnQgYW5kIHRoZSBjbGllbnQgaGlkZXMgZmVlZGJhY2sgZm9yIHRoYXQgbWVzc2FnZSxcbiAgICogZGVncmFkaW5nIGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW1pdHRpbmcgYSBib2d1cyB0cmFjZSBpZC5cbiAgICovXG4gIGNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzOiBleHByZXNzLlJlc3BvbnNlKSB7XG4gICAgaWYgKCF0aGlzLm1sZmxvd0ZlZWRiYWNrIHx8IHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xuICAgIGlmIChyZXMuZ2V0SGVhZGVyKE1MRkxPV19UUkFDRV9JRF9IRUFERVIpKSByZXR1cm47XG4gICAgY29uc3QgdHJhY2VJZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKT8uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGlmICghdHJhY2VJZCB8fCB0cmFjZUlkID09PSBJTlZBTElEX1RSQUNFX0lEKSByZXR1cm47XG4gICAgcmVzLnNldEhlYWRlcihNTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHRocmVhZCBpZCB0aGlzIHJlcXVlc3QgdGFyZ2V0cyBhbmQgcGluIGl0IG9uXG4gICAqIGBSZXF1ZXN0Q29udGV4dGAgKGNvbnN1bWVkIGJ5IHRoZSBhZ2VudCBzdHJlYW0gZm9yIHBlcnNpc3RlbmNlIGFuZFxuICAgKiBieSBuYXRpdmUgbWVtb3J5IHJvdXRlcykuIFJlc29sdXRpb24gb3JkZXI6XG4gICAqXG4gICAqICAgMS4gQSBjbGllbnQtc3VwcGxpZWQgdGhyZWFkIGlkICh0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgL1xuICAgKiAgICAgIGA/dGhyZWFkSWQ9YCBxdWVyeSkuIFRoaXMgaXMgaG93IHRoZSBjaGF0IFVJIHJlZmVyZW5jZXMgYVxuICAgKiAgICAgIHNwZWNpZmljIGNvbnZlcnNhdGlvbiBhbW9uZyB0aGUgbWFueSBhIHVzZXIgb3ducyAtIGl0IHBpY2tzIGFcbiAgICogICAgICB0aHJlYWQgaWQgZnJvbSB0aGUgYC90aHJlYWRzYCBsaXN0aW5nIChvciBtaW50cyBvbmUgZm9yIGEgbmV3XG4gICAqICAgICAgY29udmVyc2F0aW9uKSBhbmQgc3RhbXBzIGl0IGhlcmUuIFRoZSBpZCBpcyBzY29wZWQgdG8gdGhlXG4gICAqICAgICAgY2FsbGVyJ3MgcmVzb3VyY2UgYnkgdGhlIHJlY2FsbCAvIGxpc3Qgcm91dGVzLCBzbyBhIGNsaWVudFxuICAgKiAgICAgIGNhbiBvbmx5IGV2ZXIgcmVhZCBvciB3cml0ZSBpdHMgb3duIHRocmVhZHMuXG4gICAqICAgMi4gVGhlIHBlci1zZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKSxcbiAgICogICAgICBtaW50ZWQgb24gZmlyc3QgY29udGFjdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzaW5nbGUtdGhyZWFkXG4gICAqICAgICAgZmFsbGJhY2sgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBtYW5hZ2UgdGhyZWFkcyBleHBsaWNpdGx5LCBzb1xuICAgKiAgICAgIGV4aXN0aW5nIGVtYmVkcyBrZWVwIG9uZSBzdGFibGUgY29udmVyc2F0aW9uIHBlciBzZXNzaW9uIHdpdGhcbiAgICogICAgICBubyBjbGllbnQgY2hhbmdlcy5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgKSB7XG4gICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSB0aGlzLnJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXEpO1xuICAgIGlmIChyZXF1ZXN0ZWQpIHtcbiAgICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgcmVxdWVzdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29va2llcyA9IHBhcnNlQ29va2llcyhyZXEuaGVhZGVycy5jb29raWUpO1xuICAgIGNvbnN0IGNvb2tpZU5hbWUgPSB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyhcbiAgICAgIHsgZGVsaW1pdGVyOiBcIl9cIiwgZGlzdGluY3Q6IHRydWUgfSxcbiAgICAgIFwiYXBwa2l0XCIsXG4gICAgICB0aGlzLmNvbmZpZy5uYW1lISxcbiAgICAgIFwic2Vzc2lvbklkXCIsXG4gICAgKTtcbiAgICBsZXQgc2Vzc2lvbklkID0gY29va2llc1tjb29raWVOYW1lXTtcbiAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgc2Vzc2lvbklkID0gaWQoKTtcbiAgICAgIHJlcy5jb29raWUoY29va2llTmFtZSwgc2Vzc2lvbklkLCB7XG4gICAgICAgIGh0dHBPbmx5OiB0cnVlLFxuICAgICAgICBzYW1lU2l0ZTogXCJsYXhcIixcbiAgICAgICAgc2VjdXJlOiByZXEuc2VjdXJlLFxuICAgICAgICBwYXRoOiBcIi9cIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgY2xpZW50LXNlbGVjdGVkIHRocmVhZCBpZCBmcm9tIHRoZSByZXF1ZXN0LCBwcmVmZXJyaW5nXG4gICAqIHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlciBvdmVyIHRoZSBgP3RocmVhZElkPWAgcXVlcnkuIFJldHVybnNcbiAgICogYG51bGxgIHdoZW4gbmVpdGhlciBjYXJyaWVzIGEgbm9uLWVtcHR5IHZhbHVlIHNvIHRoZSBjYWxsZXIgZmFsbHNcbiAgICogYmFjayB0byB0aGUgc2Vzc2lvbiBjb29raWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gcmVxLmhlYWRlcnNbVEhSRUFEX0lEX0hFQURFUl07XG4gICAgY29uc3QgcXVlcnlWYWx1ZSA9IHJlcS5xdWVyeVtUSFJFQURfSURfUVVFUlldO1xuICAgIHJldHVybiAoXG4gICAgICB0cmltVG9OdWxsKEFycmF5LmlzQXJyYXkoaGVhZGVyVmFsdWUpID8gaGVhZGVyVmFsdWVbMF0gOiBoZWFkZXJWYWx1ZSkgPz9cbiAgICAgIHRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShxdWVyeVZhbHVlKSA/IHF1ZXJ5VmFsdWVbMF0gOiBxdWVyeVZhbHVlKVxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIC8vIFBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlOiBvbmx5IGhvbm9yZWQgd2hlbiB0aGUgcGx1Z2luXG4gICAgLy8gb3B0cyBpbiAoZGVmYXVsdCkuIFNvdXJjZXMsIGluIHByaW9yaXR5IG9yZGVyLCBhcmVcbiAgICAvLyBgWC1NYXN0cmEtTW9kZWxgIGhlYWRlciwgYD9tb2RlbD1gIHF1ZXJ5LCBhbmQgYG1vZGVsYCAvXG4gICAgLy8gYG1vZGVsSWRgIGJvZHkgZmllbGQ7IHNlZSBgc2VydmluZy50c2AuXG4gICAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICBpZiAoc2VydmluZy5hbGxvd092ZXJyaWRlKSB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4dHJhY3RNb2RlbE92ZXJyaWRlKHtcbiAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICAgICAgICBxdWVyeTogcmVxLnF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBib2R5OiByZXEuYm9keSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG92ZXJyaWRlKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgb3ZlcnJpZGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogSW5wdXRzIGZvciB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFwaUdhdGVPcHRpb25zIHtcbiAgLyoqIGBjb25maWcuYXBpQWNjZXNzYDsgYFwiZnVsbFwiYCBzaG9ydC1jaXJjdWl0cyB0byBhbGxvdyBldmVyeXRoaW5nLiAqL1xuICBhY2Nlc3M6IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqIFdoZXRoZXIgdGhlIE1DUCB0cmFuc3BvcnQgaXMgbW91bnRlZCAoc28gYC9tY3AvKmAgaXMgbGVnaXRpbWF0ZSkuICovXG4gIG1jcEVuYWJsZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgYWdlbnQgaW5mZXJlbmNlIHBhdGhzIChgL2FnZW50cy86aWQvPHZlcmI+Li4uYCkuIE1hdGNoZWRcbiAqIGJ5IHByZWZpeCBvbiB0aGUgdmVyYiBzbyBmdXR1cmUgdmFyaWFudHMgKGBzdHJlYW1WTmV4dGAsIGBzdHJlYW0vdm5leHRgLFxuICogYGdlbmVyYXRlVk5leHRgKSBzdGF5IGNvdmVyZWQgd2l0aG91dCBhIGNvZGUgY2hhbmdlLlxuICpcbiAqIENvdmVycyB0aGUgcGxhaW4gaW5mZXJlbmNlIHZlcmJzIChgc3RyZWFtYCAvIGBnZW5lcmF0ZWAgLyBgbmV0d29ya2ApIHBsdXNcbiAqIHRoZSBodW1hbi1pbi10aGUtbG9vcCByZXN1bWUgdmVyYnMgYSBwYXVzZWQgYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBuZWVkc1xuICogdG8gY29udGludWU6IGBhcHByb3ZlLXRvb2wtY2FsbGAgLyBgZGVjbGluZS10b29sLWNhbGxgIChzdHJlYW1pbmcsIGFuZCB2aWFcbiAqIHByZWZpeCB0aGVpciBgLWdlbmVyYXRlYCBub24tc3RyZWFtaW5nIHZhcmlhbnRzKSwgdGhlIGAtbmV0d29yay1gIHZhcmlhbnRzLFxuICogYW5kIGByZXN1bWUtc3RyZWFtYCAoY292ZXJzIGByZXN1bWUtc3RyZWFtLXVudGlsLWlkbGVgKS4gV2l0aG91dCB0aGVzZSBhblxuICogYXBwcm92YWwtZ2F0ZWQgdG9vbCAoZS5nLiBgc2VuZF9lbWFpbGApIGNhbiBiZSByZXF1ZXN0ZWQgYnV0IG5ldmVyIGFwcHJvdmVkXG4gKiBmcm9tIHRoZSBicm93c2VyIC0gdGhlIHJlc3VtZSBgUE9TVGAgNDAzcyB1bmRlciBzY29wZWQgbW9kZS4gVG9nZXRoZXIgd2l0aFxuICogdGhlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgbXV0YXRpb25zIGJlbG93LCB0aGVzZSBhcmUgdGhlIG9ubHkgc3RvY2sgTWFzdHJhXG4gKiB3cml0ZXMgdGhlIGJyb3dzZXIgY2xpZW50IGNhbiBtYWtlLlxuICovXG5jb25zdCBBR0VOVF9JTkZFUkVOQ0UgPVxuICAvXlxcL2FnZW50c1xcL1teL10rXFwvKHN0cmVhbXxnZW5lcmF0ZXxuZXR3b3JrfHJlc3VtZS1zdHJlYW18YXBwcm92ZS10b29sLWNhbGx8ZGVjbGluZS10b29sLWNhbGx8YXBwcm92ZS1uZXR3b3JrLXRvb2wtY2FsbHxkZWNsaW5lLW5ldHdvcmstdG9vbC1jYWxsKS9pO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhIChgL2FnZW50c2AsIGAvYWdlbnRzLzppZGApLiAqL1xuY29uc3QgQUdFTlRfTUVUQURBVEEgPSAvXlxcL2FnZW50cyhcXC9bXi9dKyk/JC87XG4vKiogUGVyc2lzdGVkIGFwcHJvdmFsIGRpc2NvdmVyeSBmb3Igb25lIGFnZW50LiAqL1xuY29uc3QgQUdFTlRfU1VTUEVOREVEX1JVTlMgPSAvXlxcL2FnZW50c1xcL1teL10rXFwvc3VzcGVuZGVkLXJ1bnMkL2k7XG4vKiogT2ZmaWNpYWwgQUkgU0RLIFVJIHN0cmVhbSByb3V0ZSwgaW5jbHVkaW5nIGByZXN1bWVEYXRhYCBjb250aW51YXRpb25zLiAqL1xuY29uc3QgQUdFTlRfQ0hBVCA9IC9eXFwvY2hhdFxcL1teL10rJC9pO1xuLyoqIER1cmFibGUgcnVuIG9ic2VydmF0aW9uIGZvciBvbmUgYWdlbnQtb3duZWQgY2hhdCBzdHJlYW0uICovXG5jb25zdCBBR0VOVF9DSEFUX1JVTiA9IC9eXFwvY2hhdFxcL1teL10rXFwvcnVuc1xcL1teL10rJC9pO1xuLyoqIEV4cGxpY2l0IGNhbmNlbGxhdGlvbiBmb3Igb25lIGR1cmFibGUgY2hhdCBydW4uICovXG5jb25zdCBBR0VOVF9DSEFUX1JVTl9BQk9SVCA9IC9eXFwvY2hhdFxcL1teL10rXFwvcnVuc1xcL1teL10rXFwvYWJvcnQkL2k7XG4vKiogTmF0aXZlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgcmVhZHMgdXNlZCBieSBoaXN0b3J5IGFuZCB0aGUgdGhyZWFkIGxpc3QuICovXG5jb25zdCBNRU1PUllfUkVBRCA9IC9eXFwvbWVtb3J5XFwvdGhyZWFkcyg/OlxcL1teL10rKD86XFwvbWVzc2FnZXMpPyk/JC9pO1xuLyoqIE5hdGl2ZSB0aHJlYWQgcmVuYW1lL2RlbGV0ZSByb3V0ZXMuICovXG5jb25zdCBNRU1PUllfVEhSRUFEX01VVEFUSU9OID0gL15cXC9tZW1vcnlcXC90aHJlYWRzXFwvW14vXSskL2k7XG5cbi8qKlxuICogV2hldGhlciBhIHJlcXVlc3QgdG8gdGhlIHN0b2NrIGBAbWFzdHJhL2V4cHJlc3NgIHN1Yi1hcHAgc2hvdWxkIGJlXG4gKiBkaXNwYXRjaGVkLCBnaXZlbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgTWFzdHJhQXBpR2F0ZU9wdGlvbnMuYWNjZXNzfS5cbiAqXG4gKiBgcGF0aGAgaXMgbW91bnQtcmVsYXRpdmUgKHdoYXQgdGhlIHBsdWdpbidzIGNhdGNoLWFsbCBzZWVzLCBlLmcuXG4gKiBgL2NoYXQveGAsIGAvbWVtb3J5L3RocmVhZHNgLCBgL21jcC8uLi5gKS4gSW4gYFwic2NvcGVkXCJgXG4gKiBtb2RlIHRoZSBhbGxvd2xpc3QgaXMgZGVsaWJlcmF0ZWx5IHRpZ2h0IC0gdGhlIGNoYXQgY2xpZW50IG9ubHkgZXZlclxuICogbmVlZHMgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHJlc291cmNlLXNjb3BlZCBtZW1vcnksXG4gKiB0aGlzIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUC4gVGhlIHJlbWFpbmluZ1xuICogYWRtaW4sIG11dGF0aW5nLCBhbmQgYnVsay1leHBvcnQgc3VyZmFjZSBzdGF5cyBkZW5pZWQgYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQoXG4gIG1ldGhvZDogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdHM6IE1hc3RyYUFwaUdhdGVPcHRpb25zLFxuKTogYm9vbGVhbiB7XG4gIGlmIChvcHRzLmFjY2VzcyA9PT0gXCJmdWxsXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBwID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAvLyBUaGUgcGx1Z2luJ3MgYC9yb3V0ZS8qYCBhZGRpdGlvbnMgdmFsaWRhdGUgdGhlaXIgb3duIGlucHV0cyBhbmQgdHJ1c3RlZFxuICAvLyBBcHBLaXQgcmVxdWVzdCBjb250ZXh0IGJlZm9yZSByZWFjaGluZyBwcm9kdWN0IGJlaGF2aW9yLlxuICBpZiAocCA9PT0gXCIvcm91dGVcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvcm91dGUvXCIpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG9wdHMubWNwRW5hYmxlZCAmJiAocCA9PT0gXCIvbWNwXCIgfHwgcC5zdGFydHNXaXRoKFwiL21jcC9cIikpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbSA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgQUdFTlRfQ0hBVC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgQUdFTlRfQ0hBVF9SVU4udGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBBR0VOVF9DSEFUX1JVTl9BQk9SVC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIEFHRU5UX0lORkVSRU5DRS50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgKEFHRU5UX01FVEFEQVRBLnRlc3QocCkgfHwgQUdFTlRfU1VTUEVOREVEX1JVTlMudGVzdChwKSkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJHRVRcIiAmJiBNRU1PUllfUkVBRC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKChtID09PSBcIlBBVENIXCIgfHwgbSA9PT0gXCJERUxFVEVcIikgJiYgTUVNT1JZX1RIUkVBRF9NVVRBVElPTi50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIHAgPT09IFwiL21lbW9yeS9tZXNzYWdlcy9kZWxldGVcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBLZWVwIE1hc3RyYSBjdXN0b20gQVBJIHJvdXRlcyBtb3VudC1yZWxhdGl2ZSB3aGVuIHRoZSBFeHByZXNzIHN1YmFwcCBpc1xuICogaG9zdGVkIHVuZGVyIEFwcEtpdCdzIGAvYXBpLzxwbHVnaW4+YCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUoYXBwOiBleHByZXNzLkV4cHJlc3MpOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCBfcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgaXNDdXN0b21Sb3V0ZSA9XG4gICAgICByZXEucGF0aCA9PT0gXCIvY2hhdFwiIHx8XG4gICAgICByZXEucGF0aC5zdGFydHNXaXRoKFwiL2NoYXQvXCIpIHx8XG4gICAgICByZXEucGF0aCA9PT0gXCIvcm91dGVcIiB8fFxuICAgICAgcmVxLnBhdGguc3RhcnRzV2l0aChcIi9yb3V0ZS9cIik7XG4gICAgaWYgKCFpc0N1c3RvbVJvdXRlKSByZXR1cm4gbmV4dCgpO1xuICAgIHJlcS5vcmlnaW5hbFVybCA9IHJlcS5wYXRoO1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRmluaXNoIGEgY2hhdCByZXF1ZXN0IHdoZW4gTWFzdHJhIHRocm93cyBiZWNhdXNlIHRoZSB3b3JrZmxvdyBpcyBub1xuICogbG9uZ2VyIHN1c3BlbmRlZC4gRHVwbGljYXRlIGFwcHJvdmUvcmVzdW1lIGFuZCBsYXRlIGBjb25zdW1lU3RyZWFtYFxuICogYm90aCBoaXQgdGhhdCBwYXRoOyB0aGUgY2xpZW50IGFscmVhZHkgaGFzIChvciB3aWxsIHJlbG9hZCkgdGhlXG4gKiBjb21wbGV0ZWQgdHVybi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFN0YWxlUmVzdW1lUmVjb3ZlcnkoYXBwOiBleHByZXNzLkV4cHJlc3MpOiB2b2lkIHtcbiAgYXBwLnVzZShcbiAgICAoZXJyb3I6IHVua25vd24sIHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXM6IGV4cHJlc3MuUmVzcG9uc2UsIG5leHQ6IGV4cHJlc3MuTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgICBpZiAoIWlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvcihlcnJvcikpIHtcbiAgICAgICAgbmV4dChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci53YXJuKFwiaWdub3JlZCBzdGFsZSBtYXN0cmEgcmVzdW1lXCIsIHtcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIGVycm9yOiB0b0Vycm9yKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlcy5zdGF0dXMoMjAwKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJ0ZXh0L2V2ZW50LXN0cmVhbTsgY2hhcnNldD11dGYtOFwiKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsIFwibm8tY2FjaGVcIik7XG4gICAgICByZXMud3JpdGUoYGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoeyB0eXBlOiBcInN0YXJ0XCIgfSl9XFxuXFxuYCk7XG4gICAgICByZXMud3JpdGUoYGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoeyB0eXBlOiBcImZpbmlzaFwiIH0pfVxcblxcbmApO1xuICAgICAgcmVzLndyaXRlKFwiZGF0YTogW0RPTkVdXFxuXFxuXCIpO1xuICAgICAgcmVzLmVuZCgpO1xuICAgIH0sXG4gICk7XG59XG4iXX0=
@@ -10,9 +10,9 @@
10
10
  *
11
11
  * @module
12
12
  */
13
- import { modelCatalog } from "@dbx-tools/model";
14
- import { stringUtils } from "@dbx-tools/shared-core";
15
- import { override } from "@dbx-tools/shared-mastra";
13
+ import { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "@dbx-tools/model";
14
+ import { firstNonEmpty } from "@dbx-tools/shared-core";
15
+ import { MODEL_OVERRIDE_HEADER, MODEL_OVERRIDE_QUERY, MODEL_OVERRIDE_BODY_FIELDS, } from "@dbx-tools/shared-mastra";
16
16
  /**
17
17
  * `RequestContext` key under which {@link MastraServer} stores the
18
18
  * per-request model override (header / query / body). `model.ts`
@@ -38,20 +38,19 @@ export const MASTRA_RESOLVED_MODEL_KEY = "mastra__resolved_model";
38
38
  export function extractModelOverride(req) {
39
39
  const headers = req.headers;
40
40
  if (headers) {
41
- const headerVal = stringUtils.firstNonEmpty(headers[override.MODEL_OVERRIDE_HEADER] ??
42
- headers[override.MODEL_OVERRIDE_HEADER.toLowerCase()]);
41
+ const headerVal = firstNonEmpty(headers[MODEL_OVERRIDE_HEADER] ?? headers[MODEL_OVERRIDE_HEADER.toLowerCase()]);
43
42
  if (headerVal)
44
43
  return headerVal;
45
44
  }
46
45
  if (req.query) {
47
- const queryVal = stringUtils.firstNonEmpty(req.query[override.MODEL_OVERRIDE_QUERY]);
46
+ const queryVal = firstNonEmpty(req.query[MODEL_OVERRIDE_QUERY]);
48
47
  if (queryVal)
49
48
  return queryVal;
50
49
  }
51
50
  if (req.body && typeof req.body === "object") {
52
51
  const record = req.body;
53
- for (const field of override.MODEL_OVERRIDE_BODY_FIELDS) {
54
- const bodyVal = stringUtils.firstNonEmpty(record[field]);
52
+ for (const field of MODEL_OVERRIDE_BODY_FIELDS) {
53
+ const bodyVal = firstNonEmpty(record[field]);
55
54
  if (bodyVal)
56
55
  return bodyVal;
57
56
  }
@@ -70,11 +69,11 @@ export function extractModelOverride(req) {
70
69
  */
71
70
  export function resolveServingConfig(config) {
72
71
  return {
73
- ttlMs: config.modelCacheTtlMs ?? modelCatalog.DEFAULT_MODEL_CACHE_TTL_MS,
74
- threshold: config.modelFuzzyThreshold ?? modelCatalog.DEFAULT_FUZZY_THRESHOLD,
72
+ ttlMs: config.modelCacheTtlMs ?? DEFAULT_MODEL_CACHE_TTL_MS,
73
+ threshold: config.modelFuzzyThreshold ?? DEFAULT_FUZZY_THRESHOLD,
75
74
  fuzzy: config.modelFuzzyMatch !== false,
76
75
  allowOverride: config.modelOverride !== false,
77
76
  fallbacks: config.defaultModelFallbacks ?? [],
78
77
  };
79
78
  }
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJcEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLHdCQUF3QixDQUFDO0FBRWxFLG1GQUFtRjtBQUNuRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyx3QkFBd0IsQ0FBQztBQWFsRTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEdBQXlCO0lBQzVELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7SUFDNUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQ3pDLE9BQU8sQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7WUFDckMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUN4RCxDQUFDO1FBQ0YsSUFBSSxTQUFTO1lBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2QsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7UUFDckYsSUFBSSxRQUFRO1lBQUUsT0FBTyxRQUFRLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQStCLENBQUM7UUFDbkQsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUN4RCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pELElBQUksT0FBTztnQkFBRSxPQUFPLE9BQU8sQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUEwQjtJQU83RCxPQUFPO1FBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxlQUFlLElBQUksWUFBWSxDQUFDLDBCQUEwQjtRQUN4RSxTQUFTLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixJQUFJLFlBQVksQ0FBQyx1QkFBdUI7UUFDN0UsS0FBSyxFQUFFLE1BQU0sQ0FBQyxlQUFlLEtBQUssS0FBSztRQUN2QyxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWEsS0FBSyxLQUFLO1FBQzdDLFNBQVMsRUFBRSxNQUFNLENBQUMscUJBQXFCLElBQUksRUFBRTtLQUM5QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFzdHJhLXNwZWNpZmljIGdsdWUgb3ZlciB0aGUgZ2VuZXJpYyBgQGRieC10b29scy9tb2RlbGAgdG9vbGtpdC5cbiAqXG4gKiBUaGUgbGl2ZSBgL3NlcnZpbmctZW5kcG9pbnRzYCBjYXRhbG9ndWUgYWNjZXNzLCBmdXp6eSBuYW1lXG4gKiByZXNvbHV0aW9uLCBhbmQgY2xhc3MvZmFsbGJhY2sgc2VsZWN0aW9uIGFsbCBsaXZlIGluXG4gKiBgQGRieC10b29scy9tb2RlbGA7IHRoaXMgbW9kdWxlIG9ubHkgYWRkcyB3aGF0IGlzIHNwZWNpZmljIHRvIHRoZVxuICogTWFzdHJhIHBsdWdpbjogcHVsbGluZyBhIHBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlIG9mZiBhbiBIVFRQXG4gKiByZXF1ZXN0IChoZWFkZXIgLyBxdWVyeSAvIGJvZHkpIGFuZCBwcm9qZWN0aW5nIHRoZSBwbHVnaW4gY29uZmlnXG4gKiBvbnRvIHRoZSBrbm9icyBgYnVpbGRNb2RlbGAgYW5kIHRoZSBgL21vZGVsc2Agcm91dGUgc2hhcmUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1vZGVsQ2F0YWxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBvdmVycmlkZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcblxuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcblxuLyoqXG4gKiBgUmVxdWVzdENvbnRleHRgIGtleSB1bmRlciB3aGljaCB7QGxpbmsgTWFzdHJhU2VydmVyfSBzdG9yZXMgdGhlXG4gKiBwZXItcmVxdWVzdCBtb2RlbCBvdmVycmlkZSAoaGVhZGVyIC8gcXVlcnkgLyBib2R5KS4gYG1vZGVsLnRzYFxuICogcmVhZHMgaXQgYmVmb3JlIGZhbGxpbmcgYmFjayB0byB0aGUgYWdlbnQgLyBwbHVnaW4gZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVkgPSBcIm1hc3RyYV9fbW9kZWxfb3ZlcnJpZGVcIjtcblxuLyoqIFJlcXVlc3RDb250ZXh0IGtleSBjYXJyeWluZyB0aGUgZW5kcG9pbnQgc2VsZWN0ZWQgZm9yIHRoZSBhY3RpdmUgYWdlbnQgc3RlcC4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZID0gXCJtYXN0cmFfX3Jlc29sdmVkX21vZGVsXCI7XG5cbi8qKlxuICogTWluaW1hbCBFeHByZXNzLWlzaCByZXF1ZXN0IHNoYXBlIHVzZWQgYnkge0BsaW5rIGV4dHJhY3RNb2RlbE92ZXJyaWRlfS5cbiAqIEtlZXBzIHRoaXMgbW9kdWxlIGluZGVwZW5kZW50IG9mIGBleHByZXNzYCBzbyB0aGUgaGVscGVyIGNhbiBiZVxuICogcmV1c2VkIGZyb20gbm9uLUV4cHJlc3MgYWRhcHRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxPdmVycmlkZVJlcXVlc3Qge1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+O1xuICBxdWVyeT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBib2R5PzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBQdWxsIGEgbW9kZWwgb3ZlcnJpZGUgb3V0IG9mIGEgc2luZ2xlIEhUVFAgcmVxdWVzdCwgY2hlY2tpbmdcbiAqIHNvdXJjZXMgaW4gcHJpb3JpdHkgb3JkZXI6XG4gKlxuICogICAxLiBgWC1NYXN0cmEtTW9kZWxgIGhlYWRlclxuICogICAyLiBgP21vZGVsPWAgcXVlcnkgc3RyaW5nIHBhcmFtZXRlclxuICogICAzLiBCb2R5IGZpZWxkIChgbW9kZWxgIG9yIGBtb2RlbElkYCwgaW4gdGhhdCBvcmRlcilcbiAqXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIG5vdGhpbmcgaXMgc2V0LCBzbyBjYWxsZXJzIGNhbiB3cmFwIHdpdGhcbiAqIGBpZiAob3ZlcnJpZGUpIC4uLmAgd2l0aG91dCBqdWdnbGluZyBlbXB0eSBzdHJpbmdzLiBCb2R5IGluc3BlY3Rpb25cbiAqIGlzIGxlbmllbnQgLSBhbnkgcGxhaW4gb2JqZWN0IHdpdGggb25lIG9mIHRoZSBjb25maWd1cmVkIGtleXNcbiAqIGNvdW50cywgbWlycm9yaW5nIGhvdyBBSSBTREsgY2hhdCBjbGllbnRzIHBhc3MgYXJiaXRyYXJ5IG1ldGFkYXRhXG4gKiBhbG9uZ3NpZGUgYG1lc3NhZ2VzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNb2RlbE92ZXJyaWRlKHJlcTogTW9kZWxPdmVycmlkZVJlcXVlc3QpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzO1xuICBpZiAoaGVhZGVycykge1xuICAgIGNvbnN0IGhlYWRlclZhbCA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkoXG4gICAgICBoZWFkZXJzW292ZXJyaWRlLk1PREVMX09WRVJSSURFX0hFQURFUl0gPz9cbiAgICAgICAgaGVhZGVyc1tvdmVycmlkZS5NT0RFTF9PVkVSUklERV9IRUFERVIudG9Mb3dlckNhc2UoKV0sXG4gICAgKTtcbiAgICBpZiAoaGVhZGVyVmFsKSByZXR1cm4gaGVhZGVyVmFsO1xuICB9XG4gIGlmIChyZXEucXVlcnkpIHtcbiAgICBjb25zdCBxdWVyeVZhbCA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnF1ZXJ5W292ZXJyaWRlLk1PREVMX09WRVJSSURFX1FVRVJZXSk7XG4gICAgaWYgKHF1ZXJ5VmFsKSByZXR1cm4gcXVlcnlWYWw7XG4gIH1cbiAgaWYgKHJlcS5ib2R5ICYmIHR5cGVvZiByZXEuYm9keSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlY29yZCA9IHJlcS5ib2R5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3QgZmllbGQgb2Ygb3ZlcnJpZGUuTU9ERUxfT1ZFUlJJREVfQk9EWV9GSUVMRFMpIHtcbiAgICAgIGNvbnN0IGJvZHlWYWwgPSBzdHJpbmdVdGlscy5maXJzdE5vbkVtcHR5KHJlY29yZFtmaWVsZF0pO1xuICAgICAgaWYgKGJvZHlWYWwpIHJldHVybiBib2R5VmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBmdXp6eS1yZXNvbHV0aW9uIGNvbmZpZyBrbm9icyBvZmYgdGhlIHBsdWdpbiBjb25maWcgd2l0aFxuICogYEBkYngtdG9vbHMvbW9kZWxgIGRlZmF1bHRzIGFwcGxpZWQuIEtlcHQgaGVyZSBzbyBgYnVpbGRNb2RlbGAgYW5kXG4gKiB0aGUgYC9tb2RlbHNgIHJvdXRlIGFncmVlIG9uIHdoYXQgXCJlbmFibGVkXCIgbWVhbnMuXG4gKlxuICogYGZhbGxiYWNrc2AgaXMgdGhlIHByaW9yaXR5LW9yZGVyZWQgbGlzdCBgcmVzb2x2ZU1vZGVsYCB3YWxrcyBmaXJzdFxuICogd2hlbiBub3RoaW5nIGV4cGxpY2l0IGlzIHNldDsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgbGlzdCBzbyB0aGVcbiAqIGdlbmVyaWMgcmVzb2x2ZXIgZmFsbHMgdGhyb3VnaCB0byB0aGUgbGl2ZSBjYXRhbG9ndWUgYW5kIGl0cyBvd25cbiAqIGBGQUxMQkFDS19NT0RFTF9JRFNgIGZsb29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNlcnZpbmdDb25maWcoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiB7XG4gIHR0bE1zOiBudW1iZXI7XG4gIHRocmVzaG9sZDogbnVtYmVyO1xuICBmdXp6eTogYm9vbGVhbjtcbiAgYWxsb3dPdmVycmlkZTogYm9vbGVhbjtcbiAgZmFsbGJhY2tzOiByZWFkb25seSBzdHJpbmdbXTtcbn0ge1xuICByZXR1cm4ge1xuICAgIHR0bE1zOiBjb25maWcubW9kZWxDYWNoZVR0bE1zID8/IG1vZGVsQ2F0YWxvZy5ERUZBVUxUX01PREVMX0NBQ0hFX1RUTF9NUyxcbiAgICB0aHJlc2hvbGQ6IGNvbmZpZy5tb2RlbEZ1enp5VGhyZXNob2xkID8/IG1vZGVsQ2F0YWxvZy5ERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCxcbiAgICBmdXp6eTogY29uZmlnLm1vZGVsRnV6enlNYXRjaCAhPT0gZmFsc2UsXG4gICAgYWxsb3dPdmVycmlkZTogY29uZmlnLm1vZGVsT3ZlcnJpZGUgIT09IGZhbHNlLFxuICAgIGZhbGxiYWNrczogY29uZmlnLmRlZmF1bHRNb2RlbEZhbGxiYWNrcyA/PyBbXSxcbiAgfTtcbn1cbiJdfQ==
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLDBCQUEwQixHQUMzQixNQUFNLDBCQUEwQixDQUFDO0FBSWxDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyx3QkFBd0IsQ0FBQztBQUVsRSxtRkFBbUY7QUFDbkYsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsd0JBQXdCLENBQUM7QUFhbEU7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxHQUF5QjtJQUM1RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO0lBQzVCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixNQUFNLFNBQVMsR0FBRyxhQUFhLENBQzdCLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUMvRSxDQUFDO1FBQ0YsSUFBSSxTQUFTO1lBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2QsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksUUFBUTtZQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUErQixDQUFDO1FBQ25ELEtBQUssTUFBTSxLQUFLLElBQUksMEJBQTBCLEVBQUUsQ0FBQztZQUMvQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDN0MsSUFBSSxPQUFPO2dCQUFFLE9BQU8sT0FBTyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE1BQTBCO0lBTzdELE9BQU87UUFDTCxLQUFLLEVBQUUsTUFBTSxDQUFDLGVBQWUsSUFBSSwwQkFBMEI7UUFDM0QsU0FBUyxFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSx1QkFBdUI7UUFDaEUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxlQUFlLEtBQUssS0FBSztRQUN2QyxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWEsS0FBSyxLQUFLO1FBQzdDLFNBQVMsRUFBRSxNQUFNLENBQUMscUJBQXFCLElBQUksRUFBRTtLQUM5QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFzdHJhLXNwZWNpZmljIGdsdWUgb3ZlciB0aGUgZ2VuZXJpYyBgQGRieC10b29scy9tb2RlbGAgdG9vbGtpdC5cbiAqXG4gKiBUaGUgbGl2ZSBgL3NlcnZpbmctZW5kcG9pbnRzYCBjYXRhbG9ndWUgYWNjZXNzLCBmdXp6eSBuYW1lXG4gKiByZXNvbHV0aW9uLCBhbmQgY2xhc3MvZmFsbGJhY2sgc2VsZWN0aW9uIGFsbCBsaXZlIGluXG4gKiBgQGRieC10b29scy9tb2RlbGA7IHRoaXMgbW9kdWxlIG9ubHkgYWRkcyB3aGF0IGlzIHNwZWNpZmljIHRvIHRoZVxuICogTWFzdHJhIHBsdWdpbjogcHVsbGluZyBhIHBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlIG9mZiBhbiBIVFRQXG4gKiByZXF1ZXN0IChoZWFkZXIgLyBxdWVyeSAvIGJvZHkpIGFuZCBwcm9qZWN0aW5nIHRoZSBwbHVnaW4gY29uZmlnXG4gKiBvbnRvIHRoZSBrbm9icyBgYnVpbGRNb2RlbGAgYW5kIHRoZSBgL21vZGVsc2Agcm91dGUgc2hhcmUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBmaXJzdE5vbkVtcHR5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1PREVMX09WRVJSSURFX0hFQURFUixcbiAgTU9ERUxfT1ZFUlJJREVfUVVFUlksXG4gIE1PREVMX09WRVJSSURFX0JPRFlfRklFTERTLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgdW5kZXIgd2hpY2gge0BsaW5rIE1hc3RyYVNlcnZlcn0gc3RvcmVzIHRoZVxuICogcGVyLXJlcXVlc3QgbW9kZWwgb3ZlcnJpZGUgKGhlYWRlciAvIHF1ZXJ5IC8gYm9keSkuIGBtb2RlbC50c2BcbiAqIHJlYWRzIGl0IGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gdGhlIGFnZW50IC8gcGx1Z2luIGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZID0gXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCI7XG5cbi8qKiBSZXF1ZXN0Q29udGV4dCBrZXkgY2FycnlpbmcgdGhlIGVuZHBvaW50IHNlbGVjdGVkIGZvciB0aGUgYWN0aXZlIGFnZW50IHN0ZXAuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1JFU09MVkVEX01PREVMX0tFWSA9IFwibWFzdHJhX19yZXNvbHZlZF9tb2RlbFwiO1xuXG4vKipcbiAqIE1pbmltYWwgRXhwcmVzcy1pc2ggcmVxdWVzdCBzaGFwZSB1c2VkIGJ5IHtAbGluayBleHRyYWN0TW9kZWxPdmVycmlkZX0uXG4gKiBLZWVwcyB0aGlzIG1vZHVsZSBpbmRlcGVuZGVudCBvZiBgZXhwcmVzc2Agc28gdGhlIGhlbHBlciBjYW4gYmVcbiAqIHJldXNlZCBmcm9tIG5vbi1FeHByZXNzIGFkYXB0ZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsT3ZlcnJpZGVSZXF1ZXN0IHtcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPjtcbiAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgYm9keT86IHVua25vd247XG59XG5cbi8qKlxuICogUHVsbCBhIG1vZGVsIG92ZXJyaWRlIG91dCBvZiBhIHNpbmdsZSBIVFRQIHJlcXVlc3QsIGNoZWNraW5nXG4gKiBzb3VyY2VzIGluIHByaW9yaXR5IG9yZGVyOlxuICpcbiAqICAgMS4gYFgtTWFzdHJhLU1vZGVsYCBoZWFkZXJcbiAqICAgMi4gYD9tb2RlbD1gIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJcbiAqICAgMy4gQm9keSBmaWVsZCAoYG1vZGVsYCBvciBgbW9kZWxJZGAsIGluIHRoYXQgb3JkZXIpXG4gKlxuICogUmV0dXJucyBgbnVsbGAgd2hlbiBub3RoaW5nIGlzIHNldCwgc28gY2FsbGVycyBjYW4gd3JhcCB3aXRoXG4gKiBgaWYgKG92ZXJyaWRlKSAuLi5gIHdpdGhvdXQganVnZ2xpbmcgZW1wdHkgc3RyaW5ncy4gQm9keSBpbnNwZWN0aW9uXG4gKiBpcyBsZW5pZW50IC0gYW55IHBsYWluIG9iamVjdCB3aXRoIG9uZSBvZiB0aGUgY29uZmlndXJlZCBrZXlzXG4gKiBjb3VudHMsIG1pcnJvcmluZyBob3cgQUkgU0RLIGNoYXQgY2xpZW50cyBwYXNzIGFyYml0cmFyeSBtZXRhZGF0YVxuICogYWxvbmdzaWRlIGBtZXNzYWdlc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TW9kZWxPdmVycmlkZShyZXE6IE1vZGVsT3ZlcnJpZGVSZXF1ZXN0KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcbiAgaWYgKGhlYWRlcnMpIHtcbiAgICBjb25zdCBoZWFkZXJWYWwgPSBmaXJzdE5vbkVtcHR5KFxuICAgICAgaGVhZGVyc1tNT0RFTF9PVkVSUklERV9IRUFERVJdID8/IGhlYWRlcnNbTU9ERUxfT1ZFUlJJREVfSEVBREVSLnRvTG93ZXJDYXNlKCldLFxuICAgICk7XG4gICAgaWYgKGhlYWRlclZhbCkgcmV0dXJuIGhlYWRlclZhbDtcbiAgfVxuICBpZiAocmVxLnF1ZXJ5KSB7XG4gICAgY29uc3QgcXVlcnlWYWwgPSBmaXJzdE5vbkVtcHR5KHJlcS5xdWVyeVtNT0RFTF9PVkVSUklERV9RVUVSWV0pO1xuICAgIGlmIChxdWVyeVZhbCkgcmV0dXJuIHF1ZXJ5VmFsO1xuICB9XG4gIGlmIChyZXEuYm9keSAmJiB0eXBlb2YgcmVxLmJvZHkgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCByZWNvcmQgPSByZXEuYm9keSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIE1PREVMX09WRVJSSURFX0JPRFlfRklFTERTKSB7XG4gICAgICBjb25zdCBib2R5VmFsID0gZmlyc3ROb25FbXB0eShyZWNvcmRbZmllbGRdKTtcbiAgICAgIGlmIChib2R5VmFsKSByZXR1cm4gYm9keVZhbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgZnV6enktcmVzb2x1dGlvbiBjb25maWcga25vYnMgb2ZmIHRoZSBwbHVnaW4gY29uZmlnIHdpdGhcbiAqIGBAZGJ4LXRvb2xzL21vZGVsYCBkZWZhdWx0cyBhcHBsaWVkLiBLZXB0IGhlcmUgc28gYGJ1aWxkTW9kZWxgIGFuZFxuICogdGhlIGAvbW9kZWxzYCByb3V0ZSBhZ3JlZSBvbiB3aGF0IFwiZW5hYmxlZFwiIG1lYW5zLlxuICpcbiAqIGBmYWxsYmFja3NgIGlzIHRoZSBwcmlvcml0eS1vcmRlcmVkIGxpc3QgYHJlc29sdmVNb2RlbGAgd2Fsa3MgZmlyc3RcbiAqIHdoZW4gbm90aGluZyBleHBsaWNpdCBpcyBzZXQ7IGRlZmF1bHRzIHRvIGFuIGVtcHR5IGxpc3Qgc28gdGhlXG4gKiBnZW5lcmljIHJlc29sdmVyIGZhbGxzIHRocm91Z2ggdG8gdGhlIGxpdmUgY2F0YWxvZ3VlIGFuZCBpdHMgb3duXG4gKiBgRkFMTEJBQ0tfTU9ERUxfSURTYCBmbG9vci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTZXJ2aW5nQ29uZmlnKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKToge1xuICB0dGxNczogbnVtYmVyO1xuICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgZnV6enk6IGJvb2xlYW47XG4gIGFsbG93T3ZlcnJpZGU6IGJvb2xlYW47XG4gIGZhbGxiYWNrczogcmVhZG9ubHkgc3RyaW5nW107XG59IHtcbiAgcmV0dXJuIHtcbiAgICB0dGxNczogY29uZmlnLm1vZGVsQ2FjaGVUdGxNcyA/PyBERUZBVUxUX01PREVMX0NBQ0hFX1RUTF9NUyxcbiAgICB0aHJlc2hvbGQ6IGNvbmZpZy5tb2RlbEZ1enp5VGhyZXNob2xkID8/IERFRkFVTFRfRlVaWllfVEhSRVNIT0xELFxuICAgIGZ1enp5OiBjb25maWcubW9kZWxGdXp6eU1hdGNoICE9PSBmYWxzZSxcbiAgICBhbGxvd092ZXJyaWRlOiBjb25maWcubW9kZWxPdmVycmlkZSAhPT0gZmFsc2UsXG4gICAgZmFsbGJhY2tzOiBjb25maWcuZGVmYXVsdE1vZGVsRmFsbGJhY2tzID8/IFtdLFxuICB9O1xufVxuIl19
@@ -18,9 +18,9 @@
18
18
  *
19
19
  * @module
20
20
  */
21
- import { databricks } from "@dbx-tools/appkit";
22
- import { object } from "@dbx-tools/shared-core";
23
- import { wire } from "@dbx-tools/shared-mastra";
21
+ import { toContext } from "@dbx-tools/appkit";
22
+ import { toNumber } from "@dbx-tools/shared-core";
23
+ import { GenieVisualizationDataSchema, } from "@dbx-tools/shared-mastra";
24
24
  /**
25
25
  * Hard server-side cap on rows returned by the
26
26
  * `/embed/data/:id` route. Sized to keep responses small
@@ -42,10 +42,10 @@ export const STATEMENT_ROW_CAP = 500;
42
42
  function coerceCell(cell) {
43
43
  if (cell === null)
44
44
  return null;
45
- return object.toNumber(cell, { separators: false, percent: false }) ?? cell;
45
+ return toNumber(cell, { separators: false, percent: false }) ?? cell;
46
46
  }
47
47
  async function fetchStatementResponse(client, statementId, signal) {
48
- const context = signal ? databricks.toContext(signal) : undefined;
48
+ const context = signal ? toContext(signal) : undefined;
49
49
  return client.statementExecution.getStatement({ statement_id: statementId }, context);
50
50
  }
51
51
  function normalizedStatementData(response, limit) {
@@ -67,7 +67,7 @@ function normalizedStatementData(response, limit) {
67
67
  }
68
68
  function visualizationData(response, limit) {
69
69
  const dataArray = (response.result?.data_array ?? []);
70
- return wire.GenieVisualizationDataSchema.parse({
70
+ return GenieVisualizationDataSchema.parse({
71
71
  manifest: {
72
72
  schema: {
73
73
  columns: (response.manifest?.schema?.columns ?? []).map((column) => ({
@@ -113,4 +113,4 @@ export async function fetchStatementEmbedData(client, statementId, options) {
113
113
  visualization: visualizationData(response, options?.limit),
114
114
  };
115
115
  }
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0YXRlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLElBQUksRUFBc0QsTUFBTSwwQkFBMEIsQ0FBQztBQUVwRzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7QUFFckM7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxVQUFVLENBQUMsSUFBbUI7SUFDckMsSUFBSSxJQUFJLEtBQUssSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQy9CLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUM5RSxDQUFDO0FBSUQsS0FBSyxVQUFVLHNCQUFzQixDQUNuQyxNQUF1QixFQUN2QixXQUFtQixFQUNuQixNQUFvQjtJQUVwQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNsRSxPQUFPLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsUUFBMkIsRUFBRSxLQUFjO0lBQzFFLE1BQU0sT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FB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LENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGFicmlja3MgU3RhdGVtZW50IEV4ZWN1dGlvbiBoZWxwZXJzIGZvciB0aGUgTWFzdHJhIHBsdWdpbi5cbiAqXG4gKiBXcmFwcyBgY2xpZW50LnN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgIHdpdGggdGhlIHNoYXBlIGFuZFxuICogc2l6ZSBoYW5kbGluZyB0aGUgcGx1Z2luJ3MgdG9vbHMgYW5kIHRoZSBgL2VtYmVkL2RhdGEvOmlkYCByb3V0ZVxuICogYm90aCBuZWVkOiBhIGxvdy1sZXZlbCBmZXRjaCB0aGF0IHJldHVybnMgYSByYXdcbiAqIGB7Y29sdW1ucywgcm93cywgcm93Q291bnR9YCBzaGFwZSBhbmQgY29lcmNlcyBudW1lcmljIHN0cmluZ3MgdG9cbiAqIG51bWJlcnMgc28gZG93bnN0cmVhbSBjaGFydHMgYW5kIGFnZ3JlZ2F0aW9ucyBkb24ndCBoYXZlIHRvLCBwbHVzIGFcbiAqIGhhcmQgcm93IGNhcCBjYWxsZXJzIGNsYW1wIGBsaW1pdGAgdG8gc28gYSBydW5hd2F5IHJlc3VsdCBzZXQgY2FuJ3RcbiAqIGhvc2UgYSByZXNwb25zZS4gVXBzdHJlYW0gNDA0cyBhcmUgZGV0ZWN0ZWQgdmlhXG4gKiBgZXJyb3IuZXJyb3JDb250ZXh0KGVycikubm90Rm91bmRgIGF0IHRoZSBjYWxsIHNpdGVzLlxuICpcbiAqIE5vdCBHZW5pZS1zcGVjaWZpYzogYSBEYXRhYnJpY2tzIGBzdGF0ZW1lbnRfaWRgIGlzIHdvcmtzcGFjZVxuICogc2NvcGVkIGFuZCBsaXZlcyBpbiB0aGUgU3RhdGVtZW50IEV4ZWN1dGlvbiBBUEkgcmVnYXJkbGVzcyBvZlxuICogd2hpY2ggcHJvZHVjZXIgKEdlbmllLCBhIHRvb2wsIGEgbm90ZWJvb2ssIGV0Yy4pIHN1Ym1pdHRlZCB0aGVcbiAqIHF1ZXJ5LiBDby1sb2NhdGVkIGhlcmUgc28gY29uc3VtZXJzIGNhbiBmZXRjaCAvIGNhcCAvIGhhbmRsZVxuICogNDA0cyB3aXRob3V0IHJlYWNoaW5nIGludG8gdGhlIEdlbmllIHRvb2wgbW9kdWxlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGRhdGFicmlja3MgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyB3aXJlLCB0eXBlIEdlbmllRGF0YXNldERhdGEsIHR5cGUgR2VuaWVWaXN1YWxpemF0aW9uRGF0YSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcblxuLyoqXG4gKiBIYXJkIHNlcnZlci1zaWRlIGNhcCBvbiByb3dzIHJldHVybmVkIGJ5IHRoZVxuICogYC9lbWJlZC9kYXRhLzppZGAgcm91dGUuIFNpemVkIHRvIGtlZXAgcmVzcG9uc2VzIHNtYWxsXG4gKiBlbm91Z2ggZm9yIGlubGluZSB0YWJsZXMgdG8gcmVuZGVyIHNuYXBwaWx5OyB0aGUgcm91dGUgc3VyZmFjZXNcbiAqIGEgYHRydW5jYXRlZGAgZmxhZyB3aGVuZXZlciB0aGUgdXBzdHJlYW0gYHJvd0NvdW50YCBleGNlZWRzXG4gKiB0aGlzIHNvIGVuZCB1c2VycyBrbm93IHRoZXkncmUgc2VlaW5nIGEgc2FtcGxlLlxuICovXG5leHBvcnQgY29uc3QgU1RBVEVNRU5UX1JPV19DQVAgPSA1MDA7XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgbnVtZXJpYyBjb2VyY2lvbiBmb3IgdGhlIFN0YXRlbWVudCBFeGVjdXRpb24gQVBJJ3NcbiAqIGFsbC1zdHJpbmdzIGNlbGxzLiBMZWF2ZXMgbm9uLW51bWVyaWMgc3RyaW5ncyAoYW5kIGV4cGxpY2l0XG4gKiBgbnVsbGBzKSBpbnRhY3QuXG4gKlxuICogQm90aCBvZiB7QGxpbmsgb2JqZWN0LnRvTnVtYmVyfSdzIHN0cmluZyBsZW5pZW5jaWVzIGFyZSBkaXNhYmxlZCwgYmVjYXVzZSBhXG4gKiBjZWxsJ3Mgb3RoZXIgY2hhcmFjdGVycyBiZWxvbmcgdG8gdGhlIFZBTFVFOiBhIGBcIjEsMDAwXCJgIGluIGEgdGV4dCBjb2x1bW4gaXNcbiAqIHRoZSBzdHJpbmcgdGhlIHF1ZXJ5IHJldHVybmVkLCBhbmQgYSBgXCIyNSVcImAgbXVzdCBub3Qgc2lsZW50bHkgYXJyaXZlIGFzXG4gKiBgMC4yNWAgaW4gYSB0YWJsZSB0aGUgdXNlciBpcyByZWFkaW5nLlxuICovXG5mdW5jdGlvbiBjb2VyY2VDZWxsKGNlbGw6IHN0cmluZyB8IG51bGwpOiB1bmtub3duIHtcbiAgaWYgKGNlbGwgPT09IG51bGwpIHJldHVybiBudWxsO1xuICByZXR1cm4gb2JqZWN0LnRvTnVtYmVyKGNlbGwsIHsgc2VwYXJhdG9yczogZmFsc2UsIHBlcmNlbnQ6IGZhbHNlIH0pID8/IGNlbGw7XG59XG5cbnR5cGUgU3RhdGVtZW50UmVzcG9uc2UgPSBBd2FpdGVkPFJldHVyblR5cGU8V29ya3NwYWNlQ2xpZW50W1wic3RhdGVtZW50RXhlY3V0aW9uXCJdW1wiZ2V0U3RhdGVtZW50XCJdPj47XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoU3RhdGVtZW50UmVzcG9uc2UoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICBzdGF0ZW1lbnRJZDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8U3RhdGVtZW50UmVzcG9uc2U+IHtcbiAgY29uc3QgY29udGV4dCA9IHNpZ25hbCA/IGRhdGFicmlja3MudG9Db250ZXh0KHNpZ25hbCkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBjbGllbnQuc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudCh7IHN0YXRlbWVudF9pZDogc3RhdGVtZW50SWQgfSwgY29udGV4dCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRTdGF0ZW1lbnREYXRhKHJlc3BvbnNlOiBTdGF0ZW1lbnRSZXNwb25zZSwgbGltaXQ/OiBudW1iZXIpOiBHZW5pZURhdGFzZXREYXRhIHtcbiAgY29uc3QgY29sdW1ucyA9IChyZXNwb25zZS5tYW5pZmVzdD8uc2NoZW1hPy5jb2x1bW5zID8/IFtdKS5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPz8gXCJcIik7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChyZXNwb25zZS5yZXN1bHQ/LmRhdGFfYXJyYXkgPz8gW10pIGFzIEFycmF5PEFycmF5PHN0cmluZyB8IG51bGw+PjtcbiAgY29uc3Qgc2xpY2VkID0gbGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCA+PSAwID8gZGF0YUFycmF5LnNsaWNlKDAsIGxpbWl0KSA6IGRhdGFBcnJheTtcbiAgY29uc3Qgcm93cyA9IHNsaWNlZC5tYXAoKHJvdykgPT4ge1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgIHJlY29yZFtjb2x1bW5dID0gY29lcmNlQ2VsbChyb3dbaW5kZXhdID8/IG51bGwpO1xuICAgIH0pO1xuICAgIHJldHVybiByZWNvcmQ7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGNvbHVtbnMsXG4gICAgcm93cyxcbiAgICByb3dDb3VudDogcmVzcG9uc2UubWFuaWZlc3Q/LnRvdGFsX3Jvd19jb3VudCA/PyBkYXRhQXJyYXkubGVuZ3RoLFxuICB9O1xufVxuXG5mdW5jdGlvbiB2aXN1YWxpemF0aW9uRGF0YShyZXNwb25zZTogU3RhdGVtZW50UmVzcG9uc2UsIGxpbWl0PzogbnVtYmVyKTogR2VuaWVWaXN1YWxpemF0aW9uRGF0YSB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChyZXNwb25zZS5yZXN1bHQ/LmRhdGFfYXJyYXkgPz8gW10pIGFzIEFycmF5PEFycmF5PHN0cmluZyB8IG51bGw+PjtcbiAgcmV0dXJuIHdpcmUuR2VuaWVWaXN1YWxpemF0aW9uRGF0YVNjaGVtYS5wYXJzZSh7XG4gICAgbWFuaWZlc3Q6IHtcbiAgICAgIHNjaGVtYToge1xuICAgICAgICBjb2x1bW5zOiAocmVzcG9uc2UubWFuaWZlc3Q/LnNjaGVtYT8uY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4pID0+ICh7XG4gICAgICAgICAgbmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgdHlwZV9uYW1lOiBjb2x1bW4udHlwZV9uYW1lLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVzdWx0OiB7XG4gICAgICBkYXRhX2FycmF5OiBsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ID49IDAgPyBkYXRhQXJyYXkuc2xpY2UoMCwgbGltaXQpIDogZGF0YUFycmF5LFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKiogTm9ybWFsaXplZCBhbmQgQXBwS2l0LW5hdGl2ZSBwcm9qZWN0aW9ucyBvZiBvbmUgc3RhdGVtZW50IHJlc3BvbnNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRFbWJlZERhdGEge1xuICAvKiogUm93IHJlY29yZHMgdXNlZCBieSB0b29scywgc29ydGFibGUgdGFibGVzLCBhbmQgY2hhcnQgcGxhbm5lcnMuICovXG4gIGRhdGE6IEdlbmllRGF0YXNldERhdGE7XG4gIC8qKiBNYW5pZmVzdCBhbmQgcm93IGFycmF5cyBjb25zdW1lZCBieSBBcHBLaXQgVUkncyBHZW5pZSB2aXN1YWxpemF0aW9uLiAqL1xuICB2aXN1YWxpemF0aW9uOiBHZW5pZVZpc3VhbGl6YXRpb25EYXRhO1xufVxuXG4vKipcbiAqIEZldGNoIGEgc2luZ2xlIHN0YXRlbWVudCdzIHJvd3MgdmlhIHRoZSBTdGF0ZW1lbnQgRXhlY3V0aW9uIEFQSVxuICogYW5kIHJlc2hhcGUgaW50byB0aGUgc2hhcmVkIHtAbGluayBHZW5pZURhdGFzZXREYXRhfSBzaGFwZVxuICogKGNvbHVtbiBhcnJheSArIHJvdyByZWNvcmRzKS5cbiAqXG4gKiBPcHRpb25hbCBgbGltaXRgIHNsaWNlcyB0aGUgcmV0dXJuZWQgYHJvd3NgIGNsaWVudC1zaWRlIHNvIHRoZVxuICogYWdlbnQgY2FuIHNjYW4gYSBzbWFsbCBzYW1wbGUgd2l0aG91dCBwYWdpbmcgdGhlIGZ1bGwgcmVzdWx0XG4gKiBzZXQgaW50byBjb250ZXh0LiBgcm93Q291bnRgIGFsd2F5cyByZWZsZWN0cyB0aGUgdXBzdHJlYW0gdG90YWxcbiAqIHNvIGNhbGxlcnMga25vdyB3aGVuIHRoZSBzbGljZSB0cnVuY2F0ZWQuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSBldmVyeSBjb25zdW1lciBpbiB0aGUgcGx1Z2luICh0aGVcbiAqIGBnZXRfc3RhdGVtZW50YCB0b29sLCB0aGUgYHByZXBhcmVfY2hhcnRgIGRhdGFzZXQgcmVzb2x2ZXIsIGFuZFxuICogdGhlIGAvZW1iZWQvZGF0YS86aWRgIHJvdXRlKSBuZWVkcyB0aGUgZXhhY3Qgc2FtZVxuICogZmV0Y2ggKyBjb2VyY2lvbiBwaXBlbGluZSBzbyBMTE0tc2lkZSBgZ2V0X3N0YXRlbWVudGAgb3V0cHV0XG4gKiBhbmQgVUktc2lkZSBgW2RhdGE6PGlkPl1gIHJlbmRlcmluZyBzdGF5IHNoYXBlLWlkZW50aWNhbCBmb3JcbiAqIHRoZSBzYW1lIGBzdGF0ZW1lbnRfaWRgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdGF0ZW1lbnREYXRhKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgc3RhdGVtZW50SWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgbGltaXQ/OiBudW1iZXI7IHNpZ25hbD86IEFib3J0U2lnbmFsIH0sXG4pOiBQcm9taXNlPEdlbmllRGF0YXNldERhdGE+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFN0YXRlbWVudFJlc3BvbnNlKGNsaWVudCwgc3RhdGVtZW50SWQsIG9wdGlvbnM/LnNpZ25hbCk7XG4gIHJldHVybiBub3JtYWxpemVkU3RhdGVtZW50RGF0YShyZXNwb25zZSwgb3B0aW9ucz8ubGltaXQpO1xufVxuXG4vKipcbiAqIEZldGNoIG9uZSBzdGF0ZW1lbnQgb25jZSBhbmQgcHJvamVjdCBpdCBmb3IgYm90aCB0aGUgZXhpc3RpbmcgZGF0YSB0YWJsZSBhbmRcbiAqIEFwcEtpdCBVSSdzIG5hdGl2ZSBHZW5pZSB2aXN1YWxpemF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdGF0ZW1lbnRFbWJlZERhdGEoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICBzdGF0ZW1lbnRJZDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBsaW1pdD86IG51bWJlcjsgc2lnbmFsPzogQWJvcnRTaWduYWwgfSxcbik6IFByb21pc2U8U3RhdGVtZW50RW1iZWREYXRhPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hTdGF0ZW1lbnRSZXNwb25zZShjbGllbnQsIHN0YXRlbWVudElkLCBvcHRpb25zPy5zaWduYWwpO1xuICByZXR1cm4ge1xuICAgIGRhdGE6IG5vcm1hbGl6ZWRTdGF0ZW1lbnREYXRhKHJlc3BvbnNlLCBvcHRpb25zPy5saW1pdCksXG4gICAgdmlzdWFsaXphdGlvbjogdmlzdWFsaXphdGlvbkRhdGEocmVzcG9uc2UsIG9wdGlvbnM/LmxpbWl0KSxcbiAgfTtcbn1cbiJdfQ==
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0YXRlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUdILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUdMLDRCQUE0QixHQUM3QixNQUFNLDBCQUEwQixDQUFDO0FBRWxDOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQUVyQzs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFtQjtJQUNyQyxJQUFJLElBQUksS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDL0IsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDdkUsQ0FBQztBQUlELEtBQUssVUFBVSxzQkFBc0IsQ0FDbkMsTUFBdUIsRUFDdkIsV0FBbUIsRUFDbkIsTUFBb0I7SUFFcEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN2RCxPQUFPLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsUUFBMkIsRUFBRSxLQUFjO0lBQzFFLE1BQU0sT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RixNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBZ0MsQ0FBQztJQUNyRixNQUFNLE1BQU0sR0FBRyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDekYsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQzlCLE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUM7UUFDM0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTztRQUNMLE9BQU87UUFDUCxJQUFJO1FBQ0osUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsZUFBZSxJQUFJLFNBQVMsQ0FBQyxNQUFNO0tBQ2pFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxRQUEyQixFQUFFLEtBQWM7SUFDcEUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQWdDLENBQUM7SUFDckYsT0FBTyw0QkFBNEIsQ0FBQyxLQUFLLENBQUM7UUFDeEMsUUFBUSxFQUFFO1lBQ1IsTUFBTSxFQUFFO2dCQUNOLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ25FLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDakIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2lCQUM1QixDQUFDLENBQUM7YUFDSjtTQUNGO1FBQ0QsTUFBTSxFQUFFO1lBQ04sVUFBVSxFQUFFLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDdEY7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBVUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxNQUF1QixFQUN2QixXQUFtQixFQUNuQixPQUFrRDtJQUVsRCxNQUFNLFFBQVEsR0FBRyxNQUFNLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BGLE9BQU8sdUJBQXVCLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsTUFBdUIsRUFDdkIsV0FBbUIsRUFDbkIsT0FBa0Q7SUFFbEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRixPQUFPO1FBQ0wsSUFBSSxFQUFFLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDO1FBQ3ZELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQztLQUMzRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyBTdGF0ZW1lbnQgRXhlY3V0aW9uIGhlbHBlcnMgZm9yIHRoZSBNYXN0cmEgcGx1Z2luLlxuICpcbiAqIFdyYXBzIGBjbGllbnQuc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudGAgd2l0aCB0aGUgc2hhcGUgYW5kXG4gKiBzaXplIGhhbmRsaW5nIHRoZSBwbHVnaW4ncyB0b29scyBhbmQgdGhlIGAvZW1iZWQvZGF0YS86aWRgIHJvdXRlXG4gKiBib3RoIG5lZWQ6IGEgbG93LWxldmVsIGZldGNoIHRoYXQgcmV0dXJucyBhIHJhd1xuICogYHtjb2x1bW5zLCByb3dzLCByb3dDb3VudH1gIHNoYXBlIGFuZCBjb2VyY2VzIG51bWVyaWMgc3RyaW5ncyB0b1xuICogbnVtYmVycyBzbyBkb3duc3RyZWFtIGNoYXJ0cyBhbmQgYWdncmVnYXRpb25zIGRvbid0IGhhdmUgdG8sIHBsdXMgYVxuICogaGFyZCByb3cgY2FwIGNhbGxlcnMgY2xhbXAgYGxpbWl0YCB0byBzbyBhIHJ1bmF3YXkgcmVzdWx0IHNldCBjYW4ndFxuICogaG9zZSBhIHJlc3BvbnNlLiBVcHN0cmVhbSA0MDRzIGFyZSBkZXRlY3RlZCB2aWFcbiAqIGBlcnJvci5lcnJvckNvbnRleHQoZXJyKS5ub3RGb3VuZGAgYXQgdGhlIGNhbGwgc2l0ZXMuXG4gKlxuICogTm90IEdlbmllLXNwZWNpZmljOiBhIERhdGFicmlja3MgYHN0YXRlbWVudF9pZGAgaXMgd29ya3NwYWNlXG4gKiBzY29wZWQgYW5kIGxpdmVzIGluIHRoZSBTdGF0ZW1lbnQgRXhlY3V0aW9uIEFQSSByZWdhcmRsZXNzIG9mXG4gKiB3aGljaCBwcm9kdWNlciAoR2VuaWUsIGEgdG9vbCwgYSBub3RlYm9vaywgZXRjLikgc3VibWl0dGVkIHRoZVxuICogcXVlcnkuIENvLWxvY2F0ZWQgaGVyZSBzbyBjb25zdW1lcnMgY2FuIGZldGNoIC8gY2FwIC8gaGFuZGxlXG4gKiA0MDRzIHdpdGhvdXQgcmVhY2hpbmcgaW50byB0aGUgR2VuaWUgdG9vbCBtb2R1bGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgdG9Db250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyB0b051bWJlciB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICB0eXBlIEdlbmllRGF0YXNldERhdGEsXG4gIHR5cGUgR2VuaWVWaXN1YWxpemF0aW9uRGF0YSxcbiAgR2VuaWVWaXN1YWxpemF0aW9uRGF0YVNjaGVtYSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuXG4vKipcbiAqIEhhcmQgc2VydmVyLXNpZGUgY2FwIG9uIHJvd3MgcmV0dXJuZWQgYnkgdGhlXG4gKiBgL2VtYmVkL2RhdGEvOmlkYCByb3V0ZS4gU2l6ZWQgdG8ga2VlcCByZXNwb25zZXMgc21hbGxcbiAqIGVub3VnaCBmb3IgaW5saW5lIHRhYmxlcyB0byByZW5kZXIgc25hcHBpbHk7IHRoZSByb3V0ZSBzdXJmYWNlc1xuICogYSBgdHJ1bmNhdGVkYCBmbGFnIHdoZW5ldmVyIHRoZSB1cHN0cmVhbSBgcm93Q291bnRgIGV4Y2VlZHNcbiAqIHRoaXMgc28gZW5kIHVzZXJzIGtub3cgdGhleSdyZSBzZWVpbmcgYSBzYW1wbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBTVEFURU1FTlRfUk9XX0NBUCA9IDUwMDtcblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBudW1lcmljIGNvZXJjaW9uIGZvciB0aGUgU3RhdGVtZW50IEV4ZWN1dGlvbiBBUEknc1xuICogYWxsLXN0cmluZ3MgY2VsbHMuIExlYXZlcyBub24tbnVtZXJpYyBzdHJpbmdzIChhbmQgZXhwbGljaXRcbiAqIGBudWxsYHMpIGludGFjdC5cbiAqXG4gKiBCb3RoIG9mIHtAbGluayBvYmplY3QudG9OdW1iZXJ9J3Mgc3RyaW5nIGxlbmllbmNpZXMgYXJlIGRpc2FibGVkLCBiZWNhdXNlIGFcbiAqIGNlbGwncyBvdGhlciBjaGFyYWN0ZXJzIGJlbG9uZyB0byB0aGUgVkFMVUU6IGEgYFwiMSwwMDBcImAgaW4gYSB0ZXh0IGNvbHVtbiBpc1xuICogdGhlIHN0cmluZyB0aGUgcXVlcnkgcmV0dXJuZWQsIGFuZCBhIGBcIjI1JVwiYCBtdXN0IG5vdCBzaWxlbnRseSBhcnJpdmUgYXNcbiAqIGAwLjI1YCBpbiBhIHRhYmxlIHRoZSB1c2VyIGlzIHJlYWRpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZUNlbGwoY2VsbDogc3RyaW5nIHwgbnVsbCk6IHVua25vd24ge1xuICBpZiAoY2VsbCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB0b051bWJlcihjZWxsLCB7IHNlcGFyYXRvcnM6IGZhbHNlLCBwZXJjZW50OiBmYWxzZSB9KSA/PyBjZWxsO1xufVxuXG50eXBlIFN0YXRlbWVudFJlc3BvbnNlID0gQXdhaXRlZDxSZXR1cm5UeXBlPFdvcmtzcGFjZUNsaWVudFtcInN0YXRlbWVudEV4ZWN1dGlvblwiXVtcImdldFN0YXRlbWVudFwiXT4+O1xuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFN0YXRlbWVudFJlc3BvbnNlKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgc3RhdGVtZW50SWQ6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFN0YXRlbWVudFJlc3BvbnNlPiB7XG4gIGNvbnN0IGNvbnRleHQgPSBzaWduYWwgPyB0b0NvbnRleHQoc2lnbmFsKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGNsaWVudC5zdGF0ZW1lbnRFeGVjdXRpb24uZ2V0U3RhdGVtZW50KHsgc3RhdGVtZW50X2lkOiBzdGF0ZW1lbnRJZCB9LCBjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplZFN0YXRlbWVudERhdGEocmVzcG9uc2U6IFN0YXRlbWVudFJlc3BvbnNlLCBsaW1pdD86IG51bWJlcik6IEdlbmllRGF0YXNldERhdGEge1xuICBjb25zdCBjb2x1bW5zID0gKHJlc3BvbnNlLm1hbmlmZXN0Py5zY2hlbWE/LmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA/PyBcIlwiKTtcbiAgY29uc3QgZGF0YUFycmF5ID0gKHJlc3BvbnNlLnJlc3VsdD8uZGF0YV9hcnJheSA/PyBbXSkgYXMgQXJyYXk8QXJyYXk8c3RyaW5nIHwgbnVsbD4+O1xuICBjb25zdCBzbGljZWQgPSBsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ID49IDAgPyBkYXRhQXJyYXkuc2xpY2UoMCwgbGltaXQpIDogZGF0YUFycmF5O1xuICBjb25zdCByb3dzID0gc2xpY2VkLm1hcCgocm93KSA9PiB7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgcmVjb3JkW2NvbHVtbl0gPSBjb2VyY2VDZWxsKHJvd1tpbmRleF0gPz8gbnVsbCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY29sdW1ucyxcbiAgICByb3dzLFxuICAgIHJvd0NvdW50OiByZXNwb25zZS5tYW5pZmVzdD8udG90YWxfcm93X2NvdW50ID8/IGRhdGFBcnJheS5sZW5ndGgsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHZpc3VhbGl6YXRpb25EYXRhKHJlc3BvbnNlOiBTdGF0ZW1lbnRSZXNwb25zZSwgbGltaXQ/OiBudW1iZXIpOiBHZW5pZVZpc3VhbGl6YXRpb25EYXRhIHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKHJlc3BvbnNlLnJlc3VsdD8uZGF0YV9hcnJheSA/PyBbXSkgYXMgQXJyYXk8QXJyYXk8c3RyaW5nIHwgbnVsbD4+O1xuICByZXR1cm4gR2VuaWVWaXN1YWxpemF0aW9uRGF0YVNjaGVtYS5wYXJzZSh7XG4gICAgbWFuaWZlc3Q6IHtcbiAgICAgIHNjaGVtYToge1xuICAgICAgICBjb2x1bW5zOiAocmVzcG9uc2UubWFuaWZlc3Q/LnNjaGVtYT8uY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4pID0+ICh7XG4gICAgICAgICAgbmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgdHlwZV9uYW1lOiBjb2x1bW4udHlwZV9uYW1lLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVzdWx0OiB7XG4gICAgICBkYXRhX2FycmF5OiBsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ID49IDAgPyBkYXRhQXJyYXkuc2xpY2UoMCwgbGltaXQpIDogZGF0YUFycmF5LFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKiogTm9ybWFsaXplZCBhbmQgQXBwS2l0LW5hdGl2ZSBwcm9qZWN0aW9ucyBvZiBvbmUgc3RhdGVtZW50IHJlc3BvbnNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRFbWJlZERhdGEge1xuICAvKiogUm93IHJlY29yZHMgdXNlZCBieSB0b29scywgc29ydGFibGUgdGFibGVzLCBhbmQgY2hhcnQgcGxhbm5lcnMuICovXG4gIGRhdGE6IEdlbmllRGF0YXNldERhdGE7XG4gIC8qKiBNYW5pZmVzdCBhbmQgcm93IGFycmF5cyBjb25zdW1lZCBieSBBcHBLaXQgVUkncyBHZW5pZSB2aXN1YWxpemF0aW9uLiAqL1xuICB2aXN1YWxpemF0aW9uOiBHZW5pZVZpc3VhbGl6YXRpb25EYXRhO1xufVxuXG4vKipcbiAqIEZldGNoIGEgc2luZ2xlIHN0YXRlbWVudCdzIHJvd3MgdmlhIHRoZSBTdGF0ZW1lbnQgRXhlY3V0aW9uIEFQSVxuICogYW5kIHJlc2hhcGUgaW50byB0aGUgc2hhcmVkIHtAbGluayBHZW5pZURhdGFzZXREYXRhfSBzaGFwZVxuICogKGNvbHVtbiBhcnJheSArIHJvdyByZWNvcmRzKS5cbiAqXG4gKiBPcHRpb25hbCBgbGltaXRgIHNsaWNlcyB0aGUgcmV0dXJuZWQgYHJvd3NgIGNsaWVudC1zaWRlIHNvIHRoZVxuICogYWdlbnQgY2FuIHNjYW4gYSBzbWFsbCBzYW1wbGUgd2l0aG91dCBwYWdpbmcgdGhlIGZ1bGwgcmVzdWx0XG4gKiBzZXQgaW50byBjb250ZXh0LiBgcm93Q291bnRgIGFsd2F5cyByZWZsZWN0cyB0aGUgdXBzdHJlYW0gdG90YWxcbiAqIHNvIGNhbGxlcnMga25vdyB3aGVuIHRoZSBzbGljZSB0cnVuY2F0ZWQuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSBldmVyeSBjb25zdW1lciBpbiB0aGUgcGx1Z2luICh0aGVcbiAqIGBnZXRfc3RhdGVtZW50YCB0b29sLCB0aGUgYHByZXBhcmVfY2hhcnRgIGRhdGFzZXQgcmVzb2x2ZXIsIGFuZFxuICogdGhlIGAvZW1iZWQvZGF0YS86aWRgIHJvdXRlKSBuZWVkcyB0aGUgZXhhY3Qgc2FtZVxuICogZmV0Y2ggKyBjb2VyY2lvbiBwaXBlbGluZSBzbyBMTE0tc2lkZSBgZ2V0X3N0YXRlbWVudGAgb3V0cHV0XG4gKiBhbmQgVUktc2lkZSBgW2RhdGE6PGlkPl1gIHJlbmRlcmluZyBzdGF5IHNoYXBlLWlkZW50aWNhbCBmb3JcbiAqIHRoZSBzYW1lIGBzdGF0ZW1lbnRfaWRgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdGF0ZW1lbnREYXRhKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgc3RhdGVtZW50SWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgbGltaXQ/OiBudW1iZXI7IHNpZ25hbD86IEFib3J0U2lnbmFsIH0sXG4pOiBQcm9taXNlPEdlbmllRGF0YXNldERhdGE+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFN0YXRlbWVudFJlc3BvbnNlKGNsaWVudCwgc3RhdGVtZW50SWQsIG9wdGlvbnM/LnNpZ25hbCk7XG4gIHJldHVybiBub3JtYWxpemVkU3RhdGVtZW50RGF0YShyZXNwb25zZSwgb3B0aW9ucz8ubGltaXQpO1xufVxuXG4vKipcbiAqIEZldGNoIG9uZSBzdGF0ZW1lbnQgb25jZSBhbmQgcHJvamVjdCBpdCBmb3IgYm90aCB0aGUgZXhpc3RpbmcgZGF0YSB0YWJsZSBhbmRcbiAqIEFwcEtpdCBVSSdzIG5hdGl2ZSBHZW5pZSB2aXN1YWxpemF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdGF0ZW1lbnRFbWJlZERhdGEoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICBzdGF0ZW1lbnRJZDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBsaW1pdD86IG51bWJlcjsgc2lnbmFsPzogQWJvcnRTaWduYWwgfSxcbik6IFByb21pc2U8U3RhdGVtZW50RW1iZWREYXRhPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hTdGF0ZW1lbnRSZXNwb25zZShjbGllbnQsIHN0YXRlbWVudElkLCBvcHRpb25zPy5zaWduYWwpO1xuICByZXR1cm4ge1xuICAgIGRhdGE6IG5vcm1hbGl6ZWRTdGF0ZW1lbnREYXRhKHJlc3BvbnNlLCBvcHRpb25zPy5saW1pdCksXG4gICAgdmlzdWFsaXphdGlvbjogdmlzdWFsaXphdGlvbkRhdGEocmVzcG9uc2UsIG9wdGlvbnM/LmxpbWl0KSxcbiAgfTtcbn1cbiJdfQ==
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
- import { stringUtils } from "@dbx-tools/shared-core";
10
+ import { toIdentifierWithOptions } from "@dbx-tools/shared-core";
11
11
  const SCHEMA_PREFIX = "mastra_";
12
12
  const MAX_PG_IDENTIFIER_LEN = 63;
13
13
  /**
@@ -16,14 +16,14 @@ const MAX_PG_IDENTIFIER_LEN = 63;
16
16
  */
17
17
  export function agentStorageSchemaName(agentId) {
18
18
  const maxSlugLen = MAX_PG_IDENTIFIER_LEN - SCHEMA_PREFIX.length;
19
- const slug = stringUtils.toIdentifierWithOptions({
19
+ const slug = toIdentifierWithOptions({
20
20
  delimiter: "_",
21
21
  maxLength: maxSlugLen,
22
22
  truncateStrategy: "hash",
23
23
  truncateHashLength: 6,
24
24
  }, agentId);
25
25
  const body = slug ||
26
- stringUtils.toIdentifierWithOptions({
26
+ toIdentifierWithOptions({
27
27
  delimiter: "_",
28
28
  maxLength: maxSlugLen,
29
29
  truncateStrategy: "hash",
@@ -31,4 +31,4 @@ export function agentStorageSchemaName(agentId) {
31
31
  }, "agent", agentId);
32
32
  return `${SCHEMA_PREFIX}${body}`;
33
33
  }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS1zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDO0FBQ2hDLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxDQUFDO0FBRWpDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFlO0lBQ3BELE1BQU0sVUFBVSxHQUFHLHFCQUFxQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7SUFDaEUsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLHVCQUF1QixDQUM5QztRQUNFLFNBQVMsRUFBRSxHQUFHO1FBQ2QsU0FBUyxFQUFFLFVBQVU7UUFDckIsZ0JBQWdCLEVBQUUsTUFBTTtRQUN4QixrQkFBa0IsRUFBRSxDQUFDO0tBQ3RCLEVBQ0QsT0FBTyxDQUNSLENBQUM7SUFDRixNQUFNLElBQUksR0FDUixJQUFJO1FBQ0osV0FBVyxDQUFDLHVCQUF1QixDQUNqQztZQUNFLFNBQVMsRUFBRSxHQUFHO1lBQ2QsU0FBUyxFQUFFLFVBQVU7WUFDckIsZ0JBQWdCLEVBQUUsTUFBTTtZQUN4QixrQkFBa0IsRUFBRSxDQUFDO1NBQ3RCLEVBQ0QsT0FBTyxFQUNQLE9BQU8sQ0FDUixDQUFDO0lBQ0osT0FBTyxHQUFHLGFBQWEsR0FBRyxJQUFJLEVBQUUsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZXJpdmUgYSBQb3N0Z3Jlcy1zYWZlIHNjaGVtYSBuYW1lIGZvciBwZXItYWdlbnQgTWFzdHJhIHN0b3JhZ2UuXG4gKlxuICogQWdlbnQgaWRzIGFyZSBvZnRlbiBrZWJhYi1jYXNlIHJvdXRlIHNlZ21lbnRzIChgZGF0YS1tZXNoLWJvb2stYXNzaXN0YW50YClcbiAqIGJ1dCB7QGxpbmsgUG9zdGdyZXNTdG9yZX0gdmFsaWRhdGVzIGBzY2hlbWFOYW1lYCB3aXRoIE1hc3RyYSdzXG4gKiBgcGFyc2VTcWxJZGVudGlmaWVyYCAobGV0dGVyL3VuZGVyc2NvcmUgc3RhcnQsIGBbQS1aYS16MC05X11gIG9ubHksIG1heCA2MykuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuY29uc3QgU0NIRU1BX1BSRUZJWCA9IFwibWFzdHJhX1wiO1xuY29uc3QgTUFYX1BHX0lERU5USUZJRVJfTEVOID0gNjM7XG5cbi8qKlxuICogRGVmYXVsdCBMYWtlYmFzZSBzY2hlbWEgZm9yIG9uZSBhZ2VudCdzIHRocmVhZC9tZXNzYWdlIHN0b3JlOlxuICogYG1hc3RyYV88c2FuaXRpemVkLWFnZW50LWlkPmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lKGFnZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1heFNsdWdMZW4gPSBNQVhfUEdfSURFTlRJRklFUl9MRU4gLSBTQ0hFTUFfUFJFRklYLmxlbmd0aDtcbiAgY29uc3Qgc2x1ZyA9IHN0cmluZ1V0aWxzLnRvSWRlbnRpZmllcldpdGhPcHRpb25zKFxuICAgIHtcbiAgICAgIGRlbGltaXRlcjogXCJfXCIsXG4gICAgICBtYXhMZW5ndGg6IG1heFNsdWdMZW4sXG4gICAgICB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIixcbiAgICAgIHRydW5jYXRlSGFzaExlbmd0aDogNixcbiAgICB9LFxuICAgIGFnZW50SWQsXG4gICk7XG4gIGNvbnN0IGJvZHkgPVxuICAgIHNsdWcgfHxcbiAgICBzdHJpbmdVdGlscy50b0lkZW50aWZpZXJXaXRoT3B0aW9ucyhcbiAgICAgIHtcbiAgICAgICAgZGVsaW1pdGVyOiBcIl9cIixcbiAgICAgICAgbWF4TGVuZ3RoOiBtYXhTbHVnTGVuLFxuICAgICAgICB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIixcbiAgICAgICAgdHJ1bmNhdGVIYXNoTGVuZ3RoOiA2LFxuICAgICAgfSxcbiAgICAgIFwiYWdlbnRcIixcbiAgICAgIGFnZW50SWQsXG4gICAgKTtcbiAgcmV0dXJuIGAke1NDSEVNQV9QUkVGSVh9JHtib2R5fWA7XG59XG4iXX0=
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS1zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVqRSxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUM7QUFDaEMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFFakM7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLE9BQWU7SUFDcEQsTUFBTSxVQUFVLEdBQUcscUJBQXFCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztJQUNoRSxNQUFNLElBQUksR0FBRyx1QkFBdUIsQ0FDbEM7UUFDRSxTQUFTLEVBQUUsR0FBRztRQUNkLFNBQVMsRUFBRSxVQUFVO1FBQ3JCLGdCQUFnQixFQUFFLE1BQU07UUFDeEIsa0JBQWtCLEVBQUUsQ0FBQztLQUN0QixFQUNELE9BQU8sQ0FDUixDQUFDO0lBQ0YsTUFBTSxJQUFJLEdBQ1IsSUFBSTtRQUNKLHVCQUF1QixDQUNyQjtZQUNFLFNBQVMsRUFBRSxHQUFHO1lBQ2QsU0FBUyxFQUFFLFVBQVU7WUFDckIsZ0JBQWdCLEVBQUUsTUFBTTtZQUN4QixrQkFBa0IsRUFBRSxDQUFDO1NBQ3RCLEVBQ0QsT0FBTyxFQUNQLE9BQU8sQ0FDUixDQUFDO0lBQ0osT0FBTyxHQUFHLGFBQWEsR0FBRyxJQUFJLEVBQUUsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZXJpdmUgYSBQb3N0Z3Jlcy1zYWZlIHNjaGVtYSBuYW1lIGZvciBwZXItYWdlbnQgTWFzdHJhIHN0b3JhZ2UuXG4gKlxuICogQWdlbnQgaWRzIGFyZSBvZnRlbiBrZWJhYi1jYXNlIHJvdXRlIHNlZ21lbnRzIChgZGF0YS1tZXNoLWJvb2stYXNzaXN0YW50YClcbiAqIGJ1dCB7QGxpbmsgUG9zdGdyZXNTdG9yZX0gdmFsaWRhdGVzIGBzY2hlbWFOYW1lYCB3aXRoIE1hc3RyYSdzXG4gKiBgcGFyc2VTcWxJZGVudGlmaWVyYCAobGV0dGVyL3VuZGVyc2NvcmUgc3RhcnQsIGBbQS1aYS16MC05X11gIG9ubHksIG1heCA2MykuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHRvSWRlbnRpZmllcldpdGhPcHRpb25zIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuY29uc3QgU0NIRU1BX1BSRUZJWCA9IFwibWFzdHJhX1wiO1xuY29uc3QgTUFYX1BHX0lERU5USUZJRVJfTEVOID0gNjM7XG5cbi8qKlxuICogRGVmYXVsdCBMYWtlYmFzZSBzY2hlbWEgZm9yIG9uZSBhZ2VudCdzIHRocmVhZC9tZXNzYWdlIHN0b3JlOlxuICogYG1hc3RyYV88c2FuaXRpemVkLWFnZW50LWlkPmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lKGFnZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1heFNsdWdMZW4gPSBNQVhfUEdfSURFTlRJRklFUl9MRU4gLSBTQ0hFTUFfUFJFRklYLmxlbmd0aDtcbiAgY29uc3Qgc2x1ZyA9IHRvSWRlbnRpZmllcldpdGhPcHRpb25zKFxuICAgIHtcbiAgICAgIGRlbGltaXRlcjogXCJfXCIsXG4gICAgICBtYXhMZW5ndGg6IG1heFNsdWdMZW4sXG4gICAgICB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIixcbiAgICAgIHRydW5jYXRlSGFzaExlbmd0aDogNixcbiAgICB9LFxuICAgIGFnZW50SWQsXG4gICk7XG4gIGNvbnN0IGJvZHkgPVxuICAgIHNsdWcgfHxcbiAgICB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyhcbiAgICAgIHtcbiAgICAgICAgZGVsaW1pdGVyOiBcIl9cIixcbiAgICAgICAgbWF4TGVuZ3RoOiBtYXhTbHVnTGVuLFxuICAgICAgICB0cnVuY2F0ZVN0cmF0ZWd5OiBcImhhc2hcIixcbiAgICAgICAgdHJ1bmNhdGVIYXNoTGVuZ3RoOiA2LFxuICAgICAgfSxcbiAgICAgIFwiYWdlbnRcIixcbiAgICAgIGFnZW50SWQsXG4gICAgKTtcbiAgcmV0dXJuIGAke1NDSEVNQV9QUkVGSVh9JHtib2R5fWA7XG59XG4iXX0=