@pipeline-builder/api-core 5.2.5 → 5.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/lib/constants/ai-providers.js +1 -1
  2. package/lib/constants/http-status.js +1 -1
  3. package/lib/constants/index.js +1 -1
  4. package/lib/constants/time.js +1 -1
  5. package/lib/errors/app-errors.js +1 -1
  6. package/lib/errors/index.js +1 -1
  7. package/lib/helpers/access-helpers.d.ts +19 -0
  8. package/lib/helpers/access-helpers.js +24 -4
  9. package/lib/helpers/content-disposition.js +1 -1
  10. package/lib/helpers/crud-helpers.js +1 -1
  11. package/lib/helpers/index.d.ts +1 -1
  12. package/lib/helpers/index.js +2 -2
  13. package/lib/helpers/org-hierarchy-http.js +1 -1
  14. package/lib/helpers/org-hierarchy.js +1 -1
  15. package/lib/helpers/restore-helpers.js +1 -1
  16. package/lib/helpers/sse-helpers.js +13 -2
  17. package/lib/helpers/support-calendar.js +1 -1
  18. package/lib/index.js +1 -1
  19. package/lib/middleware/ask-provenance.js +1 -1
  20. package/lib/middleware/assurance.js +1 -1
  21. package/lib/middleware/auth.js +1 -1
  22. package/lib/middleware/deferred-quota-check.js +1 -1
  23. package/lib/middleware/ecosystem-guard.js +1 -1
  24. package/lib/middleware/index.js +1 -1
  25. package/lib/middleware/jwt-verify.js +1 -1
  26. package/lib/middleware/mongo-sanitize.js +1 -1
  27. package/lib/middleware/on-behalf.js +1 -1
  28. package/lib/middleware/permission-gates.js +1 -1
  29. package/lib/middleware/quota-exempt-routes.js +1 -1
  30. package/lib/middleware/revocation.js +1 -1
  31. package/lib/middleware/route-table.js +16 -1
  32. package/lib/middleware/service-tokens.js +1 -1
  33. package/lib/middleware/step-up.js +1 -1
  34. package/lib/middleware/system-org.d.ts +18 -5
  35. package/lib/middleware/system-org.js +19 -6
  36. package/lib/openapi/extend-zod.js +1 -1
  37. package/lib/openapi/index.js +1 -1
  38. package/lib/openapi/registry.js +1 -1
  39. package/lib/openapi/routes/ask-routes.js +1 -1
  40. package/lib/openapi/routes/billing-routes.js +1 -1
  41. package/lib/openapi/routes/image-registry-routes.js +1 -1
  42. package/lib/openapi/routes/index.js +1 -1
  43. package/lib/openapi/routes/message-routes.js +1 -1
  44. package/lib/openapi/routes/pipeline-routes.js +1 -1
  45. package/lib/openapi/routes/pipeline-template-routes.js +1 -1
  46. package/lib/openapi/routes/plugin-routes.js +1 -1
  47. package/lib/openapi/routes/quota-routes.js +1 -1
  48. package/lib/openapi/schema-registry.js +1 -1
  49. package/lib/routes/health.js +1 -1
  50. package/lib/routes/index.js +1 -1
  51. package/lib/services/ai-call-weight.js +1 -1
  52. package/lib/services/alert-delivery.js +1 -1
  53. package/lib/services/api-key-exchange.js +1 -1
  54. package/lib/services/audit-context.js +1 -1
  55. package/lib/services/audit-spool.js +1 -1
  56. package/lib/services/cache-service.js +1 -1
  57. package/lib/services/circuit-breaker.js +1 -1
  58. package/lib/services/compliance-client.js +1 -1
  59. package/lib/services/compliance-event-subscriber.js +1 -1
  60. package/lib/services/durable-event-bus.js +1 -1
  61. package/lib/services/ecosystem-notify-client.d.ts +7 -1
  62. package/lib/services/ecosystem-notify-client.js +9 -3
  63. package/lib/services/entity-events.js +1 -1
  64. package/lib/services/env-redis.js +1 -1
  65. package/lib/services/http-client.js +19 -3
  66. package/lib/services/index.d.ts +1 -1
  67. package/lib/services/index.js +2 -2
  68. package/lib/services/jwks-cache.js +1 -1
  69. package/lib/services/leader-lock.js +1 -1
  70. package/lib/services/notification-channels.js +1 -1
  71. package/lib/services/org-ai-client.js +1 -1
  72. package/lib/services/pagerduty-inbound.js +1 -1
  73. package/lib/services/pagerduty.js +1 -1
  74. package/lib/services/quota-increment-batcher.js +1 -1
  75. package/lib/services/quota.js +1 -1
  76. package/lib/services/remote-audit-client.js +1 -1
  77. package/lib/services/retry-forever.js +1 -1
  78. package/lib/services/retry-strategy.js +1 -1
  79. package/lib/services/s3-client.js +1 -1
  80. package/lib/services/scheduler.js +1 -1
  81. package/lib/services/service-boot.js +1 -1
  82. package/lib/services/service-keys.js +2 -2
  83. package/lib/services/sse-ticket-store.js +1 -1
  84. package/lib/services/system-notification.js +1 -1
  85. package/lib/services/token-revocation.js +1 -1
  86. package/lib/services/version-vuln-policy.d.ts +11 -0
  87. package/lib/services/version-vuln-policy.js +33 -7
  88. package/lib/types/ai-catalog.js +1 -1
  89. package/lib/types/ask-proposals.d.ts +23 -0
  90. package/lib/types/ask-proposals.js +29 -1
  91. package/lib/types/audit-events.js +1 -1
  92. package/lib/types/build-catalog.d.ts +65 -0
  93. package/lib/types/build-catalog.js +95 -1
  94. package/lib/types/catalog-metadata.js +1 -1
  95. package/lib/types/common.js +1 -1
  96. package/lib/types/compliance-exemption.js +1 -1
  97. package/lib/types/ecosystem-notifications.d.ts +9 -0
  98. package/lib/types/ecosystem-notifications.js +15 -6
  99. package/lib/types/ecosystem.d.ts +1 -6
  100. package/lib/types/ecosystem.js +18 -5
  101. package/lib/types/error-codes.js +1 -1
  102. package/lib/types/feature-flags.d.ts +17 -1
  103. package/lib/types/feature-flags.js +1 -1
  104. package/lib/types/http.js +1 -1
  105. package/lib/types/index.d.ts +3 -3
  106. package/lib/types/index.js +4 -4
  107. package/lib/types/metadata-keys.js +1 -1
  108. package/lib/types/permissions.d.ts +60 -13
  109. package/lib/types/permissions.js +63 -14
  110. package/lib/types/pipeline-template.js +1 -1
  111. package/lib/types/pipeline.js +1 -1
  112. package/lib/types/plugin-catalog.js +1 -1
  113. package/lib/types/plugin-health.js +1 -1
  114. package/lib/types/plugin-scan.d.ts +69 -0
  115. package/lib/types/plugin-scan.js +77 -1
  116. package/lib/types/quota-catalog.js +15 -2
  117. package/lib/types/quota-tiers.d.ts +27 -160
  118. package/lib/types/quota-tiers.js +47 -255
  119. package/lib/types/remote-audit-actions.d.ts +1 -1
  120. package/lib/types/remote-audit-actions.js +9 -1
  121. package/lib/types/reserved-tags.js +1 -1
  122. package/lib/types/tier-limits.d.ts +210 -0
  123. package/lib/types/tier-limits.js +254 -0
  124. package/lib/types/usage-projection.js +1 -1
  125. package/lib/types/visibility.js +1 -1
  126. package/lib/types/wire-vocabulary.d.ts +7 -0
  127. package/lib/types/wire-vocabulary.js +7 -1
  128. package/lib/utils/alias-resolver.js +1 -1
  129. package/lib/utils/api-key.js +1 -1
  130. package/lib/utils/audit.js +1 -1
  131. package/lib/utils/aws-scrub.js +3 -3
  132. package/lib/utils/compliance-attributes.js +1 -1
  133. package/lib/utils/concurrency-gate.d.ts +98 -0
  134. package/lib/utils/concurrency-gate.js +110 -0
  135. package/lib/utils/concurrency.js +1 -1
  136. package/lib/utils/crash-handlers.js +1 -1
  137. package/lib/utils/date.js +1 -1
  138. package/lib/utils/dsse.js +1 -1
  139. package/lib/utils/env.d.ts +11 -0
  140. package/lib/utils/env.js +14 -1
  141. package/lib/utils/headers.js +1 -1
  142. package/lib/utils/identity.js +1 -1
  143. package/lib/utils/index.d.ts +1 -0
  144. package/lib/utils/index.js +2 -1
  145. package/lib/utils/jwk.js +2 -2
  146. package/lib/utils/logger.js +1 -1
  147. package/lib/utils/metric-emitter.js +1 -1
  148. package/lib/utils/object.js +1 -1
  149. package/lib/utils/params.js +1 -1
  150. package/lib/utils/plugin-compliance.d.ts +9 -1
  151. package/lib/utils/plugin-compliance.js +1 -1
  152. package/lib/utils/proof-of-work.js +1 -1
  153. package/lib/utils/response.js +1 -1
  154. package/lib/utils/retention.js +1 -1
  155. package/lib/utils/safe-require.js +1 -1
  156. package/lib/utils/secret-encryption.js +1 -1
  157. package/lib/utils/secret-rotation.js +1 -1
  158. package/lib/utils/secure-compare.js +1 -1
  159. package/lib/utils/sensitive-patterns.js +1 -1
  160. package/lib/utils/service-registry.js +1 -1
  161. package/lib/utils/ssrf.js +1 -1
  162. package/lib/validation/ai-schemas.js +1 -1
  163. package/lib/validation/common-schemas.js +1 -1
  164. package/lib/validation/dockerfile-static.js +1 -1
  165. package/lib/validation/index.d.ts +1 -1
  166. package/lib/validation/index.js +2 -2
  167. package/lib/validation/message-schemas.d.ts +73 -0
  168. package/lib/validation/message-schemas.js +63 -2
  169. package/lib/validation/middleware.js +1 -1
  170. package/lib/validation/pipeline-schemas.js +1 -1
  171. package/lib/validation/pipeline-template-schemas.js +1 -1
  172. package/lib/validation/plugin-base-images.js +1 -1
  173. package/lib/validation/plugin-catalog-detect.js +1 -1
  174. package/lib/validation/plugin-catalog-metadata.js +1 -1
  175. package/lib/validation/plugin-heuristics.js +1 -1
  176. package/lib/validation/plugin-lint.js +1 -1
  177. package/lib/validation/plugin-name-confusable.js +1 -1
  178. package/lib/validation/plugin-schemas.js +1 -1
  179. package/lib/validation/plugin-spec-schema.js +1 -1
  180. package/lib/validation/plugin-template-contract.js +1 -1
  181. package/package.json +11 -4
@@ -163,4 +163,4 @@ function armShutdownFlush() {
163
163
  shutdownArmed = true;
164
164
  process.once('SIGTERM', () => { void flushQuotaIncrements(); });
165
165
  }
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtaW5jcmVtZW50LWJhdGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcXVvdGEtaW5jcmVtZW50LWJhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQXVDdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBRXZELHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUUxRyxzRUFBc0U7QUFDdEUsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRW5HLDZGQUE2RjtBQUM3RixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUM7QUFFNUMsa0NBQWtDO0FBQ2xDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBaUI1QixpRkFBaUY7QUFDakYsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFvQztJQUM1RCxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3pCLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLE9B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b0I7SUFDeEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFFRCxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFFMUI7Ozs7Ozs7R0FPRztBQUNILFNBQVMsZ0JBQWdCO0lBQ3ZCLElBQUksYUFBYSxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU87SUFDcEUsYUFBYSxHQUFHLElBQUksQ0FBQztJQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxLQUFLLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGVyLXBvZCBhZ2dyZWdhdGlvbiBvZiBNRVRFUklORyBpbmNyZW1lbnRzIChhcGlDYWxscyAvIGF1dG9tYXRpb25DYWxscykuXG4gKlxuICogTWV0ZXJpbmcgdXNlZCB0byBiZSBvbmUgUE9TVCB0byB0aGUgcXVvdGEgc2VydmljZSBwZXIgc3VjY2Vzc2Z1bCByZXF1ZXN0LFxuICogYW5kIGVhY2ggUE9TVCB3YXMgYSBjb25kaXRpb25hbCBgZmluZE9uZUFuZFVwZGF0ZWAgb24gdGhlIG9yZydzIGhvdCBkb2N1bWVudCxcbiAqIGEgdGVhbSBjb3VudGVyIHVwZGF0ZSwgYSBsZWRnZXIgaW5zZXJ0IGFuZCBhIHRocmVzaG9sZCBjaGVjay4gQXQgdGhlIHJlcXVlc3RcbiAqIHJhdGVzIHRoZSBtZXRlciBleGlzdHMgZm9yLCB0aGUgcXVvdGEgc2VydmljZSB3YXMgZG9pbmcgbW9yZSB3b3JrIHRoYW4gdGhlXG4gKiByZXF1ZXN0IGl0IHdhcyBjb3VudGluZy5cbiAqXG4gKiBJbmNyZW1lbnRzIGFyZSBub3cgc3VtbWVkIGluIG1lbW9yeSBwZXIgKG9yZywgcXVvdGEgdHlwZSkgYW5kLCBpbnNpZGUgdGhhdCxcbiAqIHBlciBhdHRyaWJ1dGlvbiBncm91cCAocHJpbmNpcGFsLCBrZXksIHJvdXRlIHBhdHRlcm4sIHBpcGVsaW5lKSwgdGhlbiBzZW50XG4gKiBldmVyeSBgUVVPVEFfSU5DUkVNRU5UX0ZMVVNIX01TYCAoZGVmYXVsdCAxMDAwKSBhcyBPTkUgbWV0ZXJlZCBpbmNyZW1lbnQgcGVyXG4gKiAob3JnLCB0eXBlKSBjYXJyeWluZyBpdHMgZ3JvdXBzLiBUaGUgcXVvdGEgc2VydmljZSBhcHBsaWVzIHRoZSBzdW0gYXRvbWljYWxseVxuICogYWdhaW5zdCB0aGUgKHBvb2xlZCkgY2FwIHdpdGggcGFydGlhbCBhZG1pc3Npb246IHRoZSBjb3VudGVyIG1vdmVzIGJ5IGFzIG11Y2hcbiAqIGFzIGZpdHMgYW5kIG5ldmVyIHBhc3QgdGhlIGxpbWl0LCBhbmQgdGhlIHJlc3QgaXMgcmVjb3JkZWQgYXMgYG92ZXJzaG9vdGAgaW5cbiAqIHRoZSBsZWRnZXIgKGFwaS9xdW90YSBgaW5jcmVtZW50TWV0ZXJlZGApLlxuICpcbiAqIEd1YXJhbnRlZXMsIGFuZCB0aGVpciBsaW1pdHM6XG4gKiAgLSB0aGUgY291bnRlciBtYXkgTEFHIHJlYWwgdXNhZ2UgYnkgdXAgdG8gb25lIGZsdXNoIGludGVydmFsIChwbHVzIHRoZSBIVFRQXG4gKiAgICBob3ApOyBlbmZvcmNlbWVudCBpcyB1bmFmZmVjdGVkIGJleW9uZCB0aGF0IGxhZywgYmVjYXVzZSB0aGUgY291bnRlclxuICogICAgc3RpbGwgbmV2ZXIgZXhjZWVkcyB0aGUgY2FwO1xuICogIC0gdGhlIGJ1ZmZlciBpcyBib3VuZGVkIChgUVVPVEFfSU5DUkVNRU5UX0JVRkZFUl9NQVhgIGF0dHJpYnV0aW9uIGdyb3VwcykuXG4gKiAgICBSZWFjaGluZyBpdCBmbHVzaGVzIGltbWVkaWF0ZWx5OyBvbmx5IHdoaWxlIGEgZmx1c2ggaXMgYWxyZWFkeSBpbiBmbGlnaHRcbiAqICAgIGlzIGEgTkVXIGdyb3VwIGRyb3BwZWQsIGNvdW50ZWQgb24gYHF1b3RhX2luY3JlbWVudF9kcm9wcGVkX3RvdGFsYDtcbiAqICAtIGEgZmx1c2ggdGhhdCBmYWlscyBpcyBjb3VudGVkIG9uIGBxdW90YV9pbmNyZW1lbnRfZmFpbHVyZXNfdG90YWxgICh0aGVcbiAqICAgIFF1b3RhSW5jcmVtZW50RmFpbHVyZXMgYWxlcnQpIGFuZCBOT1QgcmV0cmllZDogdGhlIFBPU1QgbWF5IGhhdmUgbGFuZGVkLFxuICogICAgYW5kIGEgcmV0cnkgd291bGQgZG91YmxlLWNvdW50O1xuICogIC0gZ3JhY2VmdWwgc2h1dGRvd24gZmx1c2hlczogYHJ1blNlcnZlcmAgYXdhaXRzIHtAbGluayBmbHVzaFF1b3RhSW5jcmVtZW50c31cbiAqICAgIGFmdGVyIHRoZSBIVFRQIHNlcnZlciBoYXMgZHJhaW5lZCwgYW5kIGEgU0lHVEVSTSBmbHVzaCBjb3ZlcnMgcHJvY2Vzc2VzXG4gKiAgICB3aXRoIHRoZWlyIG93biBzaHV0ZG93biBwYXRoLlxuICpcbiAqIFJlc2VydmF0aW9ucyAoYWlDYWxscywgcGlwZWxpbmVzLCBwbHVnaW5zIOKApikgbmV2ZXIgY29tZSB0aHJvdWdoIGhlcmUg4oCUIHRoZXlcbiAqIG5lZWQgdGhlIHN5bmNocm9ub3VzIGFuc3dlciBhbmQga2VlcCBgcmVzZXJ2ZVF1b3RhYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFF1b3RhU2VydmljZSwgUXVvdGFVc2FnZUF0dHJpYnV0aW9uIH0gZnJvbSAnLi9xdW90YS5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBydW5Db25jdXJyZW50IH0gZnJvbSAnLi4vdXRpbHMvY29uY3VycmVuY3kuanMnO1xuaW1wb3J0IHsgZW52SW50IH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdxdW90YS1pbmNyZW1lbnQtYmF0Y2hlcicpO1xuXG4vKiogRmx1c2ggaW50ZXJ2YWwgKG1zKS4gYDBgIGRpc2FibGVzIGJhdGNoaW5nOiBldmVyeSBpbmNyZW1lbnQgaXMgc2VudCBvbiBpdHMgb3duLiAqL1xuZXhwb3J0IGNvbnN0IFFVT1RBX0lOQ1JFTUVOVF9GTFVTSF9NUyA9IGVudkludCgnUVVPVEFfSU5DUkVNRU5UX0ZMVVNIX01TJywgMTAwMCwgeyBtaW46IDAsIG1heDogNjBfMDAwIH0pO1xuXG4vKiogTW9zdCBhdHRyaWJ1dGlvbiBncm91cHMgaGVsZCBiZXR3ZWVuIGZsdXNoZXMsIGFjcm9zcyBldmVyeSBvcmcuICovXG5leHBvcnQgY29uc3QgUVVPVEFfSU5DUkVNRU5UX0JVRkZFUl9NQVggPSBlbnZJbnQoJ1FVT1RBX0lOQ1JFTUVOVF9CVUZGRVJfTUFYJywgMTBfMDAwLCB7IG1pbjogMSB9KTtcblxuLyoqIE1vc3QgZ3JvdXBzIG9uZSBtZXRlcmVkIGluY3JlbWVudCBjYXJyaWVzICh0aGUgcXVvdGEgc2VydmljZSBlbmZvcmNlcyB0aGUgc2FtZSBib3VuZCkuICovXG5leHBvcnQgY29uc3QgTUFYX0dST1VQU19QRVJfSU5DUkVNRU5UID0gNTAwO1xuXG4vKiogQ29uY3VycmVudCBQT1NUcyBwZXIgZmx1c2guICovXG5jb25zdCBGTFVTSF9DT05DVVJSRU5DWSA9IDg7XG5cbi8qKiBPbmUgYXR0cmlidXRpb24gZ3JvdXAgb2YgYSBtZXRlcmVkIGluY3JlbWVudDogd2hvIHNwZW50IGBhbW91bnRgIHVuaXRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRlcmVkSW5jcmVtZW50R3JvdXAge1xuICBhbW91bnQ6IG51bWJlcjtcbiAgYXR0cmlidXRpb24/OiBPbWl0PFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbiwgJ3JlcXVlc3RJZCc+O1xufVxuXG4vKiogU2VuZHMgb25lIChvcmcsIHR5cGUpJ3MgZ3JvdXBzLiBSZXNvbHZlcyB3aGVuIHRoZSBxdW90YSBzZXJ2aWNlIGFuc3dlcmVkIChvciBub3QpLiAqL1xuZXhwb3J0IHR5cGUgTWV0ZXJlZEluY3JlbWVudFNlbmRlciA9IChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgZ3JvdXBzOiBNZXRlcmVkSW5jcmVtZW50R3JvdXBbXSkgPT4gUHJvbWlzZTx2b2lkPjtcblxuaW50ZXJmYWNlIFBlbmRpbmdTZXJpZXMge1xuICBvcmdJZDogc3RyaW5nO1xuICBxdW90YVR5cGU6IFF1b3RhVHlwZTtcbiAgZ3JvdXBzOiBNYXA8c3RyaW5nLCBNZXRlcmVkSW5jcmVtZW50R3JvdXA+O1xufVxuXG4vKiogVGhlIGF0dHJpYnV0aW9uIGEgZ3JvdXAgYWdncmVnYXRlcyBvbiDigJQgZXZlcnl0aGluZyBidXQgdGhlIHBlci1yZXF1ZXN0IGlkLiAqL1xuZnVuY3Rpb24gZ3JvdXBBdHRyaWJ1dGlvbihhOiBRdW90YVVzYWdlQXR0cmlidXRpb24gfCB1bmRlZmluZWQpOiBNZXRlcmVkSW5jcmVtZW50R3JvdXBbJ2F0dHJpYnV0aW9uJ10ge1xuICBpZiAoIWEpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgcmVxdWVzdElkOiBfcmVxdWVzdElkLCAuLi5yZXN0IH0gPSBhO1xuICByZXR1cm4gT2JqZWN0LmtleXMocmVzdCkubGVuZ3RoID4gMCA/IHJlc3QgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdyb3VwS2V5KGE6IE1ldGVyZWRJbmNyZW1lbnRHcm91cFsnYXR0cmlidXRpb24nXSk6IHN0cmluZyB7XG4gIHJldHVybiBhID8gSlNPTi5zdHJpbmdpZnkoW2EucHJpbmNpcGFsVHlwZSwgYS5wcmluY2lwYWxJZCwgYS5rZXlJZCwgYS5yb3V0ZSwgYS5waXBlbGluZUlkXSkgOiAnJztcbn1cblxuLyoqIEEgcGVyLXBvZCBpbmNyZW1lbnQgYWdncmVnYXRvciBvdmVyIG9uZSBzZW5kZXIuIEV4cG9ydGVkIGZvciB0ZXN0cy4gKi9cbmV4cG9ydCBjbGFzcyBRdW90YUluY3JlbWVudEJhdGNoZXIge1xuICBwcml2YXRlIGJ1ZmZlciA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nU2VyaWVzPigpO1xuICBwcml2YXRlIGdyb3VwQ291bnQgPSAwO1xuICBwcml2YXRlIGluRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZW5kOiBNZXRlcmVkSW5jcmVtZW50U2VuZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0czogeyBmbHVzaE1zOiBudW1iZXI7IG1heEdyb3VwczogbnVtYmVyIH0gPSB7IGZsdXNoTXM6IFFVT1RBX0lOQ1JFTUVOVF9GTFVTSF9NUywgbWF4R3JvdXBzOiBRVU9UQV9JTkNSRU1FTlRfQlVGRkVSX01BWCB9LFxuICApIHt9XG5cbiAgLyoqIFVuaXRzIHdhaXRpbmcgZm9yIHRoZSBuZXh0IGZsdXNoICh0ZXN0cywgbWV0cmljcykuICovXG4gIHBlbmRpbmdVbml0cygpOiBudW1iZXIge1xuICAgIGxldCBuID0gMDtcbiAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5idWZmZXIudmFsdWVzKCkpIGZvciAoY29uc3QgZyBvZiBzLmdyb3Vwcy52YWx1ZXMoKSkgbiArPSBnLmFtb3VudDtcbiAgICByZXR1cm4gbjtcbiAgfVxuXG4gIC8qKiBDb3VudCBgYW1vdW50YCB1bml0cyBmb3IgKG9yZywgdHlwZSkuIE5ldmVyIHRocm93cywgbmV2ZXIgYXdhaXRzLiAqL1xuICBhZGQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF0dHJpYnV0aW9uPzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uLCBhbW91bnQ6IG51bWJlciA9IDEpOiB2b2lkIHtcbiAgICBjb25zdCBhdHRyID0gZ3JvdXBBdHRyaWJ1dGlvbihhdHRyaWJ1dGlvbik7XG4gICAgaWYgKHRoaXMub3B0cy5mbHVzaE1zID09PSAwKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoKG9yZ0lkLCBxdW90YVR5cGUsIFt7IGFtb3VudCwgLi4uKGF0dHIgJiYgeyBhdHRyaWJ1dGlvbjogYXR0ciB9KSB9XSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlcmllc0tleSA9IGAke29yZ0lkfVxcdTAwMDAke3F1b3RhVHlwZX1gO1xuICAgIGNvbnN0IGtleSA9IGdyb3VwS2V5KGF0dHIpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5idWZmZXIuZ2V0KHNlcmllc0tleSk/Lmdyb3Vwcy5nZXQoa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGV4aXN0aW5nLmFtb3VudCArPSBhbW91bnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmdyb3VwQ291bnQgPj0gdGhpcy5vcHRzLm1heEdyb3Vwcykge1xuICAgICAgaWYgKHRoaXMuaW5GbGlnaHQpIHtcbiAgICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX2luY3JlbWVudF9kcm9wcGVkX3RvdGFsJywgeyBxdW90YVR5cGUgfSwgYW1vdW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdm9pZCB0aGlzLmZsdXNoKCk7XG4gICAgfVxuICAgIGxldCBzZXJpZXMgPSB0aGlzLmJ1ZmZlci5nZXQoc2VyaWVzS2V5KTtcbiAgICBpZiAoIXNlcmllcykge1xuICAgICAgc2VyaWVzID0geyBvcmdJZCwgcXVvdGFUeXBlLCBncm91cHM6IG5ldyBNYXAoKSB9O1xuICAgICAgdGhpcy5idWZmZXIuc2V0KHNlcmllc0tleSwgc2VyaWVzKTtcbiAgICB9XG4gICAgc2VyaWVzLmdyb3Vwcy5zZXQoa2V5LCB7IGFtb3VudCwgLi4uKGF0dHIgJiYgeyBhdHRyaWJ1dGlvbjogYXR0ciB9KSB9KTtcbiAgICB0aGlzLmdyb3VwQ291bnQgKz0gMTtcbiAgICB0aGlzLmFybSgpO1xuICB9XG5cbiAgLyoqIFNlbmQgZXZlcnl0aGluZyBidWZmZXJlZCBub3cuIFJlc29sdmVzIG9uY2UgZXZlcnkgUE9TVCBoYXMgc2V0dGxlZC4gKi9cbiAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuYnVmZmVyLnNpemUgPT09IDApIHJldHVybiB0aGlzLmluRmxpZ2h0ID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCBiYXRjaCA9IFsuLi50aGlzLmJ1ZmZlci52YWx1ZXMoKV07XG4gICAgdGhpcy5idWZmZXIgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5ncm91cENvdW50ID0gMDtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuaW5GbGlnaHQ7XG4gICAgY29uc3QgcnVuID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHJ1bkNvbmN1cnJlbnQoYmF0Y2gsIEZMVVNIX0NPTkNVUlJFTkNZLCBhc3luYyAoc2VyaWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IFsuLi5zZXJpZXMuZ3JvdXBzLnZhbHVlcygpXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpICs9IE1BWF9HUk9VUFNfUEVSX0lOQ1JFTUVOVCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFNhZmVseShzZXJpZXMub3JnSWQsIHNlcmllcy5xdW90YVR5cGUsIGdyb3Vwcy5zbGljZShpLCBpICsgTUFYX0dST1VQU19QRVJfSU5DUkVNRU5UKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHByZXZpb3VzKSBhd2FpdCBwcmV2aW91cztcbiAgICB9KSgpO1xuICAgIHRoaXMuaW5GbGlnaHQgPSBydW47XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuaW5GbGlnaHQgPT09IHJ1bikgdGhpcy5pbkZsaWdodCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0b3AgdGhlIHRpbWVyICh0ZXN0czsgcHJvY2VzcyB0ZWFyZG93bikuIEJ1ZmZlcmVkIHVuaXRzIHN0YXkgdW50aWwge0BsaW5rIGZsdXNofS4gKi9cbiAgc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcbiAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXJtKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyKSByZXR1cm47XG4gICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKCgpID0+IHsgdm9pZCB0aGlzLmZsdXNoKCk7IH0sIHRoaXMub3B0cy5mbHVzaE1zKTtcbiAgICB0aGlzLnRpbWVyLnVucmVmPy4oKTtcbiAgICBhcm1TaHV0ZG93bkZsdXNoKCk7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBncm91cHM6IE1ldGVyZWRJbmNyZW1lbnRHcm91cFtdKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLnNlbmRTYWZlbHkob3JnSWQsIHF1b3RhVHlwZSwgZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZFNhZmVseShvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgZ3JvdXBzOiBNZXRlcmVkSW5jcmVtZW50R3JvdXBbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmQob3JnSWQsIHF1b3RhVHlwZSwgZ3JvdXBzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdNZXRlcmVkIHF1b3RhIGluY3JlbWVudCBmYWlsZWQnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9pbmNyZW1lbnRfZmFpbHVyZXNfdG90YWwnLCB7IHJlYXNvbjogJ2V4Y2VwdGlvbicsIHF1b3RhVHlwZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIE9uZSBiYXRjaGVyIHBlciBxdW90YSBjbGllbnQsIHNvIGEgdGVzdCdzIGZha2UgY2xpZW50IG5ldmVyIHNoYXJlcyBhIGJ1ZmZlci4gKi9cbmNvbnN0IGJhdGNoZXJzID0gbmV3IFdlYWtNYXA8UXVvdGFTZXJ2aWNlLCBRdW90YUluY3JlbWVudEJhdGNoZXI+KCk7XG5cbi8qKiBUaGUgbGl2ZSBiYXRjaGVycywgZm9yIHRoZSBzaHV0ZG93biBmbHVzaCAoYSBXZWFrTWFwIGNhbm5vdCBiZSBpdGVyYXRlZCkuICovXG5jb25zdCBsaXZlID0gbmV3IFNldDxRdW90YUluY3JlbWVudEJhdGNoZXI+KCk7XG5cbi8qKiBUaGUgYmF0Y2hlciBmZWVkaW5nIGBxdW90YVNlcnZpY2UuaW5jcmVtZW50TWV0ZXJlZGAuICovXG5leHBvcnQgZnVuY3Rpb24gYmF0Y2hlckZvcihxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSwgc2VuZGVyOiBNZXRlcmVkSW5jcmVtZW50U2VuZGVyKTogUXVvdGFJbmNyZW1lbnRCYXRjaGVyIHtcbiAgbGV0IGIgPSBiYXRjaGVycy5nZXQocXVvdGFTZXJ2aWNlKTtcbiAgaWYgKCFiKSB7XG4gICAgYiA9IG5ldyBRdW90YUluY3JlbWVudEJhdGNoZXIoc2VuZGVyKTtcbiAgICBiYXRjaGVycy5zZXQocXVvdGFTZXJ2aWNlLCBiKTtcbiAgICBsaXZlLmFkZChiKTtcbiAgfVxuICByZXR1cm4gYjtcbn1cblxuLyoqXG4gKiBGbHVzaCBldmVyeSBwb2QtbG9jYWwgYmF0Y2hlci4gQ2FsbGVkIGJ5IGBydW5TZXJ2ZXJgIG9uY2UgdGhlIEhUVFAgc2VydmVyIGhhc1xuICogc3RvcHBlZCBhY2NlcHRpbmcgYW5kIGluLWZsaWdodCByZXF1ZXN0cyBoYXZlIGZpbmlzaGVkICh0aGVpciBgZmluaXNoYFxuICogbWV0ZXJzIGFyZSB0aGVuIGFsbCBidWZmZXJlZCkuIE5ldmVyIHJlamVjdHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmbHVzaFF1b3RhSW5jcmVtZW50cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoWy4uLmxpdmVdLm1hcCgoYikgPT4gYi5mbHVzaCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpKTtcbn1cblxubGV0IHNodXRkb3duQXJtZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBTSUdURVJNIGZsdXNoIGZvciBwcm9jZXNzZXMgdGhhdCBkb24ndCBzaHV0IGRvd24gdGhyb3VnaCBgcnVuU2VydmVyYC5cbiAqXG4gKiBBcm1lZCBvbmx5IHdoZW4gdGhlIHByb2Nlc3MgQUxSRUFEWSBoYW5kbGVzIFNJR1RFUk0gKGV2ZXJ5IHNlcnZpY2UgcmVnaXN0ZXJzXG4gKiBpdHMgc2h1dGRvd24gYXQgc3RhcnR1cCwgYmVmb3JlIHRoZSBmaXJzdCByZXF1ZXN0IGlzIG1ldGVyZWQpOiBhZGRpbmcgdGhlXG4gKiBmaXJzdCBsaXN0ZW5lciB3b3VsZCBzd2l0Y2ggb2ZmIE5vZGUncyBkZWZhdWx0IGV4aXQtb24tU0lHVEVSTSBmb3IgYSBwcm9jZXNzXG4gKiB0aGF0IHJlbGllZCBvbiBpdCAoYSBDTEksIGEgdGVzdCB3b3JrZXIpLlxuICovXG5mdW5jdGlvbiBhcm1TaHV0ZG93bkZsdXNoKCk6IHZvaWQge1xuICBpZiAoc2h1dGRvd25Bcm1lZCB8fCBwcm9jZXNzLmxpc3RlbmVyQ291bnQoJ1NJR1RFUk0nKSA9PT0gMCkgcmV0dXJuO1xuICBzaHV0ZG93bkFybWVkID0gdHJ1ZTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgKCkgPT4geyB2b2lkIGZsdXNoUXVvdGFJbmNyZW1lbnRzKCk7IH0pO1xufVxuIl19
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtaW5jcmVtZW50LWJhdGNoZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9xdW90YS1pbmNyZW1lbnQtYmF0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBdUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFFdkQsc0ZBQXNGO0FBQ3RGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRTFHLHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLENBQUMsNEJBQTRCLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFbkcsNkZBQTZGO0FBQzdGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUU1QyxrQ0FBa0M7QUFDbEMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFpQjVCLGlGQUFpRjtBQUNqRixTQUFTLGdCQUFnQixDQUFDLENBQW9DO0lBQzVELElBQUksQ0FBQyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDekIsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0MsT0FBTyxNQUFNLENBQUMsSUFB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QU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztBQUUxQjs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxnQkFBZ0I7SUFDdkIsSUFBSSxhQUFhLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTztJQUNwRSxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxHQUFHLEtBQUssb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBQZXItcG9kIGFnZ3JlZ2F0aW9uIG9mIE1FVEVSSU5HIGluY3JlbWVudHMgKGFwaUNhbGxzIC8gYXV0b21hdGlvbkNhbGxzKS5cbiAqXG4gKiBNZXRlcmluZyB1c2VkIHRvIGJlIG9uZSBQT1NUIHRvIHRoZSBxdW90YSBzZXJ2aWNlIHBlciBzdWNjZXNzZnVsIHJlcXVlc3QsXG4gKiBhbmQgZWFjaCBQT1NUIHdhcyBhIGNvbmRpdGlvbmFsIGBmaW5kT25lQW5kVXBkYXRlYCBvbiB0aGUgb3JnJ3MgaG90IGRvY3VtZW50LFxuICogYSB0ZWFtIGNvdW50ZXIgdXBkYXRlLCBhIGxlZGdlciBpbnNlcnQgYW5kIGEgdGhyZXNob2xkIGNoZWNrLiBBdCB0aGUgcmVxdWVzdFxuICogcmF0ZXMgdGhlIG1ldGVyIGV4aXN0cyBmb3IsIHRoZSBxdW90YSBzZXJ2aWNlIHdhcyBkb2luZyBtb3JlIHdvcmsgdGhhbiB0aGVcbiAqIHJlcXVlc3QgaXQgd2FzIGNvdW50aW5nLlxuICpcbiAqIEluY3JlbWVudHMgYXJlIG5vdyBzdW1tZWQgaW4gbWVtb3J5IHBlciAob3JnLCBxdW90YSB0eXBlKSBhbmQsIGluc2lkZSB0aGF0LFxuICogcGVyIGF0dHJpYnV0aW9uIGdyb3VwIChwcmluY2lwYWwsIGtleSwgcm91dGUgcGF0dGVybiwgcGlwZWxpbmUpLCB0aGVuIHNlbnRcbiAqIGV2ZXJ5IGBRVU9UQV9JTkNSRU1FTlRfRkxVU0hfTVNgIChkZWZhdWx0IDEwMDApIGFzIE9ORSBtZXRlcmVkIGluY3JlbWVudCBwZXJcbiAqIChvcmcsIHR5cGUpIGNhcnJ5aW5nIGl0cyBncm91cHMuIFRoZSBxdW90YSBzZXJ2aWNlIGFwcGxpZXMgdGhlIHN1bSBhdG9taWNhbGx5XG4gKiBhZ2FpbnN0IHRoZSAocG9vbGVkKSBjYXAgd2l0aCBwYXJ0aWFsIGFkbWlzc2lvbjogdGhlIGNvdW50ZXIgbW92ZXMgYnkgYXMgbXVjaFxuICogYXMgZml0cyBhbmQgbmV2ZXIgcGFzdCB0aGUgbGltaXQsIGFuZCB0aGUgcmVzdCBpcyByZWNvcmRlZCBhcyBgb3ZlcnNob290YCBpblxuICogdGhlIGxlZGdlciAoYXBpL3F1b3RhIGBpbmNyZW1lbnRNZXRlcmVkYCkuXG4gKlxuICogR3VhcmFudGVlcywgYW5kIHRoZWlyIGxpbWl0czpcbiAqICAtIHRoZSBjb3VudGVyIG1heSBMQUcgcmVhbCB1c2FnZSBieSB1cCB0byBvbmUgZmx1c2ggaW50ZXJ2YWwgKHBsdXMgdGhlIEhUVFBcbiAqICAgIGhvcCk7IGVuZm9yY2VtZW50IGlzIHVuYWZmZWN0ZWQgYmV5b25kIHRoYXQgbGFnLCBiZWNhdXNlIHRoZSBjb3VudGVyXG4gKiAgICBzdGlsbCBuZXZlciBleGNlZWRzIHRoZSBjYXA7XG4gKiAgLSB0aGUgYnVmZmVyIGlzIGJvdW5kZWQgKGBRVU9UQV9JTkNSRU1FTlRfQlVGRkVSX01BWGAgYXR0cmlidXRpb24gZ3JvdXBzKS5cbiAqICAgIFJlYWNoaW5nIGl0IGZsdXNoZXMgaW1tZWRpYXRlbHk7IG9ubHkgd2hpbGUgYSBmbHVzaCBpcyBhbHJlYWR5IGluIGZsaWdodFxuICogICAgaXMgYSBORVcgZ3JvdXAgZHJvcHBlZCwgY291bnRlZCBvbiBgcXVvdGFfaW5jcmVtZW50X2Ryb3BwZWRfdG90YWxgO1xuICogIC0gYSBmbHVzaCB0aGF0IGZhaWxzIGlzIGNvdW50ZWQgb24gYHF1b3RhX2luY3JlbWVudF9mYWlsdXJlc190b3RhbGAgKHRoZVxuICogICAgUXVvdGFJbmNyZW1lbnRGYWlsdXJlcyBhbGVydCkgYW5kIE5PVCByZXRyaWVkOiB0aGUgUE9TVCBtYXkgaGF2ZSBsYW5kZWQsXG4gKiAgICBhbmQgYSByZXRyeSB3b3VsZCBkb3VibGUtY291bnQ7XG4gKiAgLSBncmFjZWZ1bCBzaHV0ZG93biBmbHVzaGVzOiBgcnVuU2VydmVyYCBhd2FpdHMge0BsaW5rIGZsdXNoUXVvdGFJbmNyZW1lbnRzfVxuICogICAgYWZ0ZXIgdGhlIEhUVFAgc2VydmVyIGhhcyBkcmFpbmVkLCBhbmQgYSBTSUdURVJNIGZsdXNoIGNvdmVycyBwcm9jZXNzZXNcbiAqICAgIHdpdGggdGhlaXIgb3duIHNodXRkb3duIHBhdGguXG4gKlxuICogUmVzZXJ2YXRpb25zIChhaUNhbGxzLCBwaXBlbGluZXMsIHBsdWdpbnMg4oCmKSBuZXZlciBjb21lIHRocm91Z2ggaGVyZSDigJQgdGhleVxuICogbmVlZCB0aGUgc3luY2hyb25vdXMgYW5zd2VyIGFuZCBrZWVwIGByZXNlcnZlUXVvdGFgLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUXVvdGFTZXJ2aWNlLCBRdW90YVVzYWdlQXR0cmlidXRpb24gfSBmcm9tICcuL3F1b3RhLmpzJztcbmltcG9ydCB0eXBlIHsgUXVvdGFUeXBlIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IHJ1bkNvbmN1cnJlbnQgfSBmcm9tICcuLi91dGlscy9jb25jdXJyZW5jeS5qcyc7XG5pbXBvcnQgeyBlbnZJbnQgfSBmcm9tICcuLi91dGlscy9lbnYuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3F1b3RhLWluY3JlbWVudC1iYXRjaGVyJyk7XG5cbi8qKiBGbHVzaCBpbnRlcnZhbCAobXMpLiBgMGAgZGlzYWJsZXMgYmF0Y2hpbmc6IGV2ZXJ5IGluY3JlbWVudCBpcyBzZW50IG9uIGl0cyBvd24uICovXG5leHBvcnQgY29uc3QgUVVPVEFfSU5DUkVNRU5UX0ZMVVNIX01TID0gZW52SW50KCdRVU9UQV9JTkNSRU1FTlRfRkxVU0hfTVMnLCAxMDAwLCB7IG1pbjogMCwgbWF4OiA2MF8wMDAgfSk7XG5cbi8qKiBNb3N0IGF0dHJpYnV0aW9uIGdyb3VwcyBoZWxkIGJldHdlZW4gZmx1c2hlcywgYWNyb3NzIGV2ZXJ5IG9yZy4gKi9cbmV4cG9ydCBjb25zdCBRVU9UQV9JTkNSRU1FTlRfQlVGRkVSX01BWCA9IGVudkludCgnUVVPVEFfSU5DUkVNRU5UX0JVRkZFUl9NQVgnLCAxMF8wMDAsIHsgbWluOiAxIH0pO1xuXG4vKiogTW9zdCBncm91cHMgb25lIG1ldGVyZWQgaW5jcmVtZW50IGNhcnJpZXMgKHRoZSBxdW90YSBzZXJ2aWNlIGVuZm9yY2VzIHRoZSBzYW1lIGJvdW5kKS4gKi9cbmV4cG9ydCBjb25zdCBNQVhfR1JPVVBTX1BFUl9JTkNSRU1FTlQgPSA1MDA7XG5cbi8qKiBDb25jdXJyZW50IFBPU1RzIHBlciBmbHVzaC4gKi9cbmNvbnN0IEZMVVNIX0NPTkNVUlJFTkNZID0gODtcblxuLyoqIE9uZSBhdHRyaWJ1dGlvbiBncm91cCBvZiBhIG1ldGVyZWQgaW5jcmVtZW50OiB3aG8gc3BlbnQgYGFtb3VudGAgdW5pdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGVyZWRJbmNyZW1lbnRHcm91cCB7XG4gIGFtb3VudDogbnVtYmVyO1xuICBhdHRyaWJ1dGlvbj86IE9taXQ8UXVvdGFVc2FnZUF0dHJpYnV0aW9uLCAncmVxdWVzdElkJz47XG59XG5cbi8qKiBTZW5kcyBvbmUgKG9yZywgdHlwZSkncyBncm91cHMuIFJlc29sdmVzIHdoZW4gdGhlIHF1b3RhIHNlcnZpY2UgYW5zd2VyZWQgKG9yIG5vdCkuICovXG5leHBvcnQgdHlwZSBNZXRlcmVkSW5jcmVtZW50U2VuZGVyID0gKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBncm91cHM6IE1ldGVyZWRJbmNyZW1lbnRHcm91cFtdKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5pbnRlcmZhY2UgUGVuZGluZ1NlcmllcyB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlO1xuICBncm91cHM6IE1hcDxzdHJpbmcsIE1ldGVyZWRJbmNyZW1lbnRHcm91cD47XG59XG5cbi8qKiBUaGUgYXR0cmlidXRpb24gYSBncm91cCBhZ2dyZWdhdGVzIG9uIOKAlCBldmVyeXRoaW5nIGJ1dCB0aGUgcGVyLXJlcXVlc3QgaWQuICovXG5mdW5jdGlvbiBncm91cEF0dHJpYnV0aW9uKGE6IFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbiB8IHVuZGVmaW5lZCk6IE1ldGVyZWRJbmNyZW1lbnRHcm91cFsnYXR0cmlidXRpb24nXSB7XG4gIGlmICghYSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgeyByZXF1ZXN0SWQ6IF9yZXF1ZXN0SWQsIC4uLnJlc3QgfSA9IGE7XG4gIHJldHVybiBPYmplY3Qua2V5cyhyZXN0KS5sZW5ndGggPiAwID8gcmVzdCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ3JvdXBLZXkoYTogTWV0ZXJlZEluY3JlbWVudEdyb3VwWydhdHRyaWJ1dGlvbiddKTogc3RyaW5nIHtcbiAgcmV0dXJuIGEgPyBKU09OLnN0cmluZ2lmeShbYS5wcmluY2lwYWxUeXBlLCBhLnByaW5jaXBhbElkLCBhLmtleUlkLCBhLnJvdXRlLCBhLnBpcGVsaW5lSWRdKSA6ICcnO1xufVxuXG4vKiogQSBwZXItcG9kIGluY3JlbWVudCBhZ2dyZWdhdG9yIG92ZXIgb25lIHNlbmRlci4gRXhwb3J0ZWQgZm9yIHRlc3RzLiAqL1xuZXhwb3J0IGNsYXNzIFF1b3RhSW5jcmVtZW50QmF0Y2hlciB7XG4gIHByaXZhdGUgYnVmZmVyID0gbmV3IE1hcDxzdHJpbmcsIFBlbmRpbmdTZXJpZXM+KCk7XG4gIHByaXZhdGUgZ3JvdXBDb3VudCA9IDA7XG4gIHByaXZhdGUgaW5GbGlnaHQ6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0aW1lcjogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlbmQ6IE1ldGVyZWRJbmNyZW1lbnRTZW5kZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRzOiB7IGZsdXNoTXM6IG51bWJlcjsgbWF4R3JvdXBzOiBudW1iZXIgfSA9IHsgZmx1c2hNczogUVVPVEFfSU5DUkVNRU5UX0ZMVVNIX01TLCBtYXhHcm91cHM6IFFVT1RBX0lOQ1JFTUVOVF9CVUZGRVJfTUFYIH0sXG4gICkge31cblxuICAvKiogVW5pdHMgd2FpdGluZyBmb3IgdGhlIG5leHQgZmx1c2ggKHRlc3RzLCBtZXRyaWNzKS4gKi9cbiAgcGVuZGluZ1VuaXRzKCk6IG51bWJlciB7XG4gICAgbGV0IG4gPSAwO1xuICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLmJ1ZmZlci52YWx1ZXMoKSkgZm9yIChjb25zdCBnIG9mIHMuZ3JvdXBzLnZhbHVlcygpKSBuICs9IGcuYW1vdW50O1xuICAgIHJldHVybiBuO1xuICB9XG5cbiAgLyoqIENvdW50IGBhbW91bnRgIHVuaXRzIGZvciAob3JnLCB0eXBlKS4gTmV2ZXIgdGhyb3dzLCBuZXZlciBhd2FpdHMuICovXG4gIGFkZChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXR0cmlidXRpb24/OiBRdW90YVVzYWdlQXR0cmlidXRpb24sIGFtb3VudDogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgIGNvbnN0IGF0dHIgPSBncm91cEF0dHJpYnV0aW9uKGF0dHJpYnV0aW9uKTtcbiAgICBpZiAodGhpcy5vcHRzLmZsdXNoTXMgPT09IDApIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2gob3JnSWQsIHF1b3RhVHlwZSwgW3sgYW1vdW50LCAuLi4oYXR0ciAmJiB7IGF0dHJpYnV0aW9uOiBhdHRyIH0pIH1dKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VyaWVzS2V5ID0gYCR7b3JnSWR9XFx1MDAwMCR7cXVvdGFUeXBlfWA7XG4gICAgY29uc3Qga2V5ID0gZ3JvdXBLZXkoYXR0cik7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmJ1ZmZlci5nZXQoc2VyaWVzS2V5KT8uZ3JvdXBzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcuYW1vdW50ICs9IGFtb3VudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JvdXBDb3VudCA+PSB0aGlzLm9wdHMubWF4R3JvdXBzKSB7XG4gICAgICBpZiAodGhpcy5pbkZsaWdodCkge1xuICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfaW5jcmVtZW50X2Ryb3BwZWRfdG90YWwnLCB7IHF1b3RhVHlwZSB9LCBhbW91bnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2b2lkIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gICAgbGV0IHNlcmllcyA9IHRoaXMuYnVmZmVyLmdldChzZXJpZXNLZXkpO1xuICAgIGlmICghc2VyaWVzKSB7XG4gICAgICBzZXJpZXMgPSB7IG9yZ0lkLCBxdW90YVR5cGUsIGdyb3VwczogbmV3IE1hcCgpIH07XG4gICAgICB0aGlzLmJ1ZmZlci5zZXQoc2VyaWVzS2V5LCBzZXJpZXMpO1xuICAgIH1cbiAgICBzZXJpZXMuZ3JvdXBzLnNldChrZXksIHsgYW1vdW50LCAuLi4oYXR0ciAmJiB7IGF0dHJpYnV0aW9uOiBhdHRyIH0pIH0pO1xuICAgIHRoaXMuZ3JvdXBDb3VudCArPSAxO1xuICAgIHRoaXMuYXJtKCk7XG4gIH1cblxuICAvKiogU2VuZCBldmVyeXRoaW5nIGJ1ZmZlcmVkIG5vdy4gUmVzb2x2ZXMgb25jZSBldmVyeSBQT1NUIGhhcyBzZXR0bGVkLiAqL1xuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5idWZmZXIuc2l6ZSA9PT0gMCkgcmV0dXJuIHRoaXMuaW5GbGlnaHQgPz8gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGJhdGNoID0gWy4uLnRoaXMuYnVmZmVyLnZhbHVlcygpXTtcbiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmdyb3VwQ291bnQgPSAwO1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5pbkZsaWdodDtcbiAgICBjb25zdCBydW4gPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgcnVuQ29uY3VycmVudChiYXRjaCwgRkxVU0hfQ09OQ1VSUkVOQ1ksIGFzeW5jIChzZXJpZXMpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gWy4uLnNlcmllcy5ncm91cHMudmFsdWVzKCldO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkgKz0gTUFYX0dST1VQU19QRVJfSU5DUkVNRU5UKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZW5kU2FmZWx5KHNlcmllcy5vcmdJZCwgc2VyaWVzLnF1b3RhVHlwZSwgZ3JvdXBzLnNsaWNlKGksIGkgKyBNQVhfR1JPVVBTX1BFUl9JTkNSRU1FTlQpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAocHJldmlvdXMpIGF3YWl0IHByZXZpb3VzO1xuICAgIH0pKCk7XG4gICAgdGhpcy5pbkZsaWdodCA9IHJ1bjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVuO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5pbkZsaWdodCA9PT0gcnVuKSB0aGlzLmluRmxpZ2h0ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogU3RvcCB0aGUgdGltZXIgKHRlc3RzOyBwcm9jZXNzIHRlYXJkb3duKS4gQnVmZmVyZWQgdW5pdHMgc3RheSB1bnRpbCB7QGxpbmsgZmx1c2h9LiAqL1xuICBzdG9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyKSBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuICAgIHRoaXMudGltZXIgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhcm0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGltZXIpIHJldHVybjtcbiAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB2b2lkIHRoaXMuZmx1c2goKTsgfSwgdGhpcy5vcHRzLmZsdXNoTXMpO1xuICAgIHRoaXMudGltZXIudW5yZWY/LigpO1xuICAgIGFybVNodXRkb3duRmx1c2goKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2gob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGdyb3VwczogTWV0ZXJlZEluY3JlbWVudEdyb3VwW10pOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuc2VuZFNhZmVseShvcmdJZCwgcXVvdGFUeXBlLCBncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kU2FmZWx5KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBncm91cHM6IE1ldGVyZWRJbmNyZW1lbnRHcm91cFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZChvcmdJZCwgcXVvdGFUeXBlLCBncm91cHMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ01ldGVyZWQgcXVvdGEgaW5jcmVtZW50IGZhaWxlZCcsIHsgb3JnSWQsIHF1b3RhVHlwZSwgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX2luY3JlbWVudF9mYWlsdXJlc190b3RhbCcsIHsgcmVhc29uOiAnZXhjZXB0aW9uJywgcXVvdGFUeXBlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKiogT25lIGJhdGNoZXIgcGVyIHF1b3RhIGNsaWVudCwgc28gYSB0ZXN0J3MgZmFrZSBjbGllbnQgbmV2ZXIgc2hhcmVzIGEgYnVmZmVyLiAqL1xuY29uc3QgYmF0Y2hlcnMgPSBuZXcgV2Vha01hcDxRdW90YVNlcnZpY2UsIFF1b3RhSW5jcmVtZW50QmF0Y2hlcj4oKTtcblxuLyoqIFRoZSBsaXZlIGJhdGNoZXJzLCBmb3IgdGhlIHNodXRkb3duIGZsdXNoIChhIFdlYWtNYXAgY2Fubm90IGJlIGl0ZXJhdGVkKS4gKi9cbmNvbnN0IGxpdmUgPSBuZXcgU2V0PFF1b3RhSW5jcmVtZW50QmF0Y2hlcj4oKTtcblxuLyoqIFRoZSBiYXRjaGVyIGZlZWRpbmcgYHF1b3RhU2VydmljZS5pbmNyZW1lbnRNZXRlcmVkYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXRjaGVyRm9yKHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLCBzZW5kZXI6IE1ldGVyZWRJbmNyZW1lbnRTZW5kZXIpOiBRdW90YUluY3JlbWVudEJhdGNoZXIge1xuICBsZXQgYiA9IGJhdGNoZXJzLmdldChxdW90YVNlcnZpY2UpO1xuICBpZiAoIWIpIHtcbiAgICBiID0gbmV3IFF1b3RhSW5jcmVtZW50QmF0Y2hlcihzZW5kZXIpO1xuICAgIGJhdGNoZXJzLnNldChxdW90YVNlcnZpY2UsIGIpO1xuICAgIGxpdmUuYWRkKGIpO1xuICB9XG4gIHJldHVybiBiO1xufVxuXG4vKipcbiAqIEZsdXNoIGV2ZXJ5IHBvZC1sb2NhbCBiYXRjaGVyLiBDYWxsZWQgYnkgYHJ1blNlcnZlcmAgb25jZSB0aGUgSFRUUCBzZXJ2ZXIgaGFzXG4gKiBzdG9wcGVkIGFjY2VwdGluZyBhbmQgaW4tZmxpZ2h0IHJlcXVlc3RzIGhhdmUgZmluaXNoZWQgKHRoZWlyIGBmaW5pc2hgXG4gKiBtZXRlcnMgYXJlIHRoZW4gYWxsIGJ1ZmZlcmVkKS4gTmV2ZXIgcmVqZWN0cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoUXVvdGFJbmNyZW1lbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBQcm9taXNlLmFsbChbLi4ubGl2ZV0ubWFwKChiKSA9PiBiLmZsdXNoKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSkpO1xufVxuXG5sZXQgc2h1dGRvd25Bcm1lZCA9IGZhbHNlO1xuXG4vKipcbiAqIFNJR1RFUk0gZmx1c2ggZm9yIHByb2Nlc3NlcyB0aGF0IGRvbid0IHNodXQgZG93biB0aHJvdWdoIGBydW5TZXJ2ZXJgLlxuICpcbiAqIEFybWVkIG9ubHkgd2hlbiB0aGUgcHJvY2VzcyBBTFJFQURZIGhhbmRsZXMgU0lHVEVSTSAoZXZlcnkgc2VydmljZSByZWdpc3RlcnNcbiAqIGl0cyBzaHV0ZG93biBhdCBzdGFydHVwLCBiZWZvcmUgdGhlIGZpcnN0IHJlcXVlc3QgaXMgbWV0ZXJlZCk6IGFkZGluZyB0aGVcbiAqIGZpcnN0IGxpc3RlbmVyIHdvdWxkIHN3aXRjaCBvZmYgTm9kZSdzIGRlZmF1bHQgZXhpdC1vbi1TSUdURVJNIGZvciBhIHByb2Nlc3NcbiAqIHRoYXQgcmVsaWVkIG9uIGl0IChhIENMSSwgYSB0ZXN0IHdvcmtlcikuXG4gKi9cbmZ1bmN0aW9uIGFybVNodXRkb3duRmx1c2goKTogdm9pZCB7XG4gIGlmIChzaHV0ZG93bkFybWVkIHx8IHByb2Nlc3MubGlzdGVuZXJDb3VudCgnU0lHVEVSTScpID09PSAwKSByZXR1cm47XG4gIHNodXRkb3duQXJtZWQgPSB0cnVlO1xuICBwcm9jZXNzLm9uY2UoJ1NJR1RFUk0nLCAoKSA9PiB7IHZvaWQgZmx1c2hRdW90YUluY3JlbWVudHMoKTsgfSk7XG59XG4iXX0=
@@ -556,4 +556,4 @@ export function decrementQuota(quotaService, orgId, quotaType, authHeader, logWa
556
556
  : quotaService.decrement(orgId, quotaType, authHeader, amount, resetAtSnapshot);
557
557
  sent.catch((err) => logWarn('Quota rollback failed', { error: errorMessage(err) }));
558
558
  }
559
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcXVvdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUl0QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsZ0JBQWdCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBOEIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDM0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBa0IsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFL0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLHFCQUFxQixHQUErRDtJQUN4RixtQkFBbUIsRUFBRSxDQUFDO0lBQ3RCLFVBQVUsRUFBRSxDQUFDO0NBQ2QsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUV4RixTQUFTLG1CQUFtQixDQUFDLFNBQW9CO0lBQy9DLElBQUksU0FBUyxLQUFLLGNBQWM7UUFBRSxPQUFPLHFCQUFxQixDQUFDO0lBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztBQUNwRixDQUFDO0FBRUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRXJDLCtDQUErQztBQUMvQyxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSxnRkFBZ0Y7QUFDaEYsaUZBQWlGO0FBQ2pGLG9FQUFvRTtBQUNwRSxtRUFBbUU7QUFDbkUsMkVBQTJFO0FBQzNFLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLENBQUMsQ0FBQztBQTRDMUUsK0ZBQStGO0FBQy9GLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBRWhDLFNBQVMsT0FBTyxDQUFDLEtBQWM7SUFDN0IsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN6RyxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLFNBQVMsb0JBQW9CLENBQUMsSUFBNEI7SUFDeEQsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixPQUFPO1FBQ0wsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1FBQ2pDLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUM5QixLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztLQUM3QyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxHQUFZO0lBQ3RELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLE9BQU8sU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdHLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDNUMsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RJLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEQsTUFBTSxTQUFTLEdBQUksR0FBd0MsQ0FBQyxTQUFTO1dBQ2hFLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEcsT0FBTztRQUNMLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNqQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUN4RCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHNCQUFzQjtJQUM3QixNQUFNLEdBQUcsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDcEIsT0FBTztRQUNMLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7UUFDMUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ2hFLENBQUM7QUFDSixDQUFDO0FBRUQscUZBQXFGO0FBQ3JGLFNBQVMsa0JBQWtCLENBQUMsUUFBZ0M7SUFDMUQsTUFBTSxRQUFRLEdBQUcsUUFBUSxJQUFJLHNCQUFzQixFQUFFLENBQUM7SUFDdEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBMEIsRUFBRSxTQUFvQjtJQUNsRixJQUFJLFNBQVMsS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVELE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDbkIsSUFBSSxDQUFDLENBQUMsYUFBYSxLQUFLLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxXQUFXO1FBQUUsT0FBTyxpQkFBaUIsQ0FBQztJQUNsSCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBS0Q7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUFZO0lBQzdDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hDLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWM7UUFBRSxPQUFPLGVBQWUsQ0FBQztJQUNwRCxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUM1QyxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsS0FBYTtJQUNyRCxPQUFPLG9CQUFvQixDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDekcsQ0FBQztBQXdDRCxNQUFNLGNBQWMsR0FBd0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLEVBQUUsU0FBUyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztBQWtGOUg7OztHQUdHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FDekIsS0FBYSxFQUNiLFNBQW9CLEVBQ3BCLE1BQWtELEVBQ2xELFVBQW1CO0lBRW5CLElBQUksdUJBQXVCLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN4SCxXQUFXLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUM1RixDQUFDO0lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxpRUFBaUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDekgsV0FBVyxDQUFDLHlCQUF5QixFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNwRixPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQzVHLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsb0JBQW9CO0lBQzNCLE9BQU87UUFDTCxPQUFPLEVBQUUsSUFBSTtRQUNiLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDVCxJQUFJLEVBQUUsQ0FBQztRQUNQLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDYixPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7UUFDakMsU0FBUyxFQUFFLElBQUk7UUFDZiwwRUFBMEU7UUFDMUUsa0VBQWtFO1FBQ2xFLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQWEsRUFBRSxVQUFtQixFQUFFLFNBQWtCO0lBQzFFLE1BQU0sT0FBTyxHQUEyQixFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM5RCxJQUFJLFVBQVU7UUFBRSxPQUFPLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQztJQUNuRCxJQUFJLFNBQVM7UUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ25ELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFNLEdBQXVCLEVBQUU7SUFDaEUsTUFBTSxhQUFhLEdBQWtCO1FBQ25DLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJO1FBQ2xELElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJO1FBQ2xELE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUk7S0FDaEMsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRS9DLGlFQUFpRTtJQUNqRSxLQUFLLFVBQVUsUUFBUSxDQUNyQixLQUFhLEVBQUUsVUFBa0IsRUFBRSxTQUFrQjtRQUVyRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBSTlCLFdBQVcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsRUFBRSxHQUFHLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUM5SCxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUM1RCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPO1lBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JJLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDN0MsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEgsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxPQUFPO1FBQ0wsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFhLEVBQUUsU0FBb0IsRUFBRSxVQUFrQixFQUFFLFNBQWtCO1lBQ3JGLE1BQU0sSUFBSSxHQUFHLFdBQVcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUVyRixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBSTlCLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVyRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyw4REFBOEQsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRyxXQUFXLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDL0YsT0FBTyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2hDLENBQUM7WUFFRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDekYsTUFBTSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsRUFBRTtvQkFDNUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPO2lCQUNsRixDQUFDLENBQUM7Z0JBQ0gsV0FBVyxDQUFDLHVCQUF1QixFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQzFGLE9BQU8sb0JBQW9CLEVBQUUsQ0FBQztZQUNoQyxDQUFDO1lBRUQsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDbkMsQ0FBQztRQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBYSxFQUFFLFNBQW9CLEVBQUUsVUFBa0IsRUFBRSxNQUFNLEdBQVcsQ0FBQyxFQUFFLFdBQW1DO1lBQzlILE1BQU0sSUFBSSxHQUFHLFdBQVcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztZQUM5RCxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUU3QyxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU07aUJBQzFCLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRSxHQUFHLHFCQUFxQixFQUFFLENBQUMsQ0FBQztZQUVsSyxJQUFJLFFBQVEsRUFBRSxVQUFVLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2pDLHVFQUF1RTtnQkFDdkUsdUVBQXVFO2dCQUN2RSxnQkFBZ0I7Z0JBQ2hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDckYsQ0FBQztpQkFBTSxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUU7b0JBQ3ZDLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVTtpQkFDM0QsQ0FBQyxDQUFDO2dCQUNILHNFQUFzRTtnQkFDdEUsd0VBQXdFO2dCQUN4RSx3RUFBd0U7Z0JBQ3hFLFdBQVcsQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDNUcsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLFNBQW9CLEVBQUUsVUFBa0IsRUFBRSxNQUErQjtZQUM3RyxNQUFNLElBQUksR0FBRyxXQUFXLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFDOUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVELElBQUksTUFBTSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3JELE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FDaEMsSUFBSSxFQUNKLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUMxQyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEdBQUcscUJBQXFCLEVBQUUsQ0FDdkUsQ0FBQztZQUNGLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUN4RSxNQUFNLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUN2SCx1RUFBdUU7Z0JBQ3ZFLFdBQVcsQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQzFHLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUM7WUFDdEQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDbEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFhLEVBQUUsU0FBb0IsRUFBRSxVQUFrQixFQUFFLE1BQU0sR0FBVyxDQUFDLEVBQUUsV0FBbUM7WUFDNUgsTUFBTSxJQUFJLEdBQUcsV0FBVyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQzlELE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTdDLDBFQUEwRTtZQUMxRSxzREFBc0Q7WUFDdEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQU8vQixJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRSxHQUFHLHFCQUFxQixFQUFFLENBQUMsQ0FBQztZQUU3SixJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPLGtCQUFrQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFMUUsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7Z0JBQ3ZDLDBFQUEwRTtnQkFDMUUseUVBQXlFO2dCQUN6RSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNqRSxPQUFPO3dCQUNMLFFBQVEsRUFBRSxJQUFJO3dCQUNkLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQW1CO3dCQUN2QyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDcEUsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7cUJBQ2pFLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCx3RUFBd0U7Z0JBQ3hFLHdFQUF3RTtnQkFDeEUsd0VBQXdFO2dCQUN4RSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxjQUFjLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3pELE9BQU87d0JBQ0wsUUFBUSxFQUFFLElBQUk7d0JBQ2QsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7cUJBQ2pFLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxPQUFPLGtCQUFrQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRixDQUFDO1lBRUQsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzFELE9BQU8sa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFFRCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7WUFDcEMsT0FBTztnQkFDTCxRQUFRLEVBQUUsS0FBSztnQkFDZixLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUU7YUFDbkUsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWEsRUFBRSxTQUFvQixFQUFFLFVBQWtCLEVBQUUsTUFBTSxHQUFXLENBQUMsRUFBRSxlQUF3QixFQUFFLFdBQW1DO1lBQ3hKLE1BQU0sSUFBSSxHQUFHLFdBQVcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztZQUM5RCxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3QyxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU07aUJBQzFCLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxlQUFlLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRSxHQUFHLHFCQUFxQixFQUFFLENBQUMsQ0FBQztZQUUvTSxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQzdDLG9FQUFvRTtnQkFDcEUsbUVBQW1FO2dCQUNuRSxxQ0FBcUM7Z0JBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNERBQTRELEVBQUU7b0JBQ3hFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVTtpQkFDM0QsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQWEsRUFBRSxTQUFvQixFQUFFLFVBQWtCLEVBQUUsTUFBdUIsRUFBRSxXQUFtQztZQUNySSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRSxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3QywwRUFBMEU7WUFDMUUsSUFBSSxRQUFRLEtBQUssQ0FBQyxJQUFJLFNBQVMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU87WUFDdkQsTUFBTSxJQUFJLEdBQUcsV0FBVyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQzlELElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQ2hDLElBQUksRUFDSixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQ3BGLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRSxHQUFHLHFCQUFxQixFQUFFLENBQ3hGLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUM3QyxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7b0JBQ2pHLFdBQVcsQ0FBQyxtQ0FBbUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQy9HLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekYsV0FBVyxDQUFDLG1DQUFtQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFhLEVBQUUsVUFBa0IsRUFBRSxTQUFrQjtZQUNqRSxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckMsSUFBSSxLQUFLO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDMUQsSUFBSSxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxzREFBc0QsWUFBWSxPQUFPLEVBQUU7Z0JBQ3JGLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWTthQUNuRixDQUFDLENBQUM7WUFDSCxXQUFXLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3BHLE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQWEsRUFBRSxVQUFrQixFQUFFLFNBQWtCO1lBQ3ZFLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDeEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUMzSCxXQUFXLENBQUMseUJBQXlCLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3RHLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFhO0lBQ3BDLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBRSxZQUEwQixFQUN4RCxLQUFhLEVBQ2IsU0FBb0IsRUFDcEIsT0FBa0QsRUFDbEQsV0FBbUM7SUFFbkMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNuRSxNQUFNLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRSxXQUFXLENBQUMsZ0NBQWdDLEVBQUUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFFLFlBQTBCLEVBQ3RELEtBQWEsRUFDYixTQUFvQixFQUNwQixVQUFrQixFQUNsQixNQUFNLEdBQVcsQ0FBQyxFQUNsQixXQUFtQztJQUVuQyxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxxRkFBcUY7QUFDckYsTUFBTSxxQ0FBcUMsR0FBRyxDQUFDLENBQUM7QUFFaEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxHQUFhLEVBQUUsU0FBb0IsRUFBRSxXQUErQjtJQUN6RyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQix3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUcsQ0FBQztRQUNELFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELFNBQVMsQ0FDUCxHQUFHLEVBQ0gsR0FBRyxFQUNILFdBQVcsQ0FBQyxPQUFPLElBQUksdUJBQXVCLFNBQVMsMENBQTBDLEVBQ2pHLFdBQVcsQ0FBQyxJQUFJLEVBQ2hCLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQ3pFLENBQUM7UUFDRixPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVztZQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLHFDQUFxQyxDQUFDLENBQUM7UUFDMUYsU0FBUyxDQUNQLEdBQUcsRUFDSCxHQUFHLEVBQ0gscUJBQXFCLFNBQVMsNkNBQTZDLEVBQzNFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FDOUIsQ0FBQztRQUNGLE9BQU87SUFDVCxDQUFDO0lBQ0QsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbEYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFFLFlBQTBCLEVBQ3hELEtBQWEsRUFDYixTQUFvQixFQUNwQixVQUFrQixFQUNsQixPQUFrRCxFQUNsRCxNQUFNLEdBQVcsQ0FBQyxFQUNsQixlQUF3QixFQUN4QixXQUFtQztJQUVuQyxNQUFNLElBQUksR0FBRyxXQUFXO1FBQ3RCLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsV0FBVyxDQUFDO1FBQzVGLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBWSxFQUFFLEVBQUUsQ0FDMUIsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQy9ELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcblxuaW1wb3J0IHsgY3VycmVudEF1ZGl0Q29udGV4dCwgc2FuaXRpemVDb3JyZWxhdGlvbklkIH0gZnJvbSAnLi9hdWRpdC1jb250ZXh0LmpzJztcbmltcG9ydCB7IGNyZWF0ZVNhZmVDbGllbnQsIHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IGJhdGNoZXJGb3IsIHR5cGUgTWV0ZXJlZEluY3JlbWVudEdyb3VwIH0gZnJvbSAnLi9xdW90YS1pbmNyZW1lbnQtYmF0Y2hlci5qcyc7XG5pbXBvcnQgeyBvbkJlaGFsZkNhbGxlciB9IGZyb20gJy4uL21pZGRsZXdhcmUvb24tYmVoYWxmLmpzJztcbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyLCBpc1NlcnZpY2VQcmluY2lwYWwgfSBmcm9tICcuLi9taWRkbGV3YXJlL3NlcnZpY2UtdG9rZW5zLmpzJztcbmltcG9ydCB7IFNZU1RFTV9PUkdfSUQgfSBmcm9tICcuLi9taWRkbGV3YXJlL3N5c3RlbS1vcmcuanMnO1xuaW1wb3J0IHR5cGUgeyBKd3RQYXlsb2FkLCBQcmluY2lwYWxUeXBlLCBRdW90YVR5cGUsIFF1b3RhQ2hlY2tSZXN1bHQsIFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9USUVSLCBpc1ZhbGlkVGllciwgdHlwZSBRdW90YVRpZXIgfSBmcm9tICcuLi90eXBlcy9xdW90YS10aWVycy5qcyc7XG5pbXBvcnQgeyBlbnZCb29sLCBlbnZJbnQgfSBmcm9tICcuLi91dGlscy9lbnYuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlLCBzZW5kRXJyb3IsIHNlbmRRdW90YUV4Y2VlZGVkIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgc2VydmljZUVuZHBvaW50IH0gZnJvbSAnLi4vdXRpbHMvc2VydmljZS1yZWdpc3RyeS5qcyc7XG5cbi8qKlxuICogUmV0cnkgb3B0aW9ucyBmb3IgcXVvdGEgY2FsbHMg4oCUIGZhaWwgZmFzdCAoYSBzbG93IHF1b3RhIHNlcnZpY2UgbXVzdCBub3Qgc3RhbGwgdGhlIHJlcXVlc3QpLlxuICpcbiAqIE5FVkVSIHJldHJ5IGEgNDI5LiBUaGUgcXVvdGEgc2VydmljZSBhbnN3ZXJzIGFuIG92ZXItbGltaXQgb3JnIHdpdGggNDI5XG4gKiBRVU9UQV9FWENFRURFRCBhbmQgYFJldHJ5LUFmdGVyYCA9IHNlY29uZHMgdW50aWwgdGhlIHBlcmlvZCByZXNldHM7IHRoZSBIVFRQXG4gKiBjbGllbnQgaG9ub3JzIHRoYXQgKGNhcHBlZCBhdCA2MHMpLCBzbyBhIHNpbmdsZSByYXRlLWxpbWl0IHJldHJ5IHN0YWxsZWQgdGhlXG4gKiByZXF1ZXN0IHdlbGwgcGFzdCB0aGUgaGFuZGxlciB0aW1lb3V0LCB3aGljaCB0aGVuIGFuc3dlcmVkIDUwMyBhbmQgdGhlIHJlYWxcbiAqIDQyOSB3YXMgbG9zdC4gQSA0MjkgaXMgYSBmaW5hbCBhbnN3ZXIgaGVyZS5cbiAqL1xuY29uc3QgUVVPVEFfUkVRVUVTVF9PUFRJT05TOiBQaWNrPFJlcXVlc3RPcHRpb25zLCAnbWF4UmF0ZUxpbWl0UmV0cmllcycgfCAnbWF4UmV0cmllcyc+ID0ge1xuICBtYXhSYXRlTGltaXRSZXRyaWVzOiAwLFxuICBtYXhSZXRyaWVzOiAxLFxufTtcblxuLyoqXG4gKiBCdWRnZXQgZm9yIG9uZSBgY2hlY2tgIG9mIGEgQ09VTlRFUiBxdW90YSAoYFFVT1RBX0NIRUNLX1RJTUVPVVRfTVNgLCBkZWZhdWx0XG4gKiAzMDApLCB3aXRoIG5vIHJldHJ5LlxuICpcbiAqIFRoZSBjaGVjayBpcyBhIHJlYWQgZ2F0ZSB0aGF0IEZBSUxTIE9QRU4sIHJ1biBhaGVhZCBvZiB0aGUgcmVxdWVzdCBpdCBnYXRlczpcbiAqIHRoZSBvbGQgNSBzIHRpbWVvdXQgw5cgMiBhdHRlbXB0cyBtZWFudCBhIHNsb3cgcXVvdGEgc2VydmljZSBhZGRlZCB1cCB0byAxMCBzXG4gKiB0byBldmVyeSBtZXRlcmVkIHJlcXVlc3QgYW5kIHRoZW4gbGV0IGl0IHRocm91Z2ggYW55d2F5LiBBIHNob3J0IGJ1ZGdldCB0dXJuc1xuICogdGhlIHNhbWUgaW5jaWRlbnQgaW50byBhIOKJpCAzMDAgbXMgZmFpbC1vcGVuIChjb3VudGVkIG9uXG4gKiBgcXVvdGFfZmFpbF9vcGVuX3RvdGFsYCwgd2hpY2ggYWxlcnRzKSDigJQgYW5kIHdpdGggdGhlIHBlci1wb2QgY2hlY2sgY2FjaGUgaW5cbiAqIGZyb250IChhcGktc2VydmVyIGBjaGVja1F1b3RhYCkgYSBoZWFsdGh5IHNlcnZpY2UgaXMgYXNrZWQgYXQgbW9zdCBvbmNlIHBlclxuICogb3JnL3R5cGUgcGVyIGNhY2hlIFRUTC5cbiAqXG4gKiBgc3RvcmFnZUJ5dGVzYCBrZWVwcyB0aGUgY2xpZW50IHRpbWVvdXQgYW5kIG9uZSByZXRyeTogaXQgaXMgYSBNRUFTVVJFRCByZWFkXG4gKiAodGhlIHF1b3RhIHNlcnZpY2Ugd2Fsa3MgdGhlIG9yZydzIHJlZ2lzdHJ5IG5hbWVzcGFjZSBvbiBhIGNvbGQgY2FjaGUpIGJlaGluZFxuICogdGhlIHJlZ2lzdHJ5J3MgZmFpbC1DTE9TRUQgcHVzaCBnYXRlLCB3aGVyZSBhIHByZW1hdHVyZSB0aW1lb3V0IHJlZnVzZXMgYSBwdXNoLlxuICovXG5leHBvcnQgY29uc3QgUVVPVEFfQ0hFQ0tfVElNRU9VVF9NUyA9IGVudkludCgnUVVPVEFfQ0hFQ0tfVElNRU9VVF9NUycsIDMwMCwgeyBtaW46IDEgfSk7XG5cbmZ1bmN0aW9uIGNoZWNrUmVxdWVzdE9wdGlvbnMocXVvdGFUeXBlOiBRdW90YVR5cGUpOiBQaWNrPFJlcXVlc3RPcHRpb25zLCAnbWF4UmF0ZUxpbWl0UmV0cmllcycgfCAnbWF4UmV0cmllcycgfCAndGltZW91dCc+IHtcbiAgaWYgKHF1b3RhVHlwZSA9PT0gJ3N0b3JhZ2VCeXRlcycpIHJldHVybiBRVU9UQV9SRVFVRVNUX09QVElPTlM7XG4gIHJldHVybiB7IG1heFJhdGVMaW1pdFJldHJpZXM6IDAsIG1heFJldHJpZXM6IDAsIHRpbWVvdXQ6IFFVT1RBX0NIRUNLX1RJTUVPVVRfTVMgfTtcbn1cblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdxdW90YScpO1xuXG4vLyBSRVNFUlZFIEZBSUwgTU9ERSDigJQgZXhwbGljaXQsIHNpbmdsZSBwb2xpY3kuXG4vL1xuLy8gYHJlc2VydmVgIGdhdGVzIEVYUEVOU0lWRSwgYmlsbGFibGUgcmVzb3VyY2VzIChwaXBlbGluZXMsIHBsdWdpbiBidWlsZHMsIEFJXG4vLyBjYWxscywgcGxhdGZvcm0gZmVhdHVyZSBzbG90cykuIEV2ZXJ5IHF1b3RhIHR5cGUgaXMgYSBwZXItcGVyaW9kIEZMT1cgY291bnRlclxuLy8gd2l0aCBubyBhZnRlci10aGUtZmFjdCByZWNvbmNpbGlhdGlvbjogYSB1bml0IGNvbnN1bWVkIHdoaWxlIHRoZSByZXNlcnZhdGlvblxuLy8gY291bGQgbm90IGJlIGNvbmZpcm1lZCBpcyBuZXZlciBjb3VudGVkLCBzbyBmYWlsLW9wZW4gbGV0cyBhbiBvcmcgY29uc3VtZVxuLy8gdW5ib3VuZGVkIHVubWV0ZXJlZCB1bml0cyBmb3IgdGhlIHdob2xlIGxlbmd0aCBvZiBhbiBpbmNpZGVudCDigJQgYW5kIGFuXG4vLyB1bmNvbmZpcm1lZCByZXNlcnZlICh0aW1lb3V0LCBvcGVuIGNpcmN1aXQpIG1heSBldmVuIGhhdmUgbGFuZGVkIHNlcnZlci1zaWRlLlxuLy8gU28gYHJlc2VydmVgIGZhaWxzIENMT1NFRCB3aGVuZXZlciB0aGUgcXVvdGEgc2VydmljZSBkaWQgbm90IENPTkZJUk0gdGhlIHNsb3Q6XG4vLyAgIC0gdW5yZWFjaGFibGUgLyB0aW1lZCBvdXQgLyBjaXJjdWl0IGJyZWFrZXIgb3BlbiAobm8gcmVzcG9uc2UpLFxuLy8gICAtIGEgcmVhY2hhYmxlLWJ1dC1lcnJvcmVkIHJlc3BvbnNlICg1eHgsIDR4eCwgbWFsZm9ybWVkIGJvZHkpLFxuLy8gICAtIGEgNDI5IHRoYXQgaXMgTk9UIGEgZ2VudWluZSBRVU9UQV9FWENFRURFRCAoZ2F0ZXdheSAvIHJhdGUgbGltaXRlcikuXG4vLyBPcGVyYXRvcnMgd2hvIHByZWZlciBhdmFpbGFiaWxpdHkgb3ZlciBlbmZvcmNlbWVudCBvcHQgdGhlIFdIT0xFIHNldCBpbnRvXG4vLyBmYWlsLW9wZW4gd2l0aCBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTj10cnVlLiBCb3RoIG91dGNvbWVzIGVtaXQgYSBjb3VudGVyXG4vLyAoYHF1b3RhX2ZhaWxfY2xvc2VkX3RvdGFsYCAvIGBxdW90YV9mYWlsX29wZW5fdG90YWxgKSB0YWdnZWQgd2l0aCB0aGUgcmVhc29uLlxuLy8gYGNoZWNrYCAoYSBjaGVhcCByZWFkIGdhdGUpIHN0YXlzIGZhaWwtb3BlbjsgYGluY3JlbWVudGAgaXMgZmlyZS1hbmQtZm9yZ2V0LlxuY29uc3QgUVVPVEFfUkVTRVJWRV9GQUlMX09QRU4gPSBlbnZCb29sKCdRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTicsIGZhbHNlKTtcblxuLy8gVVNBR0UgQVRUUklCVVRJT04g4oCUIHdobyBzcGVudCBhIHVuaXQuXG4vL1xuLy8gVGhlIHF1b3RhIHNlcnZpY2Uga2VlcHMgb25lIGFnZ3JlZ2F0ZSBjb3VudGVyIHBlciAob3JnLCB0eXBlKTsgb24gaXRzIG93biB0aGF0XG4vLyBjYW4gc2F5IGFuIG9yZyBpcyBhdCAxMDAlIGJ1dCBuZXZlciBXSElDSCBrZXksIHJvdXRlIG9yIHBpcGVsaW5lIGdvdCBpdCB0aGVyZS5cbi8vIEV2ZXJ5IGluY3JlbWVudCAvIHJlc2VydmUgLyByZWZ1bmQgdGhlcmVmb3JlIGNhcnJpZXMgYW4gYXR0cmlidXRpb24gYmxvY2sgdGhlXG4vLyBxdW90YSBzZXJ2aWNlIHdyaXRlcyBpbnRvIGl0cyB1c2FnZSBsZWRnZXIgKGBHRVQgL3F1b3Rhcy86b3JnSWQvdXNhZ2VgKS4gSXQgaXNcbi8vIG1ldGFkYXRhIG9ubHkg4oCUIGVuZm9yY2VtZW50IG5ldmVyIHJlYWRzIGl0IOKAlCBhbmQgZXZlcnkgZmllbGQgaXMgb3B0aW9uYWwsIHNvIGFcbi8vIGNhbGxlciB0aGF0IGtub3dzIG5vdGhpbmcgc3RpbGwgbWV0ZXJzIGNvcnJlY3RseS5cblxuLyoqIFdobyAvIHdoYXQgc3BlbnQgKG9yIGdvdCBiYWNrKSBhIHF1b3RhIHVuaXQuIEFsbCBmaWVsZHMgb3B0aW9uYWwuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbiB7XG4gIHByaW5jaXBhbFR5cGU/OiBQcmluY2lwYWxUeXBlO1xuICAvKiogVGhlIHVzZXIgaWQgb3Igc2VydmljZS1hY2NvdW50IGlkIGJlaGluZCB0aGUgY2FsbCAodGhlIHRva2VuJ3MgYHN1YmApLiAqL1xuICBwcmluY2lwYWxJZD86IHN0cmluZztcbiAgLyoqIFRoZSByZXZvY2FibGUgY3JlZGVudGlhbDogdGhlIGFjY2VzcyBrZXkgdGhlIHRva2VuIGRlcml2ZXMgZnJvbSwgZWxzZSBpdHMgYGp0aWAuICovXG4gIGtleUlkPzogc3RyaW5nO1xuICAvKiogYE1FVEhPRCAvcm91dGUvOnBhdHRlcm5gIOKAlCB0aGUgbWF0Y2hlZCByb3V0ZSBQQVRURVJOLCBuZXZlciB0aGUgcmF3IFVSTCAobm8gaWRzLCBubyBxdWVyeSkuICovXG4gIHJvdXRlPzogc3RyaW5nO1xuICAvKiogVGhlIHBpcGVsaW5lIHRoZSBjYWxsIHdhcyBtYWRlIGZvciAoYDpwaXBlbGluZUlkYCBwYXJhbSBvciBgWC1QaXBlbGluZS1JZGAgaGVhZGVyKS4gKi9cbiAgcGlwZWxpbmVJZD86IHN0cmluZztcbiAgcmVxdWVzdElkPzogc3RyaW5nO1xuICAvKipcbiAgICogQUkgY2FsbHMgb25seTogd2hpY2ggcHJvZHVjdCBzdXJmYWNlIHNwZW50IHRoZSB1bml0IOKAlCBgYXNrYCwgYGFnZW50YCxcbiAgICogYGFnZW50LXRvb2w6PG5hbWU+YCwgYHBpcGVsaW5lLWdlbmVyYXRlYCwgYHBsdWdpbi1nZW5lcmF0ZWAsXG4gICAqIGByZXBvcnQtc3VtbWFyeWAuIFNldCBieSBhcGktc2VydmVyJ3MgYHdpdGhBaUNhbGxSZXNlcnZhdGlvbmAuXG4gICAqL1xuICBmZWF0dXJlPzogc3RyaW5nO1xuICAvKiogQUkgY2FsbHMgb25seTogdGhlIG1vZGVsIGlkIHRoZSByZXNlcnZhdGlvbiB3YXMgcmVzb2x2ZWQgdG8gKG5ldmVyIGEga2V5KS4gKi9cbiAgbW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBBSSBjYWxscyBvbmx5OiB3aG9zZSBrZXkgc2VydmVkIHRoZSBjYWxsIOKAlCBgcGxhdGZvcm1gLCBgb3JnYCBvciBgcmVxdWVzdGAgKEJZT0spLiAqL1xuICBrZXlTb3VyY2U/OiBBaUtleVNvdXJjZTtcbn1cblxuLyoqIFdob3NlIGtleSBzZXJ2ZXMgYW4gQUkgY2FsbCAobWlycm9ycyBhaS1jb3JlIGBLZXlTb3VyY2VgKS4gT25seSBgcGxhdGZvcm1gIHNwZW5kcyBgYWlDYWxsc2AuICovXG5leHBvcnQgdHlwZSBBaUtleVNvdXJjZSA9ICdwbGF0Zm9ybScgfCAnb3JnJyB8ICdyZXF1ZXN0JztcblxuLyoqIFRva2VuIGNvdW50cyBhbiBBSSBjYWxsIHJlcG9ydHMgYWZ0ZXIgaXQgc2V0dGxlcyAoc2VlIHtAbGluayBRdW90YVNlcnZpY2UucmVwb3J0VXNhZ2V9KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUb2tlblVzYWdlIHtcbiAgdG9rZW5zSW46IG51bWJlcjtcbiAgdG9rZW5zT3V0OiBudW1iZXI7XG59XG5cbi8qKiBMb25nZXN0IGF0dHJpYnV0aW9uIHN0cmluZyB0aGUgY2xpZW50IHNlbmRzICh0aGUgcXVvdGEgc2VydmljZSBlbmZvcmNlcyB0aGUgc2FtZSBib3VuZCkuICovXG5jb25zdCBNQVhfQVRUUklCVVRJT05fTEVOID0gMjAwO1xuXG5mdW5jdGlvbiBib3VuZGVkKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCA/IHZhbHVlLnNsaWNlKDAsIE1BWF9BVFRSSUJVVElPTl9MRU4pIDogdW5kZWZpbmVkO1xufVxuXG4vKiogVGhlIHByaW5jaXBhbCBoYWxmIG9mIGFuIGF0dHJpYnV0aW9uIGJsb2NrLCBmcm9tIGEgVkVSSUZJRUQgdG9rZW4uICovXG5mdW5jdGlvbiBwcmluY2lwYWxBdHRyaWJ1dGlvbih1c2VyOiBKd3RQYXlsb2FkIHwgdW5kZWZpbmVkKTogUXVvdGFVc2FnZUF0dHJpYnV0aW9uIHtcbiAgaWYgKCF1c2VyKSByZXR1cm4ge307XG4gIHJldHVybiB7XG4gICAgcHJpbmNpcGFsVHlwZTogdXNlci5wcmluY2lwYWxUeXBlLFxuICAgIHByaW5jaXBhbElkOiBib3VuZGVkKHVzZXIuc3ViKSxcbiAgICBrZXlJZDogYm91bmRlZCh1c2VyLnBhcmVudEtleUlkID8/IHVzZXIuanRpKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3QgYmVpbmcgc2VydmVkOiB0aGUgdmVyaWZpZWQgcHJpbmNpcGFsLCB0aGUgbWF0Y2hlZFxuICogcm91dGUgcGF0dGVybiwgdGhlIHBpcGVsaW5lIChgOnBpcGVsaW5lSWRgIHBhcmFtIG9yIGEgc2FuaXRpemVkXG4gKiBgWC1QaXBlbGluZS1JZGAgaGVhZGVyKSBhbmQgdGhlIHJlcXVlc3QgaWQuIFJlYWQgb2ZmIGByZXFgIGRpcmVjdGx5IHJhdGhlciB0aGFuXG4gKiB0aGUgYW1iaWVudCBhdWRpdCBjb250ZXh0IGJlY2F1c2UgdGhlIG1ldGVyaW5nIG1pZGRsZXdhcmUgcnVucyBpbiBhIGBmaW5pc2hgXG4gKiBsaXN0ZW5lciwgd2hlcmUgdGhlIHJlcXVlc3QncyBhc3luYyBzY29wZSBpcyBubyBsb25nZXIgZ3VhcmFudGVlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhQXR0cmlidXRpb25Gcm9tUmVxdWVzdChyZXE6IFJlcXVlc3QpOiBRdW90YVVzYWdlQXR0cmlidXRpb24ge1xuICBjb25zdCByb3V0ZVBhdGggPSByZXEucm91dGU/LnBhdGg7XG4gIGNvbnN0IHJvdXRlID0gdHlwZW9mIHJvdXRlUGF0aCA9PT0gJ3N0cmluZycgPyBgJHtyZXEubWV0aG9kfSAkeyhyZXEuYmFzZVVybCA/PyAnJykgKyByb3V0ZVBhdGh9YCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgaGVhZGVyID0gcmVxLmhlYWRlcnNbJ3gtcGlwZWxpbmUtaWQnXTtcbiAgY29uc3QgcGlwZWxpbmVJZCA9IHNhbml0aXplQ29ycmVsYXRpb25JZChyZXEucGFyYW1zPy5waXBlbGluZUlkKSA/PyBzYW5pdGl6ZUNvcnJlbGF0aW9uSWQoQXJyYXkuaXNBcnJheShoZWFkZXIpID8gaGVhZGVyWzBdIDogaGVhZGVyKTtcbiAgY29uc3QgcmVxdWVzdElkSGVhZGVyID0gcmVxLmhlYWRlcnNbJ3gtcmVxdWVzdC1pZCddO1xuICBjb25zdCByZXF1ZXN0SWQgPSAocmVxIGFzIFJlcXVlc3QgJiB7IHJlcXVlc3RJZD86IHN0cmluZyB9KS5yZXF1ZXN0SWRcbiAgICA/PyBzYW5pdGl6ZUNvcnJlbGF0aW9uSWQoQXJyYXkuaXNBcnJheShyZXF1ZXN0SWRIZWFkZXIpID8gcmVxdWVzdElkSGVhZGVyWzBdIDogcmVxdWVzdElkSGVhZGVyKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcmluY2lwYWxBdHRyaWJ1dGlvbihyZXEudXNlciksXG4gICAgLi4uKHJvdXRlID8geyByb3V0ZTogcm91dGUuc2xpY2UoMCwgTUFYX0FUVFJJQlVUSU9OX0xFTikgfSA6IHt9KSxcbiAgICAuLi4ocGlwZWxpbmVJZCA/IHsgcGlwZWxpbmVJZCB9IDoge30pLFxuICAgIC4uLihyZXF1ZXN0SWQgPyB7IHJlcXVlc3RJZDogYm91bmRlZChyZXF1ZXN0SWQpIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogQXR0cmlidXRpb24gZnJvbSB0aGUgYW1iaWVudCBhdWRpdCBjb250ZXh0LCBmb3IgY2FsbHMgbWFkZSBpbnNpZGUgYSByZXF1ZXN0XG4gKiBzY29wZSB0aGF0IGRpZCBub3QgcGFzcyBvbmUgZXhwbGljaXRseSAodGhlIHJlc2VydmUgLyByZWZ1bmQgaGVscGVycyBldmVyeVxuICogc2VydmljZSB1c2VzKS4gRW1wdHkgb3V0c2lkZSBhbnkgc2NvcGUuXG4gKi9cbmZ1bmN0aW9uIGF0dHJpYnV0aW9uRnJvbUNvbnRleHQoKTogUXVvdGFVc2FnZUF0dHJpYnV0aW9uIHtcbiAgY29uc3QgY3R4ID0gY3VycmVudEF1ZGl0Q29udGV4dCgpO1xuICBpZiAoIWN0eCkgcmV0dXJuIHt9O1xuICByZXR1cm4ge1xuICAgIC4uLnByaW5jaXBhbEF0dHJpYnV0aW9uKGN0eC5wcmluY2lwYWw/LigpKSxcbiAgICAuLi4oY3R4LnJlcXVlc3RJZCA/IHsgcmVxdWVzdElkOiBib3VuZGVkKGN0eC5yZXF1ZXN0SWQpIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBUaGUgYXR0cmlidXRpb24gYSBxdW90YSB3cml0ZSBzZW5kczogdGhlIGV4cGxpY2l0IGJsb2NrLCBlbHNlIHRoZSBhbWJpZW50IG9uZS4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBdHRyaWJ1dGlvbihleHBsaWNpdD86IFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbik6IFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gZXhwbGljaXQgPz8gYXR0cmlidXRpb25Gcm9tQ29udGV4dCgpO1xuICByZXR1cm4gT2JqZWN0LmtleXMocmVzb2x2ZWQpLmxlbmd0aCA+IDAgPyByZXNvbHZlZCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgcXVvdGEgdHlwZSBhIG1ldGVyZWQgcmVxdWVzdCBhY3R1YWxseSBzcGVuZHMuXG4gKlxuICogYGFwaUNhbGxzYCBpcyB0aGUgUEVPUExFJ3MgYnVkZ2V0IOKAlCBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uLiBBIHJlcXVlc3QgbWFkZSBieVxuICogYSBOT04tSU5URVJBQ1RJVkUgY3JlZGVudGlhbCBzcGVuZHMgYGF1dG9tYXRpb25DYWxsc2AgaW5zdGVhZCwgbmV2ZXIgYm90aCwgc29cbiAqIGEgZmxlZXQgb2Ygc2VsZi1tdXRhdGluZyBwaXBlbGluZXMgY2FuJ3QgZXhoYXVzdCB0aGUgY29uc29sZSBmb3IgdGhlIGh1bWFuc1xuICogaW4gdGhlIHNhbWUgb3JnOlxuICogIC0gYW4gb3JnIFNFUlZJQ0UgQUNDT1VOVCAoYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlX2FjY291bnQnYCDigJRcbiAqICAgIHBsYXRmb3JtLWF1dG9tYXRpb24sIHBpcGVsaW5lLXJlZ2lzdGVyLCByZXBvcnRpbmctaW5nZXN0LCByZWdpc3RyeS1wdXNoKTtcbiAqICAtIGEgUEVSU09OQUwgQUNDRVNTIEtFWTogdGhlIGV4Y2hhbmdlZCBrZXkgdG9rZW4gKGB0b2tlbl91c2U6ICdhcGlfa2V5J2ApXG4gKiAgICBhbmQgYW55dGhpbmcgbWludGVkIHdoaWxlIGhvbGRpbmcgb25lIChgcGFyZW50S2V5SWRgKS4gQSBQQVQgaW4gYSBDSSBqb2JcbiAqICAgIGlzIGF1dG9tYXRpb24gd2hvZXZlciBvd25zIGl0IOKAlCBiaWxsaW5nIGl0IGFzIGEgcGVyc29uIGxldCBvbmUgc2NyaXB0XG4gKiAgICBsb2NrIGl0cyBvd25lcidzIHRlYW1tYXRlcyBvdXQgb2YgdGhlIGNvbnNvbGUuIENJIHNob3VsZCBzdGlsbCB1c2UgYVxuICogICAgc2VydmljZS1hY2NvdW50IGtleSAoaXQgc3Vydml2ZXMgdGhlIHBlcnNvbiBsZWF2aW5nKTsgZWl0aGVyIHdheSB0aGVcbiAqICAgIHRyYWZmaWMgbm93IGxhbmRzIG9uIGBhdXRvbWF0aW9uQ2FsbHNgLlxuICogRXZlcnkgb3RoZXIgdHlwZSBpcyByZXR1cm5lZCB1bmNoYW5nZWQ6IGFuIEFJIGNhbGwgb3IgYSBwaXBlbGluZSBjcmVhdGlvblxuICogY29zdHMgdGhlIHNhbWUgd2hvZXZlciBtYWtlcyBpdC5cbiAqXG4gKiBgbWV0ZXJRdW90YU9uU3VjY2Vzc2AgYW5kIGBjaGVja1F1b3RhYCBjYWxsIHRoaXMgdGhlbXNlbHZlcywgc28gYSBzZXJ2aWNlXG4gKiBtb3VudHMgYm90aCB3aXRoIGAnYXBpQ2FsbHMnYCBhbmQgdGhlIHNwbGl0IGhhcHBlbnMgcGVyIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRlcmVkUXVvdGFUeXBlRm9yKHJlcTogUGljazxSZXF1ZXN0LCAndXNlcic+LCBxdW90YVR5cGU6IFF1b3RhVHlwZSk6IFF1b3RhVHlwZSB7XG4gIGlmIChxdW90YVR5cGUgIT09ICdhcGlDYWxscycgfHwgIXJlcS51c2VyKSByZXR1cm4gcXVvdGFUeXBlO1xuICBjb25zdCB1ID0gcmVxLnVzZXI7XG4gIGlmICh1LnByaW5jaXBhbFR5cGUgPT09ICdzZXJ2aWNlX2FjY291bnQnIHx8IHUudG9rZW5fdXNlID09PSAnYXBpX2tleScgfHwgdS5wYXJlbnRLZXlJZCkgcmV0dXJuICdhdXRvbWF0aW9uQ2FsbHMnO1xuICByZXR1cm4gcXVvdGFUeXBlO1xufVxuXG4vKiogV2h5IGEgcmVxdWVzdCBpcyBub3QgbWV0ZXJlZC9jaGVja2VkIGFnYWluc3QgYXBpQ2FsbHMgKHNlZSB7QGxpbmsgY2FsbFF1b3RhRXhlbXB0aW9ufSkuICovXG5leHBvcnQgdHlwZSBDYWxsUXVvdGFFeGVtcHRpb24gPSAnc2VydmljZScgfCAnaW1wZXJzb25hdGlvbicgfCAnb25fYmVoYWxmJztcblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBhcGlDYWxscy9hdXRvbWF0aW9uQ2FsbHMgbWV0ZXIgQU5EIGNoZWNrIHNraXAgdGhpcyAodmVyaWZpZWQpXG4gKiByZXF1ZXN0LCBhbmQgd2h5LiBPbmUgZnVuY3Rpb24gZm9yIGJvdGggaGFsdmVzLCBzbyB0aGUgZ2F0ZSBuZXZlciByZWZ1c2VzIGFcbiAqIGNhbGwgdGhlIG1ldGVyIHdvdWxkIG5vdCBiaWxsOlxuICogIC0gYHNlcnZpY2VgIOKAlCBhbiBpbnRlcm5hbCBzZXJ2aWNlIHByaW5jaXBhbDogcGVlciB0cmFmZmljIGlzIGNhdXNlZCBieSBhXG4gKiAgICB1c2VyIGFjdGlvbiB0aGUgb3JpZ2luYXRpbmcgc2VydmljZSBhbHJlYWR5IG1ldGVyZWQ7XG4gKiAgLSBgaW1wZXJzb25hdGlvbmAg4oCUIGEgc3lzYWRtaW4gaW1wZXJzb25hdGlvbiBzZXNzaW9uIChgaW1wZXJzb25hdG9ySWRgKS5cbiAqICAgIFZlbmRvciBzdGFmZiBsb29raW5nIGF0IGEgdGVuYW50J3MgY29uc29sZSBtdXN0IG5laXRoZXIgc3BlbmQgdGhlIHRlbmFudCdzXG4gKiAgICBidWRnZXQgbm9yIGJlIGxvY2tlZCBvdXQgYnkgaXQgd2hpbGUgZGlhZ25vc2luZyBhbiBleGhhdXN0ZWQgb3JnOyB0aGVcbiAqICAgIHNlc3Npb24gaXMgYXVkaXRlZCBvbiBpdHMgb3duIHRyYWlsO1xuICogIC0gYG9uX2JlaGFsZmAg4oCUIGEgdXNlciB0b2tlbiBGT1JXQVJERUQgYnkgYW4gaW50ZXJuYWwgc2VydmljZSBhcyBwYXJ0IG9mIGFcbiAqICAgIHJlcXVlc3QgYWxyZWFkeSBtZXRlcmVkIHdoZXJlIGl0IGFycml2ZWQgKHRoZSBhc2sgYWdlbnQncyB0b29scyxcbiAqICAgIHBpcGVsaW5lJ3MgcGxhY2Vob2xkZXItcGx1Z2luIGNvbmZpcm0pLCBwcm92ZW4gYnkgYSBzaWduZWQgbWFya2VyIHRoZVxuICogICAgdXNlciBjYW5ub3QgZm9yZ2UgKG1pZGRsZXdhcmUvb24tYmVoYWxmLnRzKS5cbiAqIEFwcGxpZXMgdG8gdGhlIENBTEwgYnVkZ2V0cyBvbmx5OiByZXNlcnZhdGlvbi1nYXRlZCBxdW90YXMgKHBpcGVsaW5lcyxcbiAqIHBsdWdpbnMg4oCmKSBhcmUgY2hhcmdlZCB3aG9ldmVyIGFza3MuIGBhaUNhbGxzYCBtaXJyb3JzIHRoZSBpbXBlcnNvbmF0aW9uIGhhbGZcbiAqIG9uIGl0cyBvd24gKGFwaS1zZXJ2ZXIgYHdpdGhBaUNhbGxSZXNlcnZhdGlvbmAgc2tpcHMgdGhlIHNsb3Qgd2hlbiB0aGVcbiAqIHNlc3Npb24gaXMgYW4gaW1wZXJzb25hdGlvbjsgdGhlIGNhbGwgaXMgc3RpbGwgYXVkaXRlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxsUXVvdGFFeGVtcHRpb24ocmVxOiBSZXF1ZXN0KTogQ2FsbFF1b3RhRXhlbXB0aW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZXEudXNlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzU2VydmljZVByaW5jaXBhbChyZXEpKSByZXR1cm4gJ3NlcnZpY2UnO1xuICBpZiAocmVxLnVzZXIuaW1wZXJzb25hdG9ySWQpIHJldHVybiAnaW1wZXJzb25hdGlvbic7XG4gIGlmIChvbkJlaGFsZkNhbGxlcihyZXEpKSByZXR1cm4gJ29uX2JlaGFsZic7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU2VydmljZS1wcmluY2lwYWwgYEF1dGhvcml6YXRpb25gIGhlYWRlciBmb3IgYSBxdW90YSBjYWxsIG1hZGUgb24gYmVoYWxmIG9mXG4gKiBgb3JnSWRgIGJ5IHRoZSBDVVJSRU5UIHNlcnZpY2UgKGBTRVJWSUNFX05BTUVgLCB0aGUgc2FtZSBpZGVudGl0eSB0aGUgaGVhbHRoXG4gKiByb3V0ZXIgcmVwb3J0cykuXG4gKlxuICogVGhlIHF1b3RhIHNlcnZpY2UncyBtdXRhdGlvbiBlbmRwb2ludHMgKGAvOm9yZ0lkL2luY3JlbWVudGAsIGAvZGVjcmVtZW50YClcbiAqIHJlamVjdCBhbnl0aGluZyBidXQgYSBzaWduZWQgc2VydmljZSBwcmluY2lwYWwgb3IgYSBzeXN0ZW0gYWRtaW4sIHNvXG4gKiBmb3J3YXJkaW5nIHRoZSBlbmQgdXNlcidzIGJlYXJlciB0b2tlbiB0aGVyZSBpcyBhbHdheXMgYSA0MDMuIFNlcnZpY2UgdG9rZW5zXG4gKiBhcmUgYWxzbyBleGVtcHQgZnJvbSB0aGUgcXVvdGEgc2VydmljZSdzIHBlci1JUCByYXRlIGxpbWl0ZXIsIHNvIGhvdC1wYXRoXG4gKiBxdW90YSB0cmFmZmljIGZyb20gYSBidXN5IHBvZCBjYW4ndCBleGhhdXN0IHRoYXQgcG9kIElQJ3MgYnVja2V0IGFuZCBzaWxlbnRseVxuICogdHVybiBlbmZvcmNlbWVudCBvZmYuIFNjb3BlZCB0byB0aGUgdGFyZ2V0IG9yZyB3aXRoIHRoZSBsb3dlc3Qgcm9sZSAobWVtYmVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFF1b3RhU2VydmljZUF1dGhIZWFkZXIob3JnSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRTZXJ2aWNlQXV0aEhlYWRlcih7IHNlcnZpY2VOYW1lOiBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ2FwaScsIG9yZ0lkLCByb2xlOiAnbWVtYmVyJyB9KTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBzeW5jaHJvbm91cyBxdW90YSByZXNlcnZhdGlvbiAgdGhlIGF0b21pYyBjaGVjaytpbmNyZW1lbnRcbiAqIHZhcmlhbnQuIGBleGNlZWRlZDogdHJ1ZWAgbWVhbnMgdGhlIG9wZXJhdGlvbiB3YXMgcmVqZWN0ZWQgYXQgdGhlIERCXG4gKiBsZXZlbDsgdGhlIGNhbGxlciBzaG91bGQgcmV0dXJuIDQyOSB3aXRob3V0IHJ1bm5pbmcgdGhlIGdhdGVkIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVJlc2VydmVSZXN1bHQge1xuICAvKiogVHJ1ZSB3aGVuIHRoZSBzbG90IHdhcyBOT1QgcmVzZXJ2ZWQg4oCUIHRoZSBnYXRlZCBhY3Rpb24gbXVzdCBub3QgcnVuLiAqL1xuICBleGNlZWRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldCAodHJ1ZSkgYnkgdGhlIHF1b3RhIENMSUVOVCB3aGVuIHRoZSByZXNlcnZhdGlvbiB3YXMgZGVuaWVkIGJlY2F1c2UgdGhlXG4gICAqIHF1b3RhIHNlcnZpY2UgY291bGQgbm90IENPTkZJUk0gaXQgKHVucmVhY2hhYmxlIC8gdGltZW91dCAvIGNpcmN1aXQgb3BlbiAvXG4gICAqIGVycm9yZWQpIOKAlCBub3QgYmVjYXVzZSB0aGUgb3JnIGlzIG92ZXIgaXRzIGxpbWl0LiBBbHdheXMgcGFpcmVkIHdpdGhcbiAgICogYGV4Y2VlZGVkOiB0cnVlYC4gQW5zd2VyIHdpdGgge0BsaW5rIHNlbmRRdW90YVJlc2VydmVEZW5pZWR9LCB3aGljaCBtYXBzIGl0IHRvXG4gICAqIDUwMyBpbnN0ZWFkIG9mIGEgbWlzbGVhZGluZyA0MjkgXCJxdW90YSBleGNlZWRlZFwiLlxuICAgKi9cbiAgdW5hdmFpbGFibGU/OiBib29sZWFuO1xuICAvKipcbiAgICogU2V0IHdoZW4gYW4gYGFpQ2FsbHNgIHJlc2VydmF0aW9uIHdhcyByZWZ1c2VkIGJ5IG9uZSBvZiB0aGUgb3JnJ3MgT1BUSU9OQUxcbiAgICogQUkgY29udHJvbHMgcmF0aGVyIHRoYW4gdGhlIHBlcmlvZCBjYXA6IHtAbGluayBFcnJvckNvZGUuQUlfTUVNQkVSX1NIQVJFX0VYQ0VFREVEfVxuICAgKiAodGhlIGNhbGxlcidzIHBlci1tZW1iZXIgc2hhcmUgaXMgc3BlbnQpIG9yXG4gICAqIHtAbGluayBFcnJvckNvZGUuQUlfVE9LRU5fQlVER0VUX0VYQ0VFREVEfSAodGhlIG9yZydzIHBlci1wZXJpb2QgdG9rZW5cbiAgICogYnVkZ2V0IGlzIHNwZW50KS4gUGFpcmVkIHdpdGggYGV4Y2VlZGVkOiB0cnVlYCBhbmQgdGhlIHF1b3RhIHNlcnZpY2Unc1xuICAgKiBgbWVzc2FnZWA7IHtAbGluayBzZW5kUXVvdGFSZXNlcnZlRGVuaWVkfSByZWxheXMgYm90aC5cbiAgICovXG4gIGNvZGU/OiBBaUxpbWl0Q29kZTtcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgcXVvdGE6IHtcbiAgICB0eXBlOiBRdW90YVR5cGU7XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICB1c2VkOiBudW1iZXI7XG4gICAgcmVtYWluaW5nOiBudW1iZXI7XG4gICAgcmVzZXRBdD86IHN0cmluZztcbiAgfTtcbn1cblxuLyoqIFRoZSA0MjkgY29kZXMgYW4gYGFpQ2FsbHNgIHJlc2VydmF0aW9uIGFuc3dlcnMgd2hlbiBhbiBvcHRpb25hbCBvcmcgQUkgY29udHJvbCByZWZ1c2VzIGl0LiAqL1xuZXhwb3J0IHR5cGUgQWlMaW1pdENvZGUgPSBFcnJvckNvZGUuQUlfTUVNQkVSX1NIQVJFX0VYQ0VFREVEIHwgRXJyb3JDb2RlLkFJX1RPS0VOX0JVREdFVF9FWENFRURFRDtcblxuY29uc3QgQUlfTElNSVRfQ09ERVM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtFcnJvckNvZGUuQUlfTUVNQkVSX1NIQVJFX0VYQ0VFREVELCBFcnJvckNvZGUuQUlfVE9LRU5fQlVER0VUX0VYQ0VFREVEXSk7XG5cbi8qKlxuICogUXVvdGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhU2VydmljZSB7XG4gIC8qKiBDaGVjayBpZiBxdW90YSBpcyBhdmFpbGFibGUgKGZhaWwtb3BlbiBvbiBlcnJvcikuICovXG4gIGNoZWNrKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFDaGVja1Jlc3VsdD47XG4gIC8qKlxuICAgKiBJbmNyZW1lbnQgcXVvdGEgdXNhZ2UuIFJldHVybnMgYSBwcm9taXNlIHNvIGNhbGxlcnMgY2FuIG9wdGlvbmFsbHkgaGFuZGxlXG4gICAqIGVycm9ycy4gYGF0dHJpYnV0aW9uYCBkZWZhdWx0cyB0byB0aGUgYW1iaWVudCByZXF1ZXN0IGNvbnRleHQuXG4gICAqL1xuICBpbmNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50PzogbnVtYmVyLCBhdHRyaWJ1dGlvbj86IFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbik6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBNRVRFUkVEIGluY3JlbWVudCBvZiBhIHByZS1hZ2dyZWdhdGVkIGJhdGNoICh0aGUgcGVyLXBvZCBiYXRjaGVyJ3MgZmx1c2gsXG4gICAqIHNlZSBgcXVvdGEtaW5jcmVtZW50LWJhdGNoZXIudHNgKTogdGhlIHN1bSBvZiBgZ3JvdXBzYCBpcyBhcHBsaWVkIHdpdGhcbiAgICogUEFSVElBTCBhZG1pc3Npb24g4oCUIHRoZSBjb3VudGVyIG1vdmVzIGJ5IGFzIG11Y2ggYXMgZml0cyB1bmRlciB0aGUgY2FwIGFuZFxuICAgKiB0aGUgcmVtYWluZGVyIGlzIHJlY29yZGVkIGFzIGBvdmVyc2hvb3RgIOKAlCBhbmQgZWFjaCBncm91cCdzIGF0dHJpYnV0aW9uIGlzXG4gICAqIHdyaXR0ZW4gdG8gdGhlIHVzYWdlIGxlZGdlci4gTmV2ZXIgYSA0MjkuIFJlc29sdmVzIHdpdGggd2hhdCB3YXMgY291bnRlZCxcbiAgICogb3IgYG51bGxgIHdoZW4gdGhlIHF1b3RhIHNlcnZpY2UgZGlkIG5vdCBhbnN3ZXIgb2sgKGNvdW50ZWQgb25cbiAgICogYHF1b3RhX2luY3JlbWVudF9mYWlsdXJlc190b3RhbGApLlxuICAgKi9cbiAgaW5jcmVtZW50TWV0ZXJlZChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBncm91cHM6IE1ldGVyZWRJbmNyZW1lbnRHcm91cFtdKTogUHJvbWlzZTx7IGNvdW50ZWQ6IG51bWJlcjsgb3ZlcnNob290OiBudW1iZXIgfSB8IG51bGw+O1xuICAvKipcbiAgICogQXRvbWljIHJlc2VydmUgIHRoZSBzYW1lIGF0b21pYyBjaGVjaytpbmNyZW1lbnQgYXMgYGluY3JlbWVudGAsIGJ1dFxuICAgKiBwYXJzZXMgdGhlIHJlc3BvbnNlIHNvIGNhbGxlcnMgY2FuIHNlZSB3aGV0aGVyIHRoZSBzbG90IHdhcyBhY3R1YWxseVxuICAgKiByZXNlcnZlZC4gVXNlIHRoaXMgZm9yIGV4cGVuc2l2ZSByZXNvdXJjZXMgd2hlcmUgdGhlIHBvc3QtaG9jIGZpcmUtXG4gICAqIGFuZC1mb3JnZXQgcGF0dGVybiBhbGxvd3MgY29uY3VycmVudCBvdmVyLXNwZW5kLlxuICAgKlxuICAgKiBGYWlscyBDTE9TRUQgKGBleGNlZWRlZDogdHJ1ZWApIHdoZW5ldmVyIHRoZSBzbG90IGlzIG5vdCBjb25maXJtZWQg4oCUXG4gICAqIHVucmVhY2hhYmxlLCB0aW1lb3V0LCBvcGVuIGNpcmN1aXQsIG5vbi1vaywgb3IgYSBub24tcXVvdGEgNDI5IOKAlCB1bmxlc3NcbiAgICogYFFVT1RBX1JFU0VSVkVfRkFJTF9PUEVOPXRydWVgIChzZWUgdGhlIHBvbGljeSBub3RlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlKS5cbiAgICovXG4gIHJlc2VydmUob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50PzogbnVtYmVyLCBhdHRyaWJ1dGlvbj86IFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbik6IFByb21pc2U8UXVvdGFSZXNlcnZlUmVzdWx0PjtcbiAgLyoqXG4gICAqIFJvbGwgYmFjayBhIHByZXZpb3VzbHkgcmVzZXJ2ZWQgc2xvdC4gRmlyZS1hbmQtZm9yZ2V0IOKAlCBuZXZlciB0aHJvd3MuXG4gICAqIFBhc3MgYHJlc2V0QXRTbmFwc2hvdGAgKHRoZSBgcXVvdGEucmVzZXRBdGAgb2JzZXJ2ZWQgd2hlbiB0aGUgc2xvdCB3YXNcbiAgICogcmVzZXJ2ZWQpIHRvIG1ha2UgdGhlIHJvbGxiYWNrIGNvbmRpdGlvbmFsOiBpZiB0aGUgcGVyaW9kIHJvbGxlZCBvdmVyXG4gICAqIGJldHdlZW4gcmVzZXJ2ZSBhbmQgcm9sbGJhY2ssIHRoZSBzZXJ2ZXIgc2tpcHMgdGhlIGRlY3JlbWVudCBzbyBpdCBkb2Vzbid0XG4gICAqIHN0ZWFsIGNhcGFjaXR5IGZyb20gdGhlIG5ldyBwZXJpb2QuXG4gICAqL1xuICBkZWNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50PzogbnVtYmVyLCByZXNldEF0U25hcHNob3Q/OiBzdHJpbmcsIGF0dHJpYnV0aW9uPzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFJlY29yZCB3aGF0IGFuIEFJIGNhbGwgQ09TVCBhZnRlciBpdCBzZXR0bGVkIOKAlCBpdHMgdG9rZW4gY291bnRzIOKAlCBpbiB0aGVcbiAgICogdXNhZ2UgbGVkZ2VyLCB3aXRob3V0IG1vdmluZyBhbnkgY291bnRlciAoYSB6ZXJvLXVuaXQgbGVkZ2VyIHJvdyBjYXJyeWluZ1xuICAgKiBgdG9rZW5zSW5gIC8gYHRva2Vuc091dGAgdW5kZXIgdGhlIGNhbGwncyBhdHRyaWJ1dGlvbikuIEFsc28gaG93IGEgY2FsbCB0aGF0XG4gICAqIHNwZW50IE5PIGBhaUNhbGxzYCB1bml0IChhIEJZT0sga2V5LCBhbiBpbXBlcnNvbmF0aW9uIHNlc3Npb24sIGEgd2VpZ2h0LTBcbiAgICogbW9kZWwpIHN0aWxsIHNob3dzIHVwIGluIHRoZSB1c2FnZSBicmVha2Rvd24uIEZpcmUtYW5kLWZvcmdldCDigJQgbmV2ZXIgdGhyb3dzLlxuICAgKiBPcHRpb25hbCBzbyB0ZXN0IGRvdWJsZXMgbmVlZCBub3QgaW1wbGVtZW50IGl0LlxuICAgKi9cbiAgcmVwb3J0VXNhZ2U/KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHRva2VuczogUXVvdGFUb2tlblVzYWdlLCBhdHRyaWJ1dGlvbj86IFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbik6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBHZXQgdGhlIG9yZydzIHF1b3RhIGBRdW90YVRpZXJgLiBVc2VkIGJ5IHRoZSBwbHVnaW4tYnVpbGQgcXVldWUgcGFydGl0aW9uaW5nXG4gICAqIHRvIHJvdXRlIGEgYnVpbGQgdG8gdGhlIHJpZ2h0IHBlci10aWVyIHF1ZXVlLiBGYWlsLW9wZW4gcmV0dXJucyBgREVGQVVMVF9USUVSYFxuICAgKiAoYGRldmVsb3BlcmAgd2hlbiBiaWxsaW5nIGlzIGVuYWJsZWQsIGB1bmxpbWl0ZWRgIHdoZW4gaXQncyBkaXNhYmxlZCk7IGFcbiAgICogbWlzY2xhc3NpZmllZCBvcmcgc3RpbGwgYnVpbGRzIG9uIHRoZSBkZWZhdWx0IHF1ZXVlLCBqdXN0IHdpdGhvdXQgdGhlXG4gICAqIHRpZXItc2NvcGVkIHNjaGVkdWxpbmcgYm9vc3QuXG4gICAqL1xuICBnZXRUaWVyKG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVRpZXI+O1xuICAvKipcbiAgICogRkFJTC1DTE9TRUQgdHdpbiBvZiB7QGxpbmsgZ2V0VGllcn06IHRoZSBvcmcncyB0aWVyIGFzIHRoZSBxdW90YSBzZXJ2aWNlXG4gICAqIENPTkZJUk1FRCBpdCwgb3IgYG51bGxgIHdoZW4gaXQgY291bGQgbm90IGJlIGNvbmZpcm1lZCAodW5yZWFjaGFibGUsIG5vbi1vayxcbiAgICogbWlzc2luZyBvciB1bnJlY29nbml6ZWQgdGllcikuIEZvciBkZWNpc2lvbnMgdGhhdCBtdXN0IG5ldmVyIGJlIHRha2VuIG9uIGFcbiAgICogZ3Vlc3Mg4oCUIGFueXRoaW5nIHRoYXQgcmV2b2tlcywgZG93bmdyYWRlcyBvciBkZWxldGVzIG9uIHRoZSBzdHJlbmd0aCBvZiBhXG4gICAqIHRpZXIgKGUuZy4gYSB2ZXJpZmllZC1wdWJsaXNoZXIgZ3JhY2Ugc3dlZXApIG11c3Qgc2tpcCB0aGUgb3JnIG9uIGBudWxsYCxcbiAgICogbmV2ZXIgYWN0IG9uIGBERUZBVUxUX1RJRVJgLlxuICAgKi9cbiAgZ2V0VGllclN0cmljdChvcmdJZDogc3RyaW5nLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFUaWVyIHwgbnVsbD47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcXVvdGEgc2VydmljZSBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFTZXJ2aWNlQ29uZmlnIHtcbiAgLyoqIFF1b3RhIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFFVT1RBX1NFUlZJQ0VfSE9TVCBvciAncXVvdGEnKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUXVvdGEgc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUVVPVEFfU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiA1MDAwKSAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEFwcGx5IHRoZSBleHBsaWNpdCByZXNlcnZlIGZhaWwtbW9kZSBwb2xpY3kgdG8gYSByZXNlcnZhdGlvbiB0aGUgcXVvdGEgc2VydmljZVxuICogZGlkIE5PVCBjb25maXJtIChzZWUgUVVPVEFfUkVTRVJWRV9GQUlMX09QRU4gYWJvdmUpLiBEZWZhdWx0OiBkZW55LlxuICovXG5mdW5jdGlvbiB1bmNvbmZpcm1lZFJlc2VydmUoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICByZWFzb246ICd1bnJlYWNoYWJsZScgfCAndHJhbnNpZW50LTQyOScgfCAnbm9uLW9rJyxcbiAgc3RhdHVzQ29kZT86IG51bWJlcixcbik6IFF1b3RhUmVzZXJ2ZVJlc3VsdCB7XG4gIGlmIChRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTikge1xuICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IHF1b3RhIHJlc2VydmUgbm90IGNvbmZpcm1lZCwgYWxsb3dpbmcgcmVxdWVzdCcsIHsgb3JnSWQsIHF1b3RhVHlwZSwgcmVhc29uLCBzdGF0dXNDb2RlIH0pO1xuICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ3Jlc2VydmUnLCByZWFzb24sIHF1b3RhVHlwZSB9KTtcbiAgICByZXR1cm4geyBleGNlZWRlZDogZmFsc2UsIHF1b3RhOiB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IC0xLCB1c2VkOiAwLCByZW1haW5pbmc6IC0xIH0gfTtcbiAgfVxuICBsb2dnZXIud2FybignUVVPVEFfRkFJTF9DTE9TRUQ6IHF1b3RhIHJlc2VydmUgbm90IGNvbmZpcm1lZCwgZGVueWluZyByZXF1ZXN0JywgeyBvcmdJZCwgcXVvdGFUeXBlLCByZWFzb24sIHN0YXR1c0NvZGUgfSk7XG4gIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX2Nsb3NlZF90b3RhbCcsIHsgb3BlcmF0aW9uOiAncmVzZXJ2ZScsIHJlYXNvbiwgcXVvdGFUeXBlIH0pO1xuICByZXR1cm4geyBleGNlZWRlZDogdHJ1ZSwgdW5hdmFpbGFibGU6IHRydWUsIHF1b3RhOiB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IDAsIHVzZWQ6IDAsIHJlbWFpbmluZzogMCB9IH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZmFpbC1vcGVuIHF1b3RhIHJlc3VsdCAoYWxsb3dzIHRoZSByZXF1ZXN0KS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmFpbE9wZW5SZXN1bHQoKTogUXVvdGFDaGVja1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgYWxsb3dlZDogdHJ1ZSxcbiAgICBsaW1pdDogLTEsXG4gICAgdXNlZDogMCxcbiAgICByZW1haW5pbmc6IC0xLFxuICAgIHJlc2V0QXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB1bmxpbWl0ZWQ6IHRydWUsXG4gICAgLy8gVGFnIHRoZSBzZW50aW5lbCBzbyBmYWlsLWNsb3NlZCBjYWxsZXJzIGNhbiB0ZWxsIGFuIG91dGFnZSBhcGFydCBmcm9tIGFcbiAgICAvLyByZWFsIHVubGltaXRlZCAoLTEpIHJlYWRpbmcuIFJlYWwgcXVvdGEgcmVzdWx0cyBuZXZlciBzZXQgdGhpcy5cbiAgICBmYWlsT3BlbjogdHJ1ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBjb21tb24gcmVxdWVzdCBoZWFkZXJzIHdpdGggb3B0aW9uYWwgcmVxdWVzdCBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRIZWFkZXJzKG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI/OiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAneC1vcmctaWQnOiBvcmdJZCB9O1xuICBpZiAoYXV0aEhlYWRlcikgaGVhZGVycy5BdXRob3JpemF0aW9uID0gYXV0aEhlYWRlcjtcbiAgaWYgKHJlcXVlc3RJZCkgaGVhZGVyc1snWC1SZXF1ZXN0LUlkJ10gPSByZXF1ZXN0SWQ7XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHF1b3RhIHNlcnZpY2UgY2xpZW50LlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIFF1b3RhIHNlcnZpY2UgY2xpZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHF1b3RhU2VydmljZSA9IGNyZWF0ZVF1b3RhU2VydmljZSgpO1xuICpcbiAqIC8vIENoZWNrIHF1b3RhIGJlZm9yZSBwcm9jZXNzaW5nXG4gKiBjb25zdCBxdW90YSA9IGF3YWl0IHF1b3RhU2VydmljZS5jaGVjayhvcmdJZCwgJ2FwaUNhbGxzJywgYXV0aEhlYWRlcik7XG4gKiBpZiAoIXF1b3RhLmFsbG93ZWQpIHtcbiAqIHJldHVybiByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnUXVvdGEgZXhjZWVkZWQnIH0pO1xuICogfVxuICpcbiAqIC8vIEluY3JlbWVudCBxdW90YSBhZnRlciBzdWNjZXNzXG4gKiBxdW90YVNlcnZpY2UuaW5jcmVtZW50KG9yZ0lkLCAnYXBpQ2FsbHMnLCBhdXRoSGVhZGVyKS5jYXRjaChlcnIgPT4gbG9nZ2VyLndhcm4oJ1F1b3RhIGluY3JlbWVudCBmYWlsZWQnLCB7IGVycm9yOiBlcnIgfSkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdW90YVNlcnZpY2UoY29uZmlnOiBRdW90YVNlcnZpY2VDb25maWcgPSB7fSk6IFF1b3RhU2VydmljZSB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gc2VydmljZUVuZHBvaW50KCdxdW90YScpLmhvc3QsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gc2VydmljZUVuZHBvaW50KCdxdW90YScpLnBvcnQsXG4gICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gNTAwMCxcbiAgfTtcblxuICBjb25zdCBjbGllbnQgPSBjcmVhdGVTYWZlQ2xpZW50KHNlcnZpY2VDb25maWcpO1xuXG4gIC8qKiBPbmUgdGllciByZWFkOiB0aGUgY29uZmlybWVkIHRpZXIsIG9yIHdoeSB0aGVyZSBpc24ndCBvbmUuICovXG4gIGFzeW5jIGZ1bmN0aW9uIHJlYWRUaWVyKFxuICAgIG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgdGllcjogUXVvdGFUaWVyOyByZWFzb24/OiB1bmRlZmluZWQ7IHN0YXR1c0NvZGU/OiBudW1iZXIgfSB8IHsgdGllcjogbnVsbDsgcmVhc29uOiAndW5yZWFjaGFibGUnIHwgJ25vbi1vaycgfCAnaW52YWxpZC10aWVyJzsgc3RhdHVzQ29kZT86IG51bWJlciB9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PHtcbiAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICBkYXRhPzogeyBxdW90YT86IHsgdGllcj86IHN0cmluZyB9IH07XG4gICAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgIH0+KGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX1gLCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0pO1xuICAgIGlmICghcmVzcG9uc2UpIHJldHVybiB7IHRpZXI6IG51bGwsIHJlYXNvbjogJ3VucmVhY2hhYmxlJyB9O1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDAgfHwgIXJlc3BvbnNlLmJvZHk/LnN1Y2Nlc3MpIHJldHVybiB7IHRpZXI6IG51bGwsIHJlYXNvbjogJ25vbi1vaycsIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUgfTtcbiAgICBjb25zdCB0aWVyID0gcmVzcG9uc2UuYm9keS5kYXRhPy5xdW90YT8udGllcjtcbiAgICBpZiAoIXRpZXIgfHwgIWlzVmFsaWRUaWVyKHRpZXIpKSByZXR1cm4geyB0aWVyOiBudWxsLCByZWFzb246ICdpbnZhbGlkLXRpZXInLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlIH07XG4gICAgcmV0dXJuIHsgdGllciwgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBjaGVjayhvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhQ2hlY2tSZXN1bHQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1b3RhVHlwZSl9YDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PHtcbiAgICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgZGF0YT86IHsgcXVvdGFUeXBlOiBzdHJpbmc7IHN0YXR1czogUXVvdGFDaGVja1Jlc3VsdCB9O1xuICAgICAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgICAgfT4ocGF0aCwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCksIC4uLmNoZWNrUmVxdWVzdE9wdGlvbnMocXVvdGFUeXBlKSB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICBsb2dnZXIud2FybignUVVPVEFfRkFJTF9PUEVOOiBRdW90YSBzZXJ2aWNlIHVucmVhY2hhYmxlLCBhbGxvd2luZyByZXF1ZXN0JywgeyBvcmdJZCwgcXVvdGFUeXBlIH0pO1xuICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9vcGVuX3RvdGFsJywgeyBvcGVyYXRpb246ICdjaGVjaycsIHJlYXNvbjogJ3VucmVhY2hhYmxlJywgcXVvdGFUeXBlIH0pO1xuICAgICAgICByZXR1cm4gY3JlYXRlRmFpbE9wZW5SZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCB8fCAhcmVzcG9uc2UuYm9keS5zdWNjZXNzIHx8ICFyZXNwb25zZS5ib2R5LmRhdGE/LnN0YXR1cykge1xuICAgICAgICBsb2dnZXIud2FybignUVVPVEFfRkFJTF9PUEVOOiBRdW90YSBjaGVjayByZXR1cm5lZCBub24tb2ssIGFsbG93aW5nIHJlcXVlc3QnLCB7XG4gICAgICAgICAgb3JnSWQsIHF1b3RhVHlwZSwgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSwgbWVzc2FnZTogcmVzcG9uc2UuYm9keS5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfb3Blbl90b3RhbCcsIHsgb3BlcmF0aW9uOiAnY2hlY2snLCByZWFzb246ICdub24tb2snLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVGYWlsT3BlblJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzcG9uc2UuYm9keS5kYXRhLnN0YXR1cztcbiAgICB9LFxuXG4gICAgYXN5bmMgaW5jcmVtZW50KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyID0gMSwgYXR0cmlidXRpb24/OiBRdW90YVVzYWdlQXR0cmlidXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2luY3JlbWVudGA7XG4gICAgICBjb25zdCBhdHRyID0gcmVzb2x2ZUF0dHJpYnV0aW9uKGF0dHJpYnV0aW9uKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnRcbiAgICAgICAgLnBvc3QocGF0aCwgeyBxdW90YVR5cGUsIGFtb3VudCwgLi4uKGF0dHIgJiYgeyBhdHRyaWJ1dGlvbjogYXR0ciB9KSB9LCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgYXR0cj8ucmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2U/LnN0YXR1c0NvZGUgPT09IDQyOSkge1xuICAgICAgICAvLyBPdmVyIHRoZSBsaW1pdDogdGhlIHF1b3RhIHNlcnZpY2UgcmVmdXNlZCBBTkQgcmVjb3JkZWQgdGhlIGRlbmlhbCBpblxuICAgICAgICAvLyBpdHMgbGVkZ2VyLiBOb3QgYSBmYWlsdXJlIG9mIG1ldGVyaW5nIOKAlCB0aGUgY291bnRlciBpcyBleGFjdGx5IHdoZXJlXG4gICAgICAgIC8vIGl0IHNob3VsZCBiZS5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdRdW90YSBpbmNyZW1lbnQgcmVmdXNlZCAob3ZlciBsaW1pdCknLCB7IG9yZ0lkLCBxdW90YVR5cGUsIGFtb3VudCB9KTtcbiAgICAgIH0gZWxzZSBpZiAoIXJlc3BvbnNlIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGluY3JlbWVudCBxdW90YScsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQSBsb3N0IG1ldGVyaW5nIGluY3JlbWVudCBpcyBhIHVuaXQgdGhlIG9yZyBjb25zdW1lZCBhbmQgbmV2ZXIgcGFpZFxuICAgICAgICAvLyBmb3IuIENvdW50ZWQgKGxhYmVsbGVkIGJ5IHRoZSBlbWl0dGluZyBgc2VydmljZWApIHNvIGEgc3VzdGFpbmVkIHJhdGVcbiAgICAgICAgLy8gcGFnZXMgaW5zdGVhZCBvZiBzaWxlbnRseSB1bmRlci1iaWxsaW5nIOKAlCBzZWUgUXVvdGFJbmNyZW1lbnRGYWlsdXJlcy5cbiAgICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX2luY3JlbWVudF9mYWlsdXJlc190b3RhbCcsIHsgcmVhc29uOiByZXNwb25zZSA/ICdub24tb2snIDogJ3VucmVhY2hhYmxlJywgcXVvdGFUeXBlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdRdW90YSBpbmNyZW1lbnRlZCcsIHsgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50IH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBpbmNyZW1lbnRNZXRlcmVkKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGdyb3VwczogTWV0ZXJlZEluY3JlbWVudEdyb3VwW10pOiBQcm9taXNlPHsgY291bnRlZDogbnVtYmVyOyBvdmVyc2hvb3Q6IG51bWJlciB9IHwgbnVsbD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vaW5jcmVtZW50YDtcbiAgICAgIGNvbnN0IGFtb3VudCA9IGdyb3Vwcy5yZWR1Y2UoKHN1bSwgZykgPT4gc3VtICsgZy5hbW91bnQsIDApO1xuICAgICAgaWYgKGFtb3VudCA8PSAwKSByZXR1cm4geyBjb3VudGVkOiAwLCBvdmVyc2hvb3Q6IDAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8eyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogeyBjb3VudGVkPzogbnVtYmVyOyBvdmVyc2hvb3Q/OiBudW1iZXIgfSB9PihcbiAgICAgICAgcGF0aCxcbiAgICAgICAgeyBxdW90YVR5cGUsIGFtb3VudCwgbWV0ZXI6IHRydWUsIGdyb3VwcyB9LFxuICAgICAgICB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciksIC4uLlFVT1RBX1JFUVVFU1RfT1BUSU9OUyB9LFxuICAgICAgKTtcbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFyZXNwb25zZS5ib2R5Py5zdWNjZXNzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gYXBwbHkgbWV0ZXJlZCBxdW90YSBpbmNyZW1lbnQnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIGFtb3VudCwgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUgfSk7XG4gICAgICAgIC8vIEV2ZXJ5IHVuaXQgaW4gdGhlIGJhdGNoIHdlbnQgdW5jb3VudGVkIOKAlCBzZWUgUXVvdGFJbmNyZW1lbnRGYWlsdXJlcy5cbiAgICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX2luY3JlbWVudF9mYWlsdXJlc190b3RhbCcsIHsgcmVhc29uOiByZXNwb25zZSA/ICdub24tb2snIDogJ3VucmVhY2hhYmxlJywgcXVvdGFUeXBlIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvdW50ZWQgPSByZXNwb25zZS5ib2R5LmRhdGE/LmNvdW50ZWQgPz8gYW1vdW50O1xuICAgICAgY29uc3Qgb3ZlcnNob290ID0gcmVzcG9uc2UuYm9keS5kYXRhPy5vdmVyc2hvb3QgPz8gMDtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTWV0ZXJlZCBxdW90YSBpbmNyZW1lbnQgYXBwbGllZCcsIHsgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50LCBjb3VudGVkLCBvdmVyc2hvb3QgfSk7XG4gICAgICByZXR1cm4geyBjb3VudGVkLCBvdmVyc2hvb3QgfTtcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVzZXJ2ZShvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ6IG51bWJlciA9IDEsIGF0dHJpYnV0aW9uPzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uKTogUHJvbWlzZTxRdW90YVJlc2VydmVSZXN1bHQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2luY3JlbWVudGA7XG4gICAgICBjb25zdCBhdHRyID0gcmVzb2x2ZUF0dHJpYnV0aW9uKGF0dHJpYnV0aW9uKTtcblxuICAgICAgLy8gMjAwIGNhcnJpZXMgYGRhdGEucXVvdGFgOyA0MjkgKFFVT1RBX0VYQ0VFREVEKSBjYXJyaWVzIGBkZXRhaWxzLnF1b3RhYC5cbiAgICAgIC8vIEJvdGggc2hhcGVzIGFyZSBub3JtYWxpemVkIGludG8gUXVvdGFSZXNlcnZlUmVzdWx0LlxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDx7XG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIGRhdGE/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIGRldGFpbHM/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIC8qKiBgc2VuZEVycm9yYCdzIGVycm9yLWNvZGUgZmllbGQuICovXG4gICAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IHF1b3RhVHlwZSwgYW1vdW50LCAuLi4oYXR0ciAmJiB7IGF0dHJpYnV0aW9uOiBhdHRyIH0pIH0sIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCBhdHRyPy5yZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UpIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ3VucmVhY2hhYmxlJyk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MjkpIHtcbiAgICAgICAgY29uc3QgcSA9IHJlc3BvbnNlLmJvZHkuZGV0YWlscz8ucXVvdGE7XG4gICAgICAgIC8vIEFuIG9wdGlvbmFsIG9yZyBBSSBjb250cm9sIChwZXItbWVtYmVyIHNoYXJlLCB0b2tlbiBidWRnZXQpIHJlZnVzZWQgdGhlXG4gICAgICAgIC8vIHNsb3Q6IGEgZ2VudWluZSwgZmluYWwgZGVuaWFsIOKAlCByZWxheWVkIHdpdGggaXRzIG93biBjb2RlIGFuZCBtZXNzYWdlLlxuICAgICAgICBpZiAocmVzcG9uc2UuYm9keS5jb2RlICYmIEFJX0xJTUlUX0NPREVTLmhhcyhyZXNwb25zZS5ib2R5LmNvZGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4Y2VlZGVkOiB0cnVlLFxuICAgICAgICAgICAgY29kZTogcmVzcG9uc2UuYm9keS5jb2RlIGFzIEFpTGltaXRDb2RlLFxuICAgICAgICAgICAgLi4uKHJlc3BvbnNlLmJvZHkubWVzc2FnZSA/IHsgbWVzc2FnZTogcmVzcG9uc2UuYm9keS5tZXNzYWdlIH0gOiB7fSksXG4gICAgICAgICAgICBxdW90YTogcSA/PyB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IDAsIHVzZWQ6IDAsIHJlbWFpbmluZzogMCB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBhIEdFTlVJTkUgcXVvdGEtZXhjZWVkZWQgNDI5IG1lYW5zIFwib3ZlciBxdW90YVwiLiBBIGdlbmVyaWMgNDI5IOKAlFxuICAgICAgICAvLyBhbiBpbnRlcnZlbmluZyBnYXRld2F5IG9yIHJhdGUgbGltaXRlciDigJQgZGlkIG5vdCBjb25maXJtIGFueXRoaW5nLCBzb1xuICAgICAgICAvLyBpdCBnb2VzIHRocm91Z2ggdGhlIHNhbWUgdW5jb25maXJtZWQtcmVzZXJ2YXRpb24gcG9saWN5IGFzIGFuIG91dGFnZS5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmJvZHkuY29kZSA9PT0gRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEIHx8IHEpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXhjZWVkZWQ6IHRydWUsXG4gICAgICAgICAgICBxdW90YTogcSA/PyB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IDAsIHVzZWQ6IDAsIHJlbWFpbmluZzogMCB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuY29uZmlybWVkUmVzZXJ2ZShvcmdJZCwgcXVvdGFUeXBlLCAndHJhbnNpZW50LTQyOScsIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFyZXNwb25zZS5ib2R5LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHVuY29uZmlybWVkUmVzZXJ2ZShvcmdJZCwgcXVvdGFUeXBlLCAnbm9uLW9rJywgcmVzcG9uc2Uuc3RhdHVzQ29kZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHEgPSByZXNwb25zZS5ib2R5LmRhdGE/LnF1b3RhO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhjZWVkZWQ6IGZhbHNlLFxuICAgICAgICBxdW90YTogcSA/PyB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IC0xLCB1c2VkOiAwLCByZW1haW5pbmc6IC0xIH0sXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXNldEF0U25hcHNob3Q/OiBzdHJpbmcsIGF0dHJpYnV0aW9uPzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfS9kZWNyZW1lbnRgO1xuICAgICAgY29uc3QgYXR0ciA9IHJlc29sdmVBdHRyaWJ1dGlvbihhdHRyaWJ1dGlvbik7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudFxuICAgICAgICAucG9zdChwYXRoLCB7IHF1b3RhVHlwZSwgYW1vdW50LCAuLi4ocmVzZXRBdFNuYXBzaG90ICYmIHsgcmVzZXRBdFNuYXBzaG90IH0pLCAuLi4oYXR0ciAmJiB7IGF0dHJpYnV0aW9uOiBhdHRyIH0pIH0sIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCBhdHRyPy5yZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgIC8vIFJvbGxiYWNrIGZhaWx1cmUgaXMgbG9nZ2VkIGJ1dCBuZXZlciBwcm9wYWdhdGVkICB0aGUgYWN0aW9uJ3Mgb3duXG4gICAgICAgIC8vIGZhaWx1cmUgaGFzIGFscmVhZHkgYmVlbiBzdXJmYWNlZCB0byB0aGUgY2FsbGVyOyBhIHN0dWNrIGNvdW50ZXJcbiAgICAgICAgLy8gcmVzb2x2ZXMgb24gdGhlIG5leHQgcGVyaW9kIHJlc2V0LlxuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGRlY3JlbWVudCBxdW90YSAoc2xvdCB3aWxsIHJlc2V0IG9uIG5leHQgcGVyaW9kKScsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUXVvdGEgZGVjcmVtZW50ZWQnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIGFtb3VudCB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcmVwb3J0VXNhZ2Uob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgdG9rZW5zOiBRdW90YVRva2VuVXNhZ2UsIGF0dHJpYnV0aW9uPzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCB0b2tlbnNJbiA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IodG9rZW5zLnRva2Vuc0luIHx8IDApKTtcbiAgICAgIGNvbnN0IHRva2Vuc091dCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IodG9rZW5zLnRva2Vuc091dCB8fCAwKSk7XG4gICAgICBjb25zdCBhdHRyID0gcmVzb2x2ZUF0dHJpYnV0aW9uKGF0dHJpYnV0aW9uKTtcbiAgICAgIC8vIE5vdGhpbmcgdG8gc2F5OiBubyB0b2tlbnMgYW5kIG5vIGF0dHJpYnV0aW9uIHRvIG1ha2UgYSB6ZXJvIHJvdyB1c2VmdWwuXG4gICAgICBpZiAodG9rZW5zSW4gPT09IDAgJiYgdG9rZW5zT3V0ID09PSAwICYmICFhdHRyKSByZXR1cm47XG4gICAgICBjb25zdCBwYXRoID0gYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfS9pbmNyZW1lbnRgO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdChcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHsgcXVvdGFUeXBlLCByZXBvcnQ6IHRydWUsIHRva2Vuc0luLCB0b2tlbnNPdXQsIC4uLihhdHRyICYmIHsgYXR0cmlidXRpb246IGF0dHIgfSkgfSxcbiAgICAgICAgICB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgYXR0cj8ucmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0sXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byByZXBvcnQgQUkgdXNhZ2UnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlIH0pO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV91c2FnZV9yZXBvcnRfZmFpbHVyZXNfdG90YWwnLCB7IHJlYXNvbjogcmVzcG9uc2UgPyAnbm9uLW9rJyA6ICd1bnJlYWNoYWJsZScsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcmVwb3J0IEFJIHVzYWdlJywgeyBvcmdJZCwgcXVvdGFUeXBlLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV91c2FnZV9yZXBvcnRfZmFpbHVyZXNfdG90YWwnLCB7IHJlYXNvbjogJ2V4Y2VwdGlvbicsIHF1b3RhVHlwZSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGllcihvcmdJZDogc3RyaW5nLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFUaWVyPiB7XG4gICAgICBjb25zdCBrbm93biA9IGNvbnN0YW50VGllckZvcihvcmdJZCk7XG4gICAgICBpZiAoa25vd24pIHJldHVybiBrbm93bjtcbiAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCByZWFkVGllcihvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKTtcbiAgICAgIGlmIChyZWFkLnRpZXIpIHJldHVybiByZWFkLnRpZXI7XG4gICAgICBsb2dnZXIud2FybihgUVVPVEFfRkFJTF9PUEVOOiB0aWVyIGxvb2t1cCBmYWlsZWQsIGRlZmF1bHRpbmcgdG8gJHtERUZBVUxUX1RJRVJ9IHRpZXJgLCB7XG4gICAgICAgIG9yZ0lkLCBzdGF0dXNDb2RlOiByZWFkLnN0YXR1c0NvZGUsIHJlYXNvbjogcmVhZC5yZWFzb24sIGRlZmF1bHRUaWVyOiBERUZBVUxUX1RJRVIsXG4gICAgICB9KTtcbiAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ3RpZXInLCByZWFzb246IHJlYWQucmVhc29uLCBxdW90YVR5cGU6ICd0aWVyJyB9KTtcbiAgICAgIHJldHVybiBERUZBVUxUX1RJRVI7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFRpZXJTdHJpY3Qob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhVGllciB8IG51bGw+IHtcbiAgICAgIGNvbnN0IGtub3duID0gY29uc3RhbnRUaWVyRm9yKG9yZ0lkKTtcbiAgICAgIGlmIChrbm93bikgcmV0dXJuIGtub3duO1xuICAgICAgY29uc3QgcmVhZCA9IGF3YWl0IHJlYWRUaWVyKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpO1xuICAgICAgaWYgKHJlYWQudGllcikgcmV0dXJuIHJlYWQudGllcjtcbiAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX0NMT1NFRDogdGllciBjb3VsZCBub3QgYmUgY29uZmlybWVkJywgeyBvcmdJZCwgc3RhdHVzQ29kZTogcmVhZC5zdGF0dXNDb2RlLCByZWFzb246IHJlYWQucmVhc29uIH0pO1xuICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfY2xvc2VkX3RvdGFsJywgeyBvcGVyYXRpb246ICd0aWVyJywgcmVhc29uOiByZWFkLnJlYXNvbiwgcXVvdGFUeXBlOiAndGllcicgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFRoZSBzeXN0ZW0gb3JnJ3MgdGllciBpcyBhIENPTlNUQU5ULCBub3QgYSBiaWxsaW5nIGZhY3QsIHNvIGl0IGlzIGFuc3dlcmVkXG4gKiB3aXRob3V0IGEgbG9va3VwLlxuICpcbiAqIFRoZSBwbGF0Zm9ybSdzIG93biBvcmcgaXMgYWx3YXlzIGB1bmxpbWl0ZWRgIChwbGF0Zm9ybS9zcmMvc2VydmljZXMvXG4gKiBhdXRoLXNlcnZpY2UudHMgc2VlZHMgaXQgdGhhdCB3YXkpOiBub3RoaW5nIG1ldGVycyBpdCBhbmQgaXQgaXMgbmV2ZXIgc29sZC5cbiAqIEFza2luZyB0aGUgcXVvdGEgc2VydmljZSB3YXMgdGhlcmVmb3JlIGEgbmV0d29yayBob3Agd2hvc2Ugb25seSBwb3NzaWJsZVxuICogb3V0Y29tZXMgd2VyZSB0aGUgYW5zd2VyIHdlIGFscmVhZHkga25ldywgb3IgYSBmYWlsdXJlLlxuICpcbiAqIFRoZSBmYWlsdXJlIGlzIHdoYXQgbWFkZSB0aGlzIHdvcnRoIGZpeGluZy4gYGdldFRpZXJgIGZhaWxzIE9QRU4gdG9cbiAqIERFRkFVTFRfVElFUiwgd2hpY2ggd2l0aCBiaWxsaW5nIGVuYWJsZWQgaXMgYGRldmVsb3BlcmAg4oCUIHRoZSBtb3N0XG4gKiBjb25zdHJhaW5lZCB0aWVyIOKAlCBhbmQgaXRzIGRvY3VtZW50ZWQgam9iIGlzIGJ1aWxkLXF1ZXVlIHBhcnRpdGlvbmluZy4gQVxuICogYmxpcCBpbiB0aGUgcXVvdGEgc2VydmljZSB0aGVyZWZvcmUgcm91dGVkIHRoZSBTWVNURU0gb3JnJ3MgYnVpbGRzIG9udG8gdGhlXG4gKiBkZXZlbG9wZXIgcXVldWU7IHRoZSBPZmZpY2lhbCBjYXRhbG9nIGxvYWQgaXMgMTE5IG9mIHRoZW0uIGBnZXRUaWVyU3RyaWN0YFxuICogZmFpbHMgQ0xPU0VEIHRvIG51bGwsIHNvIGEgc3dlZXAgdGhhdCBtdXN0IG5vdCBndWVzcyB3b3VsZCBza2lwIHRoZVxuICogcGxhdGZvcm0ncyBvd24gb3JnIGluc3RlYWQuXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50VGllckZvcihvcmdJZDogc3RyaW5nKTogUXVvdGFUaWVyIHwgbnVsbCB7XG4gIHJldHVybiBvcmdJZC50b0xvd2VyQ2FzZSgpID09PSBTWVNURU1fT1JHX0lEID8gJ3VubGltaXRlZCcgOiBudWxsO1xufVxuXG4vKipcbiAqIEZpcmUtYW5kLWZvcmdldCBxdW90YSBNRVRFUklORyBpbmNyZW1lbnQuXG4gKlxuICogQnVmZmVyZWQ6IHRoZSB1bml0IGpvaW5zIHRoZSBwb2QncyBwZXItKG9yZywgdHlwZSkgYWdncmVnYXRlIGFuZCBpcyBzZW50IHdpdGhcbiAqIHRoZSBuZXh0IGZsdXNoIChgUVVPVEFfSU5DUkVNRU5UX0ZMVVNIX01TYCwgc2VlIHF1b3RhLWluY3JlbWVudC1iYXRjaGVyLnRzKVxuICogYXMgb25lIG1ldGVyZWQgaW5jcmVtZW50IOKAlCBwYXJ0aWFsIGFkbWlzc2lvbiBhZ2FpbnN0IHRoZSBjYXAsIHRoZSBleGNlc3NcbiAqIHJlY29yZGVkIGFzIGBvdmVyc2hvb3RgLiBUaGUgY291bnRlciB0aGVyZWZvcmUgbGFncyBieSBhdCBtb3N0IG9uZSBmbHVzaFxuICogaW50ZXJ2YWwuIE9ubHkgdGhlIHJlcXVlc3QgbWV0ZXIgdXNlcyB0aGlzOyByZXNlcnZhdGlvbnMgc3RheSBzeW5jaHJvbm91cy5cbiAqXG4gKiBBdXRoZW50aWNhdGVzIGFzIHRoZSBjYWxsaW5nIFNFUlZJQ0UgKHtAbGluayBnZXRRdW90YVNlcnZpY2VBdXRoSGVhZGVyfSksIG5ldmVyXG4gKiB3aXRoIHRoZSBlbmQgdXNlcidzIHRva2VuOiBgL3F1b3Rhcy86b3JnSWQvaW5jcmVtZW50YCBpcyBzZXJ2aWNlLXByaW5jaXBhbFxuICogb25seSwgc28gYSBmb3J3YXJkZWQgdXNlciBKV1Qgd2FzIGFsd2F5cyByZWplY3RlZCAoNDAzKSBhbmQgdGhlIG1ldGVyZWQgcXVvdGFcbiAqIChlLmcuIGBhcGlDYWxsc2AsIGFuZCB0aGUgYGFwaV9wYWNrYCBidW5kbGUgcmFpc2luZyBpdCkgbmV2ZXIgbW92ZWQuXG4gKlxuICogQHBhcmFtIHF1b3RhU2VydmljZSAtIFF1b3RhIHNlcnZpY2UgY2xpZW50XG4gKiBAcGFyYW0gb3JnSWQgLSBPcmdhbml6YXRpb24gSUQgd2hvc2UgY291bnRlciBpcyBpbmNyZW1lbnRlZFxuICogQHBhcmFtIHF1b3RhVHlwZSAtIFF1b3RhIHR5cGUgdG8gaW5jcmVtZW50XG4gKiBAcGFyYW0gbG9nV2FybiAtIExvZ2dpbmcgZnVuY3Rpb24gZm9yIHdhcm5pbmdzXG4gKiBAcGFyYW0gYXR0cmlidXRpb24gLSBXaG8gc3BlbnQgdGhlIHVuaXQgKGRlZmF1bHRzIHRvIHRoZSBhbWJpZW50IHJlcXVlc3QgY29udGV4dClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluY3JlbWVudFF1b3RhKCBxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4gIGxvZ1dhcm46IChtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkLFxuICBhdHRyaWJ1dGlvbj86IFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbixcbik6IHZvaWQge1xuICB0cnkge1xuICAgIGNvbnN0IGJhdGNoZXIgPSBiYXRjaGVyRm9yKHF1b3RhU2VydmljZSwgYXN5bmMgKG9yZywgdHlwZSwgZ3JvdXBzKSA9PiB7XG4gICAgICBhd2FpdCBxdW90YVNlcnZpY2UuaW5jcmVtZW50TWV0ZXJlZChvcmcsIHR5cGUsIGdldFF1b3RhU2VydmljZUF1dGhIZWFkZXIob3JnKSwgZ3JvdXBzKTtcbiAgICB9KTtcbiAgICBiYXRjaGVyLmFkZChvcmdJZCwgcXVvdGFUeXBlLCByZXNvbHZlQXR0cmlidXRpb24oYXR0cmlidXRpb24pKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nV2FybignUXVvdGEgaW5jcmVtZW50IGZhaWxlZCcsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIGVtaXRDb3VudGVyKCdxdW90YV9pbmNyZW1lbnRfZmFpbHVyZXNfdG90YWwnLCB7IHJlYXNvbjogJ2V4Y2VwdGlvbicsIHF1b3RhVHlwZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEF0b21pYyByZXNlcnZlIGhlbHBlciBmb3IgdGhlIFwicmVzZXJ2ZSArIGNvbW1pdCAvIHJvbGxiYWNrXCIgcGF0dGVybi5cbiAqIFVzZSBmb3IgZXhwZW5zaXZlIHJlc291cmNlcyAocGlwZWxpbmVzLCBwbHVnaW5zLCBBSSBjYWxscykgd2hlcmUgdGhlXG4gKiBmaXJlLWFuZC1mb3JnZXQgcG9zdC1ob2MgYGluY3JlbWVudFF1b3RhYCBhbGxvd3MgY29uY3VycmVudCBvdmVyLXNwZW5kLlxuICpcbiAqIFJldHVybnMgdGhlIHN0cnVjdHVyZWQgcmVzdWx0IHNvIHRoZSBjYWxsZXIgY2FuIGRlY2lkZSB3aGV0aGVyIHRvIHJ1blxuICogdGhlIGdhdGVkIGFjdGlvbiBvciA0MjkgdGhlIGNsaWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzZXJ2YXRpb24gPSBhd2FpdCByZXNlcnZlUXVvdGEocXVvdGFTZXJ2aWNlLCBvcmdJZCwgJ3BpcGVsaW5lcycsIGF1dGhIZWFkZXIpO1xuICogaWYgKHJlc2VydmF0aW9uLmV4Y2VlZGVkKSByZXR1cm4gc2VuZFF1b3RhUmVzZXJ2ZURlbmllZChyZXMsICdwaXBlbGluZXMnLCByZXNlcnZhdGlvbik7XG4gKiB0cnkge1xuICogYXdhaXQgZG9FeHBlbnNpdmVUaGluZygpO1xuICogfSBjYXRjaCAoZXJyKSB7XG4gKiAvLyBQYXNzIHRoZSByZXNlcnZlZCByZXNldEF0IHNvIGEgcGVyaW9kIHJvbGxvdmVyIGRvZXNuJ3QgZ2V0IGRvdWJsZS1jaGFyZ2VkLlxuICogZGVjcmVtZW50UXVvdGEocXVvdGFTZXJ2aWNlLCBvcmdJZCwgJ3BpcGVsaW5lcycsIGF1dGhIZWFkZXIsIGxvZ1dhcm4sIDEsIHJlc2VydmF0aW9uLnF1b3RhLnJlc2V0QXQpO1xuICogdGhyb3cgZXJyO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNlcnZlUXVvdGEoIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICBvcmdJZDogc3RyaW5nLFxuICBxdW90YVR5cGU6IFF1b3RhVHlwZSxcbiAgYXV0aEhlYWRlcjogc3RyaW5nLFxuICBhbW91bnQ6IG51bWJlciA9IDEsXG4gIGF0dHJpYnV0aW9uPzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uLFxuKTogUHJvbWlzZTxRdW90YVJlc2VydmVSZXN1bHQ+IHtcbiAgcmV0dXJuIHF1b3RhU2VydmljZS5yZXNlcnZlKG9yZ0lkLCBxdW90YVR5cGUsIGF1dGhIZWFkZXIsIGFtb3VudCwgYXR0cmlidXRpb24pO1xufVxuXG4vKiogU2Vjb25kcyBhIGNsaWVudCBzaG91bGQgd2FpdCBiZWZvcmUgcmV0cnlpbmcgd2hlbiBxdW90YSBjb3VsZG4ndCBiZSBjb25maXJtZWQuICovXG5jb25zdCBRVU9UQV9VTkFWQUlMQUJMRV9SRVRSWV9BRlRFUl9TRUNPTkRTID0gNTtcblxuLyoqXG4gKiBBbnN3ZXIgYSBERU5JRUQgcmVzZXJ2YXRpb24gKGByZXNlcnZhdGlvbi5leGNlZWRlZCA9PT0gdHJ1ZWApLlxuICpcbiAqIC0gYHVuYXZhaWxhYmxlYCAodGhlIHF1b3RhIHNlcnZpY2UgY291bGRuJ3QgY29uZmlybSB0aGUgc2xvdCkg4oaSICoqNTAzKipcbiAqICAgYFNFUlZJQ0VfVU5BVkFJTEFCTEVgIHdpdGggYSBzaG9ydCBgUmV0cnktQWZ0ZXJgOiB0aGUgb3JnIGlzIG5vdCBvdmVyIGl0c1xuICogICBsaW1pdCwgc28gYSA0MjkgXCJxdW90YSBleGNlZWRlZFwiIHdvdWxkIHNlbmQgdXNlcnMgdG8gdXBncmFkZSBmb3IgYW4gb3V0YWdlLlxuICogLSBvdGhlcndpc2Ug4oaSIHRoZSBzdGFuZGFyZCA0MjkgYFFVT1RBX0VYQ0VFREVEYCB3aXRoIHRoZSBYLVF1b3RhLSogaGVhZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbmRRdW90YVJlc2VydmVEZW5pZWQocmVzOiBSZXNwb25zZSwgcXVvdGFUeXBlOiBRdW90YVR5cGUsIHJlc2VydmF0aW9uOiBRdW90YVJlc2VydmVSZXN1bHQpOiB2b2lkIHtcbiAgaWYgKHJlc2VydmF0aW9uLmNvZGUpIHtcbiAgICAvLyBBbiBvcHRpb25hbCBvcmcgQUkgY29udHJvbCAocGVyLW1lbWJlciBzaGFyZSAvIHRva2VuIGJ1ZGdldCk6IGl0cyBvd25cbiAgICAvLyBjb2RlLCBzbyB0aGUgY2xpZW50IGNhbiBzYXkgXCJ5b3VyIHNoYXJlXCIgcmF0aGVyIHRoYW4gXCJ0aGUgb3JnIGlzIG91dFwiLlxuICAgIGNvbnN0IHJlc2V0QXQgPSByZXNlcnZhdGlvbi5xdW90YS5yZXNldEF0O1xuICAgIGlmICghcmVzLmhlYWRlcnNTZW50ICYmIHJlc2V0QXQpIHtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ1JldHJ5LUFmdGVyJywgTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChuZXcgRGF0ZShyZXNldEF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKSAvIDEwMDApKSk7XG4gICAgfVxuICAgIGVtaXRDb3VudGVyKCdxdW90YV9kZW5pZWRfdG90YWwnLCB7IHR5cGU6IHF1b3RhVHlwZSB9KTtcbiAgICBzZW5kRXJyb3IoXG4gICAgICByZXMsXG4gICAgICA0MjksXG4gICAgICByZXNlcnZhdGlvbi5tZXNzYWdlID8/IGBZb3VyIG9yZ2FuaXphdGlvbidzICR7cXVvdGFUeXBlfSBsaW1pdCBmb3IgdGhpcyBwZXJpb2QgaGFzIGJlZW4gcmVhY2hlZC5gLFxuICAgICAgcmVzZXJ2YXRpb24uY29kZSxcbiAgICAgIHsgcXVvdGE6IHJlc2VydmF0aW9uLnF1b3RhLCBxdW90YVR5cGUsIC4uLihyZXNldEF0ID8geyByZXNldEF0IH0gOiB7fSkgfSxcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocmVzZXJ2YXRpb24udW5hdmFpbGFibGUpIHtcbiAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkgcmVzLnNldEhlYWRlcignUmV0cnktQWZ0ZXInLCBRVU9UQV9VTkFWQUlMQUJMRV9SRVRSWV9BRlRFUl9TRUNPTkRTKTtcbiAgICBzZW5kRXJyb3IoXG4gICAgICByZXMsXG4gICAgICA1MDMsXG4gICAgICBgVW5hYmxlIHRvIGNvbmZpcm0gJHtxdW90YVR5cGV9IHF1b3RhIHJpZ2h0IG5vdy4gUGxlYXNlIHRyeSBhZ2FpbiBzaG9ydGx5LmAsXG4gICAgICBFcnJvckNvZGUuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBzZW5kUXVvdGFFeGNlZWRlZChyZXMsIHF1b3RhVHlwZSwgcmVzZXJ2YXRpb24ucXVvdGEsIHJlc2VydmF0aW9uLnF1b3RhLnJlc2V0QXQpO1xufVxuXG4vKipcbiAqIEZpcmUtYW5kLWZvcmdldCByb2xsYmFjayBmb3IgYSBwcmV2aW91c2x5IHJlc2VydmVkIHF1b3RhIHNsb3QuXG4gKiBMb2dzIG9uIGZhaWx1cmUgYnV0IG5ldmVyIHRocm93cyAgdGhlIGFjdGlvbiB0aGF0IG5lZWRlZCB0aGUgcm9sbGJhY2tcbiAqIGhhcyBhbHJlYWR5IGZhaWxlZCwgbm8gcG9pbnQgY29tcG91bmRpbmcgdGhlIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjcmVtZW50UXVvdGEoIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICBvcmdJZDogc3RyaW5nLFxuICBxdW90YVR5cGU6IFF1b3RhVHlwZSxcbiAgYXV0aEhlYWRlcjogc3RyaW5nLFxuICBsb2dXYXJuOiAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZCxcbiAgYW1vdW50OiBudW1iZXIgPSAxLFxuICByZXNldEF0U25hcHNob3Q/OiBzdHJpbmcsXG4gIGF0dHJpYnV0aW9uPzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uLFxuKTogdm9pZCB7XG4gIGNvbnN0IHNlbnQgPSBhdHRyaWJ1dGlvblxuICAgID8gcXVvdGFTZXJ2aWNlLmRlY3JlbWVudChvcmdJZCwgcXVvdGFUeXBlLCBhdXRoSGVhZGVyLCBhbW91bnQsIHJlc2V0QXRTbmFwc2hvdCwgYXR0cmlidXRpb24pXG4gICAgOiBxdW90YVNlcnZpY2UuZGVjcmVtZW50KG9yZ0lkLCBxdW90YVR5cGUsIGF1dGhIZWFkZXIsIGFtb3VudCwgcmVzZXRBdFNuYXBzaG90KTtcbiAgc2VudC5jYXRjaCgoZXJyOiB1bmtub3duKSA9PlxuICAgIGxvZ1dhcm4oJ1F1b3RhIHJvbGxiYWNrIGZhaWxlZCcsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pLFxuICApO1xufVxuIl19
559
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9xdW90YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBSXRDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUE4QixNQUFNLDhCQUE4QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNC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QVMsQ0FBQyxhQUFhLEVBQUUscUNBQXFDLENBQUMsQ0FBQztRQUMxRixTQUFTLENBQ1AsR0FBRyxFQUNILEdBQUcsRUFDSCxxQkFBcUIsU0FBUyw2Q0FBNkMsRUFDM0UsU0FBUyxDQUFDLG1CQUFtQixDQUM5QixDQUFDO1FBQ0YsT0FBTztJQUNULENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUUsWUFBMEIsRUFDeEQsS0FBYSxFQUNiLFNBQW9CLEVBQ3BCLFVBQWtCLEVBQ2xCLE9BQWtELEVBQ2xELE1BQU0sR0FBVyxDQUFDLEVBQ2xCLGVBQXdCLEVBQ3hCLFdBQW1DO0lBRW5DLE1BQU0sSUFBSSxHQUFHLFdBQVc7UUFDdEIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUM7UUFDNUYsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ2xGLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFZLEVBQUUsRUFBRSxDQUMxQixPQUFPLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FDL0QsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuXG5pbXBvcnQgeyBjdXJyZW50QXVkaXRDb250ZXh0LCBzYW5pdGl6ZUNvcnJlbGF0aW9uSWQgfSBmcm9tICcuL2F1ZGl0LWNvbnRleHQuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2FmZUNsaWVudCwgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgYmF0Y2hlckZvciwgdHlwZSBNZXRlcmVkSW5jcmVtZW50R3JvdXAgfSBmcm9tICcuL3F1b3RhLWluY3JlbWVudC1iYXRjaGVyLmpzJztcbmltcG9ydCB7IG9uQmVoYWxmQ2FsbGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9vbi1iZWhhbGYuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIsIGlzU2VydmljZVByaW5jaXBhbCB9IGZyb20gJy4uL21pZGRsZXdhcmUvc2VydmljZS10b2tlbnMuanMnO1xuaW1wb3J0IHsgU1lTVEVNX09SR19JRCB9IGZyb20gJy4uL21pZGRsZXdhcmUvc3lzdGVtLW9yZy5qcyc7XG5pbXBvcnQgdHlwZSB7IEp3dFBheWxvYWQsIFByaW5jaXBhbFR5cGUsIFF1b3RhVHlwZSwgUXVvdGFDaGVja1Jlc3VsdCwgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi90eXBlcy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1RJRVIsIGlzVmFsaWRUaWVyLCB0eXBlIFF1b3RhVGllciB9IGZyb20gJy4uL3R5cGVzL3F1b3RhLXRpZXJzLmpzJztcbmltcG9ydCB7IGVudkJvb2wsIGVudkludCB9IGZyb20gJy4uL3V0aWxzL2Vudi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UsIHNlbmRFcnJvciwgc2VuZFF1b3RhRXhjZWVkZWQgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBzZXJ2aWNlRW5kcG9pbnQgfSBmcm9tICcuLi91dGlscy9zZXJ2aWNlLXJlZ2lzdHJ5LmpzJztcblxuLyoqXG4gKiBSZXRyeSBvcHRpb25zIGZvciBxdW90YSBjYWxscyDigJQgZmFpbCBmYXN0IChhIHNsb3cgcXVvdGEgc2VydmljZSBtdXN0IG5vdCBzdGFsbCB0aGUgcmVxdWVzdCkuXG4gKlxuICogTkVWRVIgcmV0cnkgYSA0MjkuIFRoZSBxdW90YSBzZXJ2aWNlIGFuc3dlcnMgYW4gb3Zlci1saW1pdCBvcmcgd2l0aCA0MjlcbiAqIFFVT1RBX0VYQ0VFREVEIGFuZCBgUmV0cnktQWZ0ZXJgID0gc2Vjb25kcyB1bnRpbCB0aGUgcGVyaW9kIHJlc2V0czsgdGhlIEhUVFBcbiAqIGNsaWVudCBob25vcnMgdGhhdCAoY2FwcGVkIGF0IDYwcyksIHNvIGEgc2luZ2xlIHJhdGUtbGltaXQgcmV0cnkgc3RhbGxlZCB0aGVcbiAqIHJlcXVlc3Qgd2VsbCBwYXN0IHRoZSBoYW5kbGVyIHRpbWVvdXQsIHdoaWNoIHRoZW4gYW5zd2VyZWQgNTAzIGFuZCB0aGUgcmVhbFxuICogNDI5IHdhcyBsb3N0LiBBIDQyOSBpcyBhIGZpbmFsIGFuc3dlciBoZXJlLlxuICovXG5jb25zdCBRVU9UQV9SRVFVRVNUX09QVElPTlM6IFBpY2s8UmVxdWVzdE9wdGlvbnMsICdtYXhSYXRlTGltaXRSZXRyaWVzJyB8ICdtYXhSZXRyaWVzJz4gPSB7XG4gIG1heFJhdGVMaW1pdFJldHJpZXM6IDAsXG4gIG1heFJldHJpZXM6IDEsXG59O1xuXG4vKipcbiAqIEJ1ZGdldCBmb3Igb25lIGBjaGVja2Agb2YgYSBDT1VOVEVSIHF1b3RhIChgUVVPVEFfQ0hFQ0tfVElNRU9VVF9NU2AsIGRlZmF1bHRcbiAqIDMwMCksIHdpdGggbm8gcmV0cnkuXG4gKlxuICogVGhlIGNoZWNrIGlzIGEgcmVhZCBnYXRlIHRoYXQgRkFJTFMgT1BFTiwgcnVuIGFoZWFkIG9mIHRoZSByZXF1ZXN0IGl0IGdhdGVzOlxuICogdGhlIG9sZCA1IHMgdGltZW91dCDDlyAyIGF0dGVtcHRzIG1lYW50IGEgc2xvdyBxdW90YSBzZXJ2aWNlIGFkZGVkIHVwIHRvIDEwIHNcbiAqIHRvIGV2ZXJ5IG1ldGVyZWQgcmVxdWVzdCBhbmQgdGhlbiBsZXQgaXQgdGhyb3VnaCBhbnl3YXkuIEEgc2hvcnQgYnVkZ2V0IHR1cm5zXG4gKiB0aGUgc2FtZSBpbmNpZGVudCBpbnRvIGEg4omkIDMwMCBtcyBmYWlsLW9wZW4gKGNvdW50ZWQgb25cbiAqIGBxdW90YV9mYWlsX29wZW5fdG90YWxgLCB3aGljaCBhbGVydHMpIOKAlCBhbmQgd2l0aCB0aGUgcGVyLXBvZCBjaGVjayBjYWNoZSBpblxuICogZnJvbnQgKGFwaS1zZXJ2ZXIgYGNoZWNrUXVvdGFgKSBhIGhlYWx0aHkgc2VydmljZSBpcyBhc2tlZCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBvcmcvdHlwZSBwZXIgY2FjaGUgVFRMLlxuICpcbiAqIGBzdG9yYWdlQnl0ZXNgIGtlZXBzIHRoZSBjbGllbnQgdGltZW91dCBhbmQgb25lIHJldHJ5OiBpdCBpcyBhIE1FQVNVUkVEIHJlYWRcbiAqICh0aGUgcXVvdGEgc2VydmljZSB3YWxrcyB0aGUgb3JnJ3MgcmVnaXN0cnkgbmFtZXNwYWNlIG9uIGEgY29sZCBjYWNoZSkgYmVoaW5kXG4gKiB0aGUgcmVnaXN0cnkncyBmYWlsLUNMT1NFRCBwdXNoIGdhdGUsIHdoZXJlIGEgcHJlbWF0dXJlIHRpbWVvdXQgcmVmdXNlcyBhIHB1c2guXG4gKi9cbmV4cG9ydCBjb25zdCBRVU9UQV9DSEVDS19USU1FT1VUX01TID0gZW52SW50KCdRVU9UQV9DSEVDS19USU1FT1VUX01TJywgMzAwLCB7IG1pbjogMSB9KTtcblxuZnVuY3Rpb24gY2hlY2tSZXF1ZXN0T3B0aW9ucyhxdW90YVR5cGU6IFF1b3RhVHlwZSk6IFBpY2s8UmVxdWVzdE9wdGlvbnMsICdtYXhSYXRlTGltaXRSZXRyaWVzJyB8ICdtYXhSZXRyaWVzJyB8ICd0aW1lb3V0Jz4ge1xuICBpZiAocXVvdGFUeXBlID09PSAnc3RvcmFnZUJ5dGVzJykgcmV0dXJuIFFVT1RBX1JFUVVFU1RfT1BUSU9OUztcbiAgcmV0dXJuIHsgbWF4UmF0ZUxpbWl0UmV0cmllczogMCwgbWF4UmV0cmllczogMCwgdGltZW91dDogUVVPVEFfQ0hFQ0tfVElNRU9VVF9NUyB9O1xufVxuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3F1b3RhJyk7XG5cbi8vIFJFU0VSVkUgRkFJTCBNT0RFIOKAlCBleHBsaWNpdCwgc2luZ2xlIHBvbGljeS5cbi8vXG4vLyBgcmVzZXJ2ZWAgZ2F0ZXMgRVhQRU5TSVZFLCBiaWxsYWJsZSByZXNvdXJjZXMgKHBpcGVsaW5lcywgcGx1Z2luIGJ1aWxkcywgQUlcbi8vIGNhbGxzLCBwbGF0Zm9ybSBmZWF0dXJlIHNsb3RzKS4gRXZlcnkgcXVvdGEgdHlwZSBpcyBhIHBlci1wZXJpb2QgRkxPVyBjb3VudGVyXG4vLyB3aXRoIG5vIGFmdGVyLXRoZS1mYWN0IHJlY29uY2lsaWF0aW9uOiBhIHVuaXQgY29uc3VtZWQgd2hpbGUgdGhlIHJlc2VydmF0aW9uXG4vLyBjb3VsZCBub3QgYmUgY29uZmlybWVkIGlzIG5ldmVyIGNvdW50ZWQsIHNvIGZhaWwtb3BlbiBsZXRzIGFuIG9yZyBjb25zdW1lXG4vLyB1bmJvdW5kZWQgdW5tZXRlcmVkIHVuaXRzIGZvciB0aGUgd2hvbGUgbGVuZ3RoIG9mIGFuIGluY2lkZW50IOKAlCBhbmQgYW5cbi8vIHVuY29uZmlybWVkIHJlc2VydmUgKHRpbWVvdXQsIG9wZW4gY2lyY3VpdCkgbWF5IGV2ZW4gaGF2ZSBsYW5kZWQgc2VydmVyLXNpZGUuXG4vLyBTbyBgcmVzZXJ2ZWAgZmFpbHMgQ0xPU0VEIHdoZW5ldmVyIHRoZSBxdW90YSBzZXJ2aWNlIGRpZCBub3QgQ09ORklSTSB0aGUgc2xvdDpcbi8vICAgLSB1bnJlYWNoYWJsZSAvIHRpbWVkIG91dCAvIGNpcmN1aXQgYnJlYWtlciBvcGVuIChubyByZXNwb25zZSksXG4vLyAgIC0gYSByZWFjaGFibGUtYnV0LWVycm9yZWQgcmVzcG9uc2UgKDV4eCwgNHh4LCBtYWxmb3JtZWQgYm9keSksXG4vLyAgIC0gYSA0MjkgdGhhdCBpcyBOT1QgYSBnZW51aW5lIFFVT1RBX0VYQ0VFREVEIChnYXRld2F5IC8gcmF0ZSBsaW1pdGVyKS5cbi8vIE9wZXJhdG9ycyB3aG8gcHJlZmVyIGF2YWlsYWJpbGl0eSBvdmVyIGVuZm9yY2VtZW50IG9wdCB0aGUgV0hPTEUgc2V0IGludG9cbi8vIGZhaWwtb3BlbiB3aXRoIFFVT1RBX1JFU0VSVkVfRkFJTF9PUEVOPXRydWUuIEJvdGggb3V0Y29tZXMgZW1pdCBhIGNvdW50ZXJcbi8vIChgcXVvdGFfZmFpbF9jbG9zZWRfdG90YWxgIC8gYHF1b3RhX2ZhaWxfb3Blbl90b3RhbGApIHRhZ2dlZCB3aXRoIHRoZSByZWFzb24uXG4vLyBgY2hlY2tgIChhIGNoZWFwIHJlYWQgZ2F0ZSkgc3RheXMgZmFpbC1vcGVuOyBgaW5jcmVtZW50YCBpcyBmaXJlLWFuZC1mb3JnZXQuXG5jb25zdCBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTiA9IGVudkJvb2woJ1FVT1RBX1JFU0VSVkVfRkFJTF9PUEVOJywgZmFsc2UpO1xuXG4vLyBVU0FHRSBBVFRSSUJVVElPTiDigJQgd2hvIHNwZW50IGEgdW5pdC5cbi8vXG4vLyBUaGUgcXVvdGEgc2VydmljZSBrZWVwcyBvbmUgYWdncmVnYXRlIGNvdW50ZXIgcGVyIChvcmcsIHR5cGUpOyBvbiBpdHMgb3duIHRoYXRcbi8vIGNhbiBzYXkgYW4gb3JnIGlzIGF0IDEwMCUgYnV0IG5ldmVyIFdISUNIIGtleSwgcm91dGUgb3IgcGlwZWxpbmUgZ290IGl0IHRoZXJlLlxuLy8gRXZlcnkgaW5jcmVtZW50IC8gcmVzZXJ2ZSAvIHJlZnVuZCB0aGVyZWZvcmUgY2FycmllcyBhbiBhdHRyaWJ1dGlvbiBibG9jayB0aGVcbi8vIHF1b3RhIHNlcnZpY2Ugd3JpdGVzIGludG8gaXRzIHVzYWdlIGxlZGdlciAoYEdFVCAvcXVvdGFzLzpvcmdJZC91c2FnZWApLiBJdCBpc1xuLy8gbWV0YWRhdGEgb25seSDigJQgZW5mb3JjZW1lbnQgbmV2ZXIgcmVhZHMgaXQg4oCUIGFuZCBldmVyeSBmaWVsZCBpcyBvcHRpb25hbCwgc28gYVxuLy8gY2FsbGVyIHRoYXQga25vd3Mgbm90aGluZyBzdGlsbCBtZXRlcnMgY29ycmVjdGx5LlxuXG4vKiogV2hvIC8gd2hhdCBzcGVudCAob3IgZ290IGJhY2spIGEgcXVvdGEgdW5pdC4gQWxsIGZpZWxkcyBvcHRpb25hbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFVc2FnZUF0dHJpYnV0aW9uIHtcbiAgcHJpbmNpcGFsVHlwZT86IFByaW5jaXBhbFR5cGU7XG4gIC8qKiBUaGUgdXNlciBpZCBvciBzZXJ2aWNlLWFjY291bnQgaWQgYmVoaW5kIHRoZSBjYWxsICh0aGUgdG9rZW4ncyBgc3ViYCkuICovXG4gIHByaW5jaXBhbElkPzogc3RyaW5nO1xuICAvKiogVGhlIHJldm9jYWJsZSBjcmVkZW50aWFsOiB0aGUgYWNjZXNzIGtleSB0aGUgdG9rZW4gZGVyaXZlcyBmcm9tLCBlbHNlIGl0cyBganRpYC4gKi9cbiAga2V5SWQ/OiBzdHJpbmc7XG4gIC8qKiBgTUVUSE9EIC9yb3V0ZS86cGF0dGVybmAg4oCUIHRoZSBtYXRjaGVkIHJvdXRlIFBBVFRFUk4sIG5ldmVyIHRoZSByYXcgVVJMIChubyBpZHMsIG5vIHF1ZXJ5KS4gKi9cbiAgcm91dGU/OiBzdHJpbmc7XG4gIC8qKiBUaGUgcGlwZWxpbmUgdGhlIGNhbGwgd2FzIG1hZGUgZm9yIChgOnBpcGVsaW5lSWRgIHBhcmFtIG9yIGBYLVBpcGVsaW5lLUlkYCBoZWFkZXIpLiAqL1xuICBwaXBlbGluZUlkPzogc3RyaW5nO1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBSSBjYWxscyBvbmx5OiB3aGljaCBwcm9kdWN0IHN1cmZhY2Ugc3BlbnQgdGhlIHVuaXQg4oCUIGBhc2tgLCBgYWdlbnRgLFxuICAgKiBgYWdlbnQtdG9vbDo8bmFtZT5gLCBgcGlwZWxpbmUtZ2VuZXJhdGVgLCBgcGx1Z2luLWdlbmVyYXRlYCxcbiAgICogYHJlcG9ydC1zdW1tYXJ5YC4gU2V0IGJ5IGFwaS1zZXJ2ZXIncyBgd2l0aEFpQ2FsbFJlc2VydmF0aW9uYC5cbiAgICovXG4gIGZlYXR1cmU/OiBzdHJpbmc7XG4gIC8qKiBBSSBjYWxscyBvbmx5OiB0aGUgbW9kZWwgaWQgdGhlIHJlc2VydmF0aW9uIHdhcyByZXNvbHZlZCB0byAobmV2ZXIgYSBrZXkpLiAqL1xuICBtb2RlbD86IHN0cmluZztcbiAgLyoqIEFJIGNhbGxzIG9ubHk6IHdob3NlIGtleSBzZXJ2ZWQgdGhlIGNhbGwg4oCUIGBwbGF0Zm9ybWAsIGBvcmdgIG9yIGByZXF1ZXN0YCAoQllPSykuICovXG4gIGtleVNvdXJjZT86IEFpS2V5U291cmNlO1xufVxuXG4vKiogV2hvc2Uga2V5IHNlcnZlcyBhbiBBSSBjYWxsIChtaXJyb3JzIGFpLWNvcmUgYEtleVNvdXJjZWApLiBPbmx5IGBwbGF0Zm9ybWAgc3BlbmRzIGBhaUNhbGxzYC4gKi9cbmV4cG9ydCB0eXBlIEFpS2V5U291cmNlID0gJ3BsYXRmb3JtJyB8ICdvcmcnIHwgJ3JlcXVlc3QnO1xuXG4vKiogVG9rZW4gY291bnRzIGFuIEFJIGNhbGwgcmVwb3J0cyBhZnRlciBpdCBzZXR0bGVzIChzZWUge0BsaW5rIFF1b3RhU2VydmljZS5yZXBvcnRVc2FnZX0pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVRva2VuVXNhZ2Uge1xuICB0b2tlbnNJbjogbnVtYmVyO1xuICB0b2tlbnNPdXQ6IG51bWJlcjtcbn1cblxuLyoqIExvbmdlc3QgYXR0cmlidXRpb24gc3RyaW5nIHRoZSBjbGllbnQgc2VuZHMgKHRoZSBxdW90YSBzZXJ2aWNlIGVuZm9yY2VzIHRoZSBzYW1lIGJvdW5kKS4gKi9cbmNvbnN0IE1BWF9BVFRSSUJVVElPTl9MRU4gPSAyMDA7XG5cbmZ1bmN0aW9uIGJvdW5kZWQodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUuc2xpY2UoMCwgTUFYX0FUVFJJQlVUSU9OX0xFTikgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBUaGUgcHJpbmNpcGFsIGhhbGYgb2YgYW4gYXR0cmlidXRpb24gYmxvY2ssIGZyb20gYSBWRVJJRklFRCB0b2tlbi4gKi9cbmZ1bmN0aW9uIHByaW5jaXBhbEF0dHJpYnV0aW9uKHVzZXI6IEp3dFBheWxvYWQgfCB1bmRlZmluZWQpOiBRdW90YVVzYWdlQXR0cmlidXRpb24ge1xuICBpZiAoIXVzZXIpIHJldHVybiB7fTtcbiAgcmV0dXJuIHtcbiAgICBwcmluY2lwYWxUeXBlOiB1c2VyLnByaW5jaXBhbFR5cGUsXG4gICAgcHJpbmNpcGFsSWQ6IGJvdW5kZWQodXNlci5zdWIpLFxuICAgIGtleUlkOiBib3VuZGVkKHVzZXIucGFyZW50S2V5SWQgPz8gdXNlci5qdGkpLFxuICB9O1xufVxuXG4vKipcbiAqIEF0dHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdCBiZWluZyBzZXJ2ZWQ6IHRoZSB2ZXJpZmllZCBwcmluY2lwYWwsIHRoZSBtYXRjaGVkXG4gKiByb3V0ZSBwYXR0ZXJuLCB0aGUgcGlwZWxpbmUgKGA6cGlwZWxpbmVJZGAgcGFyYW0gb3IgYSBzYW5pdGl6ZWRcbiAqIGBYLVBpcGVsaW5lLUlkYCBoZWFkZXIpIGFuZCB0aGUgcmVxdWVzdCBpZC4gUmVhZCBvZmYgYHJlcWAgZGlyZWN0bHkgcmF0aGVyIHRoYW5cbiAqIHRoZSBhbWJpZW50IGF1ZGl0IGNvbnRleHQgYmVjYXVzZSB0aGUgbWV0ZXJpbmcgbWlkZGxld2FyZSBydW5zIGluIGEgYGZpbmlzaGBcbiAqIGxpc3RlbmVyLCB3aGVyZSB0aGUgcmVxdWVzdCdzIGFzeW5jIHNjb3BlIGlzIG5vIGxvbmdlciBndWFyYW50ZWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFBdHRyaWJ1dGlvbkZyb21SZXF1ZXN0KHJlcTogUmVxdWVzdCk6IFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbiB7XG4gIGNvbnN0IHJvdXRlUGF0aCA9IHJlcS5yb3V0ZT8ucGF0aDtcbiAgY29uc3Qgcm91dGUgPSB0eXBlb2Ygcm91dGVQYXRoID09PSAnc3RyaW5nJyA/IGAke3JlcS5tZXRob2R9ICR7KHJlcS5iYXNlVXJsID8/ICcnKSArIHJvdXRlUGF0aH1gIDogdW5kZWZpbmVkO1xuICBjb25zdCBoZWFkZXIgPSByZXEuaGVhZGVyc1sneC1waXBlbGluZS1pZCddO1xuICBjb25zdCBwaXBlbGluZUlkID0gc2FuaXRpemVDb3JyZWxhdGlvbklkKHJlcS5wYXJhbXM/LnBpcGVsaW5lSWQpID8/IHNhbml0aXplQ29ycmVsYXRpb25JZChBcnJheS5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXJbMF0gOiBoZWFkZXIpO1xuICBjb25zdCByZXF1ZXN0SWRIZWFkZXIgPSByZXEuaGVhZGVyc1sneC1yZXF1ZXN0LWlkJ107XG4gIGNvbnN0IHJlcXVlc3RJZCA9IChyZXEgYXMgUmVxdWVzdCAmIHsgcmVxdWVzdElkPzogc3RyaW5nIH0pLnJlcXVlc3RJZFxuICAgID8/IHNhbml0aXplQ29ycmVsYXRpb25JZChBcnJheS5pc0FycmF5KHJlcXVlc3RJZEhlYWRlcikgPyByZXF1ZXN0SWRIZWFkZXJbMF0gOiByZXF1ZXN0SWRIZWFkZXIpO1xuICByZXR1cm4ge1xuICAgIC4uLnByaW5jaXBhbEF0dHJpYnV0aW9uKHJlcS51c2VyKSxcbiAgICAuLi4ocm91dGUgPyB7IHJvdXRlOiByb3V0ZS5zbGljZSgwLCBNQVhfQVRUUklCVVRJT05fTEVOKSB9IDoge30pLFxuICAgIC4uLihwaXBlbGluZUlkID8geyBwaXBlbGluZUlkIH0gOiB7fSksXG4gICAgLi4uKHJlcXVlc3RJZCA/IHsgcmVxdWVzdElkOiBib3VuZGVkKHJlcXVlc3RJZCkgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGlvbiBmcm9tIHRoZSBhbWJpZW50IGF1ZGl0IGNvbnRleHQsIGZvciBjYWxscyBtYWRlIGluc2lkZSBhIHJlcXVlc3RcbiAqIHNjb3BlIHRoYXQgZGlkIG5vdCBwYXNzIG9uZSBleHBsaWNpdGx5ICh0aGUgcmVzZXJ2ZSAvIHJlZnVuZCBoZWxwZXJzIGV2ZXJ5XG4gKiBzZXJ2aWNlIHVzZXMpLiBFbXB0eSBvdXRzaWRlIGFueSBzY29wZS5cbiAqL1xuZnVuY3Rpb24gYXR0cmlidXRpb25Gcm9tQ29udGV4dCgpOiBRdW90YVVzYWdlQXR0cmlidXRpb24ge1xuICBjb25zdCBjdHggPSBjdXJyZW50QXVkaXRDb250ZXh0KCk7XG4gIGlmICghY3R4KSByZXR1cm4ge307XG4gIHJldHVybiB7XG4gICAgLi4ucHJpbmNpcGFsQXR0cmlidXRpb24oY3R4LnByaW5jaXBhbD8uKCkpLFxuICAgIC4uLihjdHgucmVxdWVzdElkID8geyByZXF1ZXN0SWQ6IGJvdW5kZWQoY3R4LnJlcXVlc3RJZCkgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIFRoZSBhdHRyaWJ1dGlvbiBhIHF1b3RhIHdyaXRlIHNlbmRzOiB0aGUgZXhwbGljaXQgYmxvY2ssIGVsc2UgdGhlIGFtYmllbnQgb25lLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUF0dHJpYnV0aW9uKGV4cGxpY2l0PzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uKTogUXVvdGFVc2FnZUF0dHJpYnV0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBleHBsaWNpdCA/PyBhdHRyaWJ1dGlvbkZyb21Db250ZXh0KCk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhyZXNvbHZlZCkubGVuZ3RoID4gMCA/IHJlc29sdmVkIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBxdW90YSB0eXBlIGEgbWV0ZXJlZCByZXF1ZXN0IGFjdHVhbGx5IHNwZW5kcy5cbiAqXG4gKiBgYXBpQ2FsbHNgIGlzIHRoZSBQRU9QTEUncyBidWRnZXQg4oCUIGFuIGludGVyYWN0aXZlIHNlc3Npb24uIEEgcmVxdWVzdCBtYWRlIGJ5XG4gKiBhIE5PTi1JTlRFUkFDVElWRSBjcmVkZW50aWFsIHNwZW5kcyBgYXV0b21hdGlvbkNhbGxzYCBpbnN0ZWFkLCBuZXZlciBib3RoLCBzb1xuICogYSBmbGVldCBvZiBzZWxmLW11dGF0aW5nIHBpcGVsaW5lcyBjYW4ndCBleGhhdXN0IHRoZSBjb25zb2xlIGZvciB0aGUgaHVtYW5zXG4gKiBpbiB0aGUgc2FtZSBvcmc6XG4gKiAgLSBhbiBvcmcgU0VSVklDRSBBQ0NPVU5UIChgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2VfYWNjb3VudCdgIOKAlFxuICogICAgcGxhdGZvcm0tYXV0b21hdGlvbiwgcGlwZWxpbmUtcmVnaXN0ZXIsIHJlcG9ydGluZy1pbmdlc3QsIHJlZ2lzdHJ5LXB1c2gpO1xuICogIC0gYSBQRVJTT05BTCBBQ0NFU1MgS0VZOiB0aGUgZXhjaGFuZ2VkIGtleSB0b2tlbiAoYHRva2VuX3VzZTogJ2FwaV9rZXknYClcbiAqICAgIGFuZCBhbnl0aGluZyBtaW50ZWQgd2hpbGUgaG9sZGluZyBvbmUgKGBwYXJlbnRLZXlJZGApLiBBIFBBVCBpbiBhIENJIGpvYlxuICogICAgaXMgYXV0b21hdGlvbiB3aG9ldmVyIG93bnMgaXQg4oCUIGJpbGxpbmcgaXQgYXMgYSBwZXJzb24gbGV0IG9uZSBzY3JpcHRcbiAqICAgIGxvY2sgaXRzIG93bmVyJ3MgdGVhbW1hdGVzIG91dCBvZiB0aGUgY29uc29sZS4gQ0kgc2hvdWxkIHN0aWxsIHVzZSBhXG4gKiAgICBzZXJ2aWNlLWFjY291bnQga2V5IChpdCBzdXJ2aXZlcyB0aGUgcGVyc29uIGxlYXZpbmcpOyBlaXRoZXIgd2F5IHRoZVxuICogICAgdHJhZmZpYyBub3cgbGFuZHMgb24gYGF1dG9tYXRpb25DYWxsc2AuXG4gKiBFdmVyeSBvdGhlciB0eXBlIGlzIHJldHVybmVkIHVuY2hhbmdlZDogYW4gQUkgY2FsbCBvciBhIHBpcGVsaW5lIGNyZWF0aW9uXG4gKiBjb3N0cyB0aGUgc2FtZSB3aG9ldmVyIG1ha2VzIGl0LlxuICpcbiAqIGBtZXRlclF1b3RhT25TdWNjZXNzYCBhbmQgYGNoZWNrUXVvdGFgIGNhbGwgdGhpcyB0aGVtc2VsdmVzLCBzbyBhIHNlcnZpY2VcbiAqIG1vdW50cyBib3RoIHdpdGggYCdhcGlDYWxscydgIGFuZCB0aGUgc3BsaXQgaGFwcGVucyBwZXIgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGVyZWRRdW90YVR5cGVGb3IocmVxOiBQaWNrPFJlcXVlc3QsICd1c2VyJz4sIHF1b3RhVHlwZTogUXVvdGFUeXBlKTogUXVvdGFUeXBlIHtcbiAgaWYgKHF1b3RhVHlwZSAhPT0gJ2FwaUNhbGxzJyB8fCAhcmVxLnVzZXIpIHJldHVybiBxdW90YVR5cGU7XG4gIGNvbnN0IHUgPSByZXEudXNlcjtcbiAgaWYgKHUucHJpbmNpcGFsVHlwZSA9PT0gJ3NlcnZpY2VfYWNjb3VudCcgfHwgdS50b2tlbl91c2UgPT09ICdhcGlfa2V5JyB8fCB1LnBhcmVudEtleUlkKSByZXR1cm4gJ2F1dG9tYXRpb25DYWxscyc7XG4gIHJldHVybiBxdW90YVR5cGU7XG59XG5cbi8qKiBXaHkgYSByZXF1ZXN0IGlzIG5vdCBtZXRlcmVkL2NoZWNrZWQgYWdhaW5zdCBhcGlDYWxscyAoc2VlIHtAbGluayBjYWxsUXVvdGFFeGVtcHRpb259KS4gKi9cbmV4cG9ydCB0eXBlIENhbGxRdW90YUV4ZW1wdGlvbiA9ICdzZXJ2aWNlJyB8ICdpbXBlcnNvbmF0aW9uJyB8ICdvbl9iZWhhbGYnO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGFwaUNhbGxzL2F1dG9tYXRpb25DYWxscyBtZXRlciBBTkQgY2hlY2sgc2tpcCB0aGlzICh2ZXJpZmllZClcbiAqIHJlcXVlc3QsIGFuZCB3aHkuIE9uZSBmdW5jdGlvbiBmb3IgYm90aCBoYWx2ZXMsIHNvIHRoZSBnYXRlIG5ldmVyIHJlZnVzZXMgYVxuICogY2FsbCB0aGUgbWV0ZXIgd291bGQgbm90IGJpbGw6XG4gKiAgLSBgc2VydmljZWAg4oCUIGFuIGludGVybmFsIHNlcnZpY2UgcHJpbmNpcGFsOiBwZWVyIHRyYWZmaWMgaXMgY2F1c2VkIGJ5IGFcbiAqICAgIHVzZXIgYWN0aW9uIHRoZSBvcmlnaW5hdGluZyBzZXJ2aWNlIGFscmVhZHkgbWV0ZXJlZDtcbiAqICAtIGBpbXBlcnNvbmF0aW9uYCDigJQgYSBzeXNhZG1pbiBpbXBlcnNvbmF0aW9uIHNlc3Npb24gKGBpbXBlcnNvbmF0b3JJZGApLlxuICogICAgVmVuZG9yIHN0YWZmIGxvb2tpbmcgYXQgYSB0ZW5hbnQncyBjb25zb2xlIG11c3QgbmVpdGhlciBzcGVuZCB0aGUgdGVuYW50J3NcbiAqICAgIGJ1ZGdldCBub3IgYmUgbG9ja2VkIG91dCBieSBpdCB3aGlsZSBkaWFnbm9zaW5nIGFuIGV4aGF1c3RlZCBvcmc7IHRoZVxuICogICAgc2Vzc2lvbiBpcyBhdWRpdGVkIG9uIGl0cyBvd24gdHJhaWw7XG4gKiAgLSBgb25fYmVoYWxmYCDigJQgYSB1c2VyIHRva2VuIEZPUldBUkRFRCBieSBhbiBpbnRlcm5hbCBzZXJ2aWNlIGFzIHBhcnQgb2YgYVxuICogICAgcmVxdWVzdCBhbHJlYWR5IG1ldGVyZWQgd2hlcmUgaXQgYXJyaXZlZCAodGhlIGFzayBhZ2VudCdzIHRvb2xzLFxuICogICAgcGlwZWxpbmUncyBwbGFjZWhvbGRlci1wbHVnaW4gY29uZmlybSksIHByb3ZlbiBieSBhIHNpZ25lZCBtYXJrZXIgdGhlXG4gKiAgICB1c2VyIGNhbm5vdCBmb3JnZSAobWlkZGxld2FyZS9vbi1iZWhhbGYudHMpLlxuICogQXBwbGllcyB0byB0aGUgQ0FMTCBidWRnZXRzIG9ubHk6IHJlc2VydmF0aW9uLWdhdGVkIHF1b3RhcyAocGlwZWxpbmVzLFxuICogcGx1Z2lucyDigKYpIGFyZSBjaGFyZ2VkIHdob2V2ZXIgYXNrcy4gYGFpQ2FsbHNgIG1pcnJvcnMgdGhlIGltcGVyc29uYXRpb24gaGFsZlxuICogb24gaXRzIG93biAoYXBpLXNlcnZlciBgd2l0aEFpQ2FsbFJlc2VydmF0aW9uYCBza2lwcyB0aGUgc2xvdCB3aGVuIHRoZVxuICogc2Vzc2lvbiBpcyBhbiBpbXBlcnNvbmF0aW9uOyB0aGUgY2FsbCBpcyBzdGlsbCBhdWRpdGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGxRdW90YUV4ZW1wdGlvbihyZXE6IFJlcXVlc3QpOiBDYWxsUXVvdGFFeGVtcHRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoIXJlcS51c2VyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoaXNTZXJ2aWNlUHJpbmNpcGFsKHJlcSkpIHJldHVybiAnc2VydmljZSc7XG4gIGlmIChyZXEudXNlci5pbXBlcnNvbmF0b3JJZCkgcmV0dXJuICdpbXBlcnNvbmF0aW9uJztcbiAgaWYgKG9uQmVoYWxmQ2FsbGVyKHJlcSkpIHJldHVybiAnb25fYmVoYWxmJztcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTZXJ2aWNlLXByaW5jaXBhbCBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIGZvciBhIHF1b3RhIGNhbGwgbWFkZSBvbiBiZWhhbGYgb2ZcbiAqIGBvcmdJZGAgYnkgdGhlIENVUlJFTlQgc2VydmljZSAoYFNFUlZJQ0VfTkFNRWAsIHRoZSBzYW1lIGlkZW50aXR5IHRoZSBoZWFsdGhcbiAqIHJvdXRlciByZXBvcnRzKS5cbiAqXG4gKiBUaGUgcXVvdGEgc2VydmljZSdzIG11dGF0aW9uIGVuZHBvaW50cyAoYC86b3JnSWQvaW5jcmVtZW50YCwgYC9kZWNyZW1lbnRgKVxuICogcmVqZWN0IGFueXRoaW5nIGJ1dCBhIHNpZ25lZCBzZXJ2aWNlIHByaW5jaXBhbCBvciBhIHN5c3RlbSBhZG1pbiwgc29cbiAqIGZvcndhcmRpbmcgdGhlIGVuZCB1c2VyJ3MgYmVhcmVyIHRva2VuIHRoZXJlIGlzIGFsd2F5cyBhIDQwMy4gU2VydmljZSB0b2tlbnNcbiAqIGFyZSBhbHNvIGV4ZW1wdCBmcm9tIHRoZSBxdW90YSBzZXJ2aWNlJ3MgcGVyLUlQIHJhdGUgbGltaXRlciwgc28gaG90LXBhdGhcbiAqIHF1b3RhIHRyYWZmaWMgZnJvbSBhIGJ1c3kgcG9kIGNhbid0IGV4aGF1c3QgdGhhdCBwb2QgSVAncyBidWNrZXQgYW5kIHNpbGVudGx5XG4gKiB0dXJuIGVuZm9yY2VtZW50IG9mZi4gU2NvcGVkIHRvIHRoZSB0YXJnZXQgb3JnIHdpdGggdGhlIGxvd2VzdCByb2xlIChtZW1iZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVvdGFTZXJ2aWNlQXV0aEhlYWRlcihvcmdJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWU6IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAnYXBpJywgb3JnSWQsIHJvbGU6ICdtZW1iZXInIH0pO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIHN5bmNocm9ub3VzIHF1b3RhIHJlc2VydmF0aW9uICB0aGUgYXRvbWljIGNoZWNrK2luY3JlbWVudFxuICogdmFyaWFudC4gYGV4Y2VlZGVkOiB0cnVlYCBtZWFucyB0aGUgb3BlcmF0aW9uIHdhcyByZWplY3RlZCBhdCB0aGUgREJcbiAqIGxldmVsOyB0aGUgY2FsbGVyIHNob3VsZCByZXR1cm4gNDI5IHdpdGhvdXQgcnVubmluZyB0aGUgZ2F0ZWQgYWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhUmVzZXJ2ZVJlc3VsdCB7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHNsb3Qgd2FzIE5PVCByZXNlcnZlZCDigJQgdGhlIGdhdGVkIGFjdGlvbiBtdXN0IG5vdCBydW4uICovXG4gIGV4Y2VlZGVkOiBib29sZWFuO1xuICAvKipcbiAgICogU2V0ICh0cnVlKSBieSB0aGUgcXVvdGEgQ0xJRU5UIHdoZW4gdGhlIHJlc2VydmF0aW9uIHdhcyBkZW5pZWQgYmVjYXVzZSB0aGVcbiAgICogcXVvdGEgc2VydmljZSBjb3VsZCBub3QgQ09ORklSTSBpdCAodW5yZWFjaGFibGUgLyB0aW1lb3V0IC8gY2lyY3VpdCBvcGVuIC9cbiAgICogZXJyb3JlZCkg4oCUIG5vdCBiZWNhdXNlIHRoZSBvcmcgaXMgb3ZlciBpdHMgbGltaXQuIEFsd2F5cyBwYWlyZWQgd2l0aFxuICAgKiBgZXhjZWVkZWQ6IHRydWVgLiBBbnN3ZXIgd2l0aCB7QGxpbmsgc2VuZFF1b3RhUmVzZXJ2ZURlbmllZH0sIHdoaWNoIG1hcHMgaXQgdG9cbiAgICogNTAzIGluc3RlYWQgb2YgYSBtaXNsZWFkaW5nIDQyOSBcInF1b3RhIGV4Y2VlZGVkXCIuXG4gICAqL1xuICB1bmF2YWlsYWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXQgd2hlbiBhbiBgYWlDYWxsc2AgcmVzZXJ2YXRpb24gd2FzIHJlZnVzZWQgYnkgb25lIG9mIHRoZSBvcmcncyBPUFRJT05BTFxuICAgKiBBSSBjb250cm9scyByYXRoZXIgdGhhbiB0aGUgcGVyaW9kIGNhcDoge0BsaW5rIEVycm9yQ29kZS5BSV9NRU1CRVJfU0hBUkVfRVhDRUVERUR9XG4gICAqICh0aGUgY2FsbGVyJ3MgcGVyLW1lbWJlciBzaGFyZSBpcyBzcGVudCkgb3JcbiAgICoge0BsaW5rIEVycm9yQ29kZS5BSV9UT0tFTl9CVURHRVRfRVhDRUVERUR9ICh0aGUgb3JnJ3MgcGVyLXBlcmlvZCB0b2tlblxuICAgKiBidWRnZXQgaXMgc3BlbnQpLiBQYWlyZWQgd2l0aCBgZXhjZWVkZWQ6IHRydWVgIGFuZCB0aGUgcXVvdGEgc2VydmljZSdzXG4gICAqIGBtZXNzYWdlYDsge0BsaW5rIHNlbmRRdW90YVJlc2VydmVEZW5pZWR9IHJlbGF5cyBib3RoLlxuICAgKi9cbiAgY29kZT86IEFpTGltaXRDb2RlO1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICBxdW90YToge1xuICAgIHR5cGU6IFF1b3RhVHlwZTtcbiAgICBsaW1pdDogbnVtYmVyO1xuICAgIHVzZWQ6IG51bWJlcjtcbiAgICByZW1haW5pbmc6IG51bWJlcjtcbiAgICByZXNldEF0Pzogc3RyaW5nO1xuICB9O1xufVxuXG4vKiogVGhlIDQyOSBjb2RlcyBhbiBgYWlDYWxsc2AgcmVzZXJ2YXRpb24gYW5zd2VycyB3aGVuIGFuIG9wdGlvbmFsIG9yZyBBSSBjb250cm9sIHJlZnVzZXMgaXQuICovXG5leHBvcnQgdHlwZSBBaUxpbWl0Q29kZSA9IEVycm9yQ29kZS5BSV9NRU1CRVJfU0hBUkVfRVhDRUVERUQgfCBFcnJvckNvZGUuQUlfVE9LRU5fQlVER0VUX0VYQ0VFREVEO1xuXG5jb25zdCBBSV9MSU1JVF9DT0RFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW0Vycm9yQ29kZS5BSV9NRU1CRVJfU0hBUkVfRVhDRUVERUQsIEVycm9yQ29kZS5BSV9UT0tFTl9CVURHRVRfRVhDRUVERURdKTtcblxuLyoqXG4gKiBRdW90YSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFTZXJ2aWNlIHtcbiAgLyoqIENoZWNrIGlmIHF1b3RhIGlzIGF2YWlsYWJsZSAoZmFpbC1vcGVuIG9uIGVycm9yKS4gKi9cbiAgY2hlY2sob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YUNoZWNrUmVzdWx0PjtcbiAgLyoqXG4gICAqIEluY3JlbWVudCBxdW90YSB1c2FnZS4gUmV0dXJucyBhIHByb21pc2Ugc28gY2FsbGVycyBjYW4gb3B0aW9uYWxseSBoYW5kbGVcbiAgICogZXJyb3JzLiBgYXR0cmlidXRpb25gIGRlZmF1bHRzIHRvIHRoZSBhbWJpZW50IHJlcXVlc3QgY29udGV4dC5cbiAgICovXG4gIGluY3JlbWVudChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ/OiBudW1iZXIsIGF0dHJpYnV0aW9uPzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIE1FVEVSRUQgaW5jcmVtZW50IG9mIGEgcHJlLWFnZ3JlZ2F0ZWQgYmF0Y2ggKHRoZSBwZXItcG9kIGJhdGNoZXIncyBmbHVzaCxcbiAgICogc2VlIGBxdW90YS1pbmNyZW1lbnQtYmF0Y2hlci50c2ApOiB0aGUgc3VtIG9mIGBncm91cHNgIGlzIGFwcGxpZWQgd2l0aFxuICAgKiBQQVJUSUFMIGFkbWlzc2lvbiDigJQgdGhlIGNvdW50ZXIgbW92ZXMgYnkgYXMgbXVjaCBhcyBmaXRzIHVuZGVyIHRoZSBjYXAgYW5kXG4gICAqIHRoZSByZW1haW5kZXIgaXMgcmVjb3JkZWQgYXMgYG92ZXJzaG9vdGAg4oCUIGFuZCBlYWNoIGdyb3VwJ3MgYXR0cmlidXRpb24gaXNcbiAgICogd3JpdHRlbiB0byB0aGUgdXNhZ2UgbGVkZ2VyLiBOZXZlciBhIDQyOS4gUmVzb2x2ZXMgd2l0aCB3aGF0IHdhcyBjb3VudGVkLFxuICAgKiBvciBgbnVsbGAgd2hlbiB0aGUgcXVvdGEgc2VydmljZSBkaWQgbm90IGFuc3dlciBvayAoY291bnRlZCBvblxuICAgKiBgcXVvdGFfaW5jcmVtZW50X2ZhaWx1cmVzX3RvdGFsYCkuXG4gICAqL1xuICBpbmNyZW1lbnRNZXRlcmVkKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGdyb3VwczogTWV0ZXJlZEluY3JlbWVudEdyb3VwW10pOiBQcm9taXNlPHsgY291bnRlZDogbnVtYmVyOyBvdmVyc2hvb3Q6IG51bWJlciB9IHwgbnVsbD47XG4gIC8qKlxuICAgKiBBdG9taWMgcmVzZXJ2ZSAgdGhlIHNhbWUgYXRvbWljIGNoZWNrK2luY3JlbWVudCBhcyBgaW5jcmVtZW50YCwgYnV0XG4gICAqIHBhcnNlcyB0aGUgcmVzcG9uc2Ugc28gY2FsbGVycyBjYW4gc2VlIHdoZXRoZXIgdGhlIHNsb3Qgd2FzIGFjdHVhbGx5XG4gICAqIHJlc2VydmVkLiBVc2UgdGhpcyBmb3IgZXhwZW5zaXZlIHJlc291cmNlcyB3aGVyZSB0aGUgcG9zdC1ob2MgZmlyZS1cbiAgICogYW5kLWZvcmdldCBwYXR0ZXJuIGFsbG93cyBjb25jdXJyZW50IG92ZXItc3BlbmQuXG4gICAqXG4gICAqIEZhaWxzIENMT1NFRCAoYGV4Y2VlZGVkOiB0cnVlYCkgd2hlbmV2ZXIgdGhlIHNsb3QgaXMgbm90IGNvbmZpcm1lZCDigJRcbiAgICogdW5yZWFjaGFibGUsIHRpbWVvdXQsIG9wZW4gY2lyY3VpdCwgbm9uLW9rLCBvciBhIG5vbi1xdW90YSA0Mjkg4oCUIHVubGVzc1xuICAgKiBgUVVPVEFfUkVTRVJWRV9GQUlMX09QRU49dHJ1ZWAgKHNlZSB0aGUgcG9saWN5IG5vdGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUpLlxuICAgKi9cbiAgcmVzZXJ2ZShvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ/OiBudW1iZXIsIGF0dHJpYnV0aW9uPzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uKTogUHJvbWlzZTxRdW90YVJlc2VydmVSZXN1bHQ+O1xuICAvKipcbiAgICogUm9sbCBiYWNrIGEgcHJldmlvdXNseSByZXNlcnZlZCBzbG90LiBGaXJlLWFuZC1mb3JnZXQg4oCUIG5ldmVyIHRocm93cy5cbiAgICogUGFzcyBgcmVzZXRBdFNuYXBzaG90YCAodGhlIGBxdW90YS5yZXNldEF0YCBvYnNlcnZlZCB3aGVuIHRoZSBzbG90IHdhc1xuICAgKiByZXNlcnZlZCkgdG8gbWFrZSB0aGUgcm9sbGJhY2sgY29uZGl0aW9uYWw6IGlmIHRoZSBwZXJpb2Qgcm9sbGVkIG92ZXJcbiAgICogYmV0d2VlbiByZXNlcnZlIGFuZCByb2xsYmFjaywgdGhlIHNlcnZlciBza2lwcyB0aGUgZGVjcmVtZW50IHNvIGl0IGRvZXNuJ3RcbiAgICogc3RlYWwgY2FwYWNpdHkgZnJvbSB0aGUgbmV3IHBlcmlvZC5cbiAgICovXG4gIGRlY3JlbWVudChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ/OiBudW1iZXIsIHJlc2V0QXRTbmFwc2hvdD86IHN0cmluZywgYXR0cmlidXRpb24/OiBRdW90YVVzYWdlQXR0cmlidXRpb24pOiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogUmVjb3JkIHdoYXQgYW4gQUkgY2FsbCBDT1NUIGFmdGVyIGl0IHNldHRsZWQg4oCUIGl0cyB0b2tlbiBjb3VudHMg4oCUIGluIHRoZVxuICAgKiB1c2FnZSBsZWRnZXIsIHdpdGhvdXQgbW92aW5nIGFueSBjb3VudGVyIChhIHplcm8tdW5pdCBsZWRnZXIgcm93IGNhcnJ5aW5nXG4gICAqIGB0b2tlbnNJbmAgLyBgdG9rZW5zT3V0YCB1bmRlciB0aGUgY2FsbCdzIGF0dHJpYnV0aW9uKS4gQWxzbyBob3cgYSBjYWxsIHRoYXRcbiAgICogc3BlbnQgTk8gYGFpQ2FsbHNgIHVuaXQgKGEgQllPSyBrZXksIGFuIGltcGVyc29uYXRpb24gc2Vzc2lvbiwgYSB3ZWlnaHQtMFxuICAgKiBtb2RlbCkgc3RpbGwgc2hvd3MgdXAgaW4gdGhlIHVzYWdlIGJyZWFrZG93bi4gRmlyZS1hbmQtZm9yZ2V0IOKAlCBuZXZlciB0aHJvd3MuXG4gICAqIE9wdGlvbmFsIHNvIHRlc3QgZG91YmxlcyBuZWVkIG5vdCBpbXBsZW1lbnQgaXQuXG4gICAqL1xuICByZXBvcnRVc2FnZT8ob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgdG9rZW5zOiBRdW90YVRva2VuVXNhZ2UsIGF0dHJpYnV0aW9uPzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEdldCB0aGUgb3JnJ3MgcXVvdGEgYFF1b3RhVGllcmAuIFVzZWQgYnkgdGhlIHBsdWdpbi1idWlsZCBxdWV1ZSBwYXJ0aXRpb25pbmdcbiAgICogdG8gcm91dGUgYSBidWlsZCB0byB0aGUgcmlnaHQgcGVyLXRpZXIgcXVldWUuIEZhaWwtb3BlbiByZXR1cm5zIGBERUZBVUxUX1RJRVJgXG4gICAqIChgZGV2ZWxvcGVyYCB3aGVuIGJpbGxpbmcgaXMgZW5hYmxlZCwgYHVubGltaXRlZGAgd2hlbiBpdCdzIGRpc2FibGVkKTsgYVxuICAgKiBtaXNjbGFzc2lmaWVkIG9yZyBzdGlsbCBidWlsZHMgb24gdGhlIGRlZmF1bHQgcXVldWUsIGp1c3Qgd2l0aG91dCB0aGVcbiAgICogdGllci1zY29wZWQgc2NoZWR1bGluZyBib29zdC5cbiAgICovXG4gIGdldFRpZXIob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhVGllcj47XG4gIC8qKlxuICAgKiBGQUlMLUNMT1NFRCB0d2luIG9mIHtAbGluayBnZXRUaWVyfTogdGhlIG9yZydzIHRpZXIgYXMgdGhlIHF1b3RhIHNlcnZpY2VcbiAgICogQ09ORklSTUVEIGl0LCBvciBgbnVsbGAgd2hlbiBpdCBjb3VsZCBub3QgYmUgY29uZmlybWVkICh1bnJlYWNoYWJsZSwgbm9uLW9rLFxuICAgKiBtaXNzaW5nIG9yIHVucmVjb2duaXplZCB0aWVyKS4gRm9yIGRlY2lzaW9ucyB0aGF0IG11c3QgbmV2ZXIgYmUgdGFrZW4gb24gYVxuICAgKiBndWVzcyDigJQgYW55dGhpbmcgdGhhdCByZXZva2VzLCBkb3duZ3JhZGVzIG9yIGRlbGV0ZXMgb24gdGhlIHN0cmVuZ3RoIG9mIGFcbiAgICogdGllciAoZS5nLiBhIHZlcmlmaWVkLXB1Ymxpc2hlciBncmFjZSBzd2VlcCkgbXVzdCBza2lwIHRoZSBvcmcgb24gYG51bGxgLFxuICAgKiBuZXZlciBhY3Qgb24gYERFRkFVTFRfVElFUmAuXG4gICAqL1xuICBnZXRUaWVyU3RyaWN0KG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVRpZXIgfCBudWxsPjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBxdW90YSBzZXJ2aWNlIGNsaWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVNlcnZpY2VDb25maWcge1xuICAvKiogUXVvdGEgc2VydmljZSBob3N0IChkZWZhdWx0OiBlbnYgUVVPVEFfU0VSVklDRV9IT1NUIG9yICdxdW90YScpICovXG4gIGhvc3Q/OiBzdHJpbmc7XG4gIC8qKiBRdW90YSBzZXJ2aWNlIHBvcnQgKGRlZmF1bHQ6IGVudiBRVU9UQV9TRVJWSUNFX1BPUlQgb3IgMzAwMCkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQXBwbHkgdGhlIGV4cGxpY2l0IHJlc2VydmUgZmFpbC1tb2RlIHBvbGljeSB0byBhIHJlc2VydmF0aW9uIHRoZSBxdW90YSBzZXJ2aWNlXG4gKiBkaWQgTk9UIGNvbmZpcm0gKHNlZSBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTiBhYm92ZSkuIERlZmF1bHQ6IGRlbnkuXG4gKi9cbmZ1bmN0aW9uIHVuY29uZmlybWVkUmVzZXJ2ZShcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4gIHJlYXNvbjogJ3VucmVhY2hhYmxlJyB8ICd0cmFuc2llbnQtNDI5JyB8ICdub24tb2snLFxuICBzdGF0dXNDb2RlPzogbnVtYmVyLFxuKTogUXVvdGFSZXNlcnZlUmVzdWx0IHtcbiAgaWYgKFFVT1RBX1JFU0VSVkVfRkFJTF9PUEVOKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1FVT1RBX0ZBSUxfT1BFTjogcXVvdGEgcmVzZXJ2ZSBub3QgY29uZmlybWVkLCBhbGxvd2luZyByZXF1ZXN0JywgeyBvcmdJZCwgcXVvdGFUeXBlLCByZWFzb24sIHN0YXR1c0NvZGUgfSk7XG4gICAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfb3Blbl90b3RhbCcsIHsgb3BlcmF0aW9uOiAncmVzZXJ2ZScsIHJlYXNvbiwgcXVvdGFUeXBlIH0pO1xuICAgIHJldHVybiB7IGV4Y2VlZGVkOiBmYWxzZSwgcXVvdGE6IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogLTEsIHVzZWQ6IDAsIHJlbWFpbmluZzogLTEgfSB9O1xuICB9XG4gIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX0NMT1NFRDogcXVvdGEgcmVzZXJ2ZSBub3QgY29uZmlybWVkLCBkZW55aW5nIHJlcXVlc3QnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIHJlYXNvbiwgc3RhdHVzQ29kZSB9KTtcbiAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfY2xvc2VkX3RvdGFsJywgeyBvcGVyYXRpb246ICdyZXNlcnZlJywgcmVhc29uLCBxdW90YVR5cGUgfSk7XG4gIHJldHVybiB7IGV4Y2VlZGVkOiB0cnVlLCB1bmF2YWlsYWJsZTogdHJ1ZSwgcXVvdGE6IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogMCwgdXNlZDogMCwgcmVtYWluaW5nOiAwIH0gfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmYWlsLW9wZW4gcXVvdGEgcmVzdWx0IChhbGxvd3MgdGhlIHJlcXVlc3QpLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGYWlsT3BlblJlc3VsdCgpOiBRdW90YUNoZWNrUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICBhbGxvd2VkOiB0cnVlLFxuICAgIGxpbWl0OiAtMSxcbiAgICB1c2VkOiAwLFxuICAgIHJlbWFpbmluZzogLTEsXG4gICAgcmVzZXRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIHVubGltaXRlZDogdHJ1ZSxcbiAgICAvLyBUYWcgdGhlIHNlbnRpbmVsIHNvIGZhaWwtY2xvc2VkIGNhbGxlcnMgY2FuIHRlbGwgYW4gb3V0YWdlIGFwYXJ0IGZyb20gYVxuICAgIC8vIHJlYWwgdW5saW1pdGVkICgtMSkgcmVhZGluZy4gUmVhbCBxdW90YSByZXN1bHRzIG5ldmVyIHNldCB0aGlzLlxuICAgIGZhaWxPcGVuOiB0cnVlLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGNvbW1vbiByZXF1ZXN0IGhlYWRlcnMgd2l0aCBvcHRpb25hbCByZXF1ZXN0IElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nLlxuICovXG5mdW5jdGlvbiBidWlsZEhlYWRlcnMob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcj86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7ICd4LW9yZy1pZCc6IG9yZ0lkIH07XG4gIGlmIChhdXRoSGVhZGVyKSBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBhdXRoSGVhZGVyO1xuICBpZiAocmVxdWVzdElkKSBoZWFkZXJzWydYLVJlcXVlc3QtSWQnXSA9IHJlcXVlc3RJZDtcbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcXVvdGEgc2VydmljZSBjbGllbnQuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHNlcnZpY2UgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgUXVvdGEgc2VydmljZSBjbGllbnRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcXVvdGFTZXJ2aWNlID0gY3JlYXRlUXVvdGFTZXJ2aWNlKCk7XG4gKlxuICogLy8gQ2hlY2sgcXVvdGEgYmVmb3JlIHByb2Nlc3NpbmdcbiAqIGNvbnN0IHF1b3RhID0gYXdhaXQgcXVvdGFTZXJ2aWNlLmNoZWNrKG9yZ0lkLCAnYXBpQ2FsbHMnLCBhdXRoSGVhZGVyKTtcbiAqIGlmICghcXVvdGEuYWxsb3dlZCkge1xuICogcmV0dXJuIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdRdW90YSBleGNlZWRlZCcgfSk7XG4gKiB9XG4gKlxuICogLy8gSW5jcmVtZW50IHF1b3RhIGFmdGVyIHN1Y2Nlc3NcbiAqIHF1b3RhU2VydmljZS5pbmNyZW1lbnQob3JnSWQsICdhcGlDYWxscycsIGF1dGhIZWFkZXIpLmNhdGNoKGVyciA9PiBsb2dnZXIud2FybignUXVvdGEgaW5jcmVtZW50IGZhaWxlZCcsIHsgZXJyb3I6IGVyciB9KSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1b3RhU2VydmljZShjb25maWc6IFF1b3RhU2VydmljZUNvbmZpZyA9IHt9KTogUXVvdGFTZXJ2aWNlIHtcbiAgY29uc3Qgc2VydmljZUNvbmZpZzogU2VydmljZUNvbmZpZyA9IHtcbiAgICBob3N0OiBjb25maWcuaG9zdCA/PyBzZXJ2aWNlRW5kcG9pbnQoJ3F1b3RhJykuaG9zdCxcbiAgICBwb3J0OiBjb25maWcucG9ydCA/PyBzZXJ2aWNlRW5kcG9pbnQoJ3F1b3RhJykucG9ydCxcbiAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCA/PyA1MDAwLFxuICB9O1xuXG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNhZmVDbGllbnQoc2VydmljZUNvbmZpZyk7XG5cbiAgLyoqIE9uZSB0aWVyIHJlYWQ6IHRoZSBjb25maXJtZWQgdGllciwgb3Igd2h5IHRoZXJlIGlzbid0IG9uZS4gKi9cbiAgYXN5bmMgZnVuY3Rpb24gcmVhZFRpZXIoXG4gICAgb3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyB0aWVyOiBRdW90YVRpZXI7IHJlYXNvbj86IHVuZGVmaW5lZDsgc3RhdHVzQ29kZT86IG51bWJlciB9IHwgeyB0aWVyOiBudWxsOyByZWFzb246ICd1bnJlYWNoYWJsZScgfCAnbm9uLW9rJyB8ICdpbnZhbGlkLXRpZXInOyBzdGF0dXNDb2RlPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8e1xuICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgIGRhdGE/OiB7IHF1b3RhPzogeyB0aWVyPzogc3RyaW5nIH0gfTtcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgfT4oYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfWAsIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG4gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuIHsgdGllcjogbnVsbCwgcmVhc29uOiAndW5yZWFjaGFibGUnIH07XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCB8fCAhcmVzcG9uc2UuYm9keT8uc3VjY2VzcykgcmV0dXJuIHsgdGllcjogbnVsbCwgcmVhc29uOiAnbm9uLW9rJywgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSB9O1xuICAgIGNvbnN0IHRpZXIgPSByZXNwb25zZS5ib2R5LmRhdGE/LnF1b3RhPy50aWVyO1xuICAgIGlmICghdGllciB8fCAhaXNWYWxpZFRpZXIodGllcikpIHJldHVybiB7IHRpZXI6IG51bGwsIHJlYXNvbjogJ2ludmFsaWQtdGllcicsIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUgfTtcbiAgICByZXR1cm4geyB0aWVyLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNoZWNrKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFDaGVja1Jlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vJHtlbmNvZGVVUklDb21wb25lbnQocXVvdGFUeXBlKX1gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8e1xuICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgICAgICBkYXRhPzogeyBxdW90YVR5cGU6IHN0cmluZzsgc3RhdHVzOiBRdW90YUNoZWNrUmVzdWx0IH07XG4gICAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSwgLi4uY2hlY2tSZXF1ZXN0T3B0aW9ucyhxdW90YVR5cGUpIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIHNlcnZpY2UgdW5yZWFjaGFibGUsIGFsbG93aW5nIHJlcXVlc3QnLCB7IG9yZ0lkLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ2NoZWNrJywgcmVhc29uOiAndW5yZWFjaGFibGUnLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVGYWlsT3BlblJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFyZXNwb25zZS5ib2R5LnN1Y2Nlc3MgfHwgIXJlc3BvbnNlLmJvZHkuZGF0YT8uc3RhdHVzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIGNoZWNrIHJldHVybmVkIG5vbi1vaywgYWxsb3dpbmcgcmVxdWVzdCcsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLCBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9vcGVuX3RvdGFsJywgeyBvcGVyYXRpb246ICdjaGVjaycsIHJlYXNvbjogJ25vbi1vaycsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZhaWxPcGVuUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZS5ib2R5LmRhdGEuc3RhdHVzO1xuICAgIH0sXG5cbiAgICBhc3luYyBpbmNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCBhdHRyaWJ1dGlvbj86IFF1b3RhVXNhZ2VBdHRyaWJ1dGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vaW5jcmVtZW50YDtcbiAgICAgIGNvbnN0IGF0dHIgPSByZXNvbHZlQXR0cmlidXRpb24oYXR0cmlidXRpb24pO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudFxuICAgICAgICAucG9zdChwYXRoLCB7IHF1b3RhVHlwZSwgYW1vdW50LCAuLi4oYXR0ciAmJiB7IGF0dHJpYnV0aW9uOiBhdHRyIH0pIH0sIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCBhdHRyPy5yZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZT8uc3RhdHVzQ29kZSA9PT0gNDI5KSB7XG4gICAgICAgIC8vIE92ZXIgdGhlIGxpbWl0OiB0aGUgcXVvdGEgc2VydmljZSByZWZ1c2VkIEFORCByZWNvcmRlZCB0aGUgZGVuaWFsIGluXG4gICAgICAgIC8vIGl0cyBsZWRnZXIuIE5vdCBhIGZhaWx1cmUgb2YgbWV0ZXJpbmcg4oCUIHRoZSBjb3VudGVyIGlzIGV4YWN0bHkgd2hlcmVcbiAgICAgICAgLy8gaXQgc2hvdWxkIGJlLlxuICAgICAgICBsb2dnZXIuZGVidWcoJ1F1b3RhIGluY3JlbWVudCByZWZ1c2VkIChvdmVyIGxpbWl0KScsIHsgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50IH0pO1xuICAgICAgfSBlbHNlIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gaW5jcmVtZW50IHF1b3RhJywge1xuICAgICAgICAgIG9yZ0lkLCBxdW90YVR5cGUsIGFtb3VudCwgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBBIGxvc3QgbWV0ZXJpbmcgaW5jcmVtZW50IGlzIGEgdW5pdCB0aGUgb3JnIGNvbnN1bWVkIGFuZCBuZXZlciBwYWlkXG4gICAgICAgIC8vIGZvci4gQ291bnRlZCAobGFiZWxsZWQgYnkgdGhlIGVtaXR0aW5nIGBzZXJ2aWNlYCkgc28gYSBzdXN0YWluZWQgcmF0ZVxuICAgICAgICAvLyBwYWdlcyBpbnN0ZWFkIG9mIHNpbGVudGx5IHVuZGVyLWJpbGxpbmcg4oCUIHNlZSBRdW90YUluY3JlbWVudEZhaWx1cmVzLlxuICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfaW5jcmVtZW50X2ZhaWx1cmVzX3RvdGFsJywgeyByZWFzb246IHJlc3BvbnNlID8gJ25vbi1vaycgOiAndW5yZWFjaGFibGUnLCBxdW90YVR5cGUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1F1b3RhIGluY3JlbWVudGVkJywgeyBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGluY3JlbWVudE1ldGVyZWQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgZ3JvdXBzOiBNZXRlcmVkSW5jcmVtZW50R3JvdXBbXSk6IFByb21pc2U8eyBjb3VudGVkOiBudW1iZXI7IG92ZXJzaG9vdDogbnVtYmVyIH0gfCBudWxsPiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfS9pbmNyZW1lbnRgO1xuICAgICAgY29uc3QgYW1vdW50ID0gZ3JvdXBzLnJlZHVjZSgoc3VtLCBnKSA9PiBzdW0gKyBnLmFtb3VudCwgMCk7XG4gICAgICBpZiAoYW1vdW50IDw9IDApIHJldHVybiB7IGNvdW50ZWQ6IDAsIG92ZXJzaG9vdDogMCB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDx7IHN1Y2Nlc3M6IGJvb2xlYW47IGRhdGE/OiB7IGNvdW50ZWQ/OiBudW1iZXI7IG92ZXJzaG9vdD86IG51bWJlciB9IH0+KFxuICAgICAgICBwYXRoLFxuICAgICAgICB7IHF1b3RhVHlwZSwgYW1vdW50LCBtZXRlcjogdHJ1ZSwgZ3JvdXBzIH0sXG4gICAgICAgIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0sXG4gICAgICApO1xuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDAgfHwgIXJlc3BvbnNlLmJvZHk/LnN1Y2Nlc3MpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBhcHBseSBtZXRlcmVkIHF1b3RhIGluY3JlbWVudCcsIHsgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50LCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSB9KTtcbiAgICAgICAgLy8gRXZlcnkgdW5pdCBpbiB0aGUgYmF0Y2ggd2VudCB1bmNvdW50ZWQg4oCUIHNlZSBRdW90YUluY3JlbWVudEZhaWx1cmVzLlxuICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfaW5jcmVtZW50X2ZhaWx1cmVzX3RvdGFsJywgeyByZWFzb246IHJlc3BvbnNlID8gJ25vbi1vaycgOiAndW5yZWFjaGFibGUnLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgY291bnRlZCA9IHJlc3BvbnNlLmJvZHkuZGF0YT8uY291bnRlZCA/PyBhbW91bnQ7XG4gICAgICBjb25zdCBvdmVyc2hvb3QgPSByZXNwb25zZS5ib2R5LmRhdGE/Lm92ZXJzaG9vdCA/PyAwO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdNZXRlcmVkIHF1b3RhIGluY3JlbWVudCBhcHBsaWVkJywgeyBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQsIGNvdW50ZWQsIG92ZXJzaG9vdCB9KTtcbiAgICAgIHJldHVybiB7IGNvdW50ZWQsIG92ZXJzaG9vdCB9O1xuICAgIH0sXG5cbiAgICBhc3luYyByZXNlcnZlKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyID0gMSwgYXR0cmlidXRpb24/OiBRdW90YVVzYWdlQXR0cmlidXRpb24pOiBQcm9taXNlPFF1b3RhUmVzZXJ2ZVJlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vaW5jcmVtZW50YDtcbiAgICAgIGNvbnN0IGF0dHIgPSByZXNvbHZlQXR0cmlidXRpb24oYXR0cmlidXRpb24pO1xuXG4gICAgICAvLyAyMDAgY2FycmllcyBgZGF0YS5xdW90YWA7IDQyOSAoUVVPVEFfRVhDRUVERUQpIGNhcnJpZXMgYGRldGFpbHMucXVvdGFgLlxuICAgICAgLy8gQm90aCBzaGFwZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBRdW90YVJlc2VydmVSZXN1bHQuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PHtcbiAgICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgZGF0YT86IHsgcXVvdGE/OiBRdW90YVJlc2VydmVSZXN1bHRbJ3F1b3RhJ10gfTtcbiAgICAgICAgZGV0YWlscz86IHsgcXVvdGE/OiBRdW90YVJlc2VydmVSZXN1bHRbJ3F1b3RhJ10gfTtcbiAgICAgICAgLyoqIGBzZW5kRXJyb3JgJ3MgZXJyb3ItY29kZSBmaWVsZC4gKi9cbiAgICAgICAgY29kZT86IHN0cmluZztcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZztcbiAgICAgIH0+KHBhdGgsIHsgcXVvdGFUeXBlLCBhbW91bnQsIC4uLihhdHRyICYmIHsgYXR0cmlidXRpb246IGF0dHIgfSkgfSwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIGF0dHI/LnJlcXVlc3RJZCksIC4uLlFVT1RBX1JFUVVFU1RfT1BUSU9OUyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuIHVuY29uZmlybWVkUmVzZXJ2ZShvcmdJZCwgcXVvdGFUeXBlLCAndW5yZWFjaGFibGUnKTtcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQyOSkge1xuICAgICAgICBjb25zdCBxID0gcmVzcG9uc2UuYm9keS5kZXRhaWxzPy5xdW90YTtcbiAgICAgICAgLy8gQW4gb3B0aW9uYWwgb3JnIEFJIGNvbnRyb2wgKHBlci1tZW1iZXIgc2hhcmUsIHRva2VuIGJ1ZGdldCkgcmVmdXNlZCB0aGVcbiAgICAgICAgLy8gc2xvdDogYSBnZW51aW5lLCBmaW5hbCBkZW5pYWwg4oCUIHJlbGF5ZWQgd2l0aCBpdHMgb3duIGNvZGUgYW5kIG1lc3NhZ2UuXG4gICAgICAgIGlmIChyZXNwb25zZS5ib2R5LmNvZGUgJiYgQUlfTElNSVRfQ09ERVMuaGFzKHJlc3BvbnNlLmJvZHkuY29kZSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXhjZWVkZWQ6IHRydWUsXG4gICAgICAgICAgICBjb2RlOiByZXNwb25zZS5ib2R5LmNvZGUgYXMgQWlMaW1pdENvZGUsXG4gICAgICAgICAgICAuLi4ocmVzcG9uc2UuYm9keS5tZXNzYWdlID8geyBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UgfSA6IHt9KSxcbiAgICAgICAgICAgIHF1b3RhOiBxID8/IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogMCwgdXNlZDogMCwgcmVtYWluaW5nOiAwIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IGEgR0VOVUlORSBxdW90YS1leGNlZWRlZCA0MjkgbWVhbnMgXCJvdmVyIHF1b3RhXCIuIEEgZ2VuZXJpYyA0Mjkg4oCUXG4gICAgICAgIC8vIGFuIGludGVydmVuaW5nIGdhdGV3YXkgb3IgcmF0ZSBsaW1pdGVyIOKAlCBkaWQgbm90IGNvbmZpcm0gYW55dGhpbmcsIHNvXG4gICAgICAgIC8vIGl0IGdvZXMgdGhyb3VnaCB0aGUgc2FtZSB1bmNvbmZpcm1lZC1yZXNlcnZhdGlvbiBwb2xpY3kgYXMgYW4gb3V0YWdlLlxuICAgICAgICBpZiAocmVzcG9uc2UuYm9keS5jb2RlID09PSBFcnJvckNvZGUuUVVPVEFfRVhDRUVERUQgfHwgcSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBleGNlZWRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHF1b3RhOiBxID8/IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogMCwgdXNlZDogMCwgcmVtYWluaW5nOiAwIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5jb25maXJtZWRSZXNlcnZlKG9yZ0lkLCBxdW90YVR5cGUsICd0cmFuc2llbnQtNDI5JywgcmVzcG9uc2Uuc3RhdHVzQ29kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDAgfHwgIXJlc3BvbnNlLmJvZHkuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gdW5jb25maXJtZWRSZXNlcnZlKG9yZ0lkLCBxdW90YVR5cGUsICdub24tb2snLCByZXNwb25zZS5zdGF0dXNDb2RlKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcSA9IHJlc3BvbnNlLmJvZHkuZGF0YT8ucXVvdGE7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGNlZWRlZDogZmFsc2UsXG4gICAgICAgIHF1b3RhOiBxID8/IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogLTEsIHVzZWQ6IDAsIHJlbWFpbmluZzogLTEgfSxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGFzeW5jIGRlY3JlbWVudChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ6IG51bWJlciA9IDEsIHJlc2V0QXRTbmFwc2hvdD86IHN0cmluZywgYXR0cmlidXRpb24/OiBRdW90YVVzYWdlQXR0cmlidXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2RlY3JlbWVudGA7XG4gICAgICBjb25zdCBhdHRyID0gcmVzb2x2ZUF0dHJpYnV0aW9uKGF0dHJpYnV0aW9uKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50XG4gICAgICAgIC5wb3N0KHBhdGgsIHsgcXVvdGFUeXBlLCBhbW91bnQsIC4uLihyZXNldEF0U25hcHNob3QgJiYgeyByZXNldEF0U25hcHNob3QgfSksIC4uLihhdHRyICYmIHsgYXR0cmlidXRpb246IGF0dHIgfSkgfSwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIGF0dHI/LnJlcXVlc3RJZCksIC4uLlFVT1RBX1JFUVVFU1RfT1BUSU9OUyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgLy8gUm9sbGJhY2sgZmFpbHVyZSBpcyBsb2dnZWQgYnV0IG5ldmVyIHByb3BhZ2F0ZWQgIHRoZSBhY3Rpb24ncyBvd25cbiAgICAgICAgLy8gZmFpbHVyZSBoYXMgYWxyZWFkeSBiZWVuIHN1cmZhY2VkIHRvIHRoZSBjYWxsZXI7IGEgc3R1Y2sgY291bnRlclxuICAgICAgICAvLyByZXNvbHZlcyBvbiB0aGUgbmV4dCBwZXJpb2QgcmVzZXQuXG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZGVjcmVtZW50IHF1b3RhIChzbG90IHdpbGwgcmVzZXQgb24gbmV4dCBwZXJpb2QpJywge1xuICAgICAgICAgIG9yZ0lkLCBxdW90YVR5cGUsIGFtb3VudCwgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdRdW90YSBkZWNyZW1lbnRlZCcsIHsgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50IH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyByZXBvcnRVc2FnZShvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCB0b2tlbnM6IFF1b3RhVG9rZW5Vc2FnZSwgYXR0cmlidXRpb24/OiBRdW90YVVzYWdlQXR0cmlidXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHRva2Vuc0luID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcih0b2tlbnMudG9rZW5zSW4gfHwgMCkpO1xuICAgICAgY29uc3QgdG9rZW5zT3V0ID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcih0b2tlbnMudG9rZW5zT3V0IHx8IDApKTtcbiAgICAgIGNvbnN0IGF0dHIgPSByZXNvbHZlQXR0cmlidXRpb24oYXR0cmlidXRpb24pO1xuICAgICAgLy8gTm90aGluZyB0byBzYXk6IG5vIHRva2VucyBhbmQgbm8gYXR0cmlidXRpb24gdG8gbWFrZSBhIHplcm8gcm93IHVzZWZ1bC5cbiAgICAgIGlmICh0b2tlbnNJbiA9PT0gMCAmJiB0b2tlbnNPdXQgPT09IDAgJiYgIWF0dHIpIHJldHVybjtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2luY3JlbWVudGA7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgeyBxdW90YVR5cGUsIHJlcG9ydDogdHJ1ZSwgdG9rZW5zSW4sIHRva2Vuc091dCwgLi4uKGF0dHIgJiYgeyBhdHRyaWJ1dGlvbjogYXR0ciB9KSB9LFxuICAgICAgICAgIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCBhdHRyPy5yZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHJlcG9ydCBBSSB1c2FnZScsIHsgb3JnSWQsIHF1b3RhVHlwZSwgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUgfSk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX3VzYWdlX3JlcG9ydF9mYWlsdXJlc190b3RhbCcsIHsgcmVhc29uOiByZXNwb25zZSA/ICdub24tb2snIDogJ3VucmVhY2hhYmxlJywgcXVvdGFUeXBlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byByZXBvcnQgQUkgdXNhZ2UnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX3VzYWdlX3JlcG9ydF9mYWlsdXJlc190b3RhbCcsIHsgcmVhc29uOiAnZXhjZXB0aW9uJywgcXVvdGFUeXBlIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaWVyKG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVRpZXI+IHtcbiAgICAgIGNvbnN0IGtub3duID0gY29uc3RhbnRUaWVyRm9yKG9yZ0lkKTtcbiAgICAgIGlmIChrbm93bikgcmV0dXJuIGtub3duO1xuICAgICAgY29uc3QgcmVhZCA9IGF3YWl0IHJlYWRUaWVyKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpO1xuICAgICAgaWYgKHJlYWQudGllcikgcmV0dXJuIHJlYWQudGllcjtcbiAgICAgIGxvZ2dlci53YXJuKGBRVU9UQV9GQUlMX09QRU46IHRpZXIgbG9va3VwIGZhaWxlZCwgZGVmYXVsdGluZyB0byAke0RFRkFVTFRfVElFUn0gdGllcmAsIHtcbiAgICAgICAgb3JnSWQsIHN0YXR1c0NvZGU6IHJlYWQuc3RhdHVzQ29kZSwgcmVhc29uOiByZWFkLnJlYXNvbiwgZGVmYXVsdFRpZXI6IERFRkFVTFRfVElFUixcbiAgICAgIH0pO1xuICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfb3Blbl90b3RhbCcsIHsgb3BlcmF0aW9uOiAndGllcicsIHJlYXNvbjogcmVhZC5yZWFzb24sIHF1b3RhVHlwZTogJ3RpZXInIH0pO1xuICAgICAgcmV0dXJuIERFRkFVTFRfVElFUjtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGllclN0cmljdChvcmdJZDogc3RyaW5nLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFUaWVyIHwgbnVsbD4ge1xuICAgICAgY29uc3Qga25vd24gPSBjb25zdGFudFRpZXJGb3Iob3JnSWQpO1xuICAgICAgaWYgKGtub3duKSByZXR1cm4ga25vd247XG4gICAgICBjb25zdCByZWFkID0gYXdhaXQgcmVhZFRpZXIob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCk7XG4gICAgICBpZiAocmVhZC50aWVyKSByZXR1cm4gcmVhZC50aWVyO1xuICAgICAgbG9nZ2VyLndhcm4oJ1FVT1RBX0ZBSUxfQ0xPU0VEOiB0aWVyIGNvdWxkIG5vdCBiZSBjb25maXJtZWQnLCB7IG9yZ0lkLCBzdGF0dXNDb2RlOiByZWFkLnN0YXR1c0NvZGUsIHJlYXNvbjogcmVhZC5yZWFzb24gfSk7XG4gICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9jbG9zZWRfdG90YWwnLCB7IG9wZXJhdGlvbjogJ3RpZXInLCByZWFzb246IHJlYWQucmVhc29uLCBxdW90YVR5cGU6ICd0aWVyJyB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIHN5c3RlbSBvcmcncyB0aWVyIGlzIGEgQ09OU1RBTlQsIG5vdCBhIGJpbGxpbmcgZmFjdCwgc28gaXQgaXMgYW5zd2VyZWRcbiAqIHdpdGhvdXQgYSBsb29rdXAuXG4gKlxuICogVGhlIHBsYXRmb3JtJ3Mgb3duIG9yZyBpcyBhbHdheXMgYHVubGltaXRlZGAgKHBsYXRmb3JtL3NyYy9zZXJ2aWNlcy9cbiAqIGF1dGgtc2VydmljZS50cyBzZWVkcyBpdCB0aGF0IHdheSk6IG5vdGhpbmcgbWV0ZXJzIGl0IGFuZCBpdCBpcyBuZXZlciBzb2xkLlxuICogQXNraW5nIHRoZSBxdW90YSBzZXJ2aWNlIHdhcyB0aGVyZWZvcmUgYSBuZXR3b3JrIGhvcCB3aG9zZSBvbmx5IHBvc3NpYmxlXG4gKiBvdXRjb21lcyB3ZXJlIHRoZSBhbnN3ZXIgd2UgYWxyZWFkeSBrbmV3LCBvciBhIGZhaWx1cmUuXG4gKlxuICogVGhlIGZhaWx1cmUgaXMgd2hhdCBtYWRlIHRoaXMgd29ydGggZml4aW5nLiBgZ2V0VGllcmAgZmFpbHMgT1BFTiB0b1xuICogREVGQVVMVF9USUVSLCB3aGljaCB3aXRoIGJpbGxpbmcgZW5hYmxlZCBpcyBgZGV2ZWxvcGVyYCDigJQgdGhlIG1vc3RcbiAqIGNvbnN0cmFpbmVkIHRpZXIg4oCUIGFuZCBpdHMgZG9jdW1lbnRlZCBqb2IgaXMgYnVpbGQtcXVldWUgcGFydGl0aW9uaW5nLiBBXG4gKiBibGlwIGluIHRoZSBxdW90YSBzZXJ2aWNlIHRoZXJlZm9yZSByb3V0ZWQgdGhlIFNZU1RFTSBvcmcncyBidWlsZHMgb250byB0aGVcbiAqIGRldmVsb3BlciBxdWV1ZTsgdGhlIE9mZmljaWFsIGNhdGFsb2cgbG9hZCBpcyAxMTkgb2YgdGhlbS4gYGdldFRpZXJTdHJpY3RgXG4gKiBmYWlscyBDTE9TRUQgdG8gbnVsbCwgc28gYSBzd2VlcCB0aGF0IG11c3Qgbm90IGd1ZXNzIHdvdWxkIHNraXAgdGhlXG4gKiBwbGF0Zm9ybSdzIG93biBvcmcgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gY29uc3RhbnRUaWVyRm9yKG9yZ0lkOiBzdHJpbmcpOiBRdW90YVRpZXIgfCBudWxsIHtcbiAgcmV0dXJuIG9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IFNZU1RFTV9PUkdfSUQgPyAndW5saW1pdGVkJyA6IG51bGw7XG59XG5cbi8qKlxuICogRmlyZS1hbmQtZm9yZ2V0IHF1b3RhIE1FVEVSSU5HIGluY3JlbWVudC5cbiAqXG4gKiBCdWZmZXJlZDogdGhlIHVuaXQgam9pbnMgdGhlIHBvZCdzIHBlci0ob3JnLCB0eXBlKSBhZ2dyZWdhdGUgYW5kIGlzIHNlbnQgd2l0aFxuICogdGhlIG5leHQgZmx1c2ggKGBRVU9UQV9JTkNSRU1FTlRfRkxVU0hfTVNgLCBzZWUgcXVvdGEtaW5jcmVtZW50LWJhdGNoZXIudHMpXG4gKiBhcyBvbmUgbWV0ZXJlZCBpbmNyZW1lbnQg4oCUIHBhcnRpYWwgYWRtaXNzaW9uIGFnYWluc3QgdGhlIGNhcCwgdGhlIGV4Y2Vzc1xuICogcmVjb3JkZWQgYXMgYG92ZXJzaG9vdGAuIFRoZSBjb3VudGVyIHRoZXJlZm9yZSBsYWdzIGJ5IGF0IG1vc3Qgb25lIGZsdXNoXG4gKiBpbnRlcnZhbC4gT25seSB0aGUgcmVxdWVzdCBtZXRlciB1c2VzIHRoaXM7IHJlc2VydmF0aW9ucyBzdGF5IHN5bmNocm9ub3VzLlxuICpcbiAqIEF1dGhlbnRpY2F0ZXMgYXMgdGhlIGNhbGxpbmcgU0VSVklDRSAoe0BsaW5rIGdldFF1b3RhU2VydmljZUF1dGhIZWFkZXJ9KSwgbmV2ZXJcbiAqIHdpdGggdGhlIGVuZCB1c2VyJ3MgdG9rZW46IGAvcXVvdGFzLzpvcmdJZC9pbmNyZW1lbnRgIGlzIHNlcnZpY2UtcHJpbmNpcGFsXG4gKiBvbmx5LCBzbyBhIGZvcndhcmRlZCB1c2VyIEpXVCB3YXMgYWx3YXlzIHJlamVjdGVkICg0MDMpIGFuZCB0aGUgbWV0ZXJlZCBxdW90YVxuICogKGUuZy4gYGFwaUNhbGxzYCwgYW5kIHRoZSBgYXBpX3BhY2tgIGJ1bmRsZSByYWlzaW5nIGl0KSBuZXZlciBtb3ZlZC5cbiAqXG4gKiBAcGFyYW0gcXVvdGFTZXJ2aWNlIC0gUXVvdGEgc2VydmljZSBjbGllbnRcbiAqIEBwYXJhbSBvcmdJZCAtIE9yZ2FuaXphdGlvbiBJRCB3aG9zZSBjb3VudGVyIGlzIGluY3JlbWVudGVkXG4gKiBAcGFyYW0gcXVvdGFUeXBlIC0gUXVvdGEgdHlwZSB0byBpbmNyZW1lbnRcbiAqIEBwYXJhbSBsb2dXYXJuIC0gTG9nZ2luZyBmdW5jdGlvbiBmb3Igd2FybmluZ3NcbiAqIEBwYXJhbSBhdHRyaWJ1dGlvbiAtIFdobyBzcGVudCB0aGUgdW5pdCAoZGVmYXVsdHMgdG8gdGhlIGFtYmllbnQgcmVxdWVzdCBjb250ZXh0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5jcmVtZW50UXVvdGEoIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICBvcmdJZDogc3RyaW5nLFxuICBxdW90YVR5cGU6IFF1b3RhVHlwZSxcbiAgbG9nV2FybjogKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQsXG4gIGF0dHJpYnV0aW9uPzogUXVvdGFVc2FnZUF0dHJpYnV0aW9uLFxuKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgYmF0Y2hlciA9IGJhdGNoZXJGb3IocXVvdGFTZXJ2aWNlLCBhc3luYyAob3JnLCB0eXBlLCBncm91cHMpID0+IHtcbiAgICAgIGF3YWl0IHF1b3RhU2VydmljZS5pbmNyZW1lbnRNZXRlcmVkKG9yZywgdHlwZSwgZ2V0UXVvdGFTZXJ2aWNlQXV0aEhlYWRlcihvcmcpLCBncm91cHMpO1xuICAgIH0pO1xuICAgIGJhdGNoZXIuYWRkKG9yZ0lkLCBxdW90YVR5cGUsIHJlc29sdmVBdHRyaWJ1dGlvbihhdHRyaWJ1dGlvbikpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dXYXJuKCdRdW90YSBpbmNyZW1lbnQgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgZW1pdENvdW50ZXIoJ3F1b3RhX2luY3JlbWVudF9mYWlsdXJlc190b3RhbCcsIHsgcmVhc29uOiAnZXhjZXB0aW9uJywgcXVvdGFUeXBlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQXRvbWljIHJlc2VydmUgaGVscGVyIGZvciB0aGUgXCJyZXNlcnZlICsgY29tbWl0IC8gcm9sbGJhY2tcIiBwYXR0ZXJuLlxuICogVXNlIGZvciBleHBlbnNpdmUgcmVzb3VyY2VzIChwaXBlbGluZXMsIHBsdWdpbnMsIEFJIGNhbGxzKSB3aGVyZSB0aGVcbiAqIGZpcmUtYW5kLWZvcmdldCBwb3N0LWhvYyBgaW5jcmVtZW50UXVvdGFgIGFsbG93cyBjb25jdXJyZW50IG92ZXItc3BlbmQuXG4gKlxuICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCByZXN1bHQgc28gdGhlIGNhbGxlciBjYW4gZGVjaWRlIHdoZXRoZXIgdG8gcnVuXG4gKiB0aGUgZ2F0ZWQgYWN0aW9uIG9yIDQyOSB0aGUgY2xpZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXNlcnZhdGlvbiA9IGF3YWl0IHJlc2VydmVRdW90YShxdW90YVNlcnZpY2UsIG9yZ0lkLCAncGlwZWxpbmVzJywgYXV0aEhlYWRlcik7XG4gKiBpZiAocmVzZXJ2YXRpb24uZXhjZWVkZWQpIHJldHVybiBzZW5kUXVvdGFSZXNlcnZlRGVuaWVkKHJlcywgJ3BpcGVsaW5lcycsIHJlc2VydmF0aW9uKTtcbiAqIHRyeSB7XG4gKiBhd2FpdCBkb0V4cGVuc2l2ZVRoaW5nKCk7XG4gKiB9IGNhdGNoIChlcnIpIHtcbiAqIC8vIFBhc3MgdGhlIHJlc2VydmVkIHJlc2V0QXQgc28gYSBwZXJpb2Qgcm9sbG92ZXIgZG9lc24ndCBnZXQgZG91YmxlLWNoYXJnZWQuXG4gKiBkZWNyZW1lbnRRdW90YShxdW90YVNlcnZpY2UsIG9yZ0lkLCAncGlwZWxpbmVzJywgYXV0aEhlYWRlciwgbG9nV2FybiwgMSwgcmVzZXJ2YXRpb24ucXVvdGEucmVzZXRBdCk7XG4gKiB0aHJvdyBlcnI7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2VydmVRdW90YSggcXVvdGFTZXJ2aWNlOiBRdW90YVNlcnZpY2UsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICBhdXRoSGVhZGVyOiBzdHJpbmcsXG4gIGFtb3VudDogbnVtYmVyID0gMSxcbiAgYXR0cmlidXRpb24/OiBRdW90YVVzYWdlQXR0cmlidXRpb24sXG4pOiBQcm9taXNlPFF1b3RhUmVzZXJ2ZVJlc3VsdD4ge1xuICByZXR1cm4gcXVvdGFTZXJ2aWNlLnJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgYXV0aEhlYWRlciwgYW1vdW50LCBhdHRyaWJ1dGlvbik7XG59XG5cbi8qKiBTZWNvbmRzIGEgY2xpZW50IHNob3VsZCB3YWl0IGJlZm9yZSByZXRyeWluZyB3aGVuIHF1b3RhIGNvdWxkbid0IGJlIGNvbmZpcm1lZC4gKi9cbmNvbnN0IFFVT1RBX1VOQVZBSUxBQkxFX1JFVFJZX0FGVEVSX1NFQ09ORFMgPSA1O1xuXG4vKipcbiAqIEFuc3dlciBhIERFTklFRCByZXNlcnZhdGlvbiAoYHJlc2VydmF0aW9uLmV4Y2VlZGVkID09PSB0cnVlYCkuXG4gKlxuICogLSBgdW5hdmFpbGFibGVgICh0aGUgcXVvdGEgc2VydmljZSBjb3VsZG4ndCBjb25maXJtIHRoZSBzbG90KSDihpIgKio1MDMqKlxuICogICBgU0VSVklDRV9VTkFWQUlMQUJMRWAgd2l0aCBhIHNob3J0IGBSZXRyeS1BZnRlcmA6IHRoZSBvcmcgaXMgbm90IG92ZXIgaXRzXG4gKiAgIGxpbWl0LCBzbyBhIDQyOSBcInF1b3RhIGV4Y2VlZGVkXCIgd291bGQgc2VuZCB1c2VycyB0byB1cGdyYWRlIGZvciBhbiBvdXRhZ2UuXG4gKiAtIG90aGVyd2lzZSDihpIgdGhlIHN0YW5kYXJkIDQyOSBgUVVPVEFfRVhDRUVERURgIHdpdGggdGhlIFgtUXVvdGEtKiBoZWFkZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VuZFF1b3RhUmVzZXJ2ZURlbmllZChyZXM6IFJlc3BvbnNlLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgcmVzZXJ2YXRpb246IFF1b3RhUmVzZXJ2ZVJlc3VsdCk6IHZvaWQge1xuICBpZiAocmVzZXJ2YXRpb24uY29kZSkge1xuICAgIC8vIEFuIG9wdGlvbmFsIG9yZyBBSSBjb250cm9sIChwZXItbWVtYmVyIHNoYXJlIC8gdG9rZW4gYnVkZ2V0KTogaXRzIG93blxuICAgIC8vIGNvZGUsIHNvIHRoZSBjbGllbnQgY2FuIHNheSBcInlvdXIgc2hhcmVcIiByYXRoZXIgdGhhbiBcInRoZSBvcmcgaXMgb3V0XCIuXG4gICAgY29uc3QgcmVzZXRBdCA9IHJlc2VydmF0aW9uLnF1b3RhLnJlc2V0QXQ7XG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQgJiYgcmVzZXRBdCkge1xuICAgICAgcmVzLnNldEhlYWRlcignUmV0cnktQWZ0ZXInLCBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKG5ldyBEYXRlKHJlc2V0QXQpLmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMTAwMCkpKTtcbiAgICB9XG4gICAgZW1pdENvdW50ZXIoJ3F1b3RhX2RlbmllZF90b3RhbCcsIHsgdHlwZTogcXVvdGFUeXBlIH0pO1xuICAgIHNlbmRFcnJvcihcbiAgICAgIHJlcyxcbiAgICAgIDQyOSxcbiAgICAgIHJlc2VydmF0aW9uLm1lc3NhZ2UgPz8gYFlvdXIgb3JnYW5pemF0aW9uJ3MgJHtxdW90YVR5cGV9IGxpbWl0IGZvciB0aGlzIHBlcmlvZCBoYXMgYmVlbiByZWFjaGVkLmAsXG4gICAgICByZXNlcnZhdGlvbi5jb2RlLFxuICAgICAgeyBxdW90YTogcmVzZXJ2YXRpb24ucXVvdGEsIHF1b3RhVHlwZSwgLi4uKHJlc2V0QXQgPyB7IHJlc2V0QXQgfSA6IHt9KSB9LFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChyZXNlcnZhdGlvbi51bmF2YWlsYWJsZSkge1xuICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSByZXMuc2V0SGVhZGVyKCdSZXRyeS1BZnRlcicsIFFVT1RBX1VOQVZBSUxBQkxFX1JFVFJZX0FGVEVSX1NFQ09ORFMpO1xuICAgIHNlbmRFcnJvcihcbiAgICAgIHJlcyxcbiAgICAgIDUwMyxcbiAgICAgIGBVbmFibGUgdG8gY29uZmlybSAke3F1b3RhVHlwZX0gcXVvdGEgcmlnaHQgbm93LiBQbGVhc2UgdHJ5IGFnYWluIHNob3J0bHkuYCxcbiAgICAgIEVycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbmRRdW90YUV4Y2VlZGVkKHJlcywgcXVvdGFUeXBlLCByZXNlcnZhdGlvbi5xdW90YSwgcmVzZXJ2YXRpb24ucXVvdGEucmVzZXRBdCk7XG59XG5cbi8qKlxuICogRmlyZS1hbmQtZm9yZ2V0IHJvbGxiYWNrIGZvciBhIHByZXZpb3VzbHkgcmVzZXJ2ZWQgcXVvdGEgc2xvdC5cbiAqIExvZ3Mgb24gZmFpbHVyZSBidXQgbmV2ZXIgdGhyb3dzICB0aGUgYWN0aW9uIHRoYXQgbmVlZGVkIHRoZSByb2xsYmFja1xuICogaGFzIGFscmVhZHkgZmFpbGVkLCBubyBwb2ludCBjb21wb3VuZGluZyB0aGUgZXJyb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNyZW1lbnRRdW90YSggcXVvdGFTZXJ2aWNlOiBRdW90YVNlcnZpY2UsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICBhdXRoSGVhZGVyOiBzdHJpbmcsXG4gIGxvZ1dhcm46IChtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkLFxuICBhbW91bnQ6IG51bWJlciA9IDEsXG4gIHJlc2V0QXRTbmFwc2hvdD86IHN0cmluZyxcbiAgYXR0cmlidXRpb24/OiBRdW90YVVzYWdlQXR0cmlidXRpb24sXG4pOiB2b2lkIHtcbiAgY29uc3Qgc2VudCA9IGF0dHJpYnV0aW9uXG4gICAgPyBxdW90YVNlcnZpY2UuZGVjcmVtZW50KG9yZ0lkLCBxdW90YVR5cGUsIGF1dGhIZWFkZXIsIGFtb3VudCwgcmVzZXRBdFNuYXBzaG90LCBhdHRyaWJ1dGlvbilcbiAgICA6IHF1b3RhU2VydmljZS5kZWNyZW1lbnQob3JnSWQsIHF1b3RhVHlwZSwgYXV0aEhlYWRlciwgYW1vdW50LCByZXNldEF0U25hcHNob3QpO1xuICBzZW50LmNhdGNoKChlcnI6IHVua25vd24pID0+XG4gICAgbG9nV2FybignUXVvdGEgcm9sbGJhY2sgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSksXG4gICk7XG59XG4iXX0=