@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
@@ -35,7 +35,20 @@ export const QUOTA_CATALOG = {
35
35
  alertRules: { label: 'Alert rule', labelPlural: 'Alert rules', render: 'count', accrual: 'stock', observed: 'metered', description: 'Alert rules currently defined' },
36
36
  alertDestinations: { label: 'Alert destination', labelPlural: 'Alert destinations', render: 'count', accrual: 'stock', observed: 'metered', description: 'Alert destinations currently defined' },
37
37
  idpConfigs: { label: 'IdP configuration', labelPlural: 'IdP configurations', render: 'count', accrual: 'stock', observed: 'metered', description: 'Identity-provider configurations currently defined' },
38
- listings: { label: 'Plugin listing', labelPlural: 'Plugin listings', render: 'count', accrual: 'stock', observed: 'metered', description: 'Active plugin listings you publish' },
38
+ // MEASURED, not metered — the label was wrong, not the behaviour. Nothing has
39
+ // ever incremented a `listings` counter: enforcement reads the live count from
40
+ // the plugin service's own rows (`listings.countActive`), which IS the system
41
+ // of record for what a publisher has listed. Declaring it `metered` meant the
42
+ // dashboard showed "0 of N" forever and the 80%/100% threshold notices could
43
+ // never fire, because `threshold-notifier` drops any notice whose source does
44
+ // not match `observed` and no increment was ever coming.
45
+ //
46
+ // Wiring an increment instead would have been the wrong repair: it creates a
47
+ // SECOND number for a fact the plugin service already owns exactly, and the
48
+ // two then drift on every yank, transfer, suspension and purge that does not
49
+ // remember to decrement. Same shape as `storageBytes`, which is measured for
50
+ // the same reason.
51
+ listings: { label: 'Plugin listing', labelPlural: 'Plugin listings', render: 'count', accrual: 'stock', observed: 'measured', description: 'Active plugin listings you publish' },
39
52
  };
40
53
  /**
41
54
  * Consumables that are NOT quota types but render beside them — same label,
@@ -119,4 +132,4 @@ export function quotaDescription(type) {
119
132
  export function quotaPackUnit(type) {
120
133
  return byKey[type]?.packUnit ?? null;
121
134
  }
122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9xdW90YS1jYXRhbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUE4SnRDLE1BQU0sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFFckI7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBK0M7SUFDdkUsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUM5RSwrREFBK0Q7SUFDL0QsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxzQ0FBc0MsRUFBRTtJQUN0SyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsK0JBQStCLEVBQUU7SUFDeEssNkRBQTZEO0lBQzdELCtFQUErRTtJQUMvRSwyRUFBMkU7SUFDM0Usa0VBQWtFO0lBQ2xFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUseURBQXlELEVBQUU7SUFDeEwsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsd0VBQXdFLEVBQUU7SUFDNU4sT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSx1Q0FBdUMsRUFBRTtJQUNuSyw4RUFBOEU7SUFDOUUseUVBQXlFO0lBQ3pFLGdGQUFnRjtJQUNoRiwrRUFBK0U7SUFDL0UsZ0ZBQWdGO0lBQ2hGLDhFQUE4RTtJQUM5RSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLCtDQUErQyxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQzNOLDZFQUE2RTtJQUM3RSx5REFBeUQ7SUFDekQsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsbUNBQW1DLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDMU4sNEVBQTRFO0lBQzVFLDREQUE0RDtJQUM1RCxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLDhCQUE4QixFQUFFO0lBQ2xLLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsK0JBQStCLEVBQUU7SUFDckssaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxzQ0FBc0MsRUFBRTtJQUNqTSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxvREFBb0QsRUFBRTtJQUN4TSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxvQ0FBb0MsRUFBRTtDQUNqTCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBNEM7SUFDbkYsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRTtDQUN0SixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxLQUFLLEdBQThDO0lBQ3ZELEdBQUcsNEJBQTRCO0lBQy9CLEdBQUcsYUFBYTtDQUNqQixDQUFDO0FBWUYsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUM7QUFDcEMsQ0FBQztBQUtELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxJQUFZO0lBQzNDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUM7QUFDMUMsQ0FBQztBQWNELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWTtJQUN0QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQVUsQ0FBQztBQUUxRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFhO0lBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkQsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ2QsQ0FBQyxFQUFFLENBQUM7SUFDTixDQUFDO0lBQ0QsT0FBTyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN2RyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsS0FBYTtJQUMzRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pHLENBQUM7QUFTRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBWTtJQUMzQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLElBQUksU0FBUyxDQUFDO0FBQzVDLENBQUM7QUFRRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQVk7SUFDdkMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQztBQUN4QyxDQUFDO0FBS0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQVk7SUFDM0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBS0QsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFZO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBxdW90YS10eXBlIGRpc3BsYXkgY2F0YWxvZywgYXMgREFUQSBPTkxZIOKAlCB3aGF0IGEgcXVvdGEgaXMgQ0FMTEVEIGFuZCBob3dcbiAqIGl0cyBudW1iZXIgaXMgUkVOREVSRUQsIGZvciBldmVyeSBgUXVvdGFUeXBlYC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgYW5kIGVudi1mcmVlIHNvIHRoZSBicm93c2VyIGltcG9ydHMgaXQgZGlyZWN0bHlcbiAqIChgQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUvcXVvdGEtY2F0YWxvZ2ApLiBJdHMgb25seSBpbXBvcnQgaXMgYSB0eXBlLCB3aGljaFxuICogaXMgZXJhc2VkIGF0IGNvbXBpbGUgdGltZSwgc28gbm90aGluZyBvZiB0aGUgc2VydmVyIGdyYXBoIHJlYWNoZXMgdGhlIGJ1bmRsZS5cbiAqXG4gKiBXSFkgSVQgRVhJU1RTLiBUaGUgc2FtZSBmYWN0cyB3ZXJlIHNwZWxsZWQgaW4gc2l4IHBsYWNlczogdGhpcyBwYWNrYWdlJ3NcbiAqIGBRVU9UQV9UWVBFX0xBQkVMU2AsIGFuZCBmaXZlIGluZGVwZW5kZW50IG1hcHMgaW4gdGhlIGZyb250ZW5kIOKAlCB0aGUgcHJlc3N1cmVcbiAqIGJhbm5lcidzIGxhYmVscywgdGhlIHF1b3RhcyBwYWdlJ3MgYFFVT1RBX01FVEFgLCB0aGUgb3JnIGhvbWUncyBgUVVPVEFfTEFCRUxTYCxcbiAqIHRoZSBiaWxsaW5nIHVzYWdlIGNhcmQncyBgUVVPVEFfTEFCRUxTYCAod2l0aCBpdHMgb3duIGJ5dGUgZmxhZyksIGFuZCB0aGVcbiAqIGFkZC1vbiBncmlkJ3MgYFBBQ0tfVU5JVFNgLiBFYWNoIGtuZXcgYSBzdWJzZXQsIGVhY2ggY291bGQgZHJpZnQsIGFuZCBhZGRpbmcgYVxuICogcXVvdGEgdHlwZSBtZWFudCBmaW5kaW5nIGFsbCBzaXguIGBQQUNLX1VOSVRTYCBoYWQgZXhhY3RseSBvbmUgbWVtYmVyLCBzbyB0aGVcbiAqIGFkZC1vbiBncmlkIHJlbmRlcmVkIGEgR0Igc3RlcCBmb3Igc3RvcmFnZSBhbmQgYSBiYXJlIHBhY2sgY291bnQgZm9yXG4gKiBldmVyeXRoaW5nIGVsc2Ug4oCUIG5vdCBhIGRlY2lzaW9uIGFueW9uZSByZXZpc2l0ZWQsIGp1c3QgdGhlIG9uZSBlbnRyeSBzb21lYm9keVxuICogbmVlZGVkIGF0IHRoZSB0aW1lLlxuICpcbiAqIEFkZCBhIHF1b3RhIHR5cGUgaGVyZSBhbmQgZXZlcnkgc3VyZmFjZSByZW5kZXJzIGl0OiBgUmVjb3JkPFF1b3RhVHlwZSwg4oCmPmBcbiAqIG1ha2VzIHRoZSBjb21waWxlciBkZW1hbmQgdGhlIGVudHJ5LCBzbyBub25lIG9mIHRoZSBzaXggY2FuIGJlIGZvcmdvdHRlblxuICogYWdhaW4uXG4gKlxuICogRVZFUlkgZGlzcGxheSBmYWN0IGxpdmVzIGhlcmUsIGluY2x1ZGluZyB0aGUgcGx1cmFsIGxhYmVsLiBBIGZpcnN0IGRyYWZ0IGtlcHRcbiAqIHBsdXJhbHMgaW4gYSBmcm9udGVuZCBoZWxwZXIgd2l0aCBhIGBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+YCBhbmQgYSBmYWxsYmFjayB0b1xuICogdGhlIHNpbmd1bGFyIOKAlCB3aGljaCB3b3VsZCBoYXZlIHJlbmRlcmVkIGEgbmV3IHF1b3RhIHR5cGUncyBwbHVyYWwgd3JvbmdseSBhbmRcbiAqIHNpbGVudGx5LCByZXByb2R1Y2luZyB0aGUgZXhhY3QgcGFydGlhbC1tYXAgdHJhcCB0aGlzIGZpbGUgcmVtb3Zlcy4gQSBmYWN0XG4gKiBzcGxpdCBhY3Jvc3MgdHdvIHBhY2thZ2VzIGlzIGEgZmFjdCB0aGF0IGRyaWZ0cy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSB9IGZyb20gJy4vY29tbW9uLmpzJztcblxuLyoqIEhvdyBhIHF1b3RhJ3MgdXNhZ2UgaXMgbGVhcm5lZDogaW5jcmVtZW50ZWQgYXMgaXQgaGFwcGVucywgb3IgcmVhZCBvbiBkZW1hbmQuICovXG5leHBvcnQgdHlwZSBRdW90YU9ic2VydmF0aW9uID1cbiAgLyoqIFRoZSBwbGF0Zm9ybSBpbmNyZW1lbnRzIGEgY291bnRlciBhcyB0aGUgd29yayBoYXBwZW5zLiAqL1xuICB8ICdtZXRlcmVkJ1xuICAvKiogTm90aGluZyBpbmNyZW1lbnRzOiB0aGUgZmlndXJlIGlzIHJlYWQgZnJvbSB0aGUgc3lzdGVtIG9mIHJlY29yZC4gKi9cbiAgfCAnbWVhc3VyZWQnO1xuXG4vKiogV2hldGhlciBhIHF1b3RhIHJlZmlsbHMgb24gdGhlIHBlcmlvZCBvciBwZXJzaXN0cyB1bnRpbCBzb21ldGhpbmcgY2hhbmdlcy4gKi9cbmV4cG9ydCB0eXBlIFF1b3RhQWNjcnVhbCA9XG4gIC8qKiBBIHBlci1wZXJpb2QgcmF0ZTogcmVzZXJ2ZWQgb24gdXNlLCB6ZXJvZWQgYXQgdGhlIHBlcmlvZCBib3VuZGFyeS4gKi9cbiAgfCAnZmxvdydcbiAgLyoqIEEgbGV2ZWwgdGhhdCBzdGF5cyB1bnRpbCB0aGUgdGVuYW50IGZyZWVzIGl0LiBObyByZXNldCwgbm8gZm9yZWNhc3QuICovXG4gIHwgJ3N0b2NrJztcblxuLyoqIEhvdyBhIHJhdyBxdW90YSBudW1iZXIgc2hvdWxkIGJlIHJlbmRlcmVkLiAqL1xuZXhwb3J0IHR5cGUgUXVvdGFSZW5kZXIgPVxuICAvKiogQSBwbGFpbiBpbnRlZ2VyIOKAlCBcIjQgLyAxMFwiLiAqL1xuICB8ICdjb3VudCdcbiAgLyoqIEEgYnl0ZSBjb3VudCDigJQgcmVuZGVyIHdpdGggYGZvcm1hdEJ5dGVzYCAoXCIxOC40IEdCXCIpLCBuZXZlciByYXcuICovXG4gIHwgJ2J5dGVzJztcblxuLyoqIFdoYXQgYSBzdXJmYWNlIG5lZWRzIHRvIGtub3cgdG8gc2hvdyBvbmUgcXVvdGEgdHlwZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUeXBlTWV0YSB7XG4gIC8qKlxuICAgKiBTSU5HVUxBUiBodW1hbiBsYWJlbCDigJQgdGhlIG9uZSBzcGVsbGluZyBldmVyeSA0MjkgYm9keSwgbm90aWZpY2F0aW9uIGFuZFxuICAgKiBkYXNoYm9hcmQgdXNlcyAoXCJBUEkgY2FsbCBxdW90YSByZWFjaGVkIOKAplwiKS5cbiAgICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQTFVSQUwgbGFiZWwsIGZvciBzdXJmYWNlcyB0aGF0IGxpc3QgZGltZW5zaW9ucyByYXRoZXIgdGhhbiBhZGRyZXNzIG9uZVxuICAgKiAoXCJBUEkgY2FsbHNcIiBvbiBhIHVzYWdlIGNhcmQsIGFnYWluc3QgXCJBUEkgY2FsbCBxdW90YSByZWFjaGVkXCIgaW4gYSA0MjkpLlxuICAgKlxuICAgKiBSRVFVSVJFRCwgYW5kIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGZyb250ZW5kLCBiZWNhdXNlIHRoZSBmaXJzdCBkcmFmdCBwdXRcbiAgICogaXQgaW4gYSBgUmVjb3JkPHN0cmluZywgc3RyaW5nPmAgaGVscGVyIHRoYXQgZmVsbCBiYWNrIHRvIHRoZSBzaW5ndWxhciB3aGVuXG4gICAqIGEgdHlwZSB3YXMgbWlzc2luZyDigJQgc28gYSBuZXcgcXVvdGEgdHlwZSB3b3VsZCBoYXZlIHJlbmRlcmVkIFwiQnVpbGQgbWludXRlXCJcbiAgICogaW4gcGx1cmFsIGNvbnRleHRzLCB3cm9uZ2x5IGFuZCBzaWxlbnRseS4gVGhhdCBpcyB0aGUgc2FtZSBwYXJ0aWFsLW1hcCB0cmFwXG4gICAqIHRoaXMgY2F0YWxvZyBleGlzdHMgdG8gcmVtb3ZlLCBhbmQgYFJlY29yZDxRdW90YVR5cGUsIOKApj5gIGNsb3NlcyBpdCBvbmx5IGlmXG4gICAqIGV2ZXJ5IGRpc3BsYXkgZmFjdCBsaXZlcyBoZXJlLlxuICAgKi9cbiAgbGFiZWxQbHVyYWw6IHN0cmluZztcbiAgLyoqIEhvdyB0byByZW5kZXIgYSByYXcgdmFsdWUgZm9yIHRoaXMgdHlwZS4gKi9cbiAgcmVuZGVyOiBRdW90YVJlbmRlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBxdW90YSBSRUZJTExTIG9uIHRoZSBwZXJpb2QsIG9yIHBlcnNpc3RzIHVudGlsIHRoZSB0ZW5hbnRcbiAgICogY2hhbmdlcyBzb21ldGhpbmcuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHNpbmdsZSBtb3N0IGxvYWQtYmVhcmluZyBzZW1hbnRpYyBkaWZmZXJlbmNlIGJldHdlZW4gcXVvdGFcbiAgICogdHlwZXMgYW5kIG5vdGhpbmcgY291bGQgcmVhZCBpdCBiZWZvcmU6IGEgc3VyZmFjZSBoYWQgdG8ga25vdywgYnkgaGFuZCxcbiAgICogdGhhdCBcInJlc2V0cyBpbiAyIGRheXNcIiBpcyB0cnVlIG9mIGBhcGlDYWxsc2AgYW5kIGZhbHNlIG9mIGBzdG9yYWdlQnl0ZXNgLlxuICAgKiBHZXR0aW5nIGl0IHdyb25nIGlzIG5vdCBjb3NtZXRpYyDigJQgdGhlIHF1b3RhcyBwYWdlIHRvbGQgYW4gb3JnYW5pemF0aW9uIGl0c1xuICAgKiByZWdpc3RyeSBzdG9yYWdlIHdvdWxkIHJlc2V0LCB3aGljaCBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlIG9uZSB0aGluZyBpdFxuICAgKiBuZWVkcyB0byB1bmRlcnN0YW5kIGFib3V0IHN0b3JhZ2UuXG4gICAqXG4gICAqIC0gYGZsb3dgIOKAlCBhIHBlci1wZXJpb2QgcmF0ZSwgcmVzZXJ2ZWQgb24gY3JlYXRlL2J1aWxkIGFuZCB6ZXJvZWQgYXQgdGhlXG4gICAqICAgYm91bmRhcnkuIEhpdHRpbmcgaXQgaXMgdGVtcG9yYXJ5IGFuZCB0aGUgYWNjb3VudCBzZWxmLWhlYWxzLiBUaGUgcGVyaW9kIGlzXG4gICAqICAgUEVSIFRZUEUgcmF0aGVyIHRoYW4gZ2xvYmFsOiBgUVVPVEFfUkVTRVRfREFZU2AgKDMgZGF5cykgZm9yIGV2ZXJ5IGZsb3cgYnV0XG4gICAqICAgYGNwdUNyZWRpdHNgLCB3aGljaCBpcyBtb250aGx5LiBSZWFkIGl0IHRocm91Z2ggYHF1b3RhUGVyaW9kRGF5c2AgYW5kIG5ldmVyXG4gICAqICAgYXNzdW1lIHRoZSBnbG9iYWwg4oCUIGEgZm9yZWNhc3Qgb3IgYSBcInJlc2V0cyBpbiBOIGRheXNcIiBsaW5lIGNvbXB1dGVkXG4gICAqICAgYWdhaW5zdCB0aGUgd3Jvbmcgd2luZG93IGlzIHdyb25nIGJ5IGEgZmFjdG9yIG9mIHRlbiBmb3IgY3JlZGl0cy5cbiAgICogLSBgc3RvY2tgIOKAlCBhIGxldmVsLCBub3QgYSByYXRlLiBJdCBzdGF5cyB3aGVyZSBpdCBpcyB1bnRpbCBieXRlcyBhcmUgZnJlZWRcbiAgICogICBvciByb3dzIGFyZSBkZWxldGVkLCBzbyBhIHJlc2V0IGRhdGUsIGEgXCJyZXNldHMgaW4gTiBkYXlzXCIgbGluZSBhbmQgYVxuICAgKiAgIGJ1cm4tcmF0ZSBmb3JlY2FzdCBhcmUgYWxsIG1lYW5pbmdsZXNzIGZvciBpdC4gYHN0b3JhZ2VCeXRlc2AgaXMgbWVhc3VyZWQ7XG4gICAqICAgdGhlIHJlc291cmNlLWNvdW50IGNhcHMgYXJlIGNvdW50ZWQgYXQgY3JlYXRlIHRpbWUgYW5kIGRlY3JlbWVudGVkIG9uXG4gICAqICAgZGVsZXRlOyBgbGlzdGluZ3NgIGNvdW50cyBhY3RpdmUgcHVibGljYXRpb25zLlxuICAgKlxuICAgKiBUaGUge0BsaW5rIFF1b3RhVHlwZU1ldGEuZGVzY3JpcHRpb259IHdvcmRpbmcgZm9sbG93cyBmcm9tIHRoaXMgKFwidGhpc1xuICAgKiBwZXJpb2RcIiBhZ2FpbnN0IFwiY3VycmVudGx5XCIpLCBhbmQgYSB0ZXN0IGhvbGRzIHRoZSB0d28gaW4gYWdyZWVtZW50LlxuICAgKi9cbiAgYWNjcnVhbDogUXVvdGFBY2NydWFsO1xuICAvKipcbiAgICogSG93IHVzYWdlIGlzIE9CU0VSVkVEIOKAlCB3aGljaCBpcyBhIGRpZmZlcmVudCBxdWVzdGlvbiBmcm9tIHdoZXRoZXIgdGhlXG4gICAqIHF1b3RhIHJlZmlsbHMsIGFuZCB0aGUgdHdvIGRvIG5vdCBsaW5lIHVwLlxuICAgKlxuICAgKiAtIGBtZXRlcmVkYCDigJQgdGhlIHBsYXRmb3JtIElOQ1JFTUVOVFMgYSBjb3VudGVyIGFzIHRoZSB3b3JrIGhhcHBlbnMuIEV2ZXJ5XG4gICAqICAgcXVvdGEgYnV0IG9uZSwgaW5jbHVkaW5nIHRoZSBjcmVhdGUtdGltZSBjb3VudHMgdGhhdCBhcmUgc3RvY2tzXG4gICAqICAgKGBkYXNoYm9hcmRzYCwgYGxpc3RpbmdzYCwg4oCmKS5cbiAgICogLSBgbWVhc3VyZWRgIOKAlCBub3RoaW5nIGluY3JlbWVudHMgYW55dGhpbmc7IHRoZSBmaWd1cmUgaXMgUkVBRCBmcm9tIHRoZVxuICAgKiAgIHN5c3RlbSBvZiByZWNvcmQgb24gZGVtYW5kLiBgc3RvcmFnZUJ5dGVzYCBvbmx5OiB0aGUgcmVnaXN0cnkgd2Fsa3MgaXRzXG4gICAqICAgb3duIGNhdGFsb2csIHdoaWNoIGlzIHdoeSBpdCBpcyBcInRoZSBvbmUgcXVvdGEgbm90aGluZyBpbmNyZW1lbnRzXCIuXG4gICAqXG4gICAqIEl0IGRlY2lkZXMgd2hpY2ggY29kZSBwYXRoIG1heSBsZWdpdGltYXRlbHkgbm90aWZ5IGFib3V0IGEgcXVvdGEuIEEgc3RvcmFnZVxuICAgKiBub3RpY2UgYXJyaXZpbmcgZnJvbSB0aGUgaW5jcmVtZW50IHBhdGggY291bGQgb25seSBiZSBhIGJ1ZywgYW5kIGFcbiAgICogYGxpc3RpbmdzYCBub3RpY2UgYXJyaXZpbmcgZnJvbSBhIHN3ZWVwIGxpa2V3aXNlIOKAlCBjb25mbGF0aW5nIHRoaXMgd2l0aFxuICAgKiB7QGxpbmsgYWNjcnVhbH0gd291bGQgaGF2ZSBzaWxlbmNlZCBldmVyeSBjcmVhdGUtdGltZSBjb3VudCBxdW90YSwgYmVjYXVzZVxuICAgKiB0aG9zZSBhcmUgc3RvY2tzIHRoYXQgYXJlIG5vbmV0aGVsZXNzIG1ldGVyZWQuXG4gICAqL1xuICBvYnNlcnZlZDogUXVvdGFPYnNlcnZhdGlvbjtcbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBjb3VudGVyIGFjdHVhbGx5IGNvdW50cywgaW4gb25lIHNob3J0IHBocmFzZSDigJQgdGhlIGFuc3dlciB0byBcImFtIElcbiAgICogc3BlbmRpbmcgdGhpcyBvbmU/XCIuXG4gICAqXG4gICAqIFJFUVVJUkVELCBhbmQgYSBkaXNwbGF5IEZBQ1QgcmF0aGVyIHRoYW4gcGFnZSBjb3B5LCB3aGljaCBpcyB0aGUgY2FsbCBhXG4gICAqIGZpcnN0IHBhc3MgZ290IHdyb25nIGJ5IGp1ZGdpbmcgdGhlIGZpZWxkJ3MgbmFtZSBpbnN0ZWFkIG9mIGl0cyBjb250ZW50LiBJdFxuICAgKiBoYWQgYmVlbiBsZWZ0IGluIGEgZnJvbnRlbmQgYFJlY29yZDxEaXNwbGF5ZWRRdW90YVR5cGUsIHN0cmluZz5gIG9uIHRoZVxuICAgKiByZWFzb25pbmcgdGhhdCBkZXNjcmlwdGlvbnMgYXJlIGEgcGFnZSdzIG93biB2b2ljZS4gVGhleSBhcmUgbm90OiBlYWNoIG9mXG4gICAqIHRoZXNlIGFuc3dlcnMgYSBxdWVzdGlvbiB3aG9zZSBhbnN3ZXIgaXMgdGhlIHNhbWUgb24gZXZlcnkgc3VyZmFjZSwgYW5kIHR3b1xuICAgKiBzdXJmYWNlcyBkaXNhZ3JlZWluZyBpcyBhIGJ1Zywgbm90IGEgZGlmZmVyZW5jZSBpbiB0b25lLiBUd28gb2YgdGhlIGZpdmVcbiAgICogbG9jYWwgY29waWVzIGhhZCBhbHJlYWR5IGRyaWZ0ZWQg4oCUIGBhdXRvbWF0aW9uQ2FsbHNgIG9taXR0ZWQgcGVyc29uYWxcbiAgICogYWNjZXNzIGtleXMgKHNvIGEgUEFUIGhvbGRlciByZWFkIHRoZSBwYWdlIGFuZCBjb25jbHVkZWQgdGhleSB3ZXJlIHNwZW5kaW5nXG4gICAqIGBhcGlDYWxsc2ApLCBhbmQgYHBsdWdpbnNgL2BwaXBlbGluZXNgIHdlcmUgcGhyYXNlZCBhcyBzdG9ja3MuXG4gICAqXG4gICAqIFRoZSB0ZXN0IGlzIHdoZXRoZXIgYGRvY3MvcXVvdGFzLm1kYCBhbmQgdGhpcyBzdHJpbmcgY2FuIGxlZ2l0aW1hdGVseVxuICAgKiBkaWZmZXIuIEZvciB0aGVzZSwgbm8uIEZvciBhIHRpZXIncyBwb3NpdGlvbmluZyBsaW5lIChcIlN0YXJ0ZXIgdGllclwiKSBvciB0aGVcbiAgICogcXVvdGFzIHBhZ2UncyBwb29saW5nIGV4cGxhbmF0aW9uLCB5ZXMg4oCUIHRob3NlIHN0YXkgaW4gdGhlIHBhZ2UsIGV4YWN0bHkgYXNcbiAgICogYFRJRVJfTUVUQWAgYWxyZWFkeSBzcGxpdHMgYSB0aWVyJ3MgbGFiZWwgZnJvbSBpdHMgc2FsZXMgY29weS5cbiAgICpcbiAgICogUGhyYXNpbmcgZm9sbG93cyB0aGUgU0VNQU5USUNTIGluIHtAbGluayBRdW90YVR5cGV9J3Mgb3duIGRvY3VtZW50YXRpb24sIG5vdFxuICAgKiBhIGhvdXNlIHN0eWxlOiBcInRoaXMgcGVyaW9kXCIgZm9yIHRoZSBwZXItcGVyaW9kIGZsb3dzLCBcImN1cnJlbnRseVwiIGZvciB0aGVcbiAgICogY3JlYXRlLXRpbWUgY291bnRzIHRoYXQgZGVjcmVtZW50IG9uIGRlbGV0ZSwgYW5kIG5laXRoZXIgZm9yIHRoZSBtZWFzdXJlZFxuICAgKiBzdG9yYWdlIHRvdGFsLlxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1bml0IGFuIEFERC1PTiBQQUNLIG9mIHRoaXMgcXVvdGEgaXMgdHlwZWQgaW4sIGFuZCB0aGUgZGl2aXNvciBmcm9tIHRoZVxuICAgKiByYXcgZ3JhbnQgdG8gdGhhdCB1bml0IOKAlCBzbyBhICsxMCBHQiBzdG9yYWdlIHBhY2sgb2ZmZXJzIGEgR0Igc3RlcCByYXRoZXJcbiAgICogdGhhbiBhIHBhY2sgY291bnQuXG4gICAqXG4gICAqIEFic2VudCBtZWFucyBcInR5cGUgcGFjayBjb3VudHNcIiwgd2hpY2ggaXMgcmlnaHQgd2hlcmUgdGhlIHF1b3RhIGhhcyBub1xuICAgKiBuYXR1cmFsIHVuaXQ6IFwiMSBwYWNrIG9mIEFQSSBjYWxsc1wiIHJlYWRzIGJldHRlciB0aGFuIFwiMjUwMDAgY2FsbHNcIi4gVGhlXG4gICAqIHN0ZXAgaXRzZWxmIGlzIGFsd2F5cyBkZXJpdmVkIGZyb20gdGhlIGJ1bmRsZSdzIG93biBgZ3JhbnRzYCwgbmV2ZXIgZnJvbSBhXG4gICAqIGNvbnN0YW50IGhlcmUsIGJlY2F1c2UgYSBncmFudCBpcyBlbnYtb3ZlcnJpZGFibGUuXG4gICAqL1xuICBwYWNrVW5pdD86IHsgbmFtZTogc3RyaW5nOyBwZXI6IG51bWJlciB9O1xufVxuXG5jb25zdCBHQiA9IDEwMjQgKiogMztcblxuLyoqXG4gKiBEaXNwbGF5IG1ldGFkYXRhIGZvciBldmVyeSBxdW90YSB0eXBlLiBMYWJlbHMgYXJlIHRoZSBjYW5vbmljYWwgb25lcyDigJQgdGhlXG4gKiBzdHJpbmdzIGhlcmUgYXJlIHVzZXItZmFjaW5nIGFuZCBhcmUgcmVsaWVkIG9uIGJ5IDQyOSBib2RpZXMgYW5kIG5vdGljZXMsIHNvXG4gKiB0aGV5IGNoYW5nZSBvbmx5IGRlbGliZXJhdGVseS5cbiAqL1xuZXhwb3J0IGNvbnN0IFFVT1RBX0NBVEFMT0c6IFJlYWRvbmx5PFJlY29yZDxRdW90YVR5cGUsIFF1b3RhVHlwZU1ldGE+PiA9IHtcbiAgLy8gUGVyLXBlcmlvZCBGTE9XUyDigJQgYSBjcmVhdGlvbiByYXRlLCBub3QgYSBzdG9jay4gRGVsZXRpbmcgdGhlIGVudGl0eSBkb2VzXG4gIC8vIG5vdCBnaXZlIHRoZSBzbG90IGJhY2sgKGBkZWNyZW1lbnQtb24tZGVsZXRlYCB3YXMgY29uc2lkZXJlZCBhbmQgcmVqZWN0ZWQpLFxuICAvLyBzbyB0aGUgd29yZGluZyBzYXlzIFwidGhpcyBwZXJpb2RcIiB0byBzdG9wIHRoZSBzdG9jayByZWFkaW5nLlxuICBwbHVnaW5zOiB7IGxhYmVsOiAnUGx1Z2luIGJ1aWxkJywgbGFiZWxQbHVyYWw6ICdQbHVnaW5zJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnZmxvdycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnUGx1Z2luIHZlcnNpb25zIGRlcGxveWVkIHRoaXMgcGVyaW9kJyB9LFxuICBwaXBlbGluZXM6IHsgbGFiZWw6ICdQaXBlbGluZSBjcmVhdGlvbicsIGxhYmVsUGx1cmFsOiAnUGlwZWxpbmVzJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnZmxvdycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnUGlwZWxpbmVzIGNyZWF0ZWQgdGhpcyBwZXJpb2QnIH0sXG4gIC8vIFRoZSBjYWxsIGJ1ZGdldHMuIFdISUNIIE9ORSBhIHJlcXVlc3Qgc3BlbmRzIGlzIGRlY2lkZWQgYnlcbiAgLy8gYG1ldGVyZWRRdW90YVR5cGVGb3JgLCBuZXZlciBieSB0aGUgcm91dGU6IGEgc2VydmljZS1hY2NvdW50IGtleSwgYSBQRVJTT05BTFxuICAvLyBBQ0NFU1Mga2V5IChgdG9rZW5fdXNlOiAnYXBpX2tleSdgKSBvciBhbnl0aGluZyBtaW50ZWQgd2hpbGUgaG9sZGluZyBvbmVcbiAgLy8gKGBwYXJlbnRLZXlJZGApIHNwZW5kcyBgYXV0b21hdGlvbkNhbGxzYCBJTlNURUFEIG9mIGBhcGlDYWxsc2AuXG4gIGFwaUNhbGxzOiB7IGxhYmVsOiAnQVBJIGNhbGwnLCBsYWJlbFBsdXJhbDogJ0FQSSBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ1JlcXVlc3RzIG1hZGUgYnkgcGVvcGxlIGluIGJyb3dzZXIgc2Vzc2lvbnMgdGhpcyBwZXJpb2QnIH0sXG4gIGF1dG9tYXRpb25DYWxsczogeyBsYWJlbDogJ0F1dG9tYXRpb24gY2FsbCcsIGxhYmVsUGx1cmFsOiAnQXV0b21hdGlvbiBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ1JlcXVlc3RzIG1hZGUgd2l0aCBzZXJ2aWNlLWFjY291bnQgb3IgcGVyc29uYWwgYWNjZXNzIGtleXMgdGhpcyBwZXJpb2QnIH0sXG4gIGFpQ2FsbHM6IHsgbGFiZWw6ICdBSSBjYWxsJywgbGFiZWxQbHVyYWw6ICdBSSBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ0FJIGdlbmVyYXRpb24gaW52b2NhdGlvbnMgdGhpcyBwZXJpb2QnIH0sXG4gIC8vIFRoZSBvbmUgZmxvdyBxdW90YSBvbiBhIHBlcmlvZCBvZiBpdHMgT1dOIOKAlCBhIE1PTlRILCB3aGVyZSBldmVyeSBvdGhlciBmbG93XG4gIC8vIHJvbGxzIG9uIFFVT1RBX1JFU0VUX0RBWVMgKDMgZGF5cykuIFJlbmRlcmVkIGFzIGEgQ09VTlQgYW5kIG5ldmVyIGFzIGFcbiAgLy8gZHVyYXRpb246IHRoZSB1bml0IGlzIGFuIGFic3RyYWN0IGNyZWRpdCBwcmVjaXNlbHkgc28gaXQgY2Fubm90IGJlIG1pc3JlYWQgYXNcbiAgLy8gd2FsbC1jbG9jayAoXCIxMSwyNTAgYnVpbGQgbWludXRlc1wiIHJlYWRzIGFzIDE4NyBob3VycyB3aGVuIGl0IGJ1eXMgMTI1KSwgYW5kXG4gIC8vIGZvcm1hdHRpbmcgaXQgYmFjayBpbnRvIFwiMTg3aCAzMG1cIiB3b3VsZCB1bmRvIHRoYXQuIFRoZSB3YWxsLWNsb2NrIGNvbnZlcnNpb25cbiAgLy8gYmVsb25ncyBpbiB0aGUgcHJlLWJ1aWxkIGNvc3QgaGludCwgd2hlcmUgaXQgZXhwbGFpbnMgcmF0aGVyIHRoYW4gbWlzbGVhZHMuXG4gIGNwdUNyZWRpdHM6IHsgbGFiZWw6ICdDUFUgY3JlZGl0JywgbGFiZWxQbHVyYWw6ICdDUFUgY3JlZGl0cycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ3ZDUFUtbWludXRlcyBvZiBidWlsZCBjb21wdXRlIHVzZWQgdGhpcyBtb250aCcsIHBhY2tVbml0OiB7IG5hbWU6ICdjcmVkaXRzJywgcGVyOiAxIH0gfSxcbiAgLy8gQSBNRUFTVVJFRCB0b3RhbCwgcmVjb21wdXRlZCBvbiBkZW1hbmQgcmF0aGVyIHRoYW4gY291bnRlZCDigJQgdGhlIG9uZSBxdW90YVxuICAvLyB0aGF0IGlzIG5laXRoZXIgYSBwZXJpb2QgZmxvdyBub3IgYSBjcmVhdGUtdGltZSBjb3VudC5cbiAgc3RvcmFnZUJ5dGVzOiB7IGxhYmVsOiAnUmVnaXN0cnkgc3RvcmFnZScsIGxhYmVsUGx1cmFsOiAnUmVnaXN0cnkgc3RvcmFnZScsIHJlbmRlcjogJ2J5dGVzJywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZWFzdXJlZCcsIGRlc2NyaXB0aW9uOiAnUmVnaXN0cnkgc3RvcmFnZSBjdXJyZW50bHkgaW4gdXNlJywgcGFja1VuaXQ6IHsgbmFtZTogJ0dCJywgcGVyOiBHQiB9IH0sXG4gIC8vIFJlc291cmNlLWNvdW50IGNhcHM6IGNvdW50ZWQgYXQgY3JlYXRlIHRpbWUgYW5kIERFQ1JFTUVOVEVEIG9uIGRlbGV0ZSwgc29cbiAgLy8gdGhlc2UgcmVhbGx5IGFyZSBzdG9ja3MgYW5kIFwidGhpcyBwZXJpb2RcIiB3b3VsZCBiZSB3cm9uZy5cbiAgZGFzaGJvYXJkczogeyBsYWJlbDogJ0Rhc2hib2FyZCcsIGxhYmVsUGx1cmFsOiAnRGFzaGJvYXJkcycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZXRlcmVkJywgZGVzY3JpcHRpb246ICdEYXNoYm9hcmRzIGN1cnJlbnRseSBkZWZpbmVkJyB9LFxuICBhbGVydFJ1bGVzOiB7IGxhYmVsOiAnQWxlcnQgcnVsZScsIGxhYmVsUGx1cmFsOiAnQWxlcnQgcnVsZXMnLCByZW5kZXI6ICdjb3VudCcsIGFjY3J1YWw6ICdzdG9jaycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnQWxlcnQgcnVsZXMgY3VycmVudGx5IGRlZmluZWQnIH0sXG4gIGFsZXJ0RGVzdGluYXRpb25zOiB7IGxhYmVsOiAnQWxlcnQgZGVzdGluYXRpb24nLCBsYWJlbFBsdXJhbDogJ0FsZXJ0IGRlc3RpbmF0aW9ucycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZXRlcmVkJywgZGVzY3JpcHRpb246ICdBbGVydCBkZXN0aW5hdGlvbnMgY3VycmVudGx5IGRlZmluZWQnIH0sXG4gIGlkcENvbmZpZ3M6IHsgbGFiZWw6ICdJZFAgY29uZmlndXJhdGlvbicsIGxhYmVsUGx1cmFsOiAnSWRQIGNvbmZpZ3VyYXRpb25zJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnc3RvY2snLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ0lkZW50aXR5LXByb3ZpZGVyIGNvbmZpZ3VyYXRpb25zIGN1cnJlbnRseSBkZWZpbmVkJyB9LFxuICBsaXN0aW5nczogeyBsYWJlbDogJ1BsdWdpbiBsaXN0aW5nJywgbGFiZWxQbHVyYWw6ICdQbHVnaW4gbGlzdGluZ3MnLCByZW5kZXI6ICdjb3VudCcsIGFjY3J1YWw6ICdzdG9jaycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnQWN0aXZlIHBsdWdpbiBsaXN0aW5ncyB5b3UgcHVibGlzaCcgfSxcbn07XG5cbi8qKlxuICogQ29uc3VtYWJsZXMgdGhhdCBhcmUgTk9UIHF1b3RhIHR5cGVzIGJ1dCByZW5kZXIgYmVzaWRlIHRoZW0g4oCUIHNhbWUgbGFiZWwsXG4gKiBzYW1lIGJhciwgc2FtZSBjYXJkLlxuICpcbiAqIGBzZWF0c2AgaXMgdGhlIG9ubHkgb25lOiBpdCBpcyBhIFNUT0NLIChob3cgbWFueSBwZW9wbGUgbWF5IGJlIG9uIHRoZVxuICogYWNjb3VudCkgcmF0aGVyIHRoYW4gYSBwZXItcGVyaW9kIGZsb3csIHNvIGl0IGlzIGRlbGliZXJhdGVseSBvdXRzaWRlXG4gKiBgUXVvdGFUeXBlYCBhbmQgaXMgc291cmNlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIHF1b3RhIHJvbGx1cC4gQnV0IHRoZSBiaWxsaW5nXG4gKiB1c2FnZSBjYXJkIGRyYXdzIGl0IGluIHRoZSBzYW1lIGxpc3QsIGFuZCBiZWZvcmUgdGhpcyBlbnRyeSBleGlzdGVkIHRoYXQgb25lXG4gKiByb3cgY2FycmllZCBpdHMgb3duIGlubGluZSBcIlNlYXRzXCIgbGFiZWwgd2hpbGUgdGhlIGZpdmUgYmVzaWRlIGl0IGNhbWUgZnJvbVxuICogdGhlIGNhdGFsb2cg4oCUIHRoZSBwcmVjaXNlIHNwbGl0LWZhY3QgZHJpZnQgdGhpcyBmaWxlIGV4aXN0cyB0byByZW1vdmUuXG4gKlxuICogS2VlcCB0aGlzIGZvciB0aGluZ3MgcmVuZGVyZWQgQVMgYSBjb25zdW1hYmxlLiBJdCBpcyBub3QgYSBiYWNrIGRvb3IgZm9yXG4gKiBxdW90YSB0eXBlczogYSByZWFsIHF1b3RhIGJlbG9uZ3MgaW4ge0BsaW5rIFFVT1RBX0NBVEFMT0d9LCB3aGVyZVxuICogYFJlY29yZDxRdW90YVR5cGUsIOKApj5gIGZvcmNlcyB0aGUgZW50cnkuXG4gKi9cbmV4cG9ydCBjb25zdCBOT05fUVVPVEFfQ09OU1VNQUJMRV9DQVRBTE9HOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBRdW90YVR5cGVNZXRhPj4gPSB7XG4gIHNlYXRzOiB7IGxhYmVsOiAnU2VhdCcsIGxhYmVsUGx1cmFsOiAnU2VhdHMnLCByZW5kZXI6ICdjb3VudCcsIGFjY3J1YWw6ICdzdG9jaycsIG9ic2VydmVkOiAnbWVhc3VyZWQnLCBkZXNjcmlwdGlvbjogJ01lbWJlcnMgdGhpcyBhY2NvdW50IG1heSBoYXZlJyB9LFxufTtcblxuLyoqXG4gKiBFdmVyeSBkZXNjcmliZWQgY29uc3VtYWJsZSwgd2lkZW5lZCBmb3IgbG9va3VwcyBieSBhIHZhbHVlIHRoYXQgY2FtZSBvZmYgdGhlXG4gKiB3aXJlLlxuICovXG5jb25zdCBieUtleTogUmVjb3JkPHN0cmluZywgUXVvdGFUeXBlTWV0YSB8IHVuZGVmaW5lZD4gPSB7XG4gIC4uLk5PTl9RVU9UQV9DT05TVU1BQkxFX0NBVEFMT0csXG4gIC4uLlFVT1RBX0NBVEFMT0csXG59O1xuXG4vKipcbiAqIFRoaXMgdHlwZSdzIHNpbmd1bGFyIGxhYmVsLCBvciB0aGUgcmF3IGtleSBmb3IgYSB2YWx1ZSBvdXRzaWRlIHRoZSBjYXRhbG9nLlxuICpcbiAqIFRoZSBhY2Nlc3NvcnMgdGFrZSBgc3RyaW5nYCBiZWNhdXNlIHRoZSBxdW90YSB0eXBlIG9mdGVuIGFycml2ZXMgZnJvbSB0aGUgd2lyZVxuICogKGEgNDI5IGJvZHksIGEgcXVvdGEgcmVzcG9uc2UpIHdoZXJlIGFuIHVua25vd24gdmFsdWUgbXVzdCByZW5kZXIgYXMgc29tZXRoaW5nXG4gKiByYXRoZXIgdGhhbiBjcmFzaCBhIHBhZ2UuIFRoZSBgUXVvdGFUeXBlYCBvdmVybG9hZCBpcyBmb3IgaW50ZXJuYWwgY2FsbGVyczogaXRcbiAqIG1ha2VzIGEgdHlwbyBhIGNvbXBpbGUgZXJyb3IgaW5zdGVhZCBvZiBhIGtleSByZW5kZXJlZCBhcyBhIGxhYmVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbCh0eXBlOiBRdW90YVR5cGUpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbCh0eXBlOiBzdHJpbmcpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbCh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnlLZXlbdHlwZV0/LmxhYmVsID8/IHR5cGU7XG59XG5cbi8qKiBUaGlzIHR5cGUncyBQTFVSQUwgbGFiZWwsIG9yIHRoZSByYXcga2V5IGZvciBhIHZhbHVlIG91dHNpZGUgdGhlIGNhdGFsb2cuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbFBsdXJhbCh0eXBlOiBRdW90YVR5cGUpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbFBsdXJhbCh0eXBlOiBzdHJpbmcpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbFBsdXJhbCh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnlLZXlbdHlwZV0/LmxhYmVsUGx1cmFsID8/IHR5cGU7XG59XG5cbi8qKlxuICogSG93IHRvIHJlbmRlciB0aGlzIHR5cGUncyB2YWx1ZXMuIGBjb3VudGAgZm9yIGFueXRoaW5nIHRoZSBjYXRhbG9nIGRvZXMgbm90XG4gKiBrbm93LCBzbyBhbiB1bmZhbWlsaWFyIHdpcmUgdmFsdWUgcmVuZGVycyBhcyBhIHBsYWluIG51bWJlci5cbiAqXG4gKiBSZWFkIFRISVMgcmF0aGVyIHRoYW4gYXNraW5nIFwiaXMgaXQgYnl0ZXM/XCIuIEEgYm9vbGVhbiBoZWxwZXIgZGVncmFkZXNcbiAqIHNpbGVudGx5IHRoZSBtb21lbnQge0BsaW5rIFF1b3RhUmVuZGVyfSBncm93cyBhIHRoaXJkIG1lbWJlciDigJQgYSBuZXcgbW9kZVxuICogd291bGQgc2ltcGx5IHJlbmRlciBhcyBhIGNvdW50LCB3aXRoIG5vdGhpbmcgZmFpbGluZyDigJQgd2hlcmVhcyBhIGNhbGxlciB0aGF0XG4gKiBzd2l0Y2hlcyBvbiB0aGlzIHZhbHVlIGV4aGF1c3RpdmVseSBzdG9wcyBjb21waWxpbmcgdW50aWwgaXQgaGFuZGxlcyB0aGUgbmV3XG4gKiBtb2RlLiBUaGF0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgY2F0YWxvZywgYXBwbGllZCB0byBpdHMgb3duIGFjY2Vzc29ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUmVuZGVyKHR5cGU6IFF1b3RhVHlwZSk6IFF1b3RhUmVuZGVyO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUmVuZGVyKHR5cGU6IHN0cmluZyk6IFF1b3RhUmVuZGVyO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUmVuZGVyKHR5cGU6IHN0cmluZyk6IFF1b3RhUmVuZGVyIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5yZW5kZXIgPz8gJ2NvdW50Jztcbn1cblxuY29uc3QgQllURV9VTklUUyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQiddIGFzIGNvbnN0O1xuXG4vKipcbiAqIEEgYnl0ZSBjb3VudCBhcyBhIGh1bWFuIGFtb3VudCDigJQgYDEuNSBHQmAsIGA1MTIgTUJgLCBgMCBCYC5cbiAqXG4gKiBUaGUgT05FIGltcGxlbWVudGF0aW9uOiB0aGUgZnJvbnRlbmQncyBgZm9ybWF0Qnl0ZXNgIGRlbGVnYXRlcyBoZXJlIHJhdGhlclxuICogdGhhbiBrZWVwaW5nIGl0cyBvd24gY29weSwgc28gYSBzdG9yYWdlIGZpZ3VyZSByZWFkcyBpZGVudGljYWxseSBpbiBhIHF1b3RhXG4gKiBub3RpY2UsIGEgNDAzIGV4cGxhbmF0aW9uIGFuZCB0aGUgZGFzaGJvYXJkLiBCaW5hcnkgdW5pdHMgKDEwMjQpLCBvbmUgZGVjaW1hbFxuICogYmVsb3cgMTAgYW5kIHJvdW5kZWQgYWJvdmUsIHdoaWNoIGlzIHdoYXQgdGhlIGRhc2hib2FyZCBhbHJlYWR5IHJlbmRlcmVkIOKAlFxuICogdGhpcyBtb3ZlZCB0aGUgYWxnb3JpdGhtLCBpdCBkaWQgbm90IGNoYW5nZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ5dGVBbW91bnQoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGJ5dGVzKSB8fCBieXRlcyA8IDApIHJldHVybiAnMCBCJztcbiAgbGV0IHZhbHVlID0gYnl0ZXM7XG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKHZhbHVlID49IDEwMjQgJiYgaSA8IEJZVEVfVU5JVFMubGVuZ3RoIC0gMSkge1xuICAgIHZhbHVlIC89IDEwMjQ7XG4gICAgaSsrO1xuICB9XG4gIHJldHVybiB2YWx1ZSA8IDEwID8gYCR7dmFsdWUudG9GaXhlZCgxKX0gJHtCWVRFX1VOSVRTW2ldfWAgOiBgJHtNYXRoLnJvdW5kKHZhbHVlKX0gJHtCWVRFX1VOSVRTW2ldfWA7XG59XG5cbi8qKlxuICogQSByYXcgcXVvdGEgdmFsdWUgYXMgdGhlIGFtb3VudCBhIEhVTUFOIHNob3VsZCByZWFkLCBwZXIgdGhpcyB0eXBlJ3NcbiAqIHtAbGluayBRdW90YVJlbmRlcn0g4oCUIGJ5dGVzIGFzIGAyNSBHQmAsIGNvdW50cyBncm91cGVkIGFzIGA2MCwwMDBgLlxuICpcbiAqIEZvciBzZXJ2ZXItc2lkZSBjb3B5IChxdW90YSBub3RpY2VzLCBhdWRpdCByZWFzb25zLCA0MDMgZXhwbGFuYXRpb25zKSwgd2hpY2hcbiAqIGlzIHdoeSBpdCBpcyBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBmcm9udGVuZDogYSBzdG9yYWdlIG5vdGljZSB0aGF0XG4gKiBpbnRlcnBvbGF0ZWQgdGhlIHJhdyBudW1iZXIgd291bGQgcmVhZCBcInVzZWQgYWxsIDI2ODQzNTQ1NjAwIG9mIGl0cyByZWdpc3RyeVxuICogc3RvcmFnZVwiLiBUaGUgZnJvbnRlbmQgaGFzIGl0cyBvd24gdGhpbiB3cmFwcGVyIGJlY2F1c2UgaXQgcmVuZGVycyBhblxuICogdW5saW1pdGVkICgtMSkgbGltaXQgYXMgYOKInmAsIHdoaWNoIGlzIGEgZGlzcGxheSBjaG9pY2Ugbm8gc2VydmVyIGNvcHkgbWFrZXNcbiAqICh1bmxpbWl0ZWQgb3JncyBhcmUgc2tpcHBlZCBiZWZvcmUgYW55IGNvcHkgaXMgZ2VuZXJhdGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFF1b3RhQW1vdW50KHR5cGU6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBxdW90YVJlbmRlcih0eXBlKSA9PT0gJ2J5dGVzJyA/IGZvcm1hdEJ5dGVBbW91bnQodmFsdWUpIDogdmFsdWUudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyk7XG59XG5cbi8qKlxuICogSG93IHRoaXMgcXVvdGEncyB1c2FnZSBpcyBvYnNlcnZlZDogYG1ldGVyZWRgIChpbmNyZW1lbnRlZCkgb3IgYG1lYXN1cmVkYFxuICogKHJlYWQgb24gZGVtYW5kKS4gVW5rbm93biB3aXJlIHZhbHVlcyByZWFkIGFzIGBtZXRlcmVkYCwgbWF0Y2hpbmcgZXZlcnlcbiAqIHF1b3RhIGJ1dCBzdG9yYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFPYnNlcnZhdGlvbih0eXBlOiBRdW90YVR5cGUpOiBRdW90YU9ic2VydmF0aW9uO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhT2JzZXJ2YXRpb24odHlwZTogc3RyaW5nKTogUXVvdGFPYnNlcnZhdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YU9ic2VydmF0aW9uKHR5cGU6IHN0cmluZyk6IFF1b3RhT2JzZXJ2YXRpb24ge1xuICByZXR1cm4gYnlLZXlbdHlwZV0/Lm9ic2VydmVkID8/ICdtZXRlcmVkJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgcXVvdGEgcmVmaWxscyBvbiB0aGUgcGVyaW9kIChgZmxvd2ApIG9yIHBlcnNpc3RzIChgc3RvY2tgKS5cbiAqIFVua25vd24gd2lyZSB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgYGZsb3dgLCBtYXRjaGluZyBldmVyeSBtZXRlcmVkIHF1b3RhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFBY2NydWFsKHR5cGU6IFF1b3RhVHlwZSk6IFF1b3RhQWNjcnVhbDtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YUFjY3J1YWwodHlwZTogc3RyaW5nKTogUXVvdGFBY2NydWFsO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhQWNjcnVhbCh0eXBlOiBzdHJpbmcpOiBRdW90YUFjY3J1YWwge1xuICByZXR1cm4gYnlLZXlbdHlwZV0/LmFjY3J1YWwgPz8gJ2Zsb3cnO1xufVxuXG4vKiogV2hhdCB0aGlzIHR5cGUgY291bnRzLCBvciB0aGUgZW1wdHkgc3RyaW5nIGZvciBhIHZhbHVlIG91dHNpZGUgdGhlIGNhdGFsb2cuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFEZXNjcmlwdGlvbih0eXBlOiBRdW90YVR5cGUpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFEZXNjcmlwdGlvbih0eXBlOiBzdHJpbmcpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFEZXNjcmlwdGlvbih0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnlLZXlbdHlwZV0/LmRlc2NyaXB0aW9uID8/ICcnO1xufVxuXG4vKiogVGhlIHBhY2sgdW5pdCBmb3IgdGhpcyB0eXBlLCBvciBgbnVsbGAgdG8gdHlwZSBwYWNrIGNvdW50cyBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUGFja1VuaXQodHlwZTogUXVvdGFUeXBlKTogeyBuYW1lOiBzdHJpbmc7IHBlcjogbnVtYmVyIH0gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUGFja1VuaXQodHlwZTogc3RyaW5nKTogeyBuYW1lOiBzdHJpbmc7IHBlcjogbnVtYmVyIH0gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUGFja1VuaXQodHlwZTogc3RyaW5nKTogeyBuYW1lOiBzdHJpbmc7IHBlcjogbnVtYmVyIH0gfCBudWxsIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5wYWNrVW5pdCA/PyBudWxsO1xufVxuIl19
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtY2F0YWxvZy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL3F1b3RhLWNhdGFsb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQThKdEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUVyQjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUErQztJQUN2RSw0RUFBNEU7SUFDNUUsOEVBQThFO0lBQzlFLCtEQUErRDtJQUMvRCxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLHNDQUFzQyxFQUFFO0lBQ3RLLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRTtJQUN4Syw2REFBNkQ7SUFDN0QsK0VBQStFO0lBQy9FLDJFQUEyRTtJQUMzRSxrRUFBa0U7SUFDbEUsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSx5REFBeUQsRUFBRTtJQUN4TCxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSx3RUFBd0UsRUFBRTtJQUM1TixPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLHVDQUF1QyxFQUFFO0lBQ25LLDhFQUE4RTtJQUM5RSx5RUFBeUU7SUFDekUsZ0ZBQWdGO0lBQ2hGLCtFQUErRTtJQUMvRSxnRkFBZ0Y7SUFDaEYsOEVBQThFO0lBQzlFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsK0NBQStDLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDM04sNkVBQTZFO0lBQzdFLHlEQUF5RDtJQUN6RCxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxtQ0FBbUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUMxTiw0RUFBNEU7SUFDNUUsNERBQTREO0lBQzVELFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsOEJBQThCLEVBQUU7SUFDbEssVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRTtJQUNySyxpQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLHNDQUFzQyxFQUFFO0lBQ2pNLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG9EQUFvRCxFQUFFO0lBQ3hNLDhFQUE4RTtJQUM5RSwrRUFBK0U7SUFDL0UsOEVBQThFO0lBQzlFLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLHlEQUF5RDtJQUN6RCxFQUFFO0lBQ0YsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLG1CQUFtQjtJQUNuQixRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxvQ0FBb0MsRUFBRTtDQUNsTCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBNEM7SUFDbkYsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRTtDQUN0SixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxLQUFLLEdBQThDO0lBQ3ZELEdBQUcsNEJBQTRCO0lBQy9CLEdBQUcsYUFBYTtDQUNqQixDQUFDO0FBWUYsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUM7QUFDcEMsQ0FBQztBQUtELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxJQUFZO0lBQzNDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUM7QUFDMUMsQ0FBQztBQWNELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWTtJQUN0QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQVUsQ0FBQztBQUUxRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFhO0lBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkQsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ2QsQ0FBQyxFQUFFLENBQUM7SUFDTixDQUFDO0lBQ0QsT0FBTyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN2RyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsS0FBYTtJQUMzRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pHLENBQUM7QUFTRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBWTtJQUMzQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLElBQUksU0FBUyxDQUFDO0FBQzVDLENBQUM7QUFRRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQVk7SUFDdkMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQztBQUN4QyxDQUFDO0FBS0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQVk7SUFDM0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBS0QsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFZO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBxdW90YS10eXBlIGRpc3BsYXkgY2F0YWxvZywgYXMgREFUQSBPTkxZIOKAlCB3aGF0IGEgcXVvdGEgaXMgQ0FMTEVEIGFuZCBob3dcbiAqIGl0cyBudW1iZXIgaXMgUkVOREVSRUQsIGZvciBldmVyeSBgUXVvdGFUeXBlYC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgYW5kIGVudi1mcmVlIHNvIHRoZSBicm93c2VyIGltcG9ydHMgaXQgZGlyZWN0bHlcbiAqIChgQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUvcXVvdGEtY2F0YWxvZ2ApLiBJdHMgb25seSBpbXBvcnQgaXMgYSB0eXBlLCB3aGljaFxuICogaXMgZXJhc2VkIGF0IGNvbXBpbGUgdGltZSwgc28gbm90aGluZyBvZiB0aGUgc2VydmVyIGdyYXBoIHJlYWNoZXMgdGhlIGJ1bmRsZS5cbiAqXG4gKiBXSFkgSVQgRVhJU1RTLiBUaGUgc2FtZSBmYWN0cyB3ZXJlIHNwZWxsZWQgaW4gc2l4IHBsYWNlczogdGhpcyBwYWNrYWdlJ3NcbiAqIGBRVU9UQV9UWVBFX0xBQkVMU2AsIGFuZCBmaXZlIGluZGVwZW5kZW50IG1hcHMgaW4gdGhlIGZyb250ZW5kIOKAlCB0aGUgcHJlc3N1cmVcbiAqIGJhbm5lcidzIGxhYmVscywgdGhlIHF1b3RhcyBwYWdlJ3MgYFFVT1RBX01FVEFgLCB0aGUgb3JnIGhvbWUncyBgUVVPVEFfTEFCRUxTYCxcbiAqIHRoZSBiaWxsaW5nIHVzYWdlIGNhcmQncyBgUVVPVEFfTEFCRUxTYCAod2l0aCBpdHMgb3duIGJ5dGUgZmxhZyksIGFuZCB0aGVcbiAqIGFkZC1vbiBncmlkJ3MgYFBBQ0tfVU5JVFNgLiBFYWNoIGtuZXcgYSBzdWJzZXQsIGVhY2ggY291bGQgZHJpZnQsIGFuZCBhZGRpbmcgYVxuICogcXVvdGEgdHlwZSBtZWFudCBmaW5kaW5nIGFsbCBzaXguIGBQQUNLX1VOSVRTYCBoYWQgZXhhY3RseSBvbmUgbWVtYmVyLCBzbyB0aGVcbiAqIGFkZC1vbiBncmlkIHJlbmRlcmVkIGEgR0Igc3RlcCBmb3Igc3RvcmFnZSBhbmQgYSBiYXJlIHBhY2sgY291bnQgZm9yXG4gKiBldmVyeXRoaW5nIGVsc2Ug4oCUIG5vdCBhIGRlY2lzaW9uIGFueW9uZSByZXZpc2l0ZWQsIGp1c3QgdGhlIG9uZSBlbnRyeSBzb21lYm9keVxuICogbmVlZGVkIGF0IHRoZSB0aW1lLlxuICpcbiAqIEFkZCBhIHF1b3RhIHR5cGUgaGVyZSBhbmQgZXZlcnkgc3VyZmFjZSByZW5kZXJzIGl0OiBgUmVjb3JkPFF1b3RhVHlwZSwg4oCmPmBcbiAqIG1ha2VzIHRoZSBjb21waWxlciBkZW1hbmQgdGhlIGVudHJ5LCBzbyBub25lIG9mIHRoZSBzaXggY2FuIGJlIGZvcmdvdHRlblxuICogYWdhaW4uXG4gKlxuICogRVZFUlkgZGlzcGxheSBmYWN0IGxpdmVzIGhlcmUsIGluY2x1ZGluZyB0aGUgcGx1cmFsIGxhYmVsLiBBIGZpcnN0IGRyYWZ0IGtlcHRcbiAqIHBsdXJhbHMgaW4gYSBmcm9udGVuZCBoZWxwZXIgd2l0aCBhIGBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+YCBhbmQgYSBmYWxsYmFjayB0b1xuICogdGhlIHNpbmd1bGFyIOKAlCB3aGljaCB3b3VsZCBoYXZlIHJlbmRlcmVkIGEgbmV3IHF1b3RhIHR5cGUncyBwbHVyYWwgd3JvbmdseSBhbmRcbiAqIHNpbGVudGx5LCByZXByb2R1Y2luZyB0aGUgZXhhY3QgcGFydGlhbC1tYXAgdHJhcCB0aGlzIGZpbGUgcmVtb3Zlcy4gQSBmYWN0XG4gKiBzcGxpdCBhY3Jvc3MgdHdvIHBhY2thZ2VzIGlzIGEgZmFjdCB0aGF0IGRyaWZ0cy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSB9IGZyb20gJy4vY29tbW9uLmpzJztcblxuLyoqIEhvdyBhIHF1b3RhJ3MgdXNhZ2UgaXMgbGVhcm5lZDogaW5jcmVtZW50ZWQgYXMgaXQgaGFwcGVucywgb3IgcmVhZCBvbiBkZW1hbmQuICovXG5leHBvcnQgdHlwZSBRdW90YU9ic2VydmF0aW9uID1cbiAgLyoqIFRoZSBwbGF0Zm9ybSBpbmNyZW1lbnRzIGEgY291bnRlciBhcyB0aGUgd29yayBoYXBwZW5zLiAqL1xuICB8ICdtZXRlcmVkJ1xuICAvKiogTm90aGluZyBpbmNyZW1lbnRzOiB0aGUgZmlndXJlIGlzIHJlYWQgZnJvbSB0aGUgc3lzdGVtIG9mIHJlY29yZC4gKi9cbiAgfCAnbWVhc3VyZWQnO1xuXG4vKiogV2hldGhlciBhIHF1b3RhIHJlZmlsbHMgb24gdGhlIHBlcmlvZCBvciBwZXJzaXN0cyB1bnRpbCBzb21ldGhpbmcgY2hhbmdlcy4gKi9cbmV4cG9ydCB0eXBlIFF1b3RhQWNjcnVhbCA9XG4gIC8qKiBBIHBlci1wZXJpb2QgcmF0ZTogcmVzZXJ2ZWQgb24gdXNlLCB6ZXJvZWQgYXQgdGhlIHBlcmlvZCBib3VuZGFyeS4gKi9cbiAgfCAnZmxvdydcbiAgLyoqIEEgbGV2ZWwgdGhhdCBzdGF5cyB1bnRpbCB0aGUgdGVuYW50IGZyZWVzIGl0LiBObyByZXNldCwgbm8gZm9yZWNhc3QuICovXG4gIHwgJ3N0b2NrJztcblxuLyoqIEhvdyBhIHJhdyBxdW90YSBudW1iZXIgc2hvdWxkIGJlIHJlbmRlcmVkLiAqL1xuZXhwb3J0IHR5cGUgUXVvdGFSZW5kZXIgPVxuICAvKiogQSBwbGFpbiBpbnRlZ2VyIOKAlCBcIjQgLyAxMFwiLiAqL1xuICB8ICdjb3VudCdcbiAgLyoqIEEgYnl0ZSBjb3VudCDigJQgcmVuZGVyIHdpdGggYGZvcm1hdEJ5dGVzYCAoXCIxOC40IEdCXCIpLCBuZXZlciByYXcuICovXG4gIHwgJ2J5dGVzJztcblxuLyoqIFdoYXQgYSBzdXJmYWNlIG5lZWRzIHRvIGtub3cgdG8gc2hvdyBvbmUgcXVvdGEgdHlwZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUeXBlTWV0YSB7XG4gIC8qKlxuICAgKiBTSU5HVUxBUiBodW1hbiBsYWJlbCDigJQgdGhlIG9uZSBzcGVsbGluZyBldmVyeSA0MjkgYm9keSwgbm90aWZpY2F0aW9uIGFuZFxuICAgKiBkYXNoYm9hcmQgdXNlcyAoXCJBUEkgY2FsbCBxdW90YSByZWFjaGVkIOKAplwiKS5cbiAgICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQTFVSQUwgbGFiZWwsIGZvciBzdXJmYWNlcyB0aGF0IGxpc3QgZGltZW5zaW9ucyByYXRoZXIgdGhhbiBhZGRyZXNzIG9uZVxuICAgKiAoXCJBUEkgY2FsbHNcIiBvbiBhIHVzYWdlIGNhcmQsIGFnYWluc3QgXCJBUEkgY2FsbCBxdW90YSByZWFjaGVkXCIgaW4gYSA0MjkpLlxuICAgKlxuICAgKiBSRVFVSVJFRCwgYW5kIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGZyb250ZW5kLCBiZWNhdXNlIHRoZSBmaXJzdCBkcmFmdCBwdXRcbiAgICogaXQgaW4gYSBgUmVjb3JkPHN0cmluZywgc3RyaW5nPmAgaGVscGVyIHRoYXQgZmVsbCBiYWNrIHRvIHRoZSBzaW5ndWxhciB3aGVuXG4gICAqIGEgdHlwZSB3YXMgbWlzc2luZyDigJQgc28gYSBuZXcgcXVvdGEgdHlwZSB3b3VsZCBoYXZlIHJlbmRlcmVkIFwiQnVpbGQgbWludXRlXCJcbiAgICogaW4gcGx1cmFsIGNvbnRleHRzLCB3cm9uZ2x5IGFuZCBzaWxlbnRseS4gVGhhdCBpcyB0aGUgc2FtZSBwYXJ0aWFsLW1hcCB0cmFwXG4gICAqIHRoaXMgY2F0YWxvZyBleGlzdHMgdG8gcmVtb3ZlLCBhbmQgYFJlY29yZDxRdW90YVR5cGUsIOKApj5gIGNsb3NlcyBpdCBvbmx5IGlmXG4gICAqIGV2ZXJ5IGRpc3BsYXkgZmFjdCBsaXZlcyBoZXJlLlxuICAgKi9cbiAgbGFiZWxQbHVyYWw6IHN0cmluZztcbiAgLyoqIEhvdyB0byByZW5kZXIgYSByYXcgdmFsdWUgZm9yIHRoaXMgdHlwZS4gKi9cbiAgcmVuZGVyOiBRdW90YVJlbmRlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBxdW90YSBSRUZJTExTIG9uIHRoZSBwZXJpb2QsIG9yIHBlcnNpc3RzIHVudGlsIHRoZSB0ZW5hbnRcbiAgICogY2hhbmdlcyBzb21ldGhpbmcuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHNpbmdsZSBtb3N0IGxvYWQtYmVhcmluZyBzZW1hbnRpYyBkaWZmZXJlbmNlIGJldHdlZW4gcXVvdGFcbiAgICogdHlwZXMgYW5kIG5vdGhpbmcgY291bGQgcmVhZCBpdCBiZWZvcmU6IGEgc3VyZmFjZSBoYWQgdG8ga25vdywgYnkgaGFuZCxcbiAgICogdGhhdCBcInJlc2V0cyBpbiAyIGRheXNcIiBpcyB0cnVlIG9mIGBhcGlDYWxsc2AgYW5kIGZhbHNlIG9mIGBzdG9yYWdlQnl0ZXNgLlxuICAgKiBHZXR0aW5nIGl0IHdyb25nIGlzIG5vdCBjb3NtZXRpYyDigJQgdGhlIHF1b3RhcyBwYWdlIHRvbGQgYW4gb3JnYW5pemF0aW9uIGl0c1xuICAgKiByZWdpc3RyeSBzdG9yYWdlIHdvdWxkIHJlc2V0LCB3aGljaCBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlIG9uZSB0aGluZyBpdFxuICAgKiBuZWVkcyB0byB1bmRlcnN0YW5kIGFib3V0IHN0b3JhZ2UuXG4gICAqXG4gICAqIC0gYGZsb3dgIOKAlCBhIHBlci1wZXJpb2QgcmF0ZSwgcmVzZXJ2ZWQgb24gY3JlYXRlL2J1aWxkIGFuZCB6ZXJvZWQgYXQgdGhlXG4gICAqICAgYm91bmRhcnkuIEhpdHRpbmcgaXQgaXMgdGVtcG9yYXJ5IGFuZCB0aGUgYWNjb3VudCBzZWxmLWhlYWxzLiBUaGUgcGVyaW9kIGlzXG4gICAqICAgUEVSIFRZUEUgcmF0aGVyIHRoYW4gZ2xvYmFsOiBgUVVPVEFfUkVTRVRfREFZU2AgKDMgZGF5cykgZm9yIGV2ZXJ5IGZsb3cgYnV0XG4gICAqICAgYGNwdUNyZWRpdHNgLCB3aGljaCBpcyBtb250aGx5LiBSZWFkIGl0IHRocm91Z2ggYHF1b3RhUGVyaW9kRGF5c2AgYW5kIG5ldmVyXG4gICAqICAgYXNzdW1lIHRoZSBnbG9iYWwg4oCUIGEgZm9yZWNhc3Qgb3IgYSBcInJlc2V0cyBpbiBOIGRheXNcIiBsaW5lIGNvbXB1dGVkXG4gICAqICAgYWdhaW5zdCB0aGUgd3Jvbmcgd2luZG93IGlzIHdyb25nIGJ5IGEgZmFjdG9yIG9mIHRlbiBmb3IgY3JlZGl0cy5cbiAgICogLSBgc3RvY2tgIOKAlCBhIGxldmVsLCBub3QgYSByYXRlLiBJdCBzdGF5cyB3aGVyZSBpdCBpcyB1bnRpbCBieXRlcyBhcmUgZnJlZWRcbiAgICogICBvciByb3dzIGFyZSBkZWxldGVkLCBzbyBhIHJlc2V0IGRhdGUsIGEgXCJyZXNldHMgaW4gTiBkYXlzXCIgbGluZSBhbmQgYVxuICAgKiAgIGJ1cm4tcmF0ZSBmb3JlY2FzdCBhcmUgYWxsIG1lYW5pbmdsZXNzIGZvciBpdC4gYHN0b3JhZ2VCeXRlc2AgaXMgbWVhc3VyZWQ7XG4gICAqICAgdGhlIHJlc291cmNlLWNvdW50IGNhcHMgYXJlIGNvdW50ZWQgYXQgY3JlYXRlIHRpbWUgYW5kIGRlY3JlbWVudGVkIG9uXG4gICAqICAgZGVsZXRlOyBgbGlzdGluZ3NgIGNvdW50cyBhY3RpdmUgcHVibGljYXRpb25zLlxuICAgKlxuICAgKiBUaGUge0BsaW5rIFF1b3RhVHlwZU1ldGEuZGVzY3JpcHRpb259IHdvcmRpbmcgZm9sbG93cyBmcm9tIHRoaXMgKFwidGhpc1xuICAgKiBwZXJpb2RcIiBhZ2FpbnN0IFwiY3VycmVudGx5XCIpLCBhbmQgYSB0ZXN0IGhvbGRzIHRoZSB0d28gaW4gYWdyZWVtZW50LlxuICAgKi9cbiAgYWNjcnVhbDogUXVvdGFBY2NydWFsO1xuICAvKipcbiAgICogSG93IHVzYWdlIGlzIE9CU0VSVkVEIOKAlCB3aGljaCBpcyBhIGRpZmZlcmVudCBxdWVzdGlvbiBmcm9tIHdoZXRoZXIgdGhlXG4gICAqIHF1b3RhIHJlZmlsbHMsIGFuZCB0aGUgdHdvIGRvIG5vdCBsaW5lIHVwLlxuICAgKlxuICAgKiAtIGBtZXRlcmVkYCDigJQgdGhlIHBsYXRmb3JtIElOQ1JFTUVOVFMgYSBjb3VudGVyIGFzIHRoZSB3b3JrIGhhcHBlbnMuIEV2ZXJ5XG4gICAqICAgcXVvdGEgYnV0IG9uZSwgaW5jbHVkaW5nIHRoZSBjcmVhdGUtdGltZSBjb3VudHMgdGhhdCBhcmUgc3RvY2tzXG4gICAqICAgKGBkYXNoYm9hcmRzYCwgYGxpc3RpbmdzYCwg4oCmKS5cbiAgICogLSBgbWVhc3VyZWRgIOKAlCBub3RoaW5nIGluY3JlbWVudHMgYW55dGhpbmc7IHRoZSBmaWd1cmUgaXMgUkVBRCBmcm9tIHRoZVxuICAgKiAgIHN5c3RlbSBvZiByZWNvcmQgb24gZGVtYW5kLiBgc3RvcmFnZUJ5dGVzYCBvbmx5OiB0aGUgcmVnaXN0cnkgd2Fsa3MgaXRzXG4gICAqICAgb3duIGNhdGFsb2csIHdoaWNoIGlzIHdoeSBpdCBpcyBcInRoZSBvbmUgcXVvdGEgbm90aGluZyBpbmNyZW1lbnRzXCIuXG4gICAqXG4gICAqIEl0IGRlY2lkZXMgd2hpY2ggY29kZSBwYXRoIG1heSBsZWdpdGltYXRlbHkgbm90aWZ5IGFib3V0IGEgcXVvdGEuIEEgc3RvcmFnZVxuICAgKiBub3RpY2UgYXJyaXZpbmcgZnJvbSB0aGUgaW5jcmVtZW50IHBhdGggY291bGQgb25seSBiZSBhIGJ1ZywgYW5kIGFcbiAgICogYGxpc3RpbmdzYCBub3RpY2UgYXJyaXZpbmcgZnJvbSBhIHN3ZWVwIGxpa2V3aXNlIOKAlCBjb25mbGF0aW5nIHRoaXMgd2l0aFxuICAgKiB7QGxpbmsgYWNjcnVhbH0gd291bGQgaGF2ZSBzaWxlbmNlZCBldmVyeSBjcmVhdGUtdGltZSBjb3VudCBxdW90YSwgYmVjYXVzZVxuICAgKiB0aG9zZSBhcmUgc3RvY2tzIHRoYXQgYXJlIG5vbmV0aGVsZXNzIG1ldGVyZWQuXG4gICAqL1xuICBvYnNlcnZlZDogUXVvdGFPYnNlcnZhdGlvbjtcbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBjb3VudGVyIGFjdHVhbGx5IGNvdW50cywgaW4gb25lIHNob3J0IHBocmFzZSDigJQgdGhlIGFuc3dlciB0byBcImFtIElcbiAgICogc3BlbmRpbmcgdGhpcyBvbmU/XCIuXG4gICAqXG4gICAqIFJFUVVJUkVELCBhbmQgYSBkaXNwbGF5IEZBQ1QgcmF0aGVyIHRoYW4gcGFnZSBjb3B5LCB3aGljaCBpcyB0aGUgY2FsbCBhXG4gICAqIGZpcnN0IHBhc3MgZ290IHdyb25nIGJ5IGp1ZGdpbmcgdGhlIGZpZWxkJ3MgbmFtZSBpbnN0ZWFkIG9mIGl0cyBjb250ZW50LiBJdFxuICAgKiBoYWQgYmVlbiBsZWZ0IGluIGEgZnJvbnRlbmQgYFJlY29yZDxEaXNwbGF5ZWRRdW90YVR5cGUsIHN0cmluZz5gIG9uIHRoZVxuICAgKiByZWFzb25pbmcgdGhhdCBkZXNjcmlwdGlvbnMgYXJlIGEgcGFnZSdzIG93biB2b2ljZS4gVGhleSBhcmUgbm90OiBlYWNoIG9mXG4gICAqIHRoZXNlIGFuc3dlcnMgYSBxdWVzdGlvbiB3aG9zZSBhbnN3ZXIgaXMgdGhlIHNhbWUgb24gZXZlcnkgc3VyZmFjZSwgYW5kIHR3b1xuICAgKiBzdXJmYWNlcyBkaXNhZ3JlZWluZyBpcyBhIGJ1Zywgbm90IGEgZGlmZmVyZW5jZSBpbiB0b25lLiBUd28gb2YgdGhlIGZpdmVcbiAgICogbG9jYWwgY29waWVzIGhhZCBhbHJlYWR5IGRyaWZ0ZWQg4oCUIGBhdXRvbWF0aW9uQ2FsbHNgIG9taXR0ZWQgcGVyc29uYWxcbiAgICogYWNjZXNzIGtleXMgKHNvIGEgUEFUIGhvbGRlciByZWFkIHRoZSBwYWdlIGFuZCBjb25jbHVkZWQgdGhleSB3ZXJlIHNwZW5kaW5nXG4gICAqIGBhcGlDYWxsc2ApLCBhbmQgYHBsdWdpbnNgL2BwaXBlbGluZXNgIHdlcmUgcGhyYXNlZCBhcyBzdG9ja3MuXG4gICAqXG4gICAqIFRoZSB0ZXN0IGlzIHdoZXRoZXIgYGRvY3MvcXVvdGFzLm1kYCBhbmQgdGhpcyBzdHJpbmcgY2FuIGxlZ2l0aW1hdGVseVxuICAgKiBkaWZmZXIuIEZvciB0aGVzZSwgbm8uIEZvciBhIHRpZXIncyBwb3NpdGlvbmluZyBsaW5lIChcIlN0YXJ0ZXIgdGllclwiKSBvciB0aGVcbiAgICogcXVvdGFzIHBhZ2UncyBwb29saW5nIGV4cGxhbmF0aW9uLCB5ZXMg4oCUIHRob3NlIHN0YXkgaW4gdGhlIHBhZ2UsIGV4YWN0bHkgYXNcbiAgICogYFRJRVJfTUVUQWAgYWxyZWFkeSBzcGxpdHMgYSB0aWVyJ3MgbGFiZWwgZnJvbSBpdHMgc2FsZXMgY29weS5cbiAgICpcbiAgICogUGhyYXNpbmcgZm9sbG93cyB0aGUgU0VNQU5USUNTIGluIHtAbGluayBRdW90YVR5cGV9J3Mgb3duIGRvY3VtZW50YXRpb24sIG5vdFxuICAgKiBhIGhvdXNlIHN0eWxlOiBcInRoaXMgcGVyaW9kXCIgZm9yIHRoZSBwZXItcGVyaW9kIGZsb3dzLCBcImN1cnJlbnRseVwiIGZvciB0aGVcbiAgICogY3JlYXRlLXRpbWUgY291bnRzIHRoYXQgZGVjcmVtZW50IG9uIGRlbGV0ZSwgYW5kIG5laXRoZXIgZm9yIHRoZSBtZWFzdXJlZFxuICAgKiBzdG9yYWdlIHRvdGFsLlxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1bml0IGFuIEFERC1PTiBQQUNLIG9mIHRoaXMgcXVvdGEgaXMgdHlwZWQgaW4sIGFuZCB0aGUgZGl2aXNvciBmcm9tIHRoZVxuICAgKiByYXcgZ3JhbnQgdG8gdGhhdCB1bml0IOKAlCBzbyBhICsxMCBHQiBzdG9yYWdlIHBhY2sgb2ZmZXJzIGEgR0Igc3RlcCByYXRoZXJcbiAgICogdGhhbiBhIHBhY2sgY291bnQuXG4gICAqXG4gICAqIEFic2VudCBtZWFucyBcInR5cGUgcGFjayBjb3VudHNcIiwgd2hpY2ggaXMgcmlnaHQgd2hlcmUgdGhlIHF1b3RhIGhhcyBub1xuICAgKiBuYXR1cmFsIHVuaXQ6IFwiMSBwYWNrIG9mIEFQSSBjYWxsc1wiIHJlYWRzIGJldHRlciB0aGFuIFwiMjUwMDAgY2FsbHNcIi4gVGhlXG4gICAqIHN0ZXAgaXRzZWxmIGlzIGFsd2F5cyBkZXJpdmVkIGZyb20gdGhlIGJ1bmRsZSdzIG93biBgZ3JhbnRzYCwgbmV2ZXIgZnJvbSBhXG4gICAqIGNvbnN0YW50IGhlcmUsIGJlY2F1c2UgYSBncmFudCBpcyBlbnYtb3ZlcnJpZGFibGUuXG4gICAqL1xuICBwYWNrVW5pdD86IHsgbmFtZTogc3RyaW5nOyBwZXI6IG51bWJlciB9O1xufVxuXG5jb25zdCBHQiA9IDEwMjQgKiogMztcblxuLyoqXG4gKiBEaXNwbGF5IG1ldGFkYXRhIGZvciBldmVyeSBxdW90YSB0eXBlLiBMYWJlbHMgYXJlIHRoZSBjYW5vbmljYWwgb25lcyDigJQgdGhlXG4gKiBzdHJpbmdzIGhlcmUgYXJlIHVzZXItZmFjaW5nIGFuZCBhcmUgcmVsaWVkIG9uIGJ5IDQyOSBib2RpZXMgYW5kIG5vdGljZXMsIHNvXG4gKiB0aGV5IGNoYW5nZSBvbmx5IGRlbGliZXJhdGVseS5cbiAqL1xuZXhwb3J0IGNvbnN0IFFVT1RBX0NBVEFMT0c6IFJlYWRvbmx5PFJlY29yZDxRdW90YVR5cGUsIFF1b3RhVHlwZU1ldGE+PiA9IHtcbiAgLy8gUGVyLXBlcmlvZCBGTE9XUyDigJQgYSBjcmVhdGlvbiByYXRlLCBub3QgYSBzdG9jay4gRGVsZXRpbmcgdGhlIGVudGl0eSBkb2VzXG4gIC8vIG5vdCBnaXZlIHRoZSBzbG90IGJhY2sgKGBkZWNyZW1lbnQtb24tZGVsZXRlYCB3YXMgY29uc2lkZXJlZCBhbmQgcmVqZWN0ZWQpLFxuICAvLyBzbyB0aGUgd29yZGluZyBzYXlzIFwidGhpcyBwZXJpb2RcIiB0byBzdG9wIHRoZSBzdG9jayByZWFkaW5nLlxuICBwbHVnaW5zOiB7IGxhYmVsOiAnUGx1Z2luIGJ1aWxkJywgbGFiZWxQbHVyYWw6ICdQbHVnaW5zJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnZmxvdycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnUGx1Z2luIHZlcnNpb25zIGRlcGxveWVkIHRoaXMgcGVyaW9kJyB9LFxuICBwaXBlbGluZXM6IHsgbGFiZWw6ICdQaXBlbGluZSBjcmVhdGlvbicsIGxhYmVsUGx1cmFsOiAnUGlwZWxpbmVzJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnZmxvdycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnUGlwZWxpbmVzIGNyZWF0ZWQgdGhpcyBwZXJpb2QnIH0sXG4gIC8vIFRoZSBjYWxsIGJ1ZGdldHMuIFdISUNIIE9ORSBhIHJlcXVlc3Qgc3BlbmRzIGlzIGRlY2lkZWQgYnlcbiAgLy8gYG1ldGVyZWRRdW90YVR5cGVGb3JgLCBuZXZlciBieSB0aGUgcm91dGU6IGEgc2VydmljZS1hY2NvdW50IGtleSwgYSBQRVJTT05BTFxuICAvLyBBQ0NFU1Mga2V5IChgdG9rZW5fdXNlOiAnYXBpX2tleSdgKSBvciBhbnl0aGluZyBtaW50ZWQgd2hpbGUgaG9sZGluZyBvbmVcbiAgLy8gKGBwYXJlbnRLZXlJZGApIHNwZW5kcyBgYXV0b21hdGlvbkNhbGxzYCBJTlNURUFEIG9mIGBhcGlDYWxsc2AuXG4gIGFwaUNhbGxzOiB7IGxhYmVsOiAnQVBJIGNhbGwnLCBsYWJlbFBsdXJhbDogJ0FQSSBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ1JlcXVlc3RzIG1hZGUgYnkgcGVvcGxlIGluIGJyb3dzZXIgc2Vzc2lvbnMgdGhpcyBwZXJpb2QnIH0sXG4gIGF1dG9tYXRpb25DYWxsczogeyBsYWJlbDogJ0F1dG9tYXRpb24gY2FsbCcsIGxhYmVsUGx1cmFsOiAnQXV0b21hdGlvbiBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ1JlcXVlc3RzIG1hZGUgd2l0aCBzZXJ2aWNlLWFjY291bnQgb3IgcGVyc29uYWwgYWNjZXNzIGtleXMgdGhpcyBwZXJpb2QnIH0sXG4gIGFpQ2FsbHM6IHsgbGFiZWw6ICdBSSBjYWxsJywgbGFiZWxQbHVyYWw6ICdBSSBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ0FJIGdlbmVyYXRpb24gaW52b2NhdGlvbnMgdGhpcyBwZXJpb2QnIH0sXG4gIC8vIFRoZSBvbmUgZmxvdyBxdW90YSBvbiBhIHBlcmlvZCBvZiBpdHMgT1dOIOKAlCBhIE1PTlRILCB3aGVyZSBldmVyeSBvdGhlciBmbG93XG4gIC8vIHJvbGxzIG9uIFFVT1RBX1JFU0VUX0RBWVMgKDMgZGF5cykuIFJlbmRlcmVkIGFzIGEgQ09VTlQgYW5kIG5ldmVyIGFzIGFcbiAgLy8gZHVyYXRpb246IHRoZSB1bml0IGlzIGFuIGFic3RyYWN0IGNyZWRpdCBwcmVjaXNlbHkgc28gaXQgY2Fubm90IGJlIG1pc3JlYWQgYXNcbiAgLy8gd2FsbC1jbG9jayAoXCIxMSwyNTAgYnVpbGQgbWludXRlc1wiIHJlYWRzIGFzIDE4NyBob3VycyB3aGVuIGl0IGJ1eXMgMTI1KSwgYW5kXG4gIC8vIGZvcm1hdHRpbmcgaXQgYmFjayBpbnRvIFwiMTg3aCAzMG1cIiB3b3VsZCB1bmRvIHRoYXQuIFRoZSB3YWxsLWNsb2NrIGNvbnZlcnNpb25cbiAgLy8gYmVsb25ncyBpbiB0aGUgcHJlLWJ1aWxkIGNvc3QgaGludCwgd2hlcmUgaXQgZXhwbGFpbnMgcmF0aGVyIHRoYW4gbWlzbGVhZHMuXG4gIGNwdUNyZWRpdHM6IHsgbGFiZWw6ICdDUFUgY3JlZGl0JywgbGFiZWxQbHVyYWw6ICdDUFUgY3JlZGl0cycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ3ZDUFUtbWludXRlcyBvZiBidWlsZCBjb21wdXRlIHVzZWQgdGhpcyBtb250aCcsIHBhY2tVbml0OiB7IG5hbWU6ICdjcmVkaXRzJywgcGVyOiAxIH0gfSxcbiAgLy8gQSBNRUFTVVJFRCB0b3RhbCwgcmVjb21wdXRlZCBvbiBkZW1hbmQgcmF0aGVyIHRoYW4gY291bnRlZCDigJQgdGhlIG9uZSBxdW90YVxuICAvLyB0aGF0IGlzIG5laXRoZXIgYSBwZXJpb2QgZmxvdyBub3IgYSBjcmVhdGUtdGltZSBjb3VudC5cbiAgc3RvcmFnZUJ5dGVzOiB7IGxhYmVsOiAnUmVnaXN0cnkgc3RvcmFnZScsIGxhYmVsUGx1cmFsOiAnUmVnaXN0cnkgc3RvcmFnZScsIHJlbmRlcjogJ2J5dGVzJywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZWFzdXJlZCcsIGRlc2NyaXB0aW9uOiAnUmVnaXN0cnkgc3RvcmFnZSBjdXJyZW50bHkgaW4gdXNlJywgcGFja1VuaXQ6IHsgbmFtZTogJ0dCJywgcGVyOiBHQiB9IH0sXG4gIC8vIFJlc291cmNlLWNvdW50IGNhcHM6IGNvdW50ZWQgYXQgY3JlYXRlIHRpbWUgYW5kIERFQ1JFTUVOVEVEIG9uIGRlbGV0ZSwgc29cbiAgLy8gdGhlc2UgcmVhbGx5IGFyZSBzdG9ja3MgYW5kIFwidGhpcyBwZXJpb2RcIiB3b3VsZCBiZSB3cm9uZy5cbiAgZGFzaGJvYXJkczogeyBsYWJlbDogJ0Rhc2hib2FyZCcsIGxhYmVsUGx1cmFsOiAnRGFzaGJvYXJkcycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZXRlcmVkJywgZGVzY3JpcHRpb246ICdEYXNoYm9hcmRzIGN1cnJlbnRseSBkZWZpbmVkJyB9LFxuICBhbGVydFJ1bGVzOiB7IGxhYmVsOiAnQWxlcnQgcnVsZScsIGxhYmVsUGx1cmFsOiAnQWxlcnQgcnVsZXMnLCByZW5kZXI6ICdjb3VudCcsIGFjY3J1YWw6ICdzdG9jaycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnQWxlcnQgcnVsZXMgY3VycmVudGx5IGRlZmluZWQnIH0sXG4gIGFsZXJ0RGVzdGluYXRpb25zOiB7IGxhYmVsOiAnQWxlcnQgZGVzdGluYXRpb24nLCBsYWJlbFBsdXJhbDogJ0FsZXJ0IGRlc3RpbmF0aW9ucycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZXRlcmVkJywgZGVzY3JpcHRpb246ICdBbGVydCBkZXN0aW5hdGlvbnMgY3VycmVudGx5IGRlZmluZWQnIH0sXG4gIGlkcENvbmZpZ3M6IHsgbGFiZWw6ICdJZFAgY29uZmlndXJhdGlvbicsIGxhYmVsUGx1cmFsOiAnSWRQIGNvbmZpZ3VyYXRpb25zJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnc3RvY2snLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ0lkZW50aXR5LXByb3ZpZGVyIGNvbmZpZ3VyYXRpb25zIGN1cnJlbnRseSBkZWZpbmVkJyB9LFxuICAvLyBNRUFTVVJFRCwgbm90IG1ldGVyZWQg4oCUIHRoZSBsYWJlbCB3YXMgd3JvbmcsIG5vdCB0aGUgYmVoYXZpb3VyLiBOb3RoaW5nIGhhc1xuICAvLyBldmVyIGluY3JlbWVudGVkIGEgYGxpc3RpbmdzYCBjb3VudGVyOiBlbmZvcmNlbWVudCByZWFkcyB0aGUgbGl2ZSBjb3VudCBmcm9tXG4gIC8vIHRoZSBwbHVnaW4gc2VydmljZSdzIG93biByb3dzIChgbGlzdGluZ3MuY291bnRBY3RpdmVgKSwgd2hpY2ggSVMgdGhlIHN5c3RlbVxuICAvLyBvZiByZWNvcmQgZm9yIHdoYXQgYSBwdWJsaXNoZXIgaGFzIGxpc3RlZC4gRGVjbGFyaW5nIGl0IGBtZXRlcmVkYCBtZWFudCB0aGVcbiAgLy8gZGFzaGJvYXJkIHNob3dlZCBcIjAgb2YgTlwiIGZvcmV2ZXIgYW5kIHRoZSA4MCUvMTAwJSB0aHJlc2hvbGQgbm90aWNlcyBjb3VsZFxuICAvLyBuZXZlciBmaXJlLCBiZWNhdXNlIGB0aHJlc2hvbGQtbm90aWZpZXJgIGRyb3BzIGFueSBub3RpY2Ugd2hvc2Ugc291cmNlIGRvZXNcbiAgLy8gbm90IG1hdGNoIGBvYnNlcnZlZGAgYW5kIG5vIGluY3JlbWVudCB3YXMgZXZlciBjb21pbmcuXG4gIC8vXG4gIC8vIFdpcmluZyBhbiBpbmNyZW1lbnQgaW5zdGVhZCB3b3VsZCBoYXZlIGJlZW4gdGhlIHdyb25nIHJlcGFpcjogaXQgY3JlYXRlcyBhXG4gIC8vIFNFQ09ORCBudW1iZXIgZm9yIGEgZmFjdCB0aGUgcGx1Z2luIHNlcnZpY2UgYWxyZWFkeSBvd25zIGV4YWN0bHksIGFuZCB0aGVcbiAgLy8gdHdvIHRoZW4gZHJpZnQgb24gZXZlcnkgeWFuaywgdHJhbnNmZXIsIHN1c3BlbnNpb24gYW5kIHB1cmdlIHRoYXQgZG9lcyBub3RcbiAgLy8gcmVtZW1iZXIgdG8gZGVjcmVtZW50LiBTYW1lIHNoYXBlIGFzIGBzdG9yYWdlQnl0ZXNgLCB3aGljaCBpcyBtZWFzdXJlZCBmb3JcbiAgLy8gdGhlIHNhbWUgcmVhc29uLlxuICBsaXN0aW5nczogeyBsYWJlbDogJ1BsdWdpbiBsaXN0aW5nJywgbGFiZWxQbHVyYWw6ICdQbHVnaW4gbGlzdGluZ3MnLCByZW5kZXI6ICdjb3VudCcsIGFjY3J1YWw6ICdzdG9jaycsIG9ic2VydmVkOiAnbWVhc3VyZWQnLCBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBwbHVnaW4gbGlzdGluZ3MgeW91IHB1Ymxpc2gnIH0sXG59O1xuXG4vKipcbiAqIENvbnN1bWFibGVzIHRoYXQgYXJlIE5PVCBxdW90YSB0eXBlcyBidXQgcmVuZGVyIGJlc2lkZSB0aGVtIOKAlCBzYW1lIGxhYmVsLFxuICogc2FtZSBiYXIsIHNhbWUgY2FyZC5cbiAqXG4gKiBgc2VhdHNgIGlzIHRoZSBvbmx5IG9uZTogaXQgaXMgYSBTVE9DSyAoaG93IG1hbnkgcGVvcGxlIG1heSBiZSBvbiB0aGVcbiAqIGFjY291bnQpIHJhdGhlciB0aGFuIGEgcGVyLXBlcmlvZCBmbG93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgb3V0c2lkZVxuICogYFF1b3RhVHlwZWAgYW5kIGlzIHNvdXJjZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBxdW90YSByb2xsdXAuIEJ1dCB0aGUgYmlsbGluZ1xuICogdXNhZ2UgY2FyZCBkcmF3cyBpdCBpbiB0aGUgc2FtZSBsaXN0LCBhbmQgYmVmb3JlIHRoaXMgZW50cnkgZXhpc3RlZCB0aGF0IG9uZVxuICogcm93IGNhcnJpZWQgaXRzIG93biBpbmxpbmUgXCJTZWF0c1wiIGxhYmVsIHdoaWxlIHRoZSBmaXZlIGJlc2lkZSBpdCBjYW1lIGZyb21cbiAqIHRoZSBjYXRhbG9nIOKAlCB0aGUgcHJlY2lzZSBzcGxpdC1mYWN0IGRyaWZ0IHRoaXMgZmlsZSBleGlzdHMgdG8gcmVtb3ZlLlxuICpcbiAqIEtlZXAgdGhpcyBmb3IgdGhpbmdzIHJlbmRlcmVkIEFTIGEgY29uc3VtYWJsZS4gSXQgaXMgbm90IGEgYmFjayBkb29yIGZvclxuICogcXVvdGEgdHlwZXM6IGEgcmVhbCBxdW90YSBiZWxvbmdzIGluIHtAbGluayBRVU9UQV9DQVRBTE9HfSwgd2hlcmVcbiAqIGBSZWNvcmQ8UXVvdGFUeXBlLCDigKY+YCBmb3JjZXMgdGhlIGVudHJ5LlxuICovXG5leHBvcnQgY29uc3QgTk9OX1FVT1RBX0NPTlNVTUFCTEVfQ0FUQUxPRzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUXVvdGFUeXBlTWV0YT4+ID0ge1xuICBzZWF0czogeyBsYWJlbDogJ1NlYXQnLCBsYWJlbFBsdXJhbDogJ1NlYXRzJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnc3RvY2snLCBvYnNlcnZlZDogJ21lYXN1cmVkJywgZGVzY3JpcHRpb246ICdNZW1iZXJzIHRoaXMgYWNjb3VudCBtYXkgaGF2ZScgfSxcbn07XG5cbi8qKlxuICogRXZlcnkgZGVzY3JpYmVkIGNvbnN1bWFibGUsIHdpZGVuZWQgZm9yIGxvb2t1cHMgYnkgYSB2YWx1ZSB0aGF0IGNhbWUgb2ZmIHRoZVxuICogd2lyZS5cbiAqL1xuY29uc3QgYnlLZXk6IFJlY29yZDxzdHJpbmcsIFF1b3RhVHlwZU1ldGEgfCB1bmRlZmluZWQ+ID0ge1xuICAuLi5OT05fUVVPVEFfQ09OU1VNQUJMRV9DQVRBTE9HLFxuICAuLi5RVU9UQV9DQVRBTE9HLFxufTtcblxuLyoqXG4gKiBUaGlzIHR5cGUncyBzaW5ndWxhciBsYWJlbCwgb3IgdGhlIHJhdyBrZXkgZm9yIGEgdmFsdWUgb3V0c2lkZSB0aGUgY2F0YWxvZy5cbiAqXG4gKiBUaGUgYWNjZXNzb3JzIHRha2UgYHN0cmluZ2AgYmVjYXVzZSB0aGUgcXVvdGEgdHlwZSBvZnRlbiBhcnJpdmVzIGZyb20gdGhlIHdpcmVcbiAqIChhIDQyOSBib2R5LCBhIHF1b3RhIHJlc3BvbnNlKSB3aGVyZSBhbiB1bmtub3duIHZhbHVlIG11c3QgcmVuZGVyIGFzIHNvbWV0aGluZ1xuICogcmF0aGVyIHRoYW4gY3Jhc2ggYSBwYWdlLiBUaGUgYFF1b3RhVHlwZWAgb3ZlcmxvYWQgaXMgZm9yIGludGVybmFsIGNhbGxlcnM6IGl0XG4gKiBtYWtlcyBhIHR5cG8gYSBjb21waWxlIGVycm9yIGluc3RlYWQgb2YgYSBrZXkgcmVuZGVyZWQgYXMgYSBsYWJlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWwodHlwZTogUXVvdGFUeXBlKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWwodHlwZTogc3RyaW5nKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWwodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5sYWJlbCA/PyB0eXBlO1xufVxuXG4vKiogVGhpcyB0eXBlJ3MgUExVUkFMIGxhYmVsLCBvciB0aGUgcmF3IGtleSBmb3IgYSB2YWx1ZSBvdXRzaWRlIHRoZSBjYXRhbG9nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWxQbHVyYWwodHlwZTogUXVvdGFUeXBlKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWxQbHVyYWwodHlwZTogc3RyaW5nKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWxQbHVyYWwodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5sYWJlbFBsdXJhbCA/PyB0eXBlO1xufVxuXG4vKipcbiAqIEhvdyB0byByZW5kZXIgdGhpcyB0eXBlJ3MgdmFsdWVzLiBgY291bnRgIGZvciBhbnl0aGluZyB0aGUgY2F0YWxvZyBkb2VzIG5vdFxuICoga25vdywgc28gYW4gdW5mYW1pbGlhciB3aXJlIHZhbHVlIHJlbmRlcnMgYXMgYSBwbGFpbiBudW1iZXIuXG4gKlxuICogUmVhZCBUSElTIHJhdGhlciB0aGFuIGFza2luZyBcImlzIGl0IGJ5dGVzP1wiLiBBIGJvb2xlYW4gaGVscGVyIGRlZ3JhZGVzXG4gKiBzaWxlbnRseSB0aGUgbW9tZW50IHtAbGluayBRdW90YVJlbmRlcn0gZ3Jvd3MgYSB0aGlyZCBtZW1iZXIg4oCUIGEgbmV3IG1vZGVcbiAqIHdvdWxkIHNpbXBseSByZW5kZXIgYXMgYSBjb3VudCwgd2l0aCBub3RoaW5nIGZhaWxpbmcg4oCUIHdoZXJlYXMgYSBjYWxsZXIgdGhhdFxuICogc3dpdGNoZXMgb24gdGhpcyB2YWx1ZSBleGhhdXN0aXZlbHkgc3RvcHMgY29tcGlsaW5nIHVudGlsIGl0IGhhbmRsZXMgdGhlIG5ld1xuICogbW9kZS4gVGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlIGNhdGFsb2csIGFwcGxpZWQgdG8gaXRzIG93biBhY2Nlc3NvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90YVJlbmRlcih0eXBlOiBRdW90YVR5cGUpOiBRdW90YVJlbmRlcjtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YVJlbmRlcih0eXBlOiBzdHJpbmcpOiBRdW90YVJlbmRlcjtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YVJlbmRlcih0eXBlOiBzdHJpbmcpOiBRdW90YVJlbmRlciB7XG4gIHJldHVybiBieUtleVt0eXBlXT8ucmVuZGVyID8/ICdjb3VudCc7XG59XG5cbmNvbnN0IEJZVEVfVU5JVFMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXSBhcyBjb25zdDtcblxuLyoqXG4gKiBBIGJ5dGUgY291bnQgYXMgYSBodW1hbiBhbW91bnQg4oCUIGAxLjUgR0JgLCBgNTEyIE1CYCwgYDAgQmAuXG4gKlxuICogVGhlIE9ORSBpbXBsZW1lbnRhdGlvbjogdGhlIGZyb250ZW5kJ3MgYGZvcm1hdEJ5dGVzYCBkZWxlZ2F0ZXMgaGVyZSByYXRoZXJcbiAqIHRoYW4ga2VlcGluZyBpdHMgb3duIGNvcHksIHNvIGEgc3RvcmFnZSBmaWd1cmUgcmVhZHMgaWRlbnRpY2FsbHkgaW4gYSBxdW90YVxuICogbm90aWNlLCBhIDQwMyBleHBsYW5hdGlvbiBhbmQgdGhlIGRhc2hib2FyZC4gQmluYXJ5IHVuaXRzICgxMDI0KSwgb25lIGRlY2ltYWxcbiAqIGJlbG93IDEwIGFuZCByb3VuZGVkIGFib3ZlLCB3aGljaCBpcyB3aGF0IHRoZSBkYXNoYm9hcmQgYWxyZWFkeSByZW5kZXJlZCDigJRcbiAqIHRoaXMgbW92ZWQgdGhlIGFsZ29yaXRobSwgaXQgZGlkIG5vdCBjaGFuZ2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeXRlQW1vdW50KGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShieXRlcykgfHwgYnl0ZXMgPCAwKSByZXR1cm4gJzAgQic7XG4gIGxldCB2YWx1ZSA9IGJ5dGVzO1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlICh2YWx1ZSA+PSAxMDI0ICYmIGkgPCBCWVRFX1VOSVRTLmxlbmd0aCAtIDEpIHtcbiAgICB2YWx1ZSAvPSAxMDI0O1xuICAgIGkrKztcbiAgfVxuICByZXR1cm4gdmFsdWUgPCAxMCA/IGAke3ZhbHVlLnRvRml4ZWQoMSl9ICR7QllURV9VTklUU1tpXX1gIDogYCR7TWF0aC5yb3VuZCh2YWx1ZSl9ICR7QllURV9VTklUU1tpXX1gO1xufVxuXG4vKipcbiAqIEEgcmF3IHF1b3RhIHZhbHVlIGFzIHRoZSBhbW91bnQgYSBIVU1BTiBzaG91bGQgcmVhZCwgcGVyIHRoaXMgdHlwZSdzXG4gKiB7QGxpbmsgUXVvdGFSZW5kZXJ9IOKAlCBieXRlcyBhcyBgMjUgR0JgLCBjb3VudHMgZ3JvdXBlZCBhcyBgNjAsMDAwYC5cbiAqXG4gKiBGb3Igc2VydmVyLXNpZGUgY29weSAocXVvdGEgbm90aWNlcywgYXVkaXQgcmVhc29ucywgNDAzIGV4cGxhbmF0aW9ucyksIHdoaWNoXG4gKiBpcyB3aHkgaXQgaXMgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgZnJvbnRlbmQ6IGEgc3RvcmFnZSBub3RpY2UgdGhhdFxuICogaW50ZXJwb2xhdGVkIHRoZSByYXcgbnVtYmVyIHdvdWxkIHJlYWQgXCJ1c2VkIGFsbCAyNjg0MzU0NTYwMCBvZiBpdHMgcmVnaXN0cnlcbiAqIHN0b3JhZ2VcIi4gVGhlIGZyb250ZW5kIGhhcyBpdHMgb3duIHRoaW4gd3JhcHBlciBiZWNhdXNlIGl0IHJlbmRlcnMgYW5cbiAqIHVubGltaXRlZCAoLTEpIGxpbWl0IGFzIGDiiJ5gLCB3aGljaCBpcyBhIGRpc3BsYXkgY2hvaWNlIG5vIHNlcnZlciBjb3B5IG1ha2VzXG4gKiAodW5saW1pdGVkIG9yZ3MgYXJlIHNraXBwZWQgYmVmb3JlIGFueSBjb3B5IGlzIGdlbmVyYXRlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRRdW90YUFtb3VudCh0eXBlOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gcXVvdGFSZW5kZXIodHlwZSkgPT09ICdieXRlcycgPyBmb3JtYXRCeXRlQW1vdW50KHZhbHVlKSA6IHZhbHVlLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycpO1xufVxuXG4vKipcbiAqIEhvdyB0aGlzIHF1b3RhJ3MgdXNhZ2UgaXMgb2JzZXJ2ZWQ6IGBtZXRlcmVkYCAoaW5jcmVtZW50ZWQpIG9yIGBtZWFzdXJlZGBcbiAqIChyZWFkIG9uIGRlbWFuZCkuIFVua25vd24gd2lyZSB2YWx1ZXMgcmVhZCBhcyBgbWV0ZXJlZGAsIG1hdGNoaW5nIGV2ZXJ5XG4gKiBxdW90YSBidXQgc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhT2JzZXJ2YXRpb24odHlwZTogUXVvdGFUeXBlKTogUXVvdGFPYnNlcnZhdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YU9ic2VydmF0aW9uKHR5cGU6IHN0cmluZyk6IFF1b3RhT2JzZXJ2YXRpb247XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFPYnNlcnZhdGlvbih0eXBlOiBzdHJpbmcpOiBRdW90YU9ic2VydmF0aW9uIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5vYnNlcnZlZCA/PyAnbWV0ZXJlZCc7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGlzIHF1b3RhIHJlZmlsbHMgb24gdGhlIHBlcmlvZCAoYGZsb3dgKSBvciBwZXJzaXN0cyAoYHN0b2NrYCkuXG4gKiBVbmtub3duIHdpcmUgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGBmbG93YCwgbWF0Y2hpbmcgZXZlcnkgbWV0ZXJlZCBxdW90YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhQWNjcnVhbCh0eXBlOiBRdW90YVR5cGUpOiBRdW90YUFjY3J1YWw7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFBY2NydWFsKHR5cGU6IHN0cmluZyk6IFF1b3RhQWNjcnVhbDtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YUFjY3J1YWwodHlwZTogc3RyaW5nKTogUXVvdGFBY2NydWFsIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5hY2NydWFsID8/ICdmbG93Jztcbn1cblxuLyoqIFdoYXQgdGhpcyB0eXBlIGNvdW50cywgb3IgdGhlIGVtcHR5IHN0cmluZyBmb3IgYSB2YWx1ZSBvdXRzaWRlIHRoZSBjYXRhbG9nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhRGVzY3JpcHRpb24odHlwZTogUXVvdGFUeXBlKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhRGVzY3JpcHRpb24odHlwZTogc3RyaW5nKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhRGVzY3JpcHRpb24odHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5kZXNjcmlwdGlvbiA/PyAnJztcbn1cblxuLyoqIFRoZSBwYWNrIHVuaXQgZm9yIHRoaXMgdHlwZSwgb3IgYG51bGxgIHRvIHR5cGUgcGFjayBjb3VudHMgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90YVBhY2tVbml0KHR5cGU6IFF1b3RhVHlwZSk6IHsgbmFtZTogc3RyaW5nOyBwZXI6IG51bWJlciB9IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YVBhY2tVbml0KHR5cGU6IHN0cmluZyk6IHsgbmFtZTogc3RyaW5nOyBwZXI6IG51bWJlciB9IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YVBhY2tVbml0KHR5cGU6IHN0cmluZyk6IHsgbmFtZTogc3RyaW5nOyBwZXI6IG51bWJlciB9IHwgbnVsbCB7XG4gIHJldHVybiBieUtleVt0eXBlXT8ucGFja1VuaXQgPz8gbnVsbDtcbn1cbiJdfQ==
@@ -1,4 +1,15 @@
1
1
  import type { QuotaType } from './common.js';
2
+ import { type QuotaTierLimits } from './tier-limits.js';
3
+ /**
4
+ * The limits shape, the code-default table and the sizing arithmetic live in
5
+ * `./tier-limits.js` — dependency-free, so the BROWSER imports them
6
+ * (`@pipeline-builder/api-core/tier-limits`) instead of keeping a hand-synced
7
+ * copy. Re-exported here because this is the module every server consumer and
8
+ * the package barrel already name; what stays here is everything the env
9
+ * touches.
10
+ */
11
+ export { AUTOMATION_CALLS_SIZING, automationCallsFor, DEFAULT_TIER_LIMITS, tierLabel } from './tier-limits.js';
12
+ export type { QuotaTierLimits } from './tier-limits.js';
2
13
  /** Available quota tier identifiers.
3
14
  *
4
15
  * `unlimited` is a special tier: every quota is `-1` (uncapped) and it includes
@@ -6,168 +17,11 @@ import type { QuotaType } from './common.js';
6
17
  * metering/enforcement surface exists, so nothing is capped), and it is NEVER
7
18
  * shown or selectable when billing is enabled — see `STANDARD_TIERS`. */
8
19
  export type QuotaTier = 'developer' | 'pro' | 'team' | 'business' | 'enterprise' | 'unlimited';
9
- /** Limit values for each quota type within a tier. */
10
- export interface QuotaTierLimits {
11
- plugins: number;
12
- pipelines: number;
13
- apiCalls: number;
14
- /**
15
- * Metered API calls made by ORG SERVICE ACCOUNTS (automation), counted
16
- * instead of `apiCalls` so pipelines can't starve the org's people. See
17
- * {@link AUTOMATION_CALLS_SIZING} for how the defaults are derived.
18
- */
19
- automationCalls: number;
20
- aiCalls: number;
21
- /**
22
- * Aggregate registry storage cap in BYTES. Counted across every repo
23
- * under the org's `org-{orgId}/` namespace. -1 means unlimited.
24
- * push-gate reads this; the image-registry rejects token issuance for
25
- * `push` scope when the org's measured usage exceeds the limit.
26
- */
27
- storageBytes: number;
28
- /**
29
- * vCPU-MINUTES of plugin-build compute per MONTH — the one quota on a period
30
- * of its own (every other flow quota rolls on `QUOTA_RESET_DAYS`, 3 days).
31
- *
32
- * Derived from the `plugins` cap rather than guessed: `plugins x 10` builds a
33
- * month, at a flat 30 wall-minutes a build and 1.5 vCPU of buildkitd, so
34
- * `credits = builds x 45`. The flat per-build figure is deliberate — scaling
35
- * BOTH the build count and the per-build cost by tier made credits
36
- * superlinear in tier on the strength of an unmeasured claim, and it made a
37
- * pack's credit grant tier-dependent, which the catalogue's grant shape cannot
38
- * express.
39
- *
40
- * This is the first dimension with genuine per-unit marginal cost: every other
41
- * quota is a rate limit protecting shared infrastructure, this one is compute
42
- * the platform pays for. See `docs/plans/cpu-credits.md`.
43
- */
44
- cpuCredits: number;
45
- /** Count-quotas on the user-editable feature tables added to close per-org
46
- * DoS via spam. -1 means unlimited. */
47
- dashboards: number;
48
- alertRules: number;
49
- alertDestinations: number;
50
- idpConfigs: number;
51
- /**
52
- * Active, non-suspended plugin-ecosystem listings the org publishes
53
- * (docs/plugin-installing.md). A COUNT quota — installs never
54
- * count. -1 = unlimited. Extendable via the `listing_pack` add-on bundle.
55
- */
56
- listings: number;
57
- /**
58
- * Max org members (active users / seats). -1 = unlimited. This is the "Team"
59
- * tier differentiator — enforced at member-invite time (an invite is blocked
60
- * when active members + pending invites would exceed this).
61
- */
62
- seats: number;
63
- /**
64
- * Max designated SUPPORT CONTACTS — the members authorised to open support
65
- * cases. -1 = unlimited. Base is **0 on every tier**: support is an add-on at
66
- * every tier and included in none, so an org with no support bundle has no
67
- * contacts and cannot open a case. That makes the support paywall a quota
68
- * check rather than a feature flag.
69
- *
70
- * Like `seats` this is a tier LIMIT, not a tracked counter — enforced live at
71
- * designation time against current designations across the org subtree.
72
- * Extended per unit by the `support_standard` / `support_priority` BASELINE
73
- * bundles, which are priced per contact.
74
- */
75
- supportContacts: number;
76
- /**
77
- * How many of those contacts may be UPGRADED to premium (24×7, 8-hour
78
- * response, and the only ones who may declare `urgent`).
79
- *
80
- * A second dimension rather than a third baseline level, because premium is an
81
- * UPGRADE and not an alternative. The shape it encodes: an org buys N baseline
82
- * contacts and upgrades M of them, M ≤ N. That is what lets a 100-seat
83
- * customer give business-hours support to its three named contacts and 24×7
84
- * to the one who carries the pager — the case the mutually-exclusive ladder
85
- * could not express at all, where buying "99 standard + 1 premium" charged for
86
- * 100 units and granted one contact.
87
- *
88
- * ADDITIVE, deliberately. A premium contact costs the baseline unit PLUS the
89
- * upgrade ($19.99 + $99.99), because it is served during business hours
90
- * through the baseline and overnight through the upgrade; pricing the upgrade
91
- * as a delta would pretend the baseline were free. Base 0 on every tier, like
92
- * `supportContacts`, so the paywall stays a quota check.
93
- */
94
- supportPremiumContacts: number;
95
- /**
96
- * Reporting retention in DAYS — NOT a flow quota (never decremented, absent
97
- * from `VALID_QUOTA_TYPES`): these ride the tier-baseline + bundle-grant math
98
- * purely as an entitlement the billing service syncs to reporting's
99
- * `dora_settings`. -1 = unlimited (the sweep skips the org entirely).
100
- * `eventRetentionDays` — non-deploy `pipeline_events` (STAGE/ACTION/build).
101
- * `doraRetentionDays` — deploy events + `deployment_outcomes` + `incidents`,
102
- * and the per-org report-query window for DORA routes.
103
- * Extendable via the `retention_pack` / `dora_history_pack` add-on bundles.
104
- */
105
- eventRetentionDays: number;
106
- doraRetentionDays: number;
107
- }
108
20
  /** Full preset for a single tier (label + limits). */
109
21
  export interface QuotaTierPreset {
110
22
  label: string;
111
23
  limits: QuotaTierLimits;
112
24
  }
113
- /**
114
- * How the `automationCalls` defaults are sized — written down so the next
115
- * person to touch them argues with the arithmetic, not with the numbers.
116
- *
117
- * Every call an org's automation keys make in one pipeline RUN, itemized (the
118
- * earlier sizing counted only the plugin lookups and hand-waved the rest as
119
- * "×2"):
120
- *
121
- * plugin lookups 12 one per plugin step (self-mutating pipeline)
122
- * synth 1 the synth step fetching the pipeline config
123
- * runtime check 1 the pre-deploy runtime-check call
124
- * security-report upload 1 the scan step posting its report
125
- * registry register 1 pipeline-register stamping the deployed version
126
- * reporting ingest batches 12 the event forwarder posts ~one batch per action
127
- * --
128
- * 28 calls per run
129
- *
130
- * Per default period (`QUOTA_RESET_DAYS`, 3 days) one active pipeline running
131
- * hourly makes 28 × 24 × 3 = 2,016 calls. An org keeps far more pipelines alive
132
- * than it CREATES in a period (`pipelines` is a creation rate), so active
133
- * pipelines are taken as 4× the tier's `pipelines`. On top sits a per-ORG
134
- * constant that does not scale with pipelines: the ingest-health heartbeat
135
- * (≤ 1/minute → 1,440/day → 4,320/period). The sum gets 25% headroom (retries,
136
- * registry pushes, ad-hoc CI scripts on keys) and rounds UP to the next 10,000:
137
- *
138
- * developer 2×4×2016 + 4320 = 20,448 × 1.25 = 25,560 → 30,000
139
- * pro 5×4×2016 + 4320 = 44,640 × 1.25 = 55,800 → 60,000
140
- * team 10×4×2016 + 4320 = 84,960 × 1.25 = 106,200 → 110,000
141
- * business 20×4×2016 + 4320 = 165,600 × 1.25 = 207,000 → 210,000
142
- * enterprise 30×4×2016 + 4320 = 246,240 × 1.25 = 307,800 → 310,000
143
- *
144
- * {@link automationCallsFor} computes exactly this, and the tier tests hold the
145
- * table to it. Over the cap the 429 is SOFT for a band ({@link quotaGracePct}):
146
- * a self-mutating pipeline that hard-stopped at 100% stayed stopped until the
147
- * period reset, up to 3 days. The limits are PER PERIOD: an operator who
148
- * lengthens `QUOTA_RESET_DAYS` should scale `QUOTA_TIER_<TIER>_AUTOMATION_CALLS`
149
- * by the same factor.
150
- */
151
- export declare const AUTOMATION_CALLS_SIZING: {
152
- readonly callsPerRun: {
153
- readonly pluginLookups: 12;
154
- readonly synth: 1;
155
- readonly runtimeCheck: 1;
156
- readonly securityReportUpload: 1;
157
- readonly registryRegister: 1;
158
- readonly ingestBatches: 12;
159
- };
160
- readonly runsPerDay: 24;
161
- readonly activePipelinesPerCreation: 4;
162
- /** Ingest-health heartbeats per org per day (≤ one a minute). */
163
- readonly heartbeatsPerDay: 1440;
164
- /** Multiplier on the itemized total. */
165
- readonly headroom: 1.25;
166
- /** Defaults round UP to a multiple of this. */
167
- readonly roundTo: 10000;
168
- };
169
- /** The {@link AUTOMATION_CALLS_SIZING} formula for a tier creating `pipelines` per period. */
170
- export declare function automationCallsFor(pipelines: number, periodDays?: number): number;
171
25
  /** The soft band for `quotaType` in percent, or 0 for a type that stops hard. */
172
26
  export declare function quotaGracePct(quotaType: string): number;
173
27
  /**
@@ -182,10 +36,23 @@ export declare function quotaGracePct(quotaType: string): number;
182
36
  * to have.
183
37
  */
184
38
  export declare function enforcedQuotaLimit(quotaType: string, limit: number, gracePct?: number): number;
185
- export declare const QUOTA_TIERS: Record<QuotaTier, QuotaTierPreset>;
186
- /** All valid tier names (incl. `unlimited`). Used for validation of a *stored*
187
- * tier — `unlimited` is a valid value even though it's never offered for sale. */
39
+ /** All valid tier names (incl. `unlimited`), in ladder order. Used for validation
40
+ * of a *stored* tier — `unlimited` is a valid value even though it's never
41
+ * offered for sale. Derived from the code-default limits table, which is the one
42
+ * place a tier cannot be added without being given numbers. */
188
43
  export declare const VALID_TIERS: readonly QuotaTier[];
44
+ /**
45
+ * Every tier's preset, keyed off {@link VALID_TIERS} rather than written out
46
+ * tier by tier — a tier added to the limits table gets its preset here with no
47
+ * second edit.
48
+ *
49
+ * The label defaults to {@link tierLabel} of the key ("business" → "Business",
50
+ * "pro_plus" → "Pro Plus"), which is what all six were spelled as by hand, and
51
+ * stays overridable via `QUOTA_TIER_<TIER>_LABEL` for a deployment that wants its
52
+ * own wording — or for a key the derivation cannot get right, such as an acronym.
53
+ * Display name only: it never affects a limit.
54
+ */
55
+ export declare const QUOTA_TIERS: Record<QuotaTier, QuotaTierPreset>;
189
56
  /** The standard, billing-selectable tiers — the ones offered as purchasable plans
190
57
  * and shown in tier pickers. Derived as "every valid tier except `unlimited`",
191
58
  * which is the billing-DISABLED default and is never displayed/selectable when