velocious 1.0.585 → 1.0.587

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 (66) hide show
  1. package/README.md +4 -3
  2. package/build/configuration-types.js +1 -0
  3. package/build/configuration.js +8 -1
  4. package/build/database/drivers/base.js +11 -3
  5. package/build/database/drivers/mysql/index.js +24 -1
  6. package/build/database/pool/async-tracked-multi-connection.js +1 -0
  7. package/build/frontend-model-controller.js +16 -5
  8. package/build/frontend-model-resource/base-resource.js +15 -0
  9. package/build/http-client/websocket-url-from-http-base.js +14 -0
  10. package/build/src/configuration-types.d.ts +5 -0
  11. package/build/src/configuration-types.d.ts.map +1 -1
  12. package/build/src/configuration-types.js +2 -1
  13. package/build/src/configuration.d.ts +7 -1
  14. package/build/src/configuration.d.ts.map +1 -1
  15. package/build/src/configuration.js +8 -2
  16. package/build/src/database/drivers/base.d.ts +6 -0
  17. package/build/src/database/drivers/base.d.ts.map +1 -1
  18. package/build/src/database/drivers/base.js +11 -4
  19. package/build/src/database/drivers/mysql/index.d.ts +8 -0
  20. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  21. package/build/src/database/drivers/mysql/index.js +24 -2
  22. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  23. package/build/src/database/pool/async-tracked-multi-connection.js +2 -1
  24. package/build/src/frontend-model-controller.d.ts +4 -1
  25. package/build/src/frontend-model-controller.d.ts.map +1 -1
  26. package/build/src/frontend-model-controller.js +14 -6
  27. package/build/src/frontend-model-resource/base-resource.d.ts +13 -0
  28. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  29. package/build/src/frontend-model-resource/base-resource.js +16 -1
  30. package/build/src/http-client/websocket-url-from-http-base.d.ts +8 -0
  31. package/build/src/http-client/websocket-url-from-http-base.d.ts.map +1 -0
  32. package/build/src/http-client/websocket-url-from-http-base.js +13 -0
  33. package/build/src/sync/sync-client.d.ts +6 -2
  34. package/build/src/sync/sync-client.d.ts.map +1 -1
  35. package/build/src/sync/sync-client.js +8 -5
  36. package/build/src/sync/sync-resource-base.d.ts +8 -0
  37. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  38. package/build/src/sync/sync-resource-base.js +12 -1
  39. package/build/src/sync/sync-upstream-importer.d.ts +87 -0
  40. package/build/src/sync/sync-upstream-importer.d.ts.map +1 -0
  41. package/build/src/sync/sync-upstream-importer.js +106 -0
  42. package/build/src/sync/sync-websocket-channel.d.ts.map +1 -1
  43. package/build/src/sync/sync-websocket-channel.js +2 -1
  44. package/build/src/utils/utf8-byte-length.d.ts +8 -0
  45. package/build/src/utils/utf8-byte-length.d.ts.map +1 -0
  46. package/build/src/utils/utf8-byte-length.js +14 -0
  47. package/build/sync/sync-client.js +7 -4
  48. package/build/sync/sync-resource-base.js +12 -0
  49. package/build/sync/sync-upstream-importer.js +122 -0
  50. package/build/sync/sync-websocket-channel.js +1 -0
  51. package/build/tsconfig.tsbuildinfo +1 -1
  52. package/build/utils/utf8-byte-length.js +16 -0
  53. package/package.json +1 -1
  54. package/src/configuration-types.js +1 -0
  55. package/src/configuration.js +8 -1
  56. package/src/database/drivers/base.js +11 -3
  57. package/src/database/drivers/mysql/index.js +24 -1
  58. package/src/database/pool/async-tracked-multi-connection.js +1 -0
  59. package/src/frontend-model-controller.js +16 -5
  60. package/src/frontend-model-resource/base-resource.js +15 -0
  61. package/src/http-client/websocket-url-from-http-base.js +14 -0
  62. package/src/sync/sync-client.js +7 -4
  63. package/src/sync/sync-resource-base.js +12 -0
  64. package/src/sync/sync-upstream-importer.js +122 -0
  65. package/src/sync/sync-websocket-channel.js +1 -0
  66. package/src/utils/utf8-byte-length.js +16 -0
@@ -3,6 +3,7 @@ import { forcedNonBlankString } from "typanic";
3
3
  import FrontendModelBaseResource from "../frontend-model-resource/base-resource.js";
4
4
  import SyncEnvelopeReplayService from "./sync-envelope-replay-service.js";
5
5
  import SyncModelChangeFeedService from "./sync-model-change-feed-service.js";
6
+ import { syncUpstreamImporterForConfiguration } from "./sync-upstream-importer.js";
6
7
  import VelociousError from "../velocious-error.js";
7
8
  /**
8
9
  * Optional client-declared sync scope carried on a changes request.
@@ -190,6 +191,16 @@ export default class SyncResourceBase extends FrontendModelBaseResource {
190
191
  throw new Error(`${this.constructor.name} must define static ModelClass`);
191
192
  return modelClass;
192
193
  }
194
+ /**
195
+ * Returns the shared upstream importer for this resource's configuration. Apps
196
+ * use it inside {@link SyncResourceBase#authorizeChanges} (or a legacy trigger
197
+ * endpoint) to run the upstream import that keeps the feed self-sustaining,
198
+ * with coalescing and throttling owned by the framework.
199
+ * @returns {import("./sync-upstream-importer.js").default} Shared importer for the current configuration.
200
+ */
201
+ syncUpstreamImporter() {
202
+ return syncUpstreamImporterForConfiguration(this.configuration());
203
+ }
193
204
  /**
194
205
  * Authorizes the current context for reading the requested changes.
195
206
  * @param {{params: Record<string, ReturnType<typeof JSON.parse>>, scope: SerializedChangesScope | null}} _args - Request params and parsed scope.
@@ -246,4 +257,4 @@ export default class SyncResourceBase extends FrontendModelBaseResource {
246
257
  return ResourceClass.ReplayServiceClass ?? SharedResource?.ReplayServiceClass ?? SyncEnvelopeReplayService;
247
258
  }
248
259
  }
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1yZXNvdXJjZS1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1yZXNvdXJjZS1iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFFNUMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLHlCQUF5QixNQUFNLG1DQUFtQyxDQUFBO0FBQ3pFLE9BQU8sMEJBQTBCLE1BQU0scUNBQXFDLENBQUE7QUFDNUUsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFbEQ7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUE7QUFFekM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFpQixTQUFRLHlCQUF5QjtJQUNyRTs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQTtJQUVyQzs7OztpQ0FJNkI7SUFDN0IsTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtJQUVoQzs7Ozs7OztPQU9HO0lBQ0gsNkJBQTZCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQztRQUN2RCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQztZQUFFLE9BQU07UUFFbEQsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZ0JBQWdCLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDO1FBQzlCLE1BQU0sa0JBQWtCLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxD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UUFFbEgsT0FBTyxhQUFhLENBQUMsa0JBQWtCLElBQUksY0FBYyxFQUFFLGtCQUFrQixJQUFJLHlCQUF5QixDQUFBO0lBQzVHLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2ZvcmNlZE5vbkJsYW5rU3RyaW5nfSBmcm9tIFwidHlwYW5pY1wiXG5cbmltcG9ydCBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCJcbmltcG9ydCBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlIGZyb20gXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIlxuaW1wb3J0IFN5bmNNb2RlbENoYW5nZUZlZWRTZXJ2aWNlIGZyb20gXCIuL3N5bmMtbW9kZWwtY2hhbmdlLWZlZWQtc2VydmljZS5qc1wiXG5pbXBvcnQgVmVsb2Npb3VzRXJyb3IgZnJvbSBcIi4uL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5cbi8qKlxuICogT3B0aW9uYWwgY2xpZW50LWRlY2xhcmVkIHN5bmMgc2NvcGUgY2FycmllZCBvbiBhIGNoYW5nZXMgcmVxdWVzdC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlcmlhbGl6ZWRDaGFuZ2VzU2NvcGVcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBjb25kaXRpb25zIC0gUGxhaW4gYXR0cmlidXRlIGNvbmRpdGlvbnMgZnJvbSB0aGUgY2xpZW50IHF1ZXJ5LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZXNvdXJjZVR5cGUgLSBDbGllbnQgcmVzb3VyY2UvbW9kZWwgbmFtZSB0aGUgc2NvcGUgd2FzIGRlY2xhcmVkIGZvciwgb3IgbnVsbCBmb3IgdGhlIGFsbC10eXBlcyAodXNlcikgc2NvcGU6IG9uZSBzY29wZSBjb3ZlcmluZyBldmVyeSByZXNvdXJjZSB0eXBlIHRoaXMgcmVzb3VyY2UgYXV0aG9yaXplcyBmb3IgdGhlIGNhbGxlciwgc28gYSBzeW5jIGF1dGhvcml6ZXMgb25jZSBob3dldmVyIG1hbnkgdHlwZXMgaXQgc2VydmVzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXSB8IG51bGx9IHJlc291cmNlVHlwZXMgLSBGb3IgdGhlIGFsbC10eXBlcyBzY29wZSwgdGhlIHJlc291cmNlIHR5cGVzIHRoZSBjbGllbnQgY2FuIGFwcGx5LiBBIGNoZWFwIGRlbGl2ZXJ5L3R5cGUgZmlsdGVyIG9ubHkgLSBpdCBuYXJyb3dzLCBuZXZlciB3aWRlbnMsIHdoYXQgdGhlIGFwcCdzIGF1dGhvcml6YXRpb24gYWxyZWFkeSBhbGxvd3MuIE51bGwgZm9yIGEgdHlwZS1kZWNsYXJlZCBzY29wZS5cbiAqL1xuXG4vKipcbiAqIE9uZSBwdWJsaXNoZWQgc3luYyBlbnRyeSBhcyBkZWxpdmVyZWQgdG8gdGhlIHBlci1kZWxpdmVyeSBhY2Nlc3MgcmUtY2hlY2tcbiAqICh7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNjaGFuZ2VEZWxpdmVyYWJsZX0pOiB0aGUgY29tcGxldGUgYnJvYWRjYXN0IHN5bmNcbiAqIGVudHJ5IOKAlCBpbmNsdWRpbmcgdGhlIGltbXV0YWJsZSBzeW5jLXJvdyBpZCwgYWN0b3Itc3BlY2lmaWMgbWV0YWRhdGEsIGFuZFxuICogYW55IG90aGVyIGFwcCBmaWVsZHMgdGhlIHB1Ymxpc2hlciBwdXQgb24gaXQg4oCUIHdpdGggYHJlc291cmNlSWRgIGFuZFxuICogYHJlc291cmNlVHlwZWAgbm9ybWFsaXplZCB0byBzdHJpbmdzLiBBcHBzIGF1dGhvcml6aW5nIGJ5IGV4YWN0LXJvd1xuICogaWRlbnRpdHkgcmVhZCB0aGUgZXh0cmEgZmllbGRzOyBvdmVycmlkZXMgdGhhdCBvbmx5IHJlYWRcbiAqIGByZXNvdXJjZUlkYC9gcmVzb3VyY2VUeXBlYCBrZWVwIHdvcmtpbmcgdW5jaGFuZ2VkLlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiAmIHtyZXNvdXJjZUlkOiBzdHJpbmcsIHJlc291cmNlVHlwZTogc3RyaW5nfX0gQ2hhbmdlRGVsaXZlcmFibGVTeW5jRW50cnlcbiAqL1xuY29uc3QgUVVJQ0tfU0VBUkNIX0NPTFVNTiA9IFwicXVpY2tTZWFyY2hcIlxuXG4vKipcbiAqIEJhc2UgcmVzb3VyY2UgZm9yIFZlbG9jaW91cyBzeW5jIGVuZHBvaW50cy5cbiAqXG4gKiBWZWxvY2lvdXMgb3ducyB0aGUgY2hhbmdlcy9yZXBsYXkgb3JjaGVzdHJhdGlvbiAoc2NvcGUgcGFyc2luZywgZmVlZCBwYWdpbmcsXG4gKiByZXBsYXkgZGVsZWdhdGlvbiwgcmVzcG9uc2Ugc2hhcGUpIHdoaWxlIGFwcHMgc3ViY2xhc3MgYW5kIG9ubHkgZGVjbGFyZVxuICogYXV0aG9yaXphdGlvbiwgZmVlZCBzY29waW5nLCBhbmQgdGhlaXIgcmVwbGF5IHNlcnZpY2UuXG4gKiBAdGVtcGxhdGUge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gW1RNb2RlbENsYXNzPXR5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdF1cbiAqIEBhdWdtZW50cyB7RnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZTxUTW9kZWxDbGFzcz59XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNSZXNvdXJjZUJhc2UgZXh0ZW5kcyBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFJlcGxheSBzZXJ2aWNlIGNsYXNzIGhhbmRsaW5nIHJlcGxheSBtdXRhdGlvbnMgZm9yIHRoaXMgcmVzb3VyY2UsXG4gICAqIGRlY2xhcmVkIGluc3RlYWQgb2Ygb3ZlcnJpZGluZyB7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNyZXBsYXlTZXJ2aWNlQ2xhc3N9LlxuICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgc3RhdGljIFJlcGxheVNlcnZpY2VDbGFzcyA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBEZWNsYXJhdGl2ZSBxdWljay1zZWFyY2ggdGV4dCBjb2x1bW5zLiBXaGVuIGRlY2xhcmVkLCBhbiBpbmRleCBzZWFyY2ggb25cbiAgICogdGhlIHBzZXVkby1jb2x1bW4gYHF1aWNrU2VhcmNoYCBleHBhbmRzIHRvIGFuIE9SIG9mIExJS0UgY29uZGl0aW9ucyBvdmVyXG4gICAqIHRoZXNlIHJvb3QtdGFibGUgY29sdW1ucyBpbnN0ZWFkIG9mIGhpdHRpbmcgdGhlIGNvbnRyb2xsZXIgZGVmYXVsdC5cbiAgICogQHR5cGUge3N0cmluZ1tdIHwgbnVsbH0gKi9cbiAgc3RhdGljIHF1aWNrU2VhcmNoQ29sdW1ucyA9IG51bGxcblxuICAvKipcbiAgICogQXBwbGllcyBmcm9udGVuZC1tb2RlbCBpbmRleCBzZWFyY2hlcywgZXhwYW5kaW5nIGRlY2xhcmVkIHF1aWNrIHNlYXJjaGVzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlYXJjaCBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29udHJvbGxlcn0gYXJncy5jb250cm9sbGVyIC0gQ29udHJvbGxlciBoYW5kbGluZyB0aGUgcXVlcnkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VBbnlRdWVyeX0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlU2VhcmNofSBhcmdzLnNlYXJjaCAtIFNlYXJjaCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXBwbHlGcm9udGVuZE1vZGVsSW5kZXhTZWFyY2goe2NvbnRyb2xsZXIsIHF1ZXJ5LCBzZWFyY2h9KSB7XG4gICAgaWYgKHRoaXMuYXBwbHlRdWlja1NlYXJjaCh7cXVlcnksIHNlYXJjaH0pKSByZXR1cm5cblxuICAgIHN1cGVyLmFwcGx5RnJvbnRlbmRNb2RlbEluZGV4U2VhcmNoKHtjb250cm9sbGVyLCBxdWVyeSwgc2VhcmNofSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmRzIGEgYHF1aWNrU2VhcmNoYCBwc2V1ZG8tY29sdW1uIHNlYXJjaCBpbnRvIGFuIE9SIG9mIExJS0UgY29uZGl0aW9uc1xuICAgKiBvdmVyIHRoZSBkZWNsYXJlZCB7QGxpbmsgU3luY1Jlc291cmNlQmFzZS5xdWlja1NlYXJjaENvbHVtbnN9LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlYXJjaCBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQW55UXVlcnl9IGFyZ3MucXVlcnkgLSBRdWVyeSB0byBmaWx0ZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VTZWFyY2h9IGFyZ3Muc2VhcmNoIC0gU2VhcmNoIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBzZWFyY2ggd2FzIGhhbmRsZWQgYXMgYSBxdWljayBzZWFyY2guXG4gICAqL1xuICBhcHBseVF1aWNrU2VhcmNoKHtxdWVyeSwgc2VhcmNofSkge1xuICAgIGNvbnN0IHF1aWNrU2VhcmNoQ29sdW1ucyA9IC8qKiBAdHlwZSB7dHlwZW9mIFN5bmNSZXNvdXJjZUJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKS5xdWlja1NlYXJjaENvbHVtbnNcblxuICAgIGlmICghcXVpY2tTZWFyY2hDb2x1bW5zIHx8IHF1aWNrU2VhcmNoQ29sdW1ucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZVxuICAgIGlmIChzZWFyY2gucGF0aC5sZW5ndGggPiAwIHx8IHNlYXJjaC5jb2x1bW4gIT09IFFVSUNLX1NFQVJDSF9DT0xVTU4pIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHNlYXJjaC5vcGVyYXRvciAhPT0gXCJsaWtlXCIpIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJTeW5jIHF1aWNrIHNlYXJjaCBtdXN0IHVzZSB0aGUgbGlrZSBvcGVyYXRvci5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLXF1aWNrLXNlYXJjaFwifSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNlYXJjaC52YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgcXVpY2sgc2VhcmNoIG11c3QgYmUgYSBzdHJpbmcuXCIsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1xdWljay1zZWFyY2hcIn0pXG4gICAgfVxuXG4gICAgY29uc3QgdHJpbW1lZFZhbHVlID0gc2VhcmNoLnZhbHVlLnRyaW0oKVxuXG4gICAgaWYgKCF0cmltbWVkVmFsdWUpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCB0YWJsZVNxbCA9IHF1ZXJ5LmRyaXZlci5xdW90ZVRhYmxlKHF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbigpKVxuICAgIGNvbnN0IGxpa2VWYWx1ZSA9IGAlJHt0cmltbWVkVmFsdWV9JWBcbiAgICBjb25zdCBjb25kaXRpb25zID0gcXVpY2tTZWFyY2hDb2x1bW5zLm1hcCgoY29sdW1uTmFtZSkgPT4gKFxuICAgICAgYCR7dGFibGVTcWx9LiR7cXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfSBMSUtFICR7cXVlcnkuZHJpdmVyLnF1b3RlKGxpa2VWYWx1ZSl9YFxuICAgICkpXG5cbiAgICBxdWVyeS53aGVyZShgKCR7Y29uZGl0aW9ucy5qb2luKFwiIE9SIFwiKX0pYClcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBUaGUgZGVjbGFyYXRpdmUgYHN0YXRpYyB3cml0YWJsZUF0dHJpYnV0ZXNgIHBlcm1pdCBsaXN0IGxpdmVzIG9uXG4gIC8vIEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2Ugc28gZXZlcnkgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2UgY2FuIGRlY2xhcmVcbiAgLy8gb25lOyBzeW5jIHJlc291cmNlcyBpbmhlcml0IGl0IHVuY2hhbmdlZC5cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0YWJsZSBjaGFuZ2UtZmVlZCBwYWdlIGFmdGVyIGFwcCBhdXRob3JpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBDaGFuZ2UtZmVlZCBwYWdlIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNoYW5nZXMoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5wYXJhbXMoKVxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5jaGFuZ2VzU2NvcGUocGFyYW1zKVxuXG4gICAgYXdhaXQgdGhpcy5hdXRob3JpemVDaGFuZ2VzKHtwYXJhbXMsIHNjb3BlfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNoYW5nZUZlZWRTZXJ2aWNlKHtwYXJhbXMsIHNjb3BlfSkuY2hhbmdlcygpXG4gIH1cblxuICAvKipcbiAgICogUmVwbGF5cyBjbGllbnQgc3luYyBlbnZlbG9wZXMgdGhyb3VnaCB0aGUgYXBwIHJlcGxheSBzZXJ2aWNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBSZXBsYXkgcmVzdWx0IHdpdGggcGVyLXN5bmMgc3RhdGVzLlxuICAgKi9cbiAgYXN5bmMgcmVwbGF5KCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYnVpbGRSZXBsYXlTZXJ2aWNlKCkucmVwbGF5KHRoaXMucGFyYW1zKCkpXG5cbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJlcnJvclwiKSByZXR1cm4gcmVzdWx0XG5cbiAgICByZXR1cm4ge3N0YXR1czogXCJzdWNjZXNzXCIsIHN5bmNzOiByZXN1bHQuc3luY3N9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBvcHRpb25hbCBjbGllbnQtZGVjbGFyZWQgc2NvcGUgZnJvbSByZXF1ZXN0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHBhcmFtcyAtIFJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7U2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGx9IFBhcnNlZCBzY29wZSwgb3IgbnVsbCB3aGVuIHRoZSBjbGllbnQgc2VudCBub25lLlxuICAgKi9cbiAgY2hhbmdlc1Njb3BlKHBhcmFtcykge1xuICAgIGNvbnN0IHNjb3BlID0gcGFyYW1zLnNjb3BlXG5cbiAgICBpZiAoc2NvcGUgPT09IHVuZGVmaW5lZCB8fCBzY29wZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgIGlmICh0eXBlb2Ygc2NvcGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzY29wZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyBjaGFuZ2VzIHNjb3BlIG11c3QgYmUgYW4gb2JqZWN0LCBnb3Q6ICR7U3RyaW5nKHNjb3BlKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlUGFyYW1zID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChzY29wZSlcbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBzY29wZVBhcmFtcy5yZXNvdXJjZVR5cGUgPT09IG51bGwgfHwgc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlID09PSB1bmRlZmluZWRcbiAgICAgID8gbnVsbFxuICAgICAgOiBmb3JjZWROb25CbGFua1N0cmluZyhzY29wZVBhcmFtcy5yZXNvdXJjZVR5cGUsIFwicmVzb3VyY2VUeXBlXCIpXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlcyA9IHRoaXMuY2hhbmdlc1Njb3BlUmVzb3VyY2VUeXBlcyhzY29wZVBhcmFtcy5yZXNvdXJjZVR5cGVzKVxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBzY29wZVBhcmFtcy5jb25kaXRpb25zXG5cbiAgICBpZiAoIWNvbmRpdGlvbnMgfHwgdHlwZW9mIGNvbmRpdGlvbnMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjb25kaXRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgc2NvcGUuY29uZGl0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCwgZ290OiAke1N0cmluZyhjb25kaXRpb25zKX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7Y29uZGl0aW9uczogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChjb25kaXRpb25zKSwgcmVzb3VyY2VUeXBlLCByZXNvdXJjZVR5cGVzfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgb3B0aW9uYWwgcmVzb3VyY2UtdHlwZSBsaXN0IGFuIGFsbC10eXBlcyBzY29wZSBkZWNsYXJlcy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBSYXcgYHNjb3BlLnJlc291cmNlVHlwZXNgIHBhcmFtLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW10gfCBudWxsfSBEZWNsYXJlZCByZXNvdXJjZSB0eXBlcywgb3IgbnVsbCB3aGVuIHRoZSBjbGllbnQgc2VudCBub25lLlxuICAgKi9cbiAgY2hhbmdlc1Njb3BlUmVzb3VyY2VUeXBlcyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgc2NvcGUucmVzb3VyY2VUeXBlcyBtdXN0IGJlIGFuIGFycmF5LCBnb3Q6ICR7U3RyaW5nKHZhbHVlKX1gKVxuXG4gICAgcmV0dXJuIHZhbHVlLm1hcCgocmVzb3VyY2VUeXBlKSA9PiBmb3JjZWROb25CbGFua1N0cmluZyhyZXNvdXJjZVR5cGUsIFwicmVzb3VyY2VUeXBlc1wiKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGNoYW5nZS1mZWVkIHNlcnZpY2Ugc2VydmluZyB0aGlzIGNoYW5nZXMgcmVxdWVzdC5cbiAgICogQHBhcmFtIHt7cGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH19IGFyZ3MgLSBSZXF1ZXN0IHBhcmFtcyBhbmQgcGFyc2VkIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7e2NoYW5nZXM6ICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn19IENoYW5nZS1mZWVkIHNlcnZpY2UuXG4gICAqL1xuICBjaGFuZ2VGZWVkU2VydmljZSh7cGFyYW1zLCBzY29wZX0pIHtcbiAgICByZXR1cm4gbmV3IFN5bmNNb2RlbENoYW5nZUZlZWRTZXJ2aWNlKHtcbiAgICAgIG1vZGVsQ2xhc3M6IHRoaXMuc3luY01vZGVsQ2xhc3MoKSxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHNjb3BlUXVlcnk6ICh7cXVlcnl9KSA9PiB0aGlzLnNjb3BlQ2hhbmdlc1F1ZXJ5KHtwYXJhbXMsIHF1ZXJ5LCBzY29wZX0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGFwcCByZXBsYXkgc2VydmljZSBoYW5kbGluZyB0aGlzIHJlcGxheSByZXF1ZXN0LiBUaGUgcmVzb3VyY2VcbiAgICogYWJpbGl0eSwgY29udGV4dCwgY29uZmlndXJhdGlvbiwgYW5kIGxvY2FscyBhcmUgcGx1bWJlZCBpbiB1bmRlciB0aGVcbiAgICogYXBwLWRlY2xhcmVkIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlI3JlcGxheVNlcnZpY2VBcmdzfSAoYXBwIGFyZ3Mgd2luKSBzb1xuICAgKiB0aGUgZGVmYXVsdCByZXNvdXJjZS1yb3V0ZWQgcmVwbGF5IHdvcmtzIHdpdGhvdXQgd2lyaW5nLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLmRlZmF1bHR9IFJlcGxheSBzZXJ2aWNlIGluc3RhbmNlLlxuICAgKi9cbiAgYnVpbGRSZXBsYXlTZXJ2aWNlKCkge1xuICAgIGNvbnN0IFJlcGxheVNlcnZpY2VDbGFzcyA9IHRoaXMucmVwbGF5U2VydmljZUNsYXNzKClcblxuICAgIHJldHVybiBuZXcgUmVwbGF5U2VydmljZUNsYXNzKHtcbiAgICAgIGFiaWxpdHk6IHRoaXMuYWJpbGl0eSxcbiAgICAgIGFiaWxpdHlDb250ZXh0OiB0aGlzLmdldENvbnRleHQoKSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29udHJvbGxlciA/IHRoaXMuY29udHJvbGxlckluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbigpIDogdW5kZWZpbmVkLFxuICAgICAgbG9jYWxzOiB0aGlzLmdldExvY2FscygpLFxuICAgICAgLi4udGhpcy5yZXBsYXlTZXJ2aWNlQXJncygpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGNvbnN0cnVjdG9yIGFyZ3MgZm9yIHRoZSBhcHAgcmVwbGF5IHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFJlcGxheSBzZXJ2aWNlIGNvbnN0cnVjdG9yIGFyZ3MuXG4gICAqL1xuICByZXBsYXlTZXJ2aWNlQXJncygpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzeW5jIG1vZGVsIGNsYXNzIGJhY2tpbmcgdGhlIGNoYW5nZSBmZWVkLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBTeW5jIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgc3luY01vZGVsQ2xhc3MoKSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIFN5bmNSZXNvdXJjZUJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKS5Nb2RlbENsYXNzXG5cbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IG11c3QgZGVmaW5lIHN0YXRpYyBNb2RlbENsYXNzYClcblxuICAgIHJldHVybiBtb2RlbENsYXNzXG4gIH1cblxuICAvKipcbiAgICogQXV0aG9yaXplcyB0aGUgY3VycmVudCBjb250ZXh0IGZvciByZWFkaW5nIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcy5cbiAgICogQHBhcmFtIHt7cGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH19IF9hcmdzIC0gUmVxdWVzdCBwYXJhbXMgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gYWNjZXNzIGlzIGFsbG93ZWQ7IHRocm93cyBvdGhlcndpc2UuXG4gICAqL1xuICBhc3luYyBhdXRob3JpemVDaGFuZ2VzKF9hcmdzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY1Jlc291cmNlQmFzZSNhdXRob3JpemVDaGFuZ2VzIG11c3QgYmUgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFwcCB2aXNpYmlsaXR5IHNjb3Bpbmcgb250byB0aGUgY2hhbmdlLWZlZWQgcXVlcnkuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBxdWVyeTogaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCwgc2NvcGU6IFNlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsfX0gX2FyZ3MgLSBSZXF1ZXN0IHBhcmFtcywgZmVlZCBxdWVyeSwgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzY29wZUNoYW5nZXNRdWVyeShfYXJncykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNSZXNvdXJjZUJhc2Ujc2NvcGVDaGFuZ2VzUXVlcnkgbXVzdCBiZSBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBvbmUgcHVibGlzaGVkIGNoYW5nZSBpcyBkZWxpdmVyYWJsZSB0byBhIHVzZXItc2NvcGVcbiAgICogc3Vic2NyaXB0aW9uICh0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCdzIHBlci1kZWxpdmVyeSBhY2Nlc3MgcmUtY2hlY2spLlxuICAgKiBUaGUgZGVmYXVsdCByZXVzZXMgdGhlIGFwcCdzIGFiaWxpdHkgc2NvcGluZzogaXQgYXBwbGllc1xuICAgKiB7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNzY29wZUNoYW5nZXNRdWVyeX0gdG8gdGhlIGNoYW5nZS1mZWVkIG1vZGVsIOKAlCB3aGljaFxuICAgKiBmb3IgYW4gZW1wdHktY29uZGl0aW9ucyB1c2VyIHNjb3BlIGZhbGxzIGJhY2sgdG8gYWJpbGl0eSBzY29waW5nIOKAlCBhbmRcbiAgICogY2hlY2tzIHdoZXRoZXIgdGhlIHB1Ymxpc2hlZCBjaGFuZ2UncyBmZWVkIHJvdyBpcyB2aXNpYmxlIHdpdGhpbiB0aGF0XG4gICAqIHNjb3BlLiBBcHBzIGdldCB0aGlzIGZvciBmcmVlIGZyb20gdGhlIHNjb3BpbmcgdGhleSBhbHJlYWR5IGRlY2xhcmVkO1xuICAgKiBvdmVycmlkZSBvbmx5IGZvciBjdXN0b20gcGVyLWRlbGl2ZXJ5IHJ1bGVzLlxuICAgKlxuICAgKiBUaGUgYHN5bmNgIGFyZ3VtZW50IGlzIHRoZSBjb21wbGV0ZSBicm9hZGNhc3Qgc3luYyBlbnRyeSDigJQgaW1tdXRhYmxlXG4gICAqIHN5bmMtcm93IGlkLCBhY3Rvci1zcGVjaWZpYyBtZXRhZGF0YSwgYW5kIGFueSBvdGhlciBwdWJsaXNoZXIgZmllbGRzIOKAlFxuICAgKiB3aXRoIGByZXNvdXJjZUlkYC9gcmVzb3VyY2VUeXBlYCBub3JtYWxpemVkIHRvIHN0cmluZ3MsIHNvIGFuIG92ZXJyaWRlXG4gICAqIGNhbiBhdXRob3JpemUgY29uY3VycmVudCB0YXJnZXRlZCBhbmQgc2hhcmVkIGJyb2FkY2FzdHMgZm9yIHRoZSBzYW1lXG4gICAqIHJlc291cmNlIGlkZW50aXR5IGluZGVwZW5kZW50bHkgYnkgdGhlaXIgZXhhY3Qtcm93IGlkZW50aXR5LiBUaGUgY2hhbm5lbFxuICAgKiBuZXZlciBtdXRhdGVzIHRoZSBwdWJsaXNoZWQgZW50cnk7IG5vcm1hbGl6YXRpb24gaGFwcGVucyBvbiBhIGNvcHkuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBzY29wZTogU2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGwsIHN5bmM6IENoYW5nZURlbGl2ZXJhYmxlU3luY0VudHJ5fX0gYXJncyAtIFJlcXVlc3QgcGFyYW1zLCBzdWJzY3JpcHRpb24gc2NvcGUsIGFuZCB0aGUgcHVibGlzaGVkIHN5bmMgZW50cnkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBjaGFuZ2UgbWF5IGJlIGRlbGl2ZXJlZCB0byB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGFzeW5jIGNoYW5nZURlbGl2ZXJhYmxlKHtwYXJhbXMsIHNjb3BlLCBzeW5jfSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zeW5jTW9kZWxDbGFzcygpLndoZXJlKHt9KVxuXG4gICAgdGhpcy5zY29wZUNoYW5nZXNRdWVyeSh7cGFyYW1zLCBxdWVyeSwgc2NvcGV9KVxuICAgIHF1ZXJ5LndoZXJlKHtyZXNvdXJjZV9pZDogU3RyaW5nKHN5bmMucmVzb3VyY2VJZCksIHJlc291cmNlX3R5cGU6IFN0cmluZyhzeW5jLnJlc291cmNlVHlwZSl9KVxuXG4gICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgcXVlcnkuZmlyc3QoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcmVwbGF5IHNlcnZpY2UgY2xhc3MgaGFuZGxpbmcgcmVwbGF5IG11dGF0aW9uczogdGhlXG4gICAqIGRlY2xhcmF0aXZlIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlLlJlcGxheVNlcnZpY2VDbGFzc30gc3RhdGljIChzaGFyZWRcbiAgICogcmVzb3VyY2VzIGluY2x1ZGVkKSB3aGVuIGRlY2xhcmVkLCBvdGhlcndpc2VcbiAgICoge0BsaW5rIFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2V9LCB3aGljaCByZXNvdXJjZS1yb3V0ZXMgbXV0YXRpb25zIHRocm91Z2hcbiAgICogdGhlIHBsdW1iZWQgY29uZmlndXJhdGlvbiByZWdpc3RyeS4gQXBwcyBkZWNsYXJlIHRoZSBzdGF0aWMgaW5zdGVhZCBvZlxuICAgKiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5kZWZhdWx0fSBSZXBsYXkgc2VydmljZSBjbGFzcy5cbiAgICovXG4gIHJlcGxheVNlcnZpY2VDbGFzcygpIHtcbiAgICBjb25zdCBSZXNvdXJjZUNsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgU3luY1Jlc291cmNlQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgU2hhcmVkUmVzb3VyY2UgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlIHwgbnVsbH0gKi8gKFJlc291cmNlQ2xhc3Muc2hhcmVkUmVzb3VyY2VDbGFzcygpID8/IG51bGwpXG5cbiAgICByZXR1cm4gUmVzb3VyY2VDbGFzcy5SZXBsYXlTZXJ2aWNlQ2xhc3MgPz8gU2hhcmVkUmVzb3VyY2U/LlJlcGxheVNlcnZpY2VDbGFzcyA/PyBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlXG4gIH1cbn1cbiJdfQ==
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1yZXNvdXJjZS1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1yZXNvdXJjZS1iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFFNUMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLHlCQUF5QixNQUFNLG1DQUFtQyxDQUFBO0FBQ3pFLE9BQU8sMEJBQTBCLE1BQU0scUNBQXFDLENBQUE7QUFDNUUsT0FBTyxFQUFDLG9DQUFvQyxFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDaEYsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFbEQ7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUE7QUFFekM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFpQixTQUFRLHlCQUF5QjtJQUNyRTs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQTtJQUVyQzs7OztpQ0FJNkI7SUFDN0IsTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtJQUVoQzs7Ozs7OztPQU9HO0lBQ0gsNkJBQTZCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQztRQUN2RCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQztZQUFFLE9BQU07UUFFbEQsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZ0JBQWdCLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDO1FBQzlCLE1BQU0s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QUFNLGFBQWEsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUMvRSxNQUFNLGNBQWMsR0FBRyw2Q0FBNkMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFBO1FBRWxILE9BQU8sYUFBYSxDQUFDLGtCQUFrQixJQUFJLGNBQWMsRUFBRSxrQkFBa0IsSUFBSSx5QkFBeUIsQ0FBQTtJQUM1RyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtmb3JjZWROb25CbGFua1N0cmluZ30gZnJvbSBcInR5cGFuaWNcIlxuXG5pbXBvcnQgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiXG5pbXBvcnQgU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSBmcm9tIFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCJcbmltcG9ydCBTeW5jTW9kZWxDaGFuZ2VGZWVkU2VydmljZSBmcm9tIFwiLi9zeW5jLW1vZGVsLWNoYW5nZS1mZWVkLXNlcnZpY2UuanNcIlxuaW1wb3J0IHtzeW5jVXBzdHJlYW1JbXBvcnRlckZvckNvbmZpZ3VyYXRpb259IGZyb20gXCIuL3N5bmMtdXBzdHJlYW0taW1wb3J0ZXIuanNcIlxuaW1wb3J0IFZlbG9jaW91c0Vycm9yIGZyb20gXCIuLi92ZWxvY2lvdXMtZXJyb3IuanNcIlxuXG4vKipcbiAqIE9wdGlvbmFsIGNsaWVudC1kZWNsYXJlZCBzeW5jIHNjb3BlIGNhcnJpZWQgb24gYSBjaGFuZ2VzIHJlcXVlc3QuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gY29uZGl0aW9ucyAtIFBsYWluIGF0dHJpYnV0ZSBjb25kaXRpb25zIGZyb20gdGhlIGNsaWVudCBxdWVyeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcmVzb3VyY2VUeXBlIC0gQ2xpZW50IHJlc291cmNlL21vZGVsIG5hbWUgdGhlIHNjb3BlIHdhcyBkZWNsYXJlZCBmb3IsIG9yIG51bGwgZm9yIHRoZSBhbGwtdHlwZXMgKHVzZXIpIHNjb3BlOiBvbmUgc2NvcGUgY292ZXJpbmcgZXZlcnkgcmVzb3VyY2UgdHlwZSB0aGlzIHJlc291cmNlIGF1dGhvcml6ZXMgZm9yIHRoZSBjYWxsZXIsIHNvIGEgc3luYyBhdXRob3JpemVzIG9uY2UgaG93ZXZlciBtYW55IHR5cGVzIGl0IHNlcnZlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW10gfCBudWxsfSByZXNvdXJjZVR5cGVzIC0gRm9yIHRoZSBhbGwtdHlwZXMgc2NvcGUsIHRoZSByZXNvdXJjZSB0eXBlcyB0aGUgY2xpZW50IGNhbiBhcHBseS4gQSBjaGVhcCBkZWxpdmVyeS90eXBlIGZpbHRlciBvbmx5IC0gaXQgbmFycm93cywgbmV2ZXIgd2lkZW5zLCB3aGF0IHRoZSBhcHAncyBhdXRob3JpemF0aW9uIGFscmVhZHkgYWxsb3dzLiBOdWxsIGZvciBhIHR5cGUtZGVjbGFyZWQgc2NvcGUuXG4gKi9cblxuLyoqXG4gKiBPbmUgcHVibGlzaGVkIHN5bmMgZW50cnkgYXMgZGVsaXZlcmVkIHRvIHRoZSBwZXItZGVsaXZlcnkgYWNjZXNzIHJlLWNoZWNrXG4gKiAoe0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UjY2hhbmdlRGVsaXZlcmFibGV9KTogdGhlIGNvbXBsZXRlIGJyb2FkY2FzdCBzeW5jXG4gKiBlbnRyeSDigJQgaW5jbHVkaW5nIHRoZSBpbW11dGFibGUgc3luYy1yb3cgaWQsIGFjdG9yLXNwZWNpZmljIG1ldGFkYXRhLCBhbmRcbiAqIGFueSBvdGhlciBhcHAgZmllbGRzIHRoZSBwdWJsaXNoZXIgcHV0IG9uIGl0IOKAlCB3aXRoIGByZXNvdXJjZUlkYCBhbmRcbiAqIGByZXNvdXJjZVR5cGVgIG5vcm1hbGl6ZWQgdG8gc3RyaW5ncy4gQXBwcyBhdXRob3JpemluZyBieSBleGFjdC1yb3dcbiAqIGlkZW50aXR5IHJlYWQgdGhlIGV4dHJhIGZpZWxkczsgb3ZlcnJpZGVzIHRoYXQgb25seSByZWFkXG4gKiBgcmVzb3VyY2VJZGAvYHJlc291cmNlVHlwZWAga2VlcCB3b3JraW5nIHVuY2hhbmdlZC5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gJiB7cmVzb3VyY2VJZDogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZ319IENoYW5nZURlbGl2ZXJhYmxlU3luY0VudHJ5XG4gKi9cbmNvbnN0IFFVSUNLX1NFQVJDSF9DT0xVTU4gPSBcInF1aWNrU2VhcmNoXCJcblxuLyoqXG4gKiBCYXNlIHJlc291cmNlIGZvciBWZWxvY2lvdXMgc3luYyBlbmRwb2ludHMuXG4gKlxuICogVmVsb2Npb3VzIG93bnMgdGhlIGNoYW5nZXMvcmVwbGF5IG9yY2hlc3RyYXRpb24gKHNjb3BlIHBhcnNpbmcsIGZlZWQgcGFnaW5nLFxuICogcmVwbGF5IGRlbGVnYXRpb24sIHJlc3BvbnNlIHNoYXBlKSB3aGlsZSBhcHBzIHN1YmNsYXNzIGFuZCBvbmx5IGRlY2xhcmVcbiAqIGF1dGhvcml6YXRpb24sIGZlZWQgc2NvcGluZywgYW5kIHRoZWlyIHJlcGxheSBzZXJ2aWNlLlxuICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IFtUTW9kZWxDbGFzcz10eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRdXG4gKiBAYXVnbWVudHMge0Zyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2U8VE1vZGVsQ2xhc3M+fVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jUmVzb3VyY2VCYXNlIGV4dGVuZHMgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZXBsYXkgc2VydmljZSBjbGFzcyBoYW5kbGluZyByZXBsYXkgbXV0YXRpb25zIGZvciB0aGlzIHJlc291cmNlLFxuICAgKiBkZWNsYXJlZCBpbnN0ZWFkIG9mIG92ZXJyaWRpbmcge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UjcmVwbGF5U2VydmljZUNsYXNzfS5cbiAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHN0YXRpYyBSZXBsYXlTZXJ2aWNlQ2xhc3MgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogRGVjbGFyYXRpdmUgcXVpY2stc2VhcmNoIHRleHQgY29sdW1ucy4gV2hlbiBkZWNsYXJlZCwgYW4gaW5kZXggc2VhcmNoIG9uXG4gICAqIHRoZSBwc2V1ZG8tY29sdW1uIGBxdWlja1NlYXJjaGAgZXhwYW5kcyB0byBhbiBPUiBvZiBMSUtFIGNvbmRpdGlvbnMgb3ZlclxuICAgKiB0aGVzZSByb290LXRhYmxlIGNvbHVtbnMgaW5zdGVhZCBvZiBoaXR0aW5nIHRoZSBjb250cm9sbGVyIGRlZmF1bHQuXG4gICAqIEB0eXBlIHtzdHJpbmdbXSB8IG51bGx9ICovXG4gIHN0YXRpYyBxdWlja1NlYXJjaENvbHVtbnMgPSBudWxsXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgZnJvbnRlbmQtbW9kZWwgaW5kZXggc2VhcmNoZXMsIGV4cGFuZGluZyBkZWNsYXJlZCBxdWljayBzZWFyY2hlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZWFyY2ggYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbnRyb2xsZXJ9IGFyZ3MuY29udHJvbGxlciAtIENvbnRyb2xsZXIgaGFuZGxpbmcgdGhlIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQW55UXVlcnl9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZVNlYXJjaH0gYXJncy5zZWFyY2ggLSBTZWFyY2ggcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5RnJvbnRlbmRNb2RlbEluZGV4U2VhcmNoKHtjb250cm9sbGVyLCBxdWVyeSwgc2VhcmNofSkge1xuICAgIGlmICh0aGlzLmFwcGx5UXVpY2tTZWFyY2goe3F1ZXJ5LCBzZWFyY2h9KSkgcmV0dXJuXG5cbiAgICBzdXBlci5hcHBseUZyb250ZW5kTW9kZWxJbmRleFNlYXJjaCh7Y29udHJvbGxlciwgcXVlcnksIHNlYXJjaH0pXG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kcyBhIGBxdWlja1NlYXJjaGAgcHNldWRvLWNvbHVtbiBzZWFyY2ggaW50byBhbiBPUiBvZiBMSUtFIGNvbmRpdGlvbnNcbiAgICogb3ZlciB0aGUgZGVjbGFyZWQge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UucXVpY2tTZWFyY2hDb2x1bW5zfS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZWFyY2ggYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUFueVF1ZXJ5fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgdG8gZmlsdGVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlU2VhcmNofSBhcmdzLnNlYXJjaCAtIFNlYXJjaCBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc2VhcmNoIHdhcyBoYW5kbGVkIGFzIGEgcXVpY2sgc2VhcmNoLlxuICAgKi9cbiAgYXBwbHlRdWlja1NlYXJjaCh7cXVlcnksIHNlYXJjaH0pIHtcbiAgICBjb25zdCBxdWlja1NlYXJjaENvbHVtbnMgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcikucXVpY2tTZWFyY2hDb2x1bW5zXG5cbiAgICBpZiAoIXF1aWNrU2VhcmNoQ29sdW1ucyB8fCBxdWlja1NlYXJjaENvbHVtbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoc2VhcmNoLnBhdGgubGVuZ3RoID4gMCB8fCBzZWFyY2guY29sdW1uICE9PSBRVUlDS19TRUFSQ0hfQ09MVU1OKSByZXR1cm4gZmFsc2VcblxuICAgIGlmIChzZWFyY2gub3BlcmF0b3IgIT09IFwibGlrZVwiKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKFwiU3luYyBxdWljayBzZWFyY2ggbXVzdCB1c2UgdGhlIGxpa2Ugb3BlcmF0b3IuXCIsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1xdWljay1zZWFyY2hcIn0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzZWFyY2gudmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJTeW5jIHF1aWNrIHNlYXJjaCBtdXN0IGJlIGEgc3RyaW5nLlwiLCB7Y29kZTogXCJzeW5jLWludmFsaWQtcXVpY2stc2VhcmNoXCJ9KVxuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IHNlYXJjaC52YWx1ZS50cmltKClcblxuICAgIGlmICghdHJpbW1lZFZhbHVlKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgdGFibGVTcWwgPSBxdWVyeS5kcml2ZXIucXVvdGVUYWJsZShxdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oKSlcbiAgICBjb25zdCBsaWtlVmFsdWUgPSBgJSR7dHJpbW1lZFZhbHVlfSVgXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHF1aWNrU2VhcmNoQ29sdW1ucy5tYXAoKGNvbHVtbk5hbWUpID0+IChcbiAgICAgIGAke3RhYmxlU3FsfS4ke3F1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX0gTElLRSAke3F1ZXJ5LmRyaXZlci5xdW90ZShsaWtlVmFsdWUpfWBcbiAgICApKVxuXG4gICAgcXVlcnkud2hlcmUoYCgke2NvbmRpdGlvbnMuam9pbihcIiBPUiBcIil9KWApXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gVGhlIGRlY2xhcmF0aXZlIGBzdGF0aWMgd3JpdGFibGVBdHRyaWJ1dGVzYCBwZXJtaXQgbGlzdCBsaXZlcyBvblxuICAvLyBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIHNvIGV2ZXJ5IGZyb250ZW5kLW1vZGVsIHJlc291cmNlIGNhbiBkZWNsYXJlXG4gIC8vIG9uZTsgc3luYyByZXNvdXJjZXMgaW5oZXJpdCBpdCB1bmNoYW5nZWQuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdGFibGUgY2hhbmdlLWZlZWQgcGFnZSBhZnRlciBhcHAgYXV0aG9yaXphdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gQ2hhbmdlLWZlZWQgcGFnZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucGFyYW1zKClcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuY2hhbmdlc1Njb3BlKHBhcmFtcylcblxuICAgIGF3YWl0IHRoaXMuYXV0aG9yaXplQ2hhbmdlcyh7cGFyYW1zLCBzY29wZX0pXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGFuZ2VGZWVkU2VydmljZSh7cGFyYW1zLCBzY29wZX0pLmNoYW5nZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgY2xpZW50IHN5bmMgZW52ZWxvcGVzIHRocm91Z2ggdGhlIGFwcCByZXBsYXkgc2VydmljZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gUmVwbGF5IHJlc3VsdCB3aXRoIHBlci1zeW5jIHN0YXRlcy5cbiAgICovXG4gIGFzeW5jIHJlcGxheSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJ1aWxkUmVwbGF5U2VydmljZSgpLnJlcGxheSh0aGlzLnBhcmFtcygpKVxuXG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZXJyb3JcIikgcmV0dXJuIHJlc3VsdFxuXG4gICAgcmV0dXJuIHtzdGF0dXM6IFwic3VjY2Vzc1wiLCBzeW5jczogcmVzdWx0LnN5bmNzfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgb3B0aW9uYWwgY2xpZW50LWRlY2xhcmVkIHNjb3BlIGZyb20gcmVxdWVzdCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBwYXJhbXMgLSBSZXF1ZXN0IHBhcmFtcy5cbiAgICogQHJldHVybnMge1NlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsfSBQYXJzZWQgc2NvcGUsIG9yIG51bGwgd2hlbiB0aGUgY2xpZW50IHNlbnQgbm9uZS5cbiAgICovXG4gIGNoYW5nZXNTY29wZShwYXJhbXMpIHtcbiAgICBjb25zdCBzY29wZSA9IHBhcmFtcy5zY29wZVxuXG4gICAgaWYgKHNjb3BlID09PSB1bmRlZmluZWQgfHwgc2NvcGUgPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICBpZiAodHlwZW9mIHNjb3BlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc2NvcGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgY2hhbmdlcyBzY29wZSBtdXN0IGJlIGFuIG9iamVjdCwgZ290OiAke1N0cmluZyhzY29wZSl9YClcbiAgICB9XG5cbiAgICBjb25zdCBzY29wZVBhcmFtcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoc2NvcGUpXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlID09PSBudWxsIHx8IHNjb3BlUGFyYW1zLnJlc291cmNlVHlwZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IG51bGxcbiAgICAgIDogZm9yY2VkTm9uQmxhbmtTdHJpbmcoc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlLCBcInJlc291cmNlVHlwZVwiKVxuICAgIGNvbnN0IHJlc291cmNlVHlwZXMgPSB0aGlzLmNoYW5nZXNTY29wZVJlc291cmNlVHlwZXMoc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlcylcbiAgICBjb25zdCBjb25kaXRpb25zID0gc2NvcGVQYXJhbXMuY29uZGl0aW9uc1xuXG4gICAgaWYgKCFjb25kaXRpb25zIHx8IHR5cGVvZiBjb25kaXRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoY29uZGl0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyBjaGFuZ2VzIHNjb3BlLmNvbmRpdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdDogJHtTdHJpbmcoY29uZGl0aW9ucyl9YClcbiAgICB9XG5cbiAgICByZXR1cm4ge2NvbmRpdGlvbnM6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoY29uZGl0aW9ucyksIHJlc291cmNlVHlwZSwgcmVzb3VyY2VUeXBlc31cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG9wdGlvbmFsIHJlc291cmNlLXR5cGUgbGlzdCBhbiBhbGwtdHlwZXMgc2NvcGUgZGVjbGFyZXMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gUmF3IGBzY29wZS5yZXNvdXJjZVR5cGVzYCBwYXJhbS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgbnVsbH0gRGVjbGFyZWQgcmVzb3VyY2UgdHlwZXMsIG9yIG51bGwgd2hlbiB0aGUgY2xpZW50IHNlbnQgbm9uZS5cbiAgICovXG4gIGNoYW5nZXNTY29wZVJlc291cmNlVHlwZXModmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihgU3luYyBjaGFuZ2VzIHNjb3BlLnJlc291cmNlVHlwZXMgbXVzdCBiZSBhbiBhcnJheSwgZ290OiAke1N0cmluZyh2YWx1ZSl9YClcblxuICAgIHJldHVybiB2YWx1ZS5tYXAoKHJlc291cmNlVHlwZSkgPT4gZm9yY2VkTm9uQmxhbmtTdHJpbmcocmVzb3VyY2VUeXBlLCBcInJlc291cmNlVHlwZXNcIikpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBjaGFuZ2UtZmVlZCBzZXJ2aWNlIHNlcnZpbmcgdGhpcyBjaGFuZ2VzIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBzY29wZTogU2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGx9fSBhcmdzIC0gUmVxdWVzdCBwYXJhbXMgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge3tjaGFuZ2VzOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59fSBDaGFuZ2UtZmVlZCBzZXJ2aWNlLlxuICAgKi9cbiAgY2hhbmdlRmVlZFNlcnZpY2Uoe3BhcmFtcywgc2NvcGV9KSB7XG4gICAgcmV0dXJuIG5ldyBTeW5jTW9kZWxDaGFuZ2VGZWVkU2VydmljZSh7XG4gICAgICBtb2RlbENsYXNzOiB0aGlzLnN5bmNNb2RlbENsYXNzKCksXG4gICAgICBwYXJhbXMsXG4gICAgICBzY29wZVF1ZXJ5OiAoe3F1ZXJ5fSkgPT4gdGhpcy5zY29wZUNoYW5nZXNRdWVyeSh7cGFyYW1zLCBxdWVyeSwgc2NvcGV9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBhcHAgcmVwbGF5IHNlcnZpY2UgaGFuZGxpbmcgdGhpcyByZXBsYXkgcmVxdWVzdC4gVGhlIHJlc291cmNlXG4gICAqIGFiaWxpdHksIGNvbnRleHQsIGNvbmZpZ3VyYXRpb24sIGFuZCBsb2NhbHMgYXJlIHBsdW1iZWQgaW4gdW5kZXIgdGhlXG4gICAqIGFwcC1kZWNsYXJlZCB7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNyZXBsYXlTZXJ2aWNlQXJnc30gKGFwcCBhcmdzIHdpbikgc29cbiAgICogdGhlIGRlZmF1bHQgcmVzb3VyY2Utcm91dGVkIHJlcGxheSB3b3JrcyB3aXRob3V0IHdpcmluZy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5kZWZhdWx0fSBSZXBsYXkgc2VydmljZSBpbnN0YW5jZS5cbiAgICovXG4gIGJ1aWxkUmVwbGF5U2VydmljZSgpIHtcbiAgICBjb25zdCBSZXBsYXlTZXJ2aWNlQ2xhc3MgPSB0aGlzLnJlcGxheVNlcnZpY2VDbGFzcygpXG5cbiAgICByZXR1cm4gbmV3IFJlcGxheVNlcnZpY2VDbGFzcyh7XG4gICAgICBhYmlsaXR5OiB0aGlzLmFiaWxpdHksXG4gICAgICBhYmlsaXR5Q29udGV4dDogdGhpcy5nZXRDb250ZXh0KCksXG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbnRyb2xsZXIgPyB0aGlzLmNvbnRyb2xsZXJJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb24oKSA6IHVuZGVmaW5lZCxcbiAgICAgIGxvY2FsczogdGhpcy5nZXRMb2NhbHMoKSxcbiAgICAgIC4uLnRoaXMucmVwbGF5U2VydmljZUFyZ3MoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjb25zdHJ1Y3RvciBhcmdzIGZvciB0aGUgYXBwIHJlcGxheSBzZXJ2aWNlLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBSZXBsYXkgc2VydmljZSBjb25zdHJ1Y3RvciBhcmdzLlxuICAgKi9cbiAgcmVwbGF5U2VydmljZUFyZ3MoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3luYyBtb2RlbCBjbGFzcyBiYWNraW5nIHRoZSBjaGFuZ2UgZmVlZC5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gU3luYyBtb2RlbCBjbGFzcy5cbiAgICovXG4gIHN5bmNNb2RlbENsYXNzKCkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcikuTW9kZWxDbGFzc1xuXG4gICAgaWYgKCFtb2RlbENsYXNzKSB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBtdXN0IGRlZmluZSBzdGF0aWMgTW9kZWxDbGFzc2ApXG5cbiAgICByZXR1cm4gbW9kZWxDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNoYXJlZCB1cHN0cmVhbSBpbXBvcnRlciBmb3IgdGhpcyByZXNvdXJjZSdzIGNvbmZpZ3VyYXRpb24uIEFwcHNcbiAgICogdXNlIGl0IGluc2lkZSB7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNhdXRob3JpemVDaGFuZ2VzfSAob3IgYSBsZWdhY3kgdHJpZ2dlclxuICAgKiBlbmRwb2ludCkgdG8gcnVuIHRoZSB1cHN0cmVhbSBpbXBvcnQgdGhhdCBrZWVwcyB0aGUgZmVlZCBzZWxmLXN1c3RhaW5pbmcsXG4gICAqIHdpdGggY29hbGVzY2luZyBhbmQgdGhyb3R0bGluZyBvd25lZCBieSB0aGUgZnJhbWV3b3JrLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLXVwc3RyZWFtLWltcG9ydGVyLmpzXCIpLmRlZmF1bHR9IFNoYXJlZCBpbXBvcnRlciBmb3IgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN5bmNVcHN0cmVhbUltcG9ydGVyKCkge1xuICAgIHJldHVybiBzeW5jVXBzdHJlYW1JbXBvcnRlckZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKCkpXG4gIH1cblxuICAvKipcbiAgICogQXV0aG9yaXplcyB0aGUgY3VycmVudCBjb250ZXh0IGZvciByZWFkaW5nIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcy5cbiAgICogQHBhcmFtIHt7cGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH19IF9hcmdzIC0gUmVxdWVzdCBwYXJhbXMgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gYWNjZXNzIGlzIGFsbG93ZWQ7IHRocm93cyBvdGhlcndpc2UuXG4gICAqL1xuICBhc3luYyBhdXRob3JpemVDaGFuZ2VzKF9hcmdzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY1Jlc291cmNlQmFzZSNhdXRob3JpemVDaGFuZ2VzIG11c3QgYmUgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFwcCB2aXNpYmlsaXR5IHNjb3Bpbmcgb250byB0aGUgY2hhbmdlLWZlZWQgcXVlcnkuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBxdWVyeTogaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCwgc2NvcGU6IFNlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsfX0gX2FyZ3MgLSBSZXF1ZXN0IHBhcmFtcywgZmVlZCBxdWVyeSwgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzY29wZUNoYW5nZXNRdWVyeShfYXJncykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNSZXNvdXJjZUJhc2Ujc2NvcGVDaGFuZ2VzUXVlcnkgbXVzdCBiZSBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBvbmUgcHVibGlzaGVkIGNoYW5nZSBpcyBkZWxpdmVyYWJsZSB0byBhIHVzZXItc2NvcGVcbiAgICogc3Vic2NyaXB0aW9uICh0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCdzIHBlci1kZWxpdmVyeSBhY2Nlc3MgcmUtY2hlY2spLlxuICAgKiBUaGUgZGVmYXVsdCByZXVzZXMgdGhlIGFwcCdzIGFiaWxpdHkgc2NvcGluZzogaXQgYXBwbGllc1xuICAgKiB7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNzY29wZUNoYW5nZXNRdWVyeX0gdG8gdGhlIGNoYW5nZS1mZWVkIG1vZGVsIOKAlCB3aGljaFxuICAgKiBmb3IgYW4gZW1wdHktY29uZGl0aW9ucyB1c2VyIHNjb3BlIGZhbGxzIGJhY2sgdG8gYWJpbGl0eSBzY29waW5nIOKAlCBhbmRcbiAgICogY2hlY2tzIHdoZXRoZXIgdGhlIHB1Ymxpc2hlZCBjaGFuZ2UncyBmZWVkIHJvdyBpcyB2aXNpYmxlIHdpdGhpbiB0aGF0XG4gICAqIHNjb3BlLiBBcHBzIGdldCB0aGlzIGZvciBmcmVlIGZyb20gdGhlIHNjb3BpbmcgdGhleSBhbHJlYWR5IGRlY2xhcmVkO1xuICAgKiBvdmVycmlkZSBvbmx5IGZvciBjdXN0b20gcGVyLWRlbGl2ZXJ5IHJ1bGVzLlxuICAgKlxuICAgKiBUaGUgYHN5bmNgIGFyZ3VtZW50IGlzIHRoZSBjb21wbGV0ZSBicm9hZGNhc3Qgc3luYyBlbnRyeSDigJQgaW1tdXRhYmxlXG4gICAqIHN5bmMtcm93IGlkLCBhY3Rvci1zcGVjaWZpYyBtZXRhZGF0YSwgYW5kIGFueSBvdGhlciBwdWJsaXNoZXIgZmllbGRzIOKAlFxuICAgKiB3aXRoIGByZXNvdXJjZUlkYC9gcmVzb3VyY2VUeXBlYCBub3JtYWxpemVkIHRvIHN0cmluZ3MsIHNvIGFuIG92ZXJyaWRlXG4gICAqIGNhbiBhdXRob3JpemUgY29uY3VycmVudCB0YXJnZXRlZCBhbmQgc2hhcmVkIGJyb2FkY2FzdHMgZm9yIHRoZSBzYW1lXG4gICAqIHJlc291cmNlIGlkZW50aXR5IGluZGVwZW5kZW50bHkgYnkgdGhlaXIgZXhhY3Qtcm93IGlkZW50aXR5LiBUaGUgY2hhbm5lbFxuICAgKiBuZXZlciBtdXRhdGVzIHRoZSBwdWJsaXNoZWQgZW50cnk7IG5vcm1hbGl6YXRpb24gaGFwcGVucyBvbiBhIGNvcHkuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBzY29wZTogU2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGwsIHN5bmM6IENoYW5nZURlbGl2ZXJhYmxlU3luY0VudHJ5fX0gYXJncyAtIFJlcXVlc3QgcGFyYW1zLCBzdWJzY3JpcHRpb24gc2NvcGUsIGFuZCB0aGUgcHVibGlzaGVkIHN5bmMgZW50cnkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBjaGFuZ2UgbWF5IGJlIGRlbGl2ZXJlZCB0byB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGFzeW5jIGNoYW5nZURlbGl2ZXJhYmxlKHtwYXJhbXMsIHNjb3BlLCBzeW5jfSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zeW5jTW9kZWxDbGFzcygpLndoZXJlKHt9KVxuXG4gICAgdGhpcy5zY29wZUNoYW5nZXNRdWVyeSh7cGFyYW1zLCBxdWVyeSwgc2NvcGV9KVxuICAgIHF1ZXJ5LndoZXJlKHtyZXNvdXJjZV9pZDogU3RyaW5nKHN5bmMucmVzb3VyY2VJZCksIHJlc291cmNlX3R5cGU6IFN0cmluZyhzeW5jLnJlc291cmNlVHlwZSl9KVxuXG4gICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgcXVlcnkuZmlyc3QoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcmVwbGF5IHNlcnZpY2UgY2xhc3MgaGFuZGxpbmcgcmVwbGF5IG11dGF0aW9uczogdGhlXG4gICAqIGRlY2xhcmF0aXZlIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlLlJlcGxheVNlcnZpY2VDbGFzc30gc3RhdGljIChzaGFyZWRcbiAgICogcmVzb3VyY2VzIGluY2x1ZGVkKSB3aGVuIGRlY2xhcmVkLCBvdGhlcndpc2VcbiAgICoge0BsaW5rIFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2V9LCB3aGljaCByZXNvdXJjZS1yb3V0ZXMgbXV0YXRpb25zIHRocm91Z2hcbiAgICogdGhlIHBsdW1iZWQgY29uZmlndXJhdGlvbiByZWdpc3RyeS4gQXBwcyBkZWNsYXJlIHRoZSBzdGF0aWMgaW5zdGVhZCBvZlxuICAgKiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5kZWZhdWx0fSBSZXBsYXkgc2VydmljZSBjbGFzcy5cbiAgICovXG4gIHJlcGxheVNlcnZpY2VDbGFzcygpIHtcbiAgICBjb25zdCBSZXNvdXJjZUNsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgU3luY1Jlc291cmNlQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgU2hhcmVkUmVzb3VyY2UgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlIHwgbnVsbH0gKi8gKFJlc291cmNlQ2xhc3Muc2hhcmVkUmVzb3VyY2VDbGFzcygpID8/IG51bGwpXG5cbiAgICByZXR1cm4gUmVzb3VyY2VDbGFzcy5SZXBsYXlTZXJ2aWNlQ2xhc3MgPz8gU2hhcmVkUmVzb3VyY2U/LlJlcGxheVNlcnZpY2VDbGFzcyA/PyBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,87 @@
1
+ export type SyncUpstreamImportResult<T> = {
2
+ /**
3
+ * - Whether the upstream import ran (coalesced callers share the one run's outcome); false only when the throttle window suppressed the run.
4
+ */
5
+ imported: boolean;
6
+ /**
7
+ * - The importer's return value, or undefined when skipped.
8
+ */
9
+ result: T | undefined;
10
+ };
11
+ /**
12
+ * The outcome of an SyncUpstreamImporter import call.
13
+ * @template T
14
+ * @typedef {object} SyncUpstreamImportResult
15
+ * @property {boolean} imported - Whether the upstream import ran (coalesced callers share the one run's outcome); false only when the throttle window suppressed the run.
16
+ * @property {T | undefined} result - The importer's return value, or undefined when skipped.
17
+ */
18
+ /**
19
+ * Coalesces and throttles upstream imports that keep a sync feed self-sustaining.
20
+ *
21
+ * Apps serving a sync changes feed often need a slow upstream (for example a
22
+ * legacy database) imported before the feed is served, so a pull returns fresh
23
+ * data without the client calling a bespoke trigger endpoint first. This
24
+ * importer owns the two generic mechanics that kind of trigger needs:
25
+ *
26
+ * - Coalescing: concurrent imports for the same key share one in-flight run, so
27
+ * a burst of pulls (sign-in, reconnect, several devices) starts exactly one
28
+ * upstream import.
29
+ * - Throttling: callers that may pull very frequently (auto-resync, statistics
30
+ * screens) declare `throttleMs` and repeats inside the window skip the
31
+ * upstream run, because the feed already holds everything the last import
32
+ * found. A caller that must always import (for example an explicit legacy
33
+ * endpoint) simply omits `throttleMs`; its successful run still freshens the
34
+ * shared timestamp, so subsequent throttled callers see the feed as fresh.
35
+ *
36
+ * Failures propagate to every awaiter and never start the throttle window, so
37
+ * the next call retries the upstream import.
38
+ */
39
+ export default class SyncUpstreamImporter {
40
+ maxSuccessAgeMs: number;
41
+ now: () => number;
42
+ /** @type {Map<string, Promise<SyncUpstreamImportResult<unknown>>>} In-flight import per key; the cast back to the caller's T happens at the await site. */
43
+ inFlightByKey: Map<string, Promise<SyncUpstreamImportResult<unknown>>>;
44
+ /** @type {Map<string, number>} Last successful import finish time per key. */
45
+ lastSuccessAtByKey: Map<string, number>;
46
+ /**
47
+ * Runs constructor.
48
+ * @param {object} [args] - Options.
49
+ * @param {number} [args.maxSuccessAgeMs] - How long a success timestamp is retained before being swept on the next successful import (default 24 hours, far beyond any sane throttle window). Bounds the shared importer's memory when keys vary over the server lifetime (for example `tickets:<eventId>`).
50
+ * @param {() => number} [args.now] - Clock override for specs.
51
+ */
52
+ constructor({ maxSuccessAgeMs, now }?: {
53
+ maxSuccessAgeMs?: number;
54
+ now?: () => number;
55
+ });
56
+ /**
57
+ * Runs the upstream import for the key, coalescing concurrent callers and
58
+ * skipping throttled callers while the last successful run is still fresh.
59
+ * @template T
60
+ * @param {object} args - Import args.
61
+ * @param {string} args.key - What is being imported (for example `tickets:<eventId>`); coalescing and throttling are scoped per key.
62
+ * @param {() => Promise<T>} args.importer - Performs the upstream import.
63
+ * @param {number} [args.throttleMs] - Skip the run when the last successful import for the key finished less than this long ago.
64
+ * @returns {Promise<SyncUpstreamImportResult<T>>} Import outcome.
65
+ */
66
+ import<T>({ key, importer, throttleMs }: {
67
+ key: string;
68
+ importer: () => Promise<T>;
69
+ throttleMs?: number;
70
+ }): Promise<SyncUpstreamImportResult<T>>;
71
+ /**
72
+ * Drops success timestamps past the maximum age. Runs on each successful
73
+ * import so long-lived processes do not accumulate one map entry per key
74
+ * ever imported.
75
+ * @returns {void}
76
+ */
77
+ sweepStaleSuccessTimestamps(): void;
78
+ }
79
+ /**
80
+ * Returns the shared upstream importer for a configuration, so every sync
81
+ * resource instance and legacy endpoint serving the same backend coalesces and
82
+ * throttles upstream imports together.
83
+ * @param {import("../configuration.js").default} configuration - Configuration owning the importer.
84
+ * @returns {SyncUpstreamImporter} Shared importer for the configuration.
85
+ */
86
+ export declare function syncUpstreamImporterForConfiguration(configuration: import("../configuration.js").default): SyncUpstreamImporter;
87
+ //# sourceMappingURL=sync-upstream-importer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-upstream-importer.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-upstream-importer.js"],"names":[],"mappings":"AAKG,YAAkB,wBAAwB,CADhC,CAAC,IAEX;;;;IAAoB,QAAQ,EAAjB,OAAO,CAClB;;;;IAA0B,MAAM,EAArB,CAAC,GAAG,SAAS,CAC1B;CAAA,CAAA;AAND;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,OAAO,OAAO,oBAAoB;IAQhC,eAAe;IACf,GAAG,QAJO,MAAM;IAMrB,2JAA2J;IACtJ,aAAa,EADP,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;IAGlE,8EAA8E;IACzE,kBAAkB,EADZ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAbhC;;;;;OAKG;IACH,YAAY,EAAC,eAA0B,EAAE,GAAsB,EAAC,AAJ7D,CAGF,EAFE;QAAsB,eAAe,AAArC,CACA,EADQ,MAAM,CACd;QAA4B,GAAG,AAA/B,CACF,EADU,MAAM,MAAM,CACtB;KACoE,EASpE;IAED;;;;;;;;;OASG;IACG,MAAM,CAPC,CAAC,EAOD,EAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAC,EALrC;QAAqB,GAAG,EAAhB,MAAM,CACd;QAA+B,QAAQ,EAA/B,MAAM,OAAO,CAAC,CAAC,CAAC,CACxB;QAAsB,UAAU,AAAhC,CACA,EADQ,MAAM,CACd;KAEqC,GAF3B,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CA4BhD;IAED;;;;;OAKG;IACH,2BAA2B,IAFd,IAAI,CAQhB;CACF;AAKD;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAAC,aAAa,EAHvD,OAAO,qBAAqB,EAAE,OAGyB,GAFrD,oBAAoB,CAWhC"}
@@ -0,0 +1,106 @@
1
+ // @ts-check
2
+ /**
3
+ * The outcome of an SyncUpstreamImporter import call.
4
+ * @template T
5
+ * @typedef {object} SyncUpstreamImportResult
6
+ * @property {boolean} imported - Whether the upstream import ran (coalesced callers share the one run's outcome); false only when the throttle window suppressed the run.
7
+ * @property {T | undefined} result - The importer's return value, or undefined when skipped.
8
+ */
9
+ /**
10
+ * Coalesces and throttles upstream imports that keep a sync feed self-sustaining.
11
+ *
12
+ * Apps serving a sync changes feed often need a slow upstream (for example a
13
+ * legacy database) imported before the feed is served, so a pull returns fresh
14
+ * data without the client calling a bespoke trigger endpoint first. This
15
+ * importer owns the two generic mechanics that kind of trigger needs:
16
+ *
17
+ * - Coalescing: concurrent imports for the same key share one in-flight run, so
18
+ * a burst of pulls (sign-in, reconnect, several devices) starts exactly one
19
+ * upstream import.
20
+ * - Throttling: callers that may pull very frequently (auto-resync, statistics
21
+ * screens) declare `throttleMs` and repeats inside the window skip the
22
+ * upstream run, because the feed already holds everything the last import
23
+ * found. A caller that must always import (for example an explicit legacy
24
+ * endpoint) simply omits `throttleMs`; its successful run still freshens the
25
+ * shared timestamp, so subsequent throttled callers see the feed as fresh.
26
+ *
27
+ * Failures propagate to every awaiter and never start the throttle window, so
28
+ * the next call retries the upstream import.
29
+ */
30
+ export default class SyncUpstreamImporter {
31
+ /**
32
+ * Runs constructor.
33
+ * @param {object} [args] - Options.
34
+ * @param {number} [args.maxSuccessAgeMs] - How long a success timestamp is retained before being swept on the next successful import (default 24 hours, far beyond any sane throttle window). Bounds the shared importer's memory when keys vary over the server lifetime (for example `tickets:<eventId>`).
35
+ * @param {() => number} [args.now] - Clock override for specs.
36
+ */
37
+ constructor({ maxSuccessAgeMs = 86400000, now = () => Date.now() } = {}) {
38
+ this.maxSuccessAgeMs = maxSuccessAgeMs;
39
+ this.now = now;
40
+ /** @type {Map<string, Promise<SyncUpstreamImportResult<unknown>>>} In-flight import per key; the cast back to the caller's T happens at the await site. */
41
+ this.inFlightByKey = new Map();
42
+ /** @type {Map<string, number>} Last successful import finish time per key. */
43
+ this.lastSuccessAtByKey = new Map();
44
+ }
45
+ /**
46
+ * Runs the upstream import for the key, coalescing concurrent callers and
47
+ * skipping throttled callers while the last successful run is still fresh.
48
+ * @template T
49
+ * @param {object} args - Import args.
50
+ * @param {string} args.key - What is being imported (for example `tickets:<eventId>`); coalescing and throttling are scoped per key.
51
+ * @param {() => Promise<T>} args.importer - Performs the upstream import.
52
+ * @param {number} [args.throttleMs] - Skip the run when the last successful import for the key finished less than this long ago.
53
+ * @returns {Promise<SyncUpstreamImportResult<T>>} Import outcome.
54
+ */
55
+ async import({ key, importer, throttleMs }) {
56
+ const inFlight = this.inFlightByKey.get(key);
57
+ if (inFlight)
58
+ return /** @type {SyncUpstreamImportResult<T>} */ (await inFlight);
59
+ if (typeof throttleMs === "number") {
60
+ const lastSuccessAt = this.lastSuccessAtByKey.get(key);
61
+ if (lastSuccessAt !== undefined && this.now() - lastSuccessAt < throttleMs) {
62
+ return { imported: false, result: undefined };
63
+ }
64
+ }
65
+ const runPromise = (async () => {
66
+ const result = await importer();
67
+ this.lastSuccessAtByKey.set(key, this.now());
68
+ this.sweepStaleSuccessTimestamps();
69
+ return { imported: true, result };
70
+ })();
71
+ const trackedPromise = runPromise.finally(() => this.inFlightByKey.delete(key));
72
+ this.inFlightByKey.set(key, trackedPromise);
73
+ return await trackedPromise;
74
+ }
75
+ /**
76
+ * Drops success timestamps past the maximum age. Runs on each successful
77
+ * import so long-lived processes do not accumulate one map entry per key
78
+ * ever imported.
79
+ * @returns {void}
80
+ */
81
+ sweepStaleSuccessTimestamps() {
82
+ const now = this.now();
83
+ for (const [key, at] of this.lastSuccessAtByKey) {
84
+ if (now - at >= this.maxSuccessAgeMs)
85
+ this.lastSuccessAtByKey.delete(key);
86
+ }
87
+ }
88
+ }
89
+ /** @type {Map<import("../configuration.js").default, SyncUpstreamImporter>} Shared importer per configuration. */
90
+ const importersByConfiguration = new Map();
91
+ /**
92
+ * Returns the shared upstream importer for a configuration, so every sync
93
+ * resource instance and legacy endpoint serving the same backend coalesces and
94
+ * throttles upstream imports together.
95
+ * @param {import("../configuration.js").default} configuration - Configuration owning the importer.
96
+ * @returns {SyncUpstreamImporter} Shared importer for the configuration.
97
+ */
98
+ export function syncUpstreamImporterForConfiguration(configuration) {
99
+ let importer = importersByConfiguration.get(configuration);
100
+ if (!importer) {
101
+ importer = new SyncUpstreamImporter();
102
+ importersByConfiguration.set(configuration, importer);
103
+ }
104
+ return importer;
105
+ }
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy11cHN0cmVhbS1pbXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3N5bmMtdXBzdHJlYW0taW1wb3J0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sb0JBQW9CO0lBQ3ZDOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLGVBQWUsR0FBRyxRQUFRLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBQyxHQUFHLEVBQUU7UUFDbkUsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUE7UUFDdEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFFZCwySkFBMko7UUFDM0osSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTlCLDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUNyQyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRTVDLElBQUksUUFBUTtZQUFFLE9BQU8sMENBQTBDLENBQUMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFBO1FBRWhGLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUV0RCxJQUFJLGFBQWEsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGFBQWEsR0FBRyxVQUFVLEVBQUUsQ0FBQztnQkFDM0UsT0FBTyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxDQUFBO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsRUFBRSxDQUFBO1lBRS9CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBQzVDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFBO1lBRWxDLE9BQU8sRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFBO1FBQ2pDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDSixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFFL0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBRTNDLE9BQU8sTUFBTSxjQUFjLENBQUE7SUFDN0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsMkJBQTJCO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUV0QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDaEQsSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlO2dCQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDM0UsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELGtIQUFrSDtBQUNsSCxNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFMUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9DQUFvQyxDQUFDLGFBQWE7SUFDaEUsSUFBSSxRQUFRLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRTFELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLFFBQVEsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUE7UUFDckMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIGFuIFN5bmNVcHN0cmVhbUltcG9ydGVyIGltcG9ydCBjYWxsLlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNVcHN0cmVhbUltcG9ydFJlc3VsdFxuICogQHByb3BlcnR5IHtib29sZWFufSBpbXBvcnRlZCAtIFdoZXRoZXIgdGhlIHVwc3RyZWFtIGltcG9ydCByYW4gKGNvYWxlc2NlZCBjYWxsZXJzIHNoYXJlIHRoZSBvbmUgcnVuJ3Mgb3V0Y29tZSk7IGZhbHNlIG9ubHkgd2hlbiB0aGUgdGhyb3R0bGUgd2luZG93IHN1cHByZXNzZWQgdGhlIHJ1bi5cbiAqIEBwcm9wZXJ0eSB7VCB8IHVuZGVmaW5lZH0gcmVzdWx0IC0gVGhlIGltcG9ydGVyJ3MgcmV0dXJuIHZhbHVlLCBvciB1bmRlZmluZWQgd2hlbiBza2lwcGVkLlxuICovXG5cbi8qKlxuICogQ29hbGVzY2VzIGFuZCB0aHJvdHRsZXMgdXBzdHJlYW0gaW1wb3J0cyB0aGF0IGtlZXAgYSBzeW5jIGZlZWQgc2VsZi1zdXN0YWluaW5nLlxuICpcbiAqIEFwcHMgc2VydmluZyBhIHN5bmMgY2hhbmdlcyBmZWVkIG9mdGVuIG5lZWQgYSBzbG93IHVwc3RyZWFtIChmb3IgZXhhbXBsZSBhXG4gKiBsZWdhY3kgZGF0YWJhc2UpIGltcG9ydGVkIGJlZm9yZSB0aGUgZmVlZCBpcyBzZXJ2ZWQsIHNvIGEgcHVsbCByZXR1cm5zIGZyZXNoXG4gKiBkYXRhIHdpdGhvdXQgdGhlIGNsaWVudCBjYWxsaW5nIGEgYmVzcG9rZSB0cmlnZ2VyIGVuZHBvaW50IGZpcnN0LiBUaGlzXG4gKiBpbXBvcnRlciBvd25zIHRoZSB0d28gZ2VuZXJpYyBtZWNoYW5pY3MgdGhhdCBraW5kIG9mIHRyaWdnZXIgbmVlZHM6XG4gKlxuICogLSBDb2FsZXNjaW5nOiBjb25jdXJyZW50IGltcG9ydHMgZm9yIHRoZSBzYW1lIGtleSBzaGFyZSBvbmUgaW4tZmxpZ2h0IHJ1biwgc29cbiAqICAgYSBidXJzdCBvZiBwdWxscyAoc2lnbi1pbiwgcmVjb25uZWN0LCBzZXZlcmFsIGRldmljZXMpIHN0YXJ0cyBleGFjdGx5IG9uZVxuICogICB1cHN0cmVhbSBpbXBvcnQuXG4gKiAtIFRocm90dGxpbmc6IGNhbGxlcnMgdGhhdCBtYXkgcHVsbCB2ZXJ5IGZyZXF1ZW50bHkgKGF1dG8tcmVzeW5jLCBzdGF0aXN0aWNzXG4gKiAgIHNjcmVlbnMpIGRlY2xhcmUgYHRocm90dGxlTXNgIGFuZCByZXBlYXRzIGluc2lkZSB0aGUgd2luZG93IHNraXAgdGhlXG4gKiAgIHVwc3RyZWFtIHJ1biwgYmVjYXVzZSB0aGUgZmVlZCBhbHJlYWR5IGhvbGRzIGV2ZXJ5dGhpbmcgdGhlIGxhc3QgaW1wb3J0XG4gKiAgIGZvdW5kLiBBIGNhbGxlciB0aGF0IG11c3QgYWx3YXlzIGltcG9ydCAoZm9yIGV4YW1wbGUgYW4gZXhwbGljaXQgbGVnYWN5XG4gKiAgIGVuZHBvaW50KSBzaW1wbHkgb21pdHMgYHRocm90dGxlTXNgOyBpdHMgc3VjY2Vzc2Z1bCBydW4gc3RpbGwgZnJlc2hlbnMgdGhlXG4gKiAgIHNoYXJlZCB0aW1lc3RhbXAsIHNvIHN1YnNlcXVlbnQgdGhyb3R0bGVkIGNhbGxlcnMgc2VlIHRoZSBmZWVkIGFzIGZyZXNoLlxuICpcbiAqIEZhaWx1cmVzIHByb3BhZ2F0ZSB0byBldmVyeSBhd2FpdGVyIGFuZCBuZXZlciBzdGFydCB0aGUgdGhyb3R0bGUgd2luZG93LCBzb1xuICogdGhlIG5leHQgY2FsbCByZXRyaWVzIHRoZSB1cHN0cmVhbSBpbXBvcnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNVcHN0cmVhbUltcG9ydGVyIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubWF4U3VjY2Vzc0FnZU1zXSAtIEhvdyBsb25nIGEgc3VjY2VzcyB0aW1lc3RhbXAgaXMgcmV0YWluZWQgYmVmb3JlIGJlaW5nIHN3ZXB0IG9uIHRoZSBuZXh0IHN1Y2Nlc3NmdWwgaW1wb3J0IChkZWZhdWx0IDI0IGhvdXJzLCBmYXIgYmV5b25kIGFueSBzYW5lIHRocm90dGxlIHdpbmRvdykuIEJvdW5kcyB0aGUgc2hhcmVkIGltcG9ydGVyJ3MgbWVtb3J5IHdoZW4ga2V5cyB2YXJ5IG92ZXIgdGhlIHNlcnZlciBsaWZldGltZSAoZm9yIGV4YW1wbGUgYHRpY2tldHM6PGV2ZW50SWQ+YCkuXG4gICAqIEBwYXJhbSB7KCkgPT4gbnVtYmVyfSBbYXJncy5ub3ddIC0gQ2xvY2sgb3ZlcnJpZGUgZm9yIHNwZWNzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe21heFN1Y2Nlc3NBZ2VNcyA9IDg2NDAwMDAwLCBub3cgPSAoKSA9PiBEYXRlLm5vdygpfSA9IHt9KSB7XG4gICAgdGhpcy5tYXhTdWNjZXNzQWdlTXMgPSBtYXhTdWNjZXNzQWdlTXNcbiAgICB0aGlzLm5vdyA9IG5vd1xuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBQcm9taXNlPFN5bmNVcHN0cmVhbUltcG9ydFJlc3VsdDx1bmtub3duPj4+fSBJbi1mbGlnaHQgaW1wb3J0IHBlciBrZXk7IHRoZSBjYXN0IGJhY2sgdG8gdGhlIGNhbGxlcidzIFQgaGFwcGVucyBhdCB0aGUgYXdhaXQgc2l0ZS4gKi9cbiAgICB0aGlzLmluRmxpZ2h0QnlLZXkgPSBuZXcgTWFwKClcblxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgbnVtYmVyPn0gTGFzdCBzdWNjZXNzZnVsIGltcG9ydCBmaW5pc2ggdGltZSBwZXIga2V5LiAqL1xuICAgIHRoaXMubGFzdFN1Y2Nlc3NBdEJ5S2V5ID0gbmV3IE1hcCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgdXBzdHJlYW0gaW1wb3J0IGZvciB0aGUga2V5LCBjb2FsZXNjaW5nIGNvbmN1cnJlbnQgY2FsbGVycyBhbmRcbiAgICogc2tpcHBpbmcgdGhyb3R0bGVkIGNhbGxlcnMgd2hpbGUgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBydW4gaXMgc3RpbGwgZnJlc2guXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSW1wb3J0IGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmtleSAtIFdoYXQgaXMgYmVpbmcgaW1wb3J0ZWQgKGZvciBleGFtcGxlIGB0aWNrZXRzOjxldmVudElkPmApOyBjb2FsZXNjaW5nIGFuZCB0aHJvdHRsaW5nIGFyZSBzY29wZWQgcGVyIGtleS5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBhcmdzLmltcG9ydGVyIC0gUGVyZm9ybXMgdGhlIHVwc3RyZWFtIGltcG9ydC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnRocm90dGxlTXNdIC0gU2tpcCB0aGUgcnVuIHdoZW4gdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBpbXBvcnQgZm9yIHRoZSBrZXkgZmluaXNoZWQgbGVzcyB0aGFuIHRoaXMgbG9uZyBhZ28uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNVcHN0cmVhbUltcG9ydFJlc3VsdDxUPj59IEltcG9ydCBvdXRjb21lLlxuICAgKi9cbiAgYXN5bmMgaW1wb3J0KHtrZXksIGltcG9ydGVyLCB0aHJvdHRsZU1zfSkge1xuICAgIGNvbnN0IGluRmxpZ2h0ID0gdGhpcy5pbkZsaWdodEJ5S2V5LmdldChrZXkpXG5cbiAgICBpZiAoaW5GbGlnaHQpIHJldHVybiAvKiogQHR5cGUge1N5bmNVcHN0cmVhbUltcG9ydFJlc3VsdDxUPn0gKi8gKGF3YWl0IGluRmxpZ2h0KVxuXG4gICAgaWYgKHR5cGVvZiB0aHJvdHRsZU1zID09PSBcIm51bWJlclwiKSB7XG4gICAgICBjb25zdCBsYXN0U3VjY2Vzc0F0ID0gdGhpcy5sYXN0U3VjY2Vzc0F0QnlLZXkuZ2V0KGtleSlcblxuICAgICAgaWYgKGxhc3RTdWNjZXNzQXQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm5vdygpIC0gbGFzdFN1Y2Nlc3NBdCA8IHRocm90dGxlTXMpIHtcbiAgICAgICAgcmV0dXJuIHtpbXBvcnRlZDogZmFsc2UsIHJlc3VsdDogdW5kZWZpbmVkfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJ1blByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW1wb3J0ZXIoKVxuXG4gICAgICB0aGlzLmxhc3RTdWNjZXNzQXRCeUtleS5zZXQoa2V5LCB0aGlzLm5vdygpKVxuICAgICAgdGhpcy5zd2VlcFN0YWxlU3VjY2Vzc1RpbWVzdGFtcHMoKVxuXG4gICAgICByZXR1cm4ge2ltcG9ydGVkOiB0cnVlLCByZXN1bHR9XG4gICAgfSkoKVxuICAgIGNvbnN0IHRyYWNrZWRQcm9taXNlID0gcnVuUHJvbWlzZS5maW5hbGx5KCgpID0+IHRoaXMuaW5GbGlnaHRCeUtleS5kZWxldGUoa2V5KSlcblxuICAgIHRoaXMuaW5GbGlnaHRCeUtleS5zZXQoa2V5LCB0cmFja2VkUHJvbWlzZSlcblxuICAgIHJldHVybiBhd2FpdCB0cmFja2VkUHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIHN1Y2Nlc3MgdGltZXN0YW1wcyBwYXN0IHRoZSBtYXhpbXVtIGFnZS4gUnVucyBvbiBlYWNoIHN1Y2Nlc3NmdWxcbiAgICogaW1wb3J0IHNvIGxvbmctbGl2ZWQgcHJvY2Vzc2VzIGRvIG5vdCBhY2N1bXVsYXRlIG9uZSBtYXAgZW50cnkgcGVyIGtleVxuICAgKiBldmVyIGltcG9ydGVkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN3ZWVwU3RhbGVTdWNjZXNzVGltZXN0YW1wcygpIHtcbiAgICBjb25zdCBub3cgPSB0aGlzLm5vdygpXG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGF0XSBvZiB0aGlzLmxhc3RTdWNjZXNzQXRCeUtleSkge1xuICAgICAgaWYgKG5vdyAtIGF0ID49IHRoaXMubWF4U3VjY2Vzc0FnZU1zKSB0aGlzLmxhc3RTdWNjZXNzQXRCeUtleS5kZWxldGUoa2V5KVxuICAgIH1cbiAgfVxufVxuXG4vKiogQHR5cGUge01hcDxpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIFN5bmNVcHN0cmVhbUltcG9ydGVyPn0gU2hhcmVkIGltcG9ydGVyIHBlciBjb25maWd1cmF0aW9uLiAqL1xuY29uc3QgaW1wb3J0ZXJzQnlDb25maWd1cmF0aW9uID0gbmV3IE1hcCgpXG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2hhcmVkIHVwc3RyZWFtIGltcG9ydGVyIGZvciBhIGNvbmZpZ3VyYXRpb24sIHNvIGV2ZXJ5IHN5bmNcbiAqIHJlc291cmNlIGluc3RhbmNlIGFuZCBsZWdhY3kgZW5kcG9pbnQgc2VydmluZyB0aGUgc2FtZSBiYWNrZW5kIGNvYWxlc2NlcyBhbmRcbiAqIHRocm90dGxlcyB1cHN0cmVhbSBpbXBvcnRzIHRvZ2V0aGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIG93bmluZyB0aGUgaW1wb3J0ZXIuXG4gKiBAcmV0dXJucyB7U3luY1Vwc3RyZWFtSW1wb3J0ZXJ9IFNoYXJlZCBpbXBvcnRlciBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW5jVXBzdHJlYW1JbXBvcnRlckZvckNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xuICBsZXQgaW1wb3J0ZXIgPSBpbXBvcnRlcnNCeUNvbmZpZ3VyYXRpb24uZ2V0KGNvbmZpZ3VyYXRpb24pXG5cbiAgaWYgKCFpbXBvcnRlcikge1xuICAgIGltcG9ydGVyID0gbmV3IFN5bmNVcHN0cmVhbUltcG9ydGVyKClcbiAgICBpbXBvcnRlcnNCeUNvbmZpZ3VyYXRpb24uc2V0KGNvbmZpZ3VyYXRpb24sIGltcG9ydGVyKVxuICB9XG5cbiAgcmV0dXJuIGltcG9ydGVyXG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"sync-websocket-channel.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-websocket-channel.js"],"names":[],"mappings":"AAEA,OAAO,yBAAyB,MAAM,qCAAqC,CAAA;AAM3E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,yBAAyB;IACzE;;;OAGG;IACH,MAAM,EAFI,OAAO,yBAAyB,EAAE,sBAAsB,GAAG,IAAI,CAE5D;IAEb;;;;;;;OAOG;IACH,MAAM,CAAC,yBAAyB,CAAC,aAAa,EAHnC,OAAO,qBAAqB,EAAE,OAGK,GAFjC,IAAI,CAOhB;IAED;;;;;;OAMG;IACG,YAAY,IAFL,OAAO,CAAC,OAAO,CAAC,CAW5B;IAED;;;;;;OAMG;IACG,iBAAiB,IAFV,OAAO,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAkC9D;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,eAAe,EAHZ,OAAO,qCAAqC,EAAE,kBAGlC,GAFV,OAAO,CAgCnB;IAED;;;;;;;;;;;;OAYG;IACG,gBAAgB,CAAC,IAAI,EAJhB,OAAO,qCAAqC,EAAE,kBAI9B,EAAE,IAAI,AAH9B,CACA,EADQ;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAGK,GAFpB,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;OAIG;IACH,YAAY,IAFC,OAAO,CAInB;IAED;;;;;;;;OAQG;IACG,yBAAyB,CAAC,IAAI,EAHzB,OAAO,qCAAqC,EAAE,kBAGrB,GAFvB,OAAO,CAAC,OAAO,qCAAqC,EAAE,kBAAkB,GAAG,IAAI,CAAC,CAiD5F;IAED;;;OAGG;IACH,aAAa,IAFA,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAIzD;CACF"}
1
+ {"version":3,"file":"sync-websocket-channel.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-websocket-channel.js"],"names":[],"mappings":"AAEA,OAAO,yBAAyB,MAAM,qCAAqC,CAAA;AAM3E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,yBAAyB;IACzE;;;OAGG;IACH,MAAM,EAFI,OAAO,yBAAyB,EAAE,sBAAsB,GAAG,IAAI,CAE5D;IAEb;;;;;;;OAOG;IACH,MAAM,CAAC,yBAAyB,CAAC,aAAa,EAHnC,OAAO,qBAAqB,EAAE,OAGK,GAFjC,IAAI,CAOhB;IAED;;;;;;OAMG;IACG,YAAY,IAFL,OAAO,CAAC,OAAO,CAAC,CAW5B;IAED;;;;;;OAMG;IACG,iBAAiB,IAFV,OAAO,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAmC9D;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,eAAe,EAHZ,OAAO,qCAAqC,EAAE,kBAGlC,GAFV,OAAO,CAgCnB;IAED;;;;;;;;;;;;OAYG;IACG,gBAAgB,CAAC,IAAI,EAJhB,OAAO,qCAAqC,EAAE,kBAI9B,EAAE,IAAI,AAH9B,CACA,EADQ;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAGK,GAFpB,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;OAIG;IACH,YAAY,IAFC,OAAO,CAInB;IAED;;;;;;;;OAQG;IACG,yBAAyB,CAAC,IAAI,EAHzB,OAAO,qCAAqC,EAAE,kBAGrB,GAFvB,OAAO,CAAC,OAAO,qCAAqC,EAAE,kBAAkB,GAAG,IAAI,CAAC,CAiD5F;IAED;;;OAGG;IACH,aAAa,IAFA,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAIzD;CACF"}
@@ -71,6 +71,7 @@ export default class SyncWebsocketChannel extends VelociousWebsocketChannel {
71
71
  const ability = await configuration.resolveAbility({ params, request });
72
72
  return new ResourceClass({
73
73
  ability,
74
+ configuration,
74
75
  context: {
75
76
  ...(ability?.getContext() || {}),
76
77
  params,
@@ -228,4 +229,4 @@ export default class SyncWebsocketChannel extends VelociousWebsocketChannel {
228
229
  return { scope: this._scope, userScope: this._isUserScope() };
229
230
  }
230
231
  }
231
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy13ZWJzb2NrZXQtY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3N5bmMtd2Vic29ja2V0LWNoYW5uZWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8seUJBQXlCLE1BQU0scUNBQXFDLENBQUE7QUFDM0UsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFN0QsK0VBQStFO0FBQy9FLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUU5Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sb0JBQXFCLFNBQVEseUJBQXlCO0lBQ3pFOzs7T0FHRztJQUNILE1BQU0sR0FBRyxJQUFJLENBQUE7SUFFYjs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLHlCQUF5QixDQUFDLGFBQWE7UUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQUUsT0FBTTtRQUVwRyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDM0MsYUFBYSxDQUFDLHdCQUF3QixDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3RFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQy9DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxD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QUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFDLENBQUE7SUFDN0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDaGFubmVsIGZyb20gXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5pbXBvcnQge1ZFTE9DSU9VU19TWU5DX0NIQU5ORUx9IGZyb20gXCIuL3N5bmMtY2hhbm5lbC1uYW1lLmpzXCJcblxuLyoqIENvbmZpZ3VyYXRpb25zIHdob3NlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLiAqL1xuY29uc3QgcmVnaXN0ZXJlZENvbmZpZ3VyYXRpb25zID0gbmV3IFdlYWtTZXQoKVxuXG4vKipcbiAqIEZyYW1ld29yay1vd25lZCB3ZWJzb2NrZXQgY2hhbm5lbCBmb3Igc3luY2VkIHJlc291cmNlc1xuICogKHtAbGluayBWRUxPQ0lPVVNfU1lOQ19DSEFOTkVMfSkuXG4gKlxuICogU3Vic2NyaWJlIHBhcmFtcyBtaXJyb3IgYSBkZWNsYXJlZCBwdWxsIHNjb3BlIOKAlCBge3Jlc291cmNlVHlwZSwgY29uZGl0aW9uc31gXG4gKiBwbHVzIHRoZSBjbGllbnQtaW5qZWN0ZWQgYGF1dGhlbnRpY2F0aW9uVG9rZW5gIOKAlCBhbmQgc3Vic2NyaWJlLXRpbWVcbiAqIGF1dGhvcml6YXRpb24gZGVsZWdhdGVzIHRvIHRoZSBhcHAgc3luYyByZXNvdXJjZSdzIGV4aXN0aW5nXG4gKiBgYXV0aG9yaXplQ2hhbmdlcyh7cGFyYW1zLCBzY29wZX0pYCAodGhlIGBzeW5jLmFwaS5yZXNvdXJjZUNsYXNzYCksIHNvIGFwcHNcbiAqIGhvb2sgaW4gdGhyb3VnaCB0aGUgYXV0aG9yaXphdGlvbiB0aGV5IGFscmVhZHkgZGVjbGFyZWQgaW5zdGVhZCBvZiB3cml0aW5nXG4gKiB0aGVpciBvd24gY2hhbm5lbCBjbGFzc2VzLiBCcm9hZGNhc3Qgcm91dGluZyBtYXRjaGVzIHRoZSBwdWJsaXNoZXInc1xuICogc2NvcGluZyBwYXJhbXMgYWdhaW5zdCB0aGUgc3Vic2NyaXB0aW9uJ3Mgc2NvcGUgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY1dlYnNvY2tldENoYW5uZWwgZXh0ZW5kcyBWZWxvY2lvdXNXZWJzb2NrZXRDaGFubmVsIHtcbiAgLyoqXG4gICAqIFNjb3BlIHRoZSBzdWJzY3JpcHRpb24gd2FzIGF1dGhvcml6ZWQgZm9yLCBzZXQgYnkge0BsaW5rIFN5bmNXZWJzb2NrZXRDaGFubmVsI2NhblN1YnNjcmliZX0uXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtcmVzb3VyY2UtYmFzZS5qc1wiKS5TZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH1cbiAgICovXG4gIF9zY29wZSA9IG51bGxcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBmcmFtZXdvcmsgc3luYyBjaGFubmVsIG9uIGEgY29uZmlndXJhdGlvbiBkZWNsYXJpbmcgYVxuICAgKiBgc3luYy5hcGlgIGJsb2NrIChndWFyZGVkIHNvIHJlcGVhdGVkIHNlcnZlciBib290cyB3aXRoIHRoZSBzYW1lXG4gICAqIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaXQgb25seSBvbmNlKS4gTm8tb3Agd2l0aG91dCBgc3luYy5hcGlgIOKAlCB0aGVcbiAgICogY2hhbm5lbCBhdXRob3JpemVzIHRocm91Z2ggdGhlIGFwcCdzIHN5bmMgcmVzb3VyY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJGcm9tQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uLmdldFN5bmNDb25maWd1cmF0aW9uKCkuYXBpIHx8IHJlZ2lzdGVyZWRDb25maWd1cmF0aW9ucy5oYXMoY29uZmlndXJhdGlvbikpIHJldHVyblxuXG4gICAgcmVnaXN0ZXJlZENvbmZpZ3VyYXRpb25zLmFkZChjb25maWd1cmF0aW9uKVxuICAgIGNvbmZpZ3VyYXRpb24ucmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsKFZFTE9DSU9VU19TWU5DX0NIQU5ORUwsIHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogQXV0aG9yaXplcyB0aGUgc3Vic2NyaXB0aW9uIHRocm91Z2ggdGhlIGFwcCBzeW5jIHJlc291cmNlOiB0aGUgc3Vic2NyaWJlXG4gICAqIHBhcmFtcyBhcmUgcGFyc2VkIGludG8gdGhlIHNhbWUgc2VyaWFsaXplZCBzY29wZSB0aGUgY2hhbmdlcyBlbmRwb2ludFxuICAgKiBjb25zdW1lcyBhbmQgcGFzc2VkIHRvIHRoZSByZXNvdXJjZSdzIGBhdXRob3JpemVDaGFuZ2VzKHtwYXJhbXMsIHNjb3BlfSlgLlxuICAgKiBEZW5pYWxzIGFuZCBtYWxmb3JtZWQgc2NvcGVzIHRocm93LCByZWplY3RpbmcgdGhlIHN1YnNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIHN1YnNjcmlwdGlvbiBpcyBhbGxvd2VkLlxuICAgKi9cbiAgYXN5bmMgY2FuU3Vic2NyaWJlKCkge1xuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5idWlsZFN5bmNSZXNvdXJjZSgpXG4gICAgY29uc3Qgc2NvcGUgPSByZXNvdXJjZS5jaGFuZ2VzU2NvcGUoe3Njb3BlOiB7Y29uZGl0aW9uczogdGhpcy5wYXJhbXMuY29uZGl0aW9ucywgcmVzb3VyY2VUeXBlOiB0aGlzLnBhcmFtcy5yZXNvdXJjZVR5cGUsIHJlc291cmNlVHlwZXM6IHRoaXMucGFyYW1zLnJlc291cmNlVHlwZXN9fSlcblxuICAgIGF3YWl0IHJlc291cmNlLmF1dGhvcml6ZUNoYW5nZXMoe3BhcmFtczogdGhpcy5wYXJhbXMsIHNjb3BlfSlcblxuICAgIHRoaXMuX3Njb3BlID0gc2NvcGVcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBhcHAgc3luYyByZXNvdXJjZSBhdXRob3JpemluZyB0aGlzIHN1YnNjcmlwdGlvbiwgbWlycm9yaW5nIHRoZVxuICAgKiBzeW5jIHRyYW5zcG9ydCBjb250cm9sbGVyJ3MgcmVzb3VyY2UgY29uc3RydWN0aW9uIHdpdGggdGhlIGFiaWxpdHlcbiAgICogcmVzb2x2ZWQgZnJvbSB0aGUgc3Vic2NyaWJlIHBhcmFtcyAod2hpY2ggY2FycnkgdGhlIGNsaWVudC1pbmplY3RlZFxuICAgKiBhdXRoZW50aWNhdGlvblRva2VuKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9zeW5jLXJlc291cmNlLWJhc2UuanNcIikuZGVmYXVsdD59IEFwcCBzeW5jIHJlc291cmNlIGluc3RhbmNlLlxuICAgKi9cbiAgYXN5bmMgYnVpbGRTeW5jUmVzb3VyY2UoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuc2Vzc2lvbi5jb25maWd1cmF0aW9uXG4gICAgY29uc3QgYXBpID0gY29uZmlndXJhdGlvbi5nZXRTeW5jQ29uZmlndXJhdGlvbigpLmFwaVxuXG4gICAgaWYgKCFhcGkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7VkVMT0NJT1VTX1NZTkNfQ0hBTk5FTH0gY2hhbm5lbCByZXF1aXJlcyBhIHN5bmMuYXBpIGNvbmZpZ3VyYXRpb24gYmxvY2sgd2l0aCB0aGUgYXBwJ3Mgc3luYyByZXNvdXJjZSBjbGFzc2ApXG4gICAgfVxuXG4gICAgLy8gTmFycm93cyB0aGUgY29uZmlndXJlZCByZXNvdXJjZSBjbGFzcyB0byB0aGUgc3luYyByZXNvdXJjZSBjb250cmFjdFxuICAgIC8vIChjaGFuZ2VzU2NvcGUvYXV0aG9yaXplQ2hhbmdlcykgdGhlIHN5bmMuYXBpIHZhbGlkYXRpb24gcmVxdWlyZXMuXG4gICAgY29uc3QgUmVzb3VyY2VDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vc3luYy1yZXNvdXJjZS1iYXNlLmpzXCIpLmRlZmF1bHR9ICovIChhcGkucmVzb3VyY2VDbGFzcylcbiAgICAvLyBOYXJyb3dzIHRoZSB3ZWJzb2NrZXQgc3Vic2NyaWJlIHBhcmFtcyB0byB0aGUgcmVzb3VyY2UgcGFyYW1zIGNvbnRyYWN0LlxuICAgIGNvbnN0IHBhcmFtcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5WZWxvY2lvdXNQYXJhbXN9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh0aGlzLnBhcmFtcykpXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuc2Vzc2lvbi51cGdyYWRlUmVxdWVzdFxuICAgIGNvbnN0IGFiaWxpdHkgPSBhd2FpdCBjb25maWd1cmF0aW9uLnJlc29sdmVBYmlsaXR5KHtwYXJhbXMsIHJlcXVlc3R9KVxuXG4gICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNsYXNzKHtcbiAgICAgIGFiaWxpdHksXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIC4uLihhYmlsaXR5Py5nZXRDb250ZXh0KCkgfHwge30pLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH0sXG4gICAgICBsb2NhbHM6IGFiaWxpdHk/LmdldExvY2FscygpIHx8IHt9LFxuICAgICAgbW9kZWxDbGFzczogUmVzb3VyY2VDbGFzcy5Nb2RlbENsYXNzLFxuICAgICAgbW9kZWxOYW1lOiBSZXNvdXJjZUNsYXNzLk1vZGVsQ2xhc3M/Lm5hbWUsXG4gICAgICBwYXJhbXMsXG4gICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb246IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSAqLyAoe1xuICAgICAgICBhdHRyaWJ1dGVzOiBSZXNvdXJjZUNsYXNzLmF0dHJpYnV0ZXMgfHwge30sXG4gICAgICAgIHN5bmM6IHtlbmFibGVkOiB0cnVlfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlcyBhIHB1Ymxpc2hlciBicm9hZGNhc3QgdG8gdGhpcyBzdWJzY3JpcHRpb24gd2hlbiB0aGUgcHVibGlzaGVkXG4gICAqIHJlc291cmNlIHR5cGUgZXF1YWxzIHRoZSB0eXBlIHRoZSBzdWJzY3JpcHRpb24gd2FzIGF1dGhvcml6ZWQgZm9yIGFuZCB0aGVcbiAgICogc2NvcGluZyBwYXJhbXMgc2F0aXNmeSBldmVyeSBzY29wZSBjb25kaXRpb246IGVhY2ggY29uZGl0aW9uIGtleSBtdXN0IGJlXG4gICAqIHByZXNlbnQgaW4gdGhlIGJyb2FkY2FzdCBwYXJhbXMgYW5kIG1hdGNoIGJ5IHN0cmluZyBjb21wYXJpc29uIChhcnJheVxuICAgKiBjb25kaXRpb25zIG1hdGNoIGJ5IG1lbWJlcnNoaXApLiBCcm9hZGNhc3RzIHdpdGhvdXQgYSByZXNvdXJjZSB0eXBlIGFuZFxuICAgKiBjb25kaXRpb25zIHRoZSBwdWJsaXNoZXIncyBzY29waW5nIHBhcmFtcyBkbyBub3QgY2FycnkgbmV2ZXIgbWF0Y2gsIHNvIGFcbiAgICogc3Vic2NyaXB0aW9uIGNhbm5vdCByZWNlaXZlIGNoYW5nZXMgb3V0c2lkZSBpdHMgYXV0aG9yaXplZCBzY29wZS5cbiAgICpcbiAgICogVGhlIGFsbC10eXBlcyAodXNlcikgc2NvcGUgZGVjbGFyZXMgbm8gc2luZ2xlIHJlc291cmNlIHR5cGUgLSBpdCBzdWJzY3JpYmVzXG4gICAqIG9uY2UgZm9yIGV2ZXJ5IHR5cGUgaXQgY2FuIGFwcGx5LCBsaXN0ZWQgaW4gYHNjb3BlLnJlc291cmNlVHlwZXNgIC0gc28gaXRcbiAgICogbWF0Y2hlcyBhIGJyb2FkY2FzdCBvZiBhbnkgb2YgdGhvc2UgdHlwZXMuIFR5cGVzIG91dHNpZGUgdGhhdCBsaXN0IGFyZVxuICAgKiBkcm9wcGVkIGhlcmUsIGJ5IHRoaXMgY2hlYXAgY2hlY2ssIGFuZCBuZXZlciByZWFjaCB0aGUgcGVyLWRlbGl2ZXJ5IGFjY2Vzc1xuICAgKiByZS1jaGVjayBpbiB7QGxpbmsgU3luY1dlYnNvY2tldENoYW5uZWwjX3VzZXJTY29wZURlbGl2ZXJhYmxlQm9keX06IHRoYXRcbiAgICogcmUtY2hlY2sgY2hlY2tzIG91dCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHJ1bnMgYSBxdWVyeSBwZXIgbWF0Y2hlZFxuICAgKiBicm9hZGNhc3QsIHNvIG1hdGNoaW5nIGV2ZXJ5IHR5cGUgd291bGQgcHV0IERCIHdvcmsgb24gZXZlcnkgYnJvYWRjYXN0IGZvclxuICAgKiBldmVyeSBzdWJzY3JpYmVkIGRldmljZS4gQSBicm9hZGNhc3QgY2Fycnlpbmcgbm8gcmVzb3VyY2UgdHlwZSBhdCBhbGwgc3RpbGxcbiAgICogbmV2ZXIgbWF0Y2hlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5XZWJzb2NrZXRKc29uVmFsdWV9IGJyb2FkY2FzdFBhcmFtcyAtIFB1Ymxpc2hlciBzY29waW5nIHBhcmFtcyAodGhlIHB1Ymxpc2hlZCByZXNvdXJjZVR5cGUgcGx1cyB0aGUgY2hhbmdlJ3Mgc2NvcGUtcGFydGl0aW9uIHZhbHVlcykuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBicm9hZGNhc3QgYmVsb25ncyB0byB0aGlzIHN1YnNjcmlwdGlvbidzIHNjb3BlLlxuICAgKi9cbiAgbWF0Y2hlcyhicm9hZGNhc3RQYXJhbXMpIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuX3Njb3BlXG5cbiAgICBpZiAoIXNjb3BlKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHNjb3BpbmdQYXJhbXMgPSBicm9hZGNhc3RQYXJhbXMgJiYgdHlwZW9mIGJyb2FkY2FzdFBhcmFtcyA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShicm9hZGNhc3RQYXJhbXMpXG4gICAgICA/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoYnJvYWRjYXN0UGFyYW1zKVxuICAgICAgOiB7fVxuXG4gICAgaWYgKCFPYmplY3QuaGFzT3duKHNjb3BpbmdQYXJhbXMsIFwicmVzb3VyY2VUeXBlXCIpKSByZXR1cm4gZmFsc2VcblxuICAgIGlmIChzY29wZS5yZXNvdXJjZVR5cGUgPT09IG51bGwpIHtcbiAgICAgIGlmIChzY29wZS5yZXNvdXJjZVR5cGVzICYmICFzY29wZS5yZXNvdXJjZVR5cGVzLnNvbWUoKHJlc291cmNlVHlwZSkgPT4gcmVzb3VyY2VUeXBlID09PSBTdHJpbmcoc2NvcGluZ1BhcmFtcy5yZXNvdXJjZVR5cGUpKSkgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmIChTdHJpbmcoc2NvcGluZ1BhcmFtcy5yZXNvdXJjZVR5cGUpICE9PSBTdHJpbmcoc2NvcGUucmVzb3VyY2VUeXBlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbY29uZGl0aW9uTmFtZSwgY29uZGl0aW9uVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjb3BlLmNvbmRpdGlvbnMpKSB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oc2NvcGluZ1BhcmFtcywgY29uZGl0aW9uTmFtZSkpIHJldHVybiBmYWxzZVxuXG4gICAgICBjb25zdCBzY29waW5nVmFsdWUgPSBzY29waW5nUGFyYW1zW2NvbmRpdGlvbk5hbWVdXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmRpdGlvblZhbHVlKSkge1xuICAgICAgICBpZiAoIWNvbmRpdGlvblZhbHVlLnNvbWUoKHZhbHVlKSA9PiBTdHJpbmcodmFsdWUpID09PSBTdHJpbmcoc2NvcGluZ1ZhbHVlKSkpIHJldHVybiBmYWxzZVxuICAgICAgfSBlbHNlIGlmIChTdHJpbmcoY29uZGl0aW9uVmFsdWUpICE9PSBTdHJpbmcoc2NvcGluZ1ZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGl2ZXJzIGEgbWF0Y2hlZCBicm9hZGNhc3QuIFNjb3BlZCBzdWJzY3JpcHRpb25zICh3aXRoIGV4cGxpY2l0XG4gICAqIGNvbmRpdGlvbnMpIGFscmVhZHkgcm91dGVkIHRocm91Z2gge0BsaW5rIFN5bmNXZWJzb2NrZXRDaGFubmVsI21hdGNoZXN9LCBzb1xuICAgKiB0aGUgY2hhbmdlIGlzIGluIHNjb3BlIGFuZCBkZWxpdmVycyB1bmNoYW5nZWQuIFVzZXItc2NvcGUgc3Vic2NyaXB0aW9uc1xuICAgKiAoZW1wdHkgY29uZGl0aW9ucywgXCJldmVyeXRoaW5nIG15IGFiaWxpdHkgY2FuIHNlZVwiKSBtYXRjaCBldmVyeSBicm9hZGNhc3RcbiAgICogb2YgdGhlIHJlc291cmNlIHR5cGUsIHNvIGVhY2ggcHVibGlzaGVkIGNoYW5nZSBpcyByZS1jaGVja2VkIGFnYWluc3QgdGhlXG4gICAqIHN1YnNjcmliZXIncyBhYmlsaXR5IGF0IGZhbi1vdXQgdGhyb3VnaCB0aGUgYXBwIHN5bmMgcmVzb3VyY2Unc1xuICAgKiBgY2hhbmdlRGVsaXZlcmFibGVgOyBvbmx5IGFjY2Vzc2libGUgY2hhbmdlcyBhcmUgZGVsaXZlcmVkLCBhbmQgYSBicm9hZGNhc3RcbiAgICogd2l0aCBubyBhY2Nlc3NpYmxlIGNoYW5nZSBpcyBkcm9wcGVkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLldlYnNvY2tldEpzb25WYWx1ZX0gYm9keSAtIEJyb2FkY2FzdCBib2R5IChzeW5jIGVudmVsb3BlKS5cbiAgICogQHBhcmFtIHt7ZXZlbnRJZD86IHN0cmluZ319IFttZXRhXSAtIE9wdGlvbmFsIGV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRlbGl2ZXJCcm9hZGNhc3QoYm9keSwgbWV0YSkge1xuICAgIGlmICghdGhpcy5faXNVc2VyU2NvcGUoKSkge1xuICAgICAgdGhpcy5zZW5kTWVzc2FnZShib2R5LCBtZXRhKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkZWxpdmVyYWJsZUJvZHkgPSBhd2FpdCB0aGlzLl91c2VyU2NvcGVEZWxpdmVyYWJsZUJvZHkoYm9keSlcblxuICAgIGlmIChkZWxpdmVyYWJsZUJvZHkgIT09IG51bGwpIHRoaXMuc2VuZE1lc3NhZ2UoZGVsaXZlcmFibGVCb2R5LCBtZXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBzdWJzY3JpcHRpb24gaXMgYSB1c2VyIHNjb3BlOiBhdXRob3JpemVkIHdpdGggZW1wdHkgY29uZGl0aW9uc1xuICAgKiAoXCJldmVyeXRoaW5nIG15IGFiaWxpdHkgY2FuIHNlZVwiKS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHN1YnNjcmlwdGlvbiBpcyBhIHVzZXIgc2NvcGUuXG4gICAqL1xuICBfaXNVc2VyU2NvcGUoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fc2NvcGUpICYmIE9iamVjdC5rZXlzKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLXJlc291cmNlLWJhc2UuanNcIikuU2VyaWFsaXplZENoYW5nZXNTY29wZX0gKi8gKHRoaXMuX3Njb3BlKS5jb25kaXRpb25zKS5sZW5ndGggPT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGEgdXNlci1zY29wZSBicm9hZGNhc3QgdG8gdGhlIHN5bmMgZW50cmllcyB0aGUgc3Vic2NyaWJlcidzIGFiaWxpdHlcbiAgICogY2FuIGFjY2VzcywgcmUtY2hlY2tpbmcgZWFjaCB0aHJvdWdoIHRoZSBhcHAgc3luYyByZXNvdXJjZSdzXG4gICAqIGBjaGFuZ2VEZWxpdmVyYWJsZWAuIFJldHVybnMgdGhlIGJyb2FkY2FzdCBuYXJyb3dlZCB0byBhY2Nlc3NpYmxlIGVudHJpZXMsXG4gICAqIG9yIG51bGwgd2hlbiBub25lIGFyZSBhY2Nlc3NpYmxlLiBOb24tZW52ZWxvcGUgYm9kaWVzIGFuZCBlbnRyaWVzIHdpdGhvdXQgYVxuICAgKiByZXNvdXJjZSBpZCBhcmUgZHJvcHBlZCAoZmFpbCBjbG9zZWQpLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLldlYnNvY2tldEpzb25WYWx1ZX0gYm9keSAtIEJyb2FkY2FzdCBib2R5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5XZWJzb2NrZXRKc29uVmFsdWUgfCBudWxsPn0gRGVsaXZlcmFibGUgYm9keSwgb3IgbnVsbC5cbiAgICovXG4gIGFzeW5jIF91c2VyU2NvcGVEZWxpdmVyYWJsZUJvZHkoYm9keSkge1xuICAgIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGJvZHkpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgZW52ZWxvcGUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKGJvZHkpXG4gICAgY29uc3Qgc2NvcGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1yZXNvdXJjZS1iYXNlLmpzXCIpLlNlcmlhbGl6ZWRDaGFuZ2VzU2NvcGV9ICovICh0aGlzLl9zY29wZSlcbiAgICAvKiogQHR5cGUge0FycmF5PFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59ICovXG4gICAgY29uc3Qgc3luY3MgPSBBcnJheS5pc0FycmF5KGVudmVsb3BlLnN5bmNzKSA/IGVudmVsb3BlLnN5bmNzIDogW2VudmVsb3BlXVxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuICAgIC8qKiBAdHlwZSB7QXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gKi9cbiAgICBjb25zdCBkZWxpdmVyYWJsZVN5bmNzID0gW11cblxuICAgIC8vIEJyb2FkY2FzdCBmYW4tb3V0IHJ1bnMgdGhyb3VnaCBgd2l0aG91dEN1cnJlbnRDb25uZWN0aW9uQ29udGV4dHNgIChzZWVcbiAgICAvLyBDb25maWd1cmF0aW9uI19icm9hZGNhc3RUb0NoYW5uZWxMb2NhbCksIHNvIHRoZXJlIGlzIG5vIGFtYmllbnQgZGF0YWJhc2VcbiAgICAvLyBjb25uZWN0aW9uIGhlcmUuIFJlc29sdmUgdGhlIHJlc291cmNlJ3MgYWJpbGl0eSBhbmQgcnVuIHRoZSBwZXItZGVsaXZlcnlcbiAgICAvLyBhY2Nlc3MgcXVlcnkgaW5zaWRlIGEgY2hlY2tlZC1vdXQgY29ubmVjdGlvbiBjb250ZXh0LCBtaXJyb3JpbmcgaG93IG90aGVyXG4gICAgLy8gYnJvYWRjYXN0LXRpbWUgREIgd29yayAodGhlIGZyb250ZW5kLW1vZGVsIGNoYW5uZWwpIG9idGFpbnMgY29ubmVjdGlvbnMuXG4gICAgYXdhaXQgY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogYCR7VkVMT0NJT1VTX1NZTkNfQ0hBTk5FTH0gdXNlci1zY29wZSBkZWxpdmVyeSBhY2Nlc3MgY2hlY2tgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0aGlzLmJ1aWxkU3luY1Jlc291cmNlKClcblxuICAgICAgZm9yIChjb25zdCBzeW5jIG9mIHN5bmNzKSB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlSWQgPSBzeW5jPy5yZXNvdXJjZUlkXG4gICAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHN5bmM/LnJlc291cmNlVHlwZSA/PyBzY29wZS5yZXNvdXJjZVR5cGVcblxuICAgICAgICBpZiAocmVzb3VyY2VJZCA9PT0gdW5kZWZpbmVkIHx8IHJlc291cmNlSWQgPT09IG51bGwpIGNvbnRpbnVlXG5cbiAgICAgICAgLy8gUGFzcyB0aGUgY29tcGxldGUgYnJvYWRjYXN0IGVudHJ5IHRocm91Z2ggc28gdGhlIGFwcCdzXG4gICAgICAgIC8vIGNoYW5nZURlbGl2ZXJhYmxlIGNhbiBhdXRob3JpemUgYnkgZXhhY3Qtcm93IGlkZW50aXR5IChpbW11dGFibGVcbiAgICAgICAgLy8gc3luYy1yb3cgaWQsIGFjdG9yLXNwZWNpZmljIG1ldGFkYXRhKSDigJQgY29uY3VycmVudCB0YXJnZXRlZCBhbmRcbiAgICAgICAgLy8gc2hhcmVkIGJyb2FkY2FzdHMgZm9yIHRoZSBzYW1lIHJlc291cmNlIGlkZW50aXR5IGF1dGhvcml6ZVxuICAgICAgICAvLyBpbmRlcGVuZGVudGx5LiBPbmx5IHJlc291cmNlSWQvcmVzb3VyY2VUeXBlIGFyZSBub3JtYWxpemVkIHRvXG4gICAgICAgIC8vIHN0cmluZ3MsIG9uIGEgY29weSBzbyB0aGUgcHVibGlzaGVkIGVudHJ5IGlzIG5ldmVyIG11dGF0ZWQuXG4gICAgICAgIGNvbnN0IHN5bmNFbnRyeSA9IHtcbiAgICAgICAgICAuLi5zeW5jLFxuICAgICAgICAgIHJlc291cmNlSWQ6IFN0cmluZyhyZXNvdXJjZUlkKSxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IFN0cmluZyhyZXNvdXJjZVR5cGUpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXdhaXQgcmVzb3VyY2UuY2hhbmdlRGVsaXZlcmFibGUoe3BhcmFtczogdGhpcy5wYXJhbXMsIHNjb3BlLCBzeW5jOiBzeW5jRW50cnl9KSkge1xuICAgICAgICAgIGRlbGl2ZXJhYmxlU3luY3MucHVzaChzeW5jKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmIChkZWxpdmVyYWJsZVN5bmNzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGxcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnZlbG9wZS5zeW5jcykpIHJldHVybiB7Li4uZW52ZWxvcGUsIHN5bmNzOiBkZWxpdmVyYWJsZVN5bmNzfVxuXG4gICAgcmV0dXJuIGRlbGl2ZXJhYmxlU3luY3NbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpemVkIHNjb3BlIGZvciBkZWJ1ZyBzbmFwc2hvdHMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IERlYnVnLXNhZmUgc3Vic2NyaXB0aW9uIGRldGFpbHMuXG4gICAqL1xuICBkZWJ1Z1NuYXBzaG90KCkge1xuICAgIHJldHVybiB7c2NvcGU6IHRoaXMuX3Njb3BlLCB1c2VyU2NvcGU6IHRoaXMuX2lzVXNlclNjb3BlKCl9XG4gIH1cbn1cbiJdfQ==
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy13ZWJzb2NrZXQtY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3N5bmMtd2Vic29ja2V0LWNoYW5uZWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8seUJBQXlCLE1BQU0scUNBQXFDLENBQUE7QUFDM0UsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFN0QsK0VBQStFO0FBQy9FLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUU5Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sb0JBQXFCLFNBQVEseUJBQXlCO0lBQ3pFOzs7T0FHRztJQUNILE1BQU0sR0FBRyxJQUFJLENBQUE7SUFFYjs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLHlCQUF5QixDQUFDLGFBQWE7UUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQUUsT0FBTTtRQUVwRyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDM0MsYUFBYSxDQUFDLHdCQUF3QixDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3RFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQy9DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxD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QUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBQyxDQUFBO0lBQzdELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVmVsb2Npb3VzV2Vic29ja2V0Q2hhbm5lbCBmcm9tIFwiLi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIlxuaW1wb3J0IHtWRUxPQ0lPVVNfU1lOQ19DSEFOTkVMfSBmcm9tIFwiLi9zeW5jLWNoYW5uZWwtbmFtZS5qc1wiXG5cbi8qKiBDb25maWd1cmF0aW9ucyB3aG9zZSBmcmFtZXdvcmsgc3luYyBjaGFubmVsIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZC4gKi9cbmNvbnN0IHJlZ2lzdGVyZWRDb25maWd1cmF0aW9ucyA9IG5ldyBXZWFrU2V0KClcblxuLyoqXG4gKiBGcmFtZXdvcmstb3duZWQgd2Vic29ja2V0IGNoYW5uZWwgZm9yIHN5bmNlZCByZXNvdXJjZXNcbiAqICh7QGxpbmsgVkVMT0NJT1VTX1NZTkNfQ0hBTk5FTH0pLlxuICpcbiAqIFN1YnNjcmliZSBwYXJhbXMgbWlycm9yIGEgZGVjbGFyZWQgcHVsbCBzY29wZSDigJQgYHtyZXNvdXJjZVR5cGUsIGNvbmRpdGlvbnN9YFxuICogcGx1cyB0aGUgY2xpZW50LWluamVjdGVkIGBhdXRoZW50aWNhdGlvblRva2VuYCDigJQgYW5kIHN1YnNjcmliZS10aW1lXG4gKiBhdXRob3JpemF0aW9uIGRlbGVnYXRlcyB0byB0aGUgYXBwIHN5bmMgcmVzb3VyY2UncyBleGlzdGluZ1xuICogYGF1dGhvcml6ZUNoYW5nZXMoe3BhcmFtcywgc2NvcGV9KWAgKHRoZSBgc3luYy5hcGkucmVzb3VyY2VDbGFzc2ApLCBzbyBhcHBzXG4gKiBob29rIGluIHRocm91Z2ggdGhlIGF1dGhvcml6YXRpb24gdGhleSBhbHJlYWR5IGRlY2xhcmVkIGluc3RlYWQgb2Ygd3JpdGluZ1xuICogdGhlaXIgb3duIGNoYW5uZWwgY2xhc3Nlcy4gQnJvYWRjYXN0IHJvdXRpbmcgbWF0Y2hlcyB0aGUgcHVibGlzaGVyJ3NcbiAqIHNjb3BpbmcgcGFyYW1zIGFnYWluc3QgdGhlIHN1YnNjcmlwdGlvbidzIHNjb3BlIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNXZWJzb2NrZXRDaGFubmVsIGV4dGVuZHMgVmVsb2Npb3VzV2Vic29ja2V0Q2hhbm5lbCB7XG4gIC8qKlxuICAgKiBTY29wZSB0aGUgc3Vic2NyaXB0aW9uIHdhcyBhdXRob3JpemVkIGZvciwgc2V0IGJ5IHtAbGluayBTeW5jV2Vic29ja2V0Q2hhbm5lbCNjYW5TdWJzY3JpYmV9LlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLXJlc291cmNlLWJhc2UuanNcIikuU2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGx9XG4gICAqL1xuICBfc2NvcGUgPSBudWxsXG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCBvbiBhIGNvbmZpZ3VyYXRpb24gZGVjbGFyaW5nIGFcbiAgICogYHN5bmMuYXBpYCBibG9jayAoZ3VhcmRlZCBzbyByZXBlYXRlZCBzZXJ2ZXIgYm9vdHMgd2l0aCB0aGUgc2FtZVxuICAgKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGl0IG9ubHkgb25jZSkuIE5vLW9wIHdpdGhvdXQgYHN5bmMuYXBpYCDigJQgdGhlXG4gICAqIGNoYW5uZWwgYXV0aG9yaXplcyB0aHJvdWdoIHRoZSBhcHAncyBzeW5jIHJlc291cmNlIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyRnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xuICAgIGlmICghY29uZmlndXJhdGlvbi5nZXRTeW5jQ29uZmlndXJhdGlvbigpLmFwaSB8fCByZWdpc3RlcmVkQ29uZmlndXJhdGlvbnMuaGFzKGNvbmZpZ3VyYXRpb24pKSByZXR1cm5cblxuICAgIHJlZ2lzdGVyZWRDb25maWd1cmF0aW9ucy5hZGQoY29uZmlndXJhdGlvbilcbiAgICBjb25maWd1cmF0aW9uLnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbChWRUxPQ0lPVVNfU1lOQ19DSEFOTkVMLCB0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhvcml6ZXMgdGhlIHN1YnNjcmlwdGlvbiB0aHJvdWdoIHRoZSBhcHAgc3luYyByZXNvdXJjZTogdGhlIHN1YnNjcmliZVxuICAgKiBwYXJhbXMgYXJlIHBhcnNlZCBpbnRvIHRoZSBzYW1lIHNlcmlhbGl6ZWQgc2NvcGUgdGhlIGNoYW5nZXMgZW5kcG9pbnRcbiAgICogY29uc3VtZXMgYW5kIHBhc3NlZCB0byB0aGUgcmVzb3VyY2UncyBgYXV0aG9yaXplQ2hhbmdlcyh7cGFyYW1zLCBzY29wZX0pYC5cbiAgICogRGVuaWFscyBhbmQgbWFsZm9ybWVkIHNjb3BlcyB0aHJvdywgcmVqZWN0aW5nIHRoZSBzdWJzY3JpcHRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBzdWJzY3JpcHRpb24gaXMgYWxsb3dlZC5cbiAgICovXG4gIGFzeW5jIGNhblN1YnNjcmliZSgpIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuYnVpbGRTeW5jUmVzb3VyY2UoKVxuICAgIGNvbnN0IHNjb3BlID0gcmVzb3VyY2UuY2hhbmdlc1Njb3BlKHtzY29wZToge2NvbmRpdGlvbnM6IHRoaXMucGFyYW1zLmNvbmRpdGlvbnMsIHJlc291cmNlVHlwZTogdGhpcy5wYXJhbXMucmVzb3VyY2VUeXBlLCByZXNvdXJjZVR5cGVzOiB0aGlzLnBhcmFtcy5yZXNvdXJjZVR5cGVzfX0pXG5cbiAgICBhd2FpdCByZXNvdXJjZS5hdXRob3JpemVDaGFuZ2VzKHtwYXJhbXM6IHRoaXMucGFyYW1zLCBzY29wZX0pXG5cbiAgICB0aGlzLl9zY29wZSA9IHNjb3BlXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgYXBwIHN5bmMgcmVzb3VyY2UgYXV0aG9yaXppbmcgdGhpcyBzdWJzY3JpcHRpb24sIG1pcnJvcmluZyB0aGVcbiAgICogc3luYyB0cmFuc3BvcnQgY29udHJvbGxlcidzIHJlc291cmNlIGNvbnN0cnVjdGlvbiB3aXRoIHRoZSBhYmlsaXR5XG4gICAqIHJlc29sdmVkIGZyb20gdGhlIHN1YnNjcmliZSBwYXJhbXMgKHdoaWNoIGNhcnJ5IHRoZSBjbGllbnQtaW5qZWN0ZWRcbiAgICogYXV0aGVudGljYXRpb25Ub2tlbikuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc3luYy1yZXNvdXJjZS1iYXNlLmpzXCIpLmRlZmF1bHQ+fSBBcHAgc3luYyByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIGJ1aWxkU3luY1Jlc291cmNlKCkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGFwaSA9IGNvbmZpZ3VyYXRpb24uZ2V0U3luY0NvbmZpZ3VyYXRpb24oKS5hcGlcblxuICAgIGlmICghYXBpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke1ZFTE9DSU9VU19TWU5DX0NIQU5ORUx9IGNoYW5uZWwgcmVxdWlyZXMgYSBzeW5jLmFwaSBjb25maWd1cmF0aW9uIGJsb2NrIHdpdGggdGhlIGFwcCdzIHN5bmMgcmVzb3VyY2UgY2xhc3NgKVxuICAgIH1cblxuICAgIC8vIE5hcnJvd3MgdGhlIGNvbmZpZ3VyZWQgcmVzb3VyY2UgY2xhc3MgdG8gdGhlIHN5bmMgcmVzb3VyY2UgY29udHJhY3RcbiAgICAvLyAoY2hhbmdlc1Njb3BlL2F1dGhvcml6ZUNoYW5nZXMpIHRoZSBzeW5jLmFwaSB2YWxpZGF0aW9uIHJlcXVpcmVzLlxuICAgIGNvbnN0IFJlc291cmNlQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL3N5bmMtcmVzb3VyY2UtYmFzZS5qc1wiKS5kZWZhdWx0fSAqLyAoYXBpLnJlc291cmNlQ2xhc3MpXG4gICAgLy8gTmFycm93cyB0aGUgd2Vic29ja2V0IHN1YnNjcmliZSBwYXJhbXMgdG8gdGhlIHJlc291cmNlIHBhcmFtcyBjb250cmFjdC5cbiAgICBjb25zdCBwYXJhbXMgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuVmVsb2Npb3VzUGFyYW1zfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAodGhpcy5wYXJhbXMpKVxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnNlc3Npb24udXBncmFkZVJlcXVlc3RcbiAgICBjb25zdCBhYmlsaXR5ID0gYXdhaXQgY29uZmlndXJhdGlvbi5yZXNvbHZlQWJpbGl0eSh7cGFyYW1zLCByZXF1ZXN0fSlcblxuICAgIHJldHVybiBuZXcgUmVzb3VyY2VDbGFzcyh7XG4gICAgICBhYmlsaXR5LFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgLi4uKGFiaWxpdHk/LmdldENvbnRleHQoKSB8fCB7fSksXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfSxcbiAgICAgIGxvY2FsczogYWJpbGl0eT8uZ2V0TG9jYWxzKCkgfHwge30sXG4gICAgICBtb2RlbENsYXNzOiBSZXNvdXJjZUNsYXNzLk1vZGVsQ2xhc3MsXG4gICAgICBtb2RlbE5hbWU6IFJlc291cmNlQ2xhc3MuTW9kZWxDbGFzcz8ubmFtZSxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHJlc291cmNlQ29uZmlndXJhdGlvbjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259ICovICh7XG4gICAgICAgIGF0dHJpYnV0ZXM6IFJlc291cmNlQ2xhc3MuYXR0cmlidXRlcyB8fCB7fSxcbiAgICAgICAgc3luYzoge2VuYWJsZWQ6IHRydWV9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUm91dGVzIGEgcHVibGlzaGVyIGJyb2FkY2FzdCB0byB0aGlzIHN1YnNjcmlwdGlvbiB3aGVuIHRoZSBwdWJsaXNoZWRcbiAgICogcmVzb3VyY2UgdHlwZSBlcXVhbHMgdGhlIHR5cGUgdGhlIHN1YnNjcmlwdGlvbiB3YXMgYXV0aG9yaXplZCBmb3IgYW5kIHRoZVxuICAgKiBzY29waW5nIHBhcmFtcyBzYXRpc2Z5IGV2ZXJ5IHNjb3BlIGNvbmRpdGlvbjogZWFjaCBjb25kaXRpb24ga2V5IG11c3QgYmVcbiAgICogcHJlc2VudCBpbiB0aGUgYnJvYWRjYXN0IHBhcmFtcyBhbmQgbWF0Y2ggYnkgc3RyaW5nIGNvbXBhcmlzb24gKGFycmF5XG4gICAqIGNvbmRpdGlvbnMgbWF0Y2ggYnkgbWVtYmVyc2hpcCkuIEJyb2FkY2FzdHMgd2l0aG91dCBhIHJlc291cmNlIHR5cGUgYW5kXG4gICAqIGNvbmRpdGlvbnMgdGhlIHB1Ymxpc2hlcidzIHNjb3BpbmcgcGFyYW1zIGRvIG5vdCBjYXJyeSBuZXZlciBtYXRjaCwgc28gYVxuICAgKiBzdWJzY3JpcHRpb24gY2Fubm90IHJlY2VpdmUgY2hhbmdlcyBvdXRzaWRlIGl0cyBhdXRob3JpemVkIHNjb3BlLlxuICAgKlxuICAgKiBUaGUgYWxsLXR5cGVzICh1c2VyKSBzY29wZSBkZWNsYXJlcyBubyBzaW5nbGUgcmVzb3VyY2UgdHlwZSAtIGl0IHN1YnNjcmliZXNcbiAgICogb25jZSBmb3IgZXZlcnkgdHlwZSBpdCBjYW4gYXBwbHksIGxpc3RlZCBpbiBgc2NvcGUucmVzb3VyY2VUeXBlc2AgLSBzbyBpdFxuICAgKiBtYXRjaGVzIGEgYnJvYWRjYXN0IG9mIGFueSBvZiB0aG9zZSB0eXBlcy4gVHlwZXMgb3V0c2lkZSB0aGF0IGxpc3QgYXJlXG4gICAqIGRyb3BwZWQgaGVyZSwgYnkgdGhpcyBjaGVhcCBjaGVjaywgYW5kIG5ldmVyIHJlYWNoIHRoZSBwZXItZGVsaXZlcnkgYWNjZXNzXG4gICAqIHJlLWNoZWNrIGluIHtAbGluayBTeW5jV2Vic29ja2V0Q2hhbm5lbCNfdXNlclNjb3BlRGVsaXZlcmFibGVCb2R5fTogdGhhdFxuICAgKiByZS1jaGVjayBjaGVja3Mgb3V0IGEgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgcnVucyBhIHF1ZXJ5IHBlciBtYXRjaGVkXG4gICAqIGJyb2FkY2FzdCwgc28gbWF0Y2hpbmcgZXZlcnkgdHlwZSB3b3VsZCBwdXQgREIgd29yayBvbiBldmVyeSBicm9hZGNhc3QgZm9yXG4gICAqIGV2ZXJ5IHN1YnNjcmliZWQgZGV2aWNlLiBBIGJyb2FkY2FzdCBjYXJyeWluZyBubyByZXNvdXJjZSB0eXBlIGF0IGFsbCBzdGlsbFxuICAgKiBuZXZlciBtYXRjaGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLldlYnNvY2tldEpzb25WYWx1ZX0gYnJvYWRjYXN0UGFyYW1zIC0gUHVibGlzaGVyIHNjb3BpbmcgcGFyYW1zICh0aGUgcHVibGlzaGVkIHJlc291cmNlVHlwZSBwbHVzIHRoZSBjaGFuZ2UncyBzY29wZS1wYXJ0aXRpb24gdmFsdWVzKS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGJyb2FkY2FzdCBiZWxvbmdzIHRvIHRoaXMgc3Vic2NyaXB0aW9uJ3Mgc2NvcGUuXG4gICAqL1xuICBtYXRjaGVzKGJyb2FkY2FzdFBhcmFtcykge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5fc2NvcGVcblxuICAgIGlmICghc2NvcGUpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3Qgc2NvcGluZ1BhcmFtcyA9IGJyb2FkY2FzdFBhcmFtcyAmJiB0eXBlb2YgYnJvYWRjYXN0UGFyYW1zID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGJyb2FkY2FzdFBhcmFtcylcbiAgICAgID8gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChicm9hZGNhc3RQYXJhbXMpXG4gICAgICA6IHt9XG5cbiAgICBpZiAoIU9iamVjdC5oYXNPd24oc2NvcGluZ1BhcmFtcywgXCJyZXNvdXJjZVR5cGVcIikpIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHNjb3BlLnJlc291cmNlVHlwZSA9PT0gbnVsbCkge1xuICAgICAgaWYgKHNjb3BlLnJlc291cmNlVHlwZXMgJiYgIXNjb3BlLnJlc291cmNlVHlwZXMuc29tZSgocmVzb3VyY2VUeXBlKSA9PiByZXNvdXJjZVR5cGUgPT09IFN0cmluZyhzY29waW5nUGFyYW1zLnJlc291cmNlVHlwZSkpKSByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKFN0cmluZyhzY29waW5nUGFyYW1zLnJlc291cmNlVHlwZSkgIT09IFN0cmluZyhzY29wZS5yZXNvdXJjZVR5cGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjb25kaXRpb25OYW1lLCBjb25kaXRpb25WYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NvcGUuY29uZGl0aW9ucykpIHtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihzY29waW5nUGFyYW1zLCBjb25kaXRpb25OYW1lKSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNvbnN0IHNjb3BpbmdWYWx1ZSA9IHNjb3BpbmdQYXJhbXNbY29uZGl0aW9uTmFtZV1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uVmFsdWUpKSB7XG4gICAgICAgIGlmICghY29uZGl0aW9uVmFsdWUuc29tZSgodmFsdWUpID0+IFN0cmluZyh2YWx1ZSkgPT09IFN0cmluZyhzY29waW5nVmFsdWUpKSkgcmV0dXJuIGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKFN0cmluZyhjb25kaXRpb25WYWx1ZSkgIT09IFN0cmluZyhzY29waW5nVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogRGVsaXZlcnMgYSBtYXRjaGVkIGJyb2FkY2FzdC4gU2NvcGVkIHN1YnNjcmlwdGlvbnMgKHdpdGggZXhwbGljaXRcbiAgICogY29uZGl0aW9ucykgYWxyZWFkeSByb3V0ZWQgdGhyb3VnaCB7QGxpbmsgU3luY1dlYnNvY2tldENoYW5uZWwjbWF0Y2hlc30sIHNvXG4gICAqIHRoZSBjaGFuZ2UgaXMgaW4gc2NvcGUgYW5kIGRlbGl2ZXJzIHVuY2hhbmdlZC4gVXNlci1zY29wZSBzdWJzY3JpcHRpb25zXG4gICAqIChlbXB0eSBjb25kaXRpb25zLCBcImV2ZXJ5dGhpbmcgbXkgYWJpbGl0eSBjYW4gc2VlXCIpIG1hdGNoIGV2ZXJ5IGJyb2FkY2FzdFxuICAgKiBvZiB0aGUgcmVzb3VyY2UgdHlwZSwgc28gZWFjaCBwdWJsaXNoZWQgY2hhbmdlIGlzIHJlLWNoZWNrZWQgYWdhaW5zdCB0aGVcbiAgICogc3Vic2NyaWJlcidzIGFiaWxpdHkgYXQgZmFuLW91dCB0aHJvdWdoIHRoZSBhcHAgc3luYyByZXNvdXJjZSdzXG4gICAqIGBjaGFuZ2VEZWxpdmVyYWJsZWA7IG9ubHkgYWNjZXNzaWJsZSBjaGFuZ2VzIGFyZSBkZWxpdmVyZWQsIGFuZCBhIGJyb2FkY2FzdFxuICAgKiB3aXRoIG5vIGFjY2Vzc2libGUgY2hhbmdlIGlzIGRyb3BwZWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSBib2R5IC0gQnJvYWRjYXN0IGJvZHkgKHN5bmMgZW52ZWxvcGUpLlxuICAgKiBAcGFyYW0ge3tldmVudElkPzogc3RyaW5nfX0gW21ldGFdIC0gT3B0aW9uYWwgZXZlbnQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZGVsaXZlckJyb2FkY2FzdChib2R5LCBtZXRhKSB7XG4gICAgaWYgKCF0aGlzLl9pc1VzZXJTY29wZSgpKSB7XG4gICAgICB0aGlzLnNlbmRNZXNzYWdlKGJvZHksIG1ldGEpXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRlbGl2ZXJhYmxlQm9keSA9IGF3YWl0IHRoaXMuX3VzZXJTY29wZURlbGl2ZXJhYmxlQm9keShib2R5KVxuXG4gICAgaWYgKGRlbGl2ZXJhYmxlQm9keSAhPT0gbnVsbCkgdGhpcy5zZW5kTWVzc2FnZShkZWxpdmVyYWJsZUJvZHksIG1ldGEpXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN1YnNjcmlwdGlvbiBpcyBhIHVzZXIgc2NvcGU6IGF1dGhvcml6ZWQgd2l0aCBlbXB0eSBjb25kaXRpb25zXG4gICAqIChcImV2ZXJ5dGhpbmcgbXkgYWJpbGl0eSBjYW4gc2VlXCIpLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIGlzIGEgdXNlciBzY29wZS5cbiAgICovXG4gIF9pc1VzZXJTY29wZSgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9zY29wZSkgJiYgT2JqZWN0LmtleXMoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtcmVzb3VyY2UtYmFzZS5qc1wiKS5TZXJpYWxpemVkQ2hhbmdlc1Njb3BlfSAqLyAodGhpcy5fc2NvcGUpLmNvbmRpdGlvbnMpLmxlbmd0aCA9PT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYSB1c2VyLXNjb3BlIGJyb2FkY2FzdCB0byB0aGUgc3luYyBlbnRyaWVzIHRoZSBzdWJzY3JpYmVyJ3MgYWJpbGl0eVxuICAgKiBjYW4gYWNjZXNzLCByZS1jaGVja2luZyBlYWNoIHRocm91Z2ggdGhlIGFwcCBzeW5jIHJlc291cmNlJ3NcbiAgICogYGNoYW5nZURlbGl2ZXJhYmxlYC4gUmV0dXJucyB0aGUgYnJvYWRjYXN0IG5hcnJvd2VkIHRvIGFjY2Vzc2libGUgZW50cmllcyxcbiAgICogb3IgbnVsbCB3aGVuIG5vbmUgYXJlIGFjY2Vzc2libGUuIE5vbi1lbnZlbG9wZSBib2RpZXMgYW5kIGVudHJpZXMgd2l0aG91dCBhXG4gICAqIHJlc291cmNlIGlkIGFyZSBkcm9wcGVkIChmYWlsIGNsb3NlZCkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSBib2R5IC0gQnJvYWRjYXN0IGJvZHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLldlYnNvY2tldEpzb25WYWx1ZSB8IG51bGw+fSBEZWxpdmVyYWJsZSBib2R5LCBvciBudWxsLlxuICAgKi9cbiAgYXN5bmMgX3VzZXJTY29wZURlbGl2ZXJhYmxlQm9keShib2R5KSB7XG4gICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoYm9keSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBlbnZlbG9wZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoYm9keSlcbiAgICBjb25zdCBzY29wZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLXJlc291cmNlLWJhc2UuanNcIikuU2VyaWFsaXplZENoYW5nZXNTY29wZX0gKi8gKHRoaXMuX3Njb3BlKVxuICAgIC8qKiBAdHlwZSB7QXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gKi9cbiAgICBjb25zdCBzeW5jcyA9IEFycmF5LmlzQXJyYXkoZW52ZWxvcGUuc3luY3MpID8gZW52ZWxvcGUuc3luY3MgOiBbZW52ZWxvcGVdXG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuc2Vzc2lvbi5jb25maWd1cmF0aW9uXG4gICAgLyoqIEB0eXBlIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSAqL1xuICAgIGNvbnN0IGRlbGl2ZXJhYmxlU3luY3MgPSBbXVxuXG4gICAgLy8gQnJvYWRjYXN0IGZhbi1vdXQgcnVucyB0aHJvdWdoIGB3aXRob3V0Q3VycmVudENvbm5lY3Rpb25Db250ZXh0c2AgKHNlZVxuICAgIC8vIENvbmZpZ3VyYXRpb24jX2Jyb2FkY2FzdFRvQ2hhbm5lbExvY2FsKSwgc28gdGhlcmUgaXMgbm8gYW1iaWVudCBkYXRhYmFzZVxuICAgIC8vIGNvbm5lY3Rpb24gaGVyZS4gUmVzb2x2ZSB0aGUgcmVzb3VyY2UncyBhYmlsaXR5IGFuZCBydW4gdGhlIHBlci1kZWxpdmVyeVxuICAgIC8vIGFjY2VzcyBxdWVyeSBpbnNpZGUgYSBjaGVja2VkLW91dCBjb25uZWN0aW9uIGNvbnRleHQsIG1pcnJvcmluZyBob3cgb3RoZXJcbiAgICAvLyBicm9hZGNhc3QtdGltZSBEQiB3b3JrICh0aGUgZnJvbnRlbmQtbW9kZWwgY2hhbm5lbCkgb2J0YWlucyBjb25uZWN0aW9ucy5cbiAgICBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgJHtWRUxPQ0lPVVNfU1lOQ19DSEFOTkVMfSB1c2VyLXNjb3BlIGRlbGl2ZXJ5IGFjY2VzcyBjaGVja2B9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuYnVpbGRTeW5jUmVzb3VyY2UoKVxuXG4gICAgICBmb3IgKGNvbnN0IHN5bmMgb2Ygc3luY3MpIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VJZCA9IHN5bmM/LnJlc291cmNlSWRcbiAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gc3luYz8ucmVzb3VyY2VUeXBlID8/IHNjb3BlLnJlc291cmNlVHlwZVxuXG4gICAgICAgIGlmIChyZXNvdXJjZUlkID09PSB1bmRlZmluZWQgfHwgcmVzb3VyY2VJZCA9PT0gbnVsbCkgY29udGludWVcblxuICAgICAgICAvLyBQYXNzIHRoZSBjb21wbGV0ZSBicm9hZGNhc3QgZW50cnkgdGhyb3VnaCBzbyB0aGUgYXBwJ3NcbiAgICAgICAgLy8gY2hhbmdlRGVsaXZlcmFibGUgY2FuIGF1dGhvcml6ZSBieSBleGFjdC1yb3cgaWRlbnRpdHkgKGltbXV0YWJsZVxuICAgICAgICAvLyBzeW5jLXJvdyBpZCwgYWN0b3Itc3BlY2lmaWMgbWV0YWRhdGEpIOKAlCBjb25jdXJyZW50IHRhcmdldGVkIGFuZFxuICAgICAgICAvLyBzaGFyZWQgYnJvYWRjYXN0cyBmb3IgdGhlIHNhbWUgcmVzb3VyY2UgaWRlbnRpdHkgYXV0aG9yaXplXG4gICAgICAgIC8vIGluZGVwZW5kZW50bHkuIE9ubHkgcmVzb3VyY2VJZC9yZXNvdXJjZVR5cGUgYXJlIG5vcm1hbGl6ZWQgdG9cbiAgICAgICAgLy8gc3RyaW5ncywgb24gYSBjb3B5IHNvIHRoZSBwdWJsaXNoZWQgZW50cnkgaXMgbmV2ZXIgbXV0YXRlZC5cbiAgICAgICAgY29uc3Qgc3luY0VudHJ5ID0ge1xuICAgICAgICAgIC4uLnN5bmMsXG4gICAgICAgICAgcmVzb3VyY2VJZDogU3RyaW5nKHJlc291cmNlSWQpLFxuICAgICAgICAgIHJlc291cmNlVHlwZTogU3RyaW5nKHJlc291cmNlVHlwZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhd2FpdCByZXNvdXJjZS5jaGFuZ2VEZWxpdmVyYWJsZSh7cGFyYW1zOiB0aGlzLnBhcmFtcywgc2NvcGUsIHN5bmM6IHN5bmNFbnRyeX0pKSB7XG4gICAgICAgICAgZGVsaXZlcmFibGVTeW5jcy5wdXNoKHN5bmMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKGRlbGl2ZXJhYmxlU3luY3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICAgIGlmIChBcnJheS5pc0FycmF5KGVudmVsb3BlLnN5bmNzKSkgcmV0dXJuIHsuLi5lbnZlbG9wZSwgc3luY3M6IGRlbGl2ZXJhYmxlU3luY3N9XG5cbiAgICByZXR1cm4gZGVsaXZlcmFibGVTeW5jc1swXVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF1dGhvcml6ZWQgc2NvcGUgZm9yIGRlYnVnIHNuYXBzaG90cy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gRGVidWctc2FmZSBzdWJzY3JpcHRpb24gZGV0YWlscy5cbiAgICovXG4gIGRlYnVnU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHtzY29wZTogdGhpcy5fc2NvcGUsIHVzZXJTY29wZTogdGhpcy5faXNVc2VyU2NvcGUoKX1cbiAgfVxufVxuIl19
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns the UTF-8 byte length of a string without Node's `Buffer`, so shared
3
+ * driver code can bound query chunks in browser and React Native bundles too.
4
+ * @param {string} value - String to measure.
5
+ * @returns {number} - UTF-8 byte length.
6
+ */
7
+ export declare function utf8ByteLength(value: string): number;
8
+ //# sourceMappingURL=utf8-byte-length.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utf8-byte-length.d.ts","sourceRoot":"","sources":["../../../src/utils/utf8-byte-length.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAHzB,MAGyB,GAFvB,MAAM,CAMlB"}
@@ -0,0 +1,14 @@
1
+ // @ts-check
2
+ /** @type {TextEncoder | undefined} Shared encoder instance. */
3
+ let sharedEncoder;
4
+ /**
5
+ * Returns the UTF-8 byte length of a string without Node's `Buffer`, so shared
6
+ * driver code can bound query chunks in browser and React Native bundles too.
7
+ * @param {string} value - String to measure.
8
+ * @returns {number} - UTF-8 byte length.
9
+ */
10
+ export function utf8ByteLength(value) {
11
+ sharedEncoder ??= new TextEncoder();
12
+ return sharedEncoder.encode(value).length;
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRmOC1ieXRlLWxlbmd0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy91dGY4LWJ5dGUtbGVuZ3RoLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWiwrREFBK0Q7QUFDL0QsSUFBSSxhQUFhLENBQUE7QUFFakI7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQUs7SUFDbEMsYUFBYSxLQUFLLElBQUksV0FBVyxFQUFFLENBQUE7SUFFbkMsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQTtBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZSB7VGV4dEVuY29kZXIgfCB1bmRlZmluZWR9IFNoYXJlZCBlbmNvZGVyIGluc3RhbmNlLiAqL1xubGV0IHNoYXJlZEVuY29kZXJcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBVVEYtOCBieXRlIGxlbmd0aCBvZiBhIHN0cmluZyB3aXRob3V0IE5vZGUncyBgQnVmZmVyYCwgc28gc2hhcmVkXG4gKiBkcml2ZXIgY29kZSBjYW4gYm91bmQgcXVlcnkgY2h1bmtzIGluIGJyb3dzZXIgYW5kIFJlYWN0IE5hdGl2ZSBidW5kbGVzIHRvby5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFN0cmluZyB0byBtZWFzdXJlLlxuICogQHJldHVybnMge251bWJlcn0gLSBVVEYtOCBieXRlIGxlbmd0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV0ZjhCeXRlTGVuZ3RoKHZhbHVlKSB7XG4gIHNoYXJlZEVuY29kZXIgPz89IG5ldyBUZXh0RW5jb2RlcigpXG5cbiAgcmV0dXJuIHNoYXJlZEVuY29kZXIuZW5jb2RlKHZhbHVlKS5sZW5ndGhcbn1cbiJdfQ==
@@ -362,9 +362,10 @@ export default class SyncClient {
362
362
  * @param {import("../database/query/model-class-query.js").default<ReturnType<typeof JSON.parse>>} query - Query declaring the sync scope.
363
363
  * @param {object} [options] - Sync options.
364
364
  * @param {(progress: import("./sync-api-client-types.js").SyncPullProgress) => void} [options.onProgress] - Called per applied page of the pull this declaration triggers, so the initial import of a newly declared scope can drive a "syncedCount of total" progress bar. See `pull()`.
365
+ * @param {boolean} [options.upstreamRefresh] - Marks the changes request(s) as a user-initiated refresh, so the server can bypass upstream-import throttle windows. See `pull()`.
365
366
  * @returns {Promise<{scope: import("./sync-client-types.js").SerializedSyncScope, pulled: import("./sync-api-client-types.js").SyncChangesResult | null}>} Declared scope and pull result (null while offline).
366
367
  */
367
- async sync(query, {onProgress} = {}) {
368
+ async sync(query, {onProgress, upstreamRefresh} = {}) {
368
369
  const scope = serializedScopeFromQuery(query)
369
370
  const scopeStore = this.scopeStore()
370
371
  const scopeRow = await scopeStore.findOrCreateScope(scope)
@@ -376,7 +377,7 @@ export default class SyncClient {
376
377
  if (legacyCursor) await scopeStore.saveCursor(scopeRow, legacyCursor)
377
378
  }
378
379
 
379
- return {pulled: await this.pull({onProgress}), scope}
380
+ return {pulled: await this.pull({onProgress, upstreamRefresh}), scope}
380
381
  }
381
382
 
382
383
  /**
@@ -392,9 +393,10 @@ export default class SyncClient {
392
393
  * Pulls changes for every active scope with per-scope cursors (single-flighted, online-gated).
393
394
  * @param {object} [options] - Pull options.
394
395
  * @param {(progress: import("./sync-api-client-types.js").SyncPullProgress) => void} [options.onProgress] - Called per applied page with cumulative `{pages, syncedCount, total}` across the pulled scopes, for rendering a "syncedCount of total" progress bar (e.g. a full-import screen). Optional; omitting it keeps the existing behavior.
396
+ * @param {boolean} [options.upstreamRefresh] - Sends `upstreamRefresh: true` on the changes request(s), telling the server this pull is user-initiated so it can bypass upstream-import throttle windows (see docs/sync-upstream-imports.md). Background pulls omit it and stay throttled.
395
397
  * @returns {Promise<import("./sync-api-client-types.js").SyncChangesResult | null>} Combined pull result, or null while offline.
396
398
  */
397
- async pull({onProgress} = {}) {
399
+ async pull({onProgress, upstreamRefresh} = {}) {
398
400
  if (!(await this.isOnline())) return null
399
401
 
400
402
  /** @type {import("./sync-api-client-types.js").SyncChangesResult | null} */
@@ -437,7 +439,8 @@ export default class SyncClient {
437
439
  conditions: scopeRow.conditions,
438
440
  resourceType: scopeRow.resourceType,
439
441
  ...(scopeRow.resourceType === null ? {resourceTypes: this.userScopeResourceTypes()} : {})
440
- }
442
+ },
443
+ ...(upstreamRefresh ? {upstreamRefresh: true} : {})
441
444
  }),
442
445
  saveCursor: async (cursor) => await scopeStore.saveCursor(scopeRow, cursor)
443
446
  })
@@ -5,6 +5,7 @@ import {forcedNonBlankString} from "typanic"
5
5
  import FrontendModelBaseResource from "../frontend-model-resource/base-resource.js"
6
6
  import SyncEnvelopeReplayService from "./sync-envelope-replay-service.js"
7
7
  import SyncModelChangeFeedService from "./sync-model-change-feed-service.js"
8
+ import {syncUpstreamImporterForConfiguration} from "./sync-upstream-importer.js"
8
9
  import VelociousError from "../velocious-error.js"
9
10
 
10
11
  /**
@@ -224,6 +225,17 @@ export default class SyncResourceBase extends FrontendModelBaseResource {
224
225
  return modelClass
225
226
  }
226
227
 
228
+ /**
229
+ * Returns the shared upstream importer for this resource's configuration. Apps
230
+ * use it inside {@link SyncResourceBase#authorizeChanges} (or a legacy trigger
231
+ * endpoint) to run the upstream import that keeps the feed self-sustaining,
232
+ * with coalescing and throttling owned by the framework.
233
+ * @returns {import("./sync-upstream-importer.js").default} Shared importer for the current configuration.
234
+ */
235
+ syncUpstreamImporter() {
236
+ return syncUpstreamImporterForConfiguration(this.configuration())
237
+ }
238
+
227
239
  /**
228
240
  * Authorizes the current context for reading the requested changes.
229
241
  * @param {{params: Record<string, ReturnType<typeof JSON.parse>>, scope: SerializedChangesScope | null}} _args - Request params and parsed scope.