@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
@@ -208,19 +208,25 @@ export const SUPERADMIN_ONLY_PERMISSIONS = [
208
208
  /**
209
209
  * Permissions that govern the PLUGIN ECOSYSTEM and may be held only inside the
210
210
  * system org (docs/plugin-publishing.md). Like
211
- * {@link SUPERADMIN_ONLY_PERMISSIONS} they are in no member/admin/owner bundle
212
- * and are never grantable through a custom Role in ANY org (platform
213
- * `sanitizePermissions` refuses them). The only holders are superadmins
214
- * (implicit-all) and members of the built-in "Ecosystem Manager" Role, which is
215
- * seeded in the system org alone from {@link ECOSYSTEM_MANAGER_PERMISSIONS} and
216
- * assignable only by a superadmin.
217
- *
218
- * `oncall:manage` is in NEITHER named role, which makes it superadmin-only in
219
- * practice. That is deliberate rather than an oversight: paging is the vendor's
220
- * own operational concern and has nothing to do with ecosystem moderation, so
221
- * widening the Ecosystem Manager role to carry it would hand the pager to
222
- * people hired to review plugins. It is not a placeholder — it gates two live
223
- * routes (the paging posture read and the test page), unlike `registry:*`.
211
+ * {@link SUPERADMIN_ONLY_PERMISSIONS} they are in no member/admin/owner bundle,
212
+ * and no Role authored in a TENANT may carry one: platform's
213
+ * `sanitizePermissions` admits them only when the author is a superadmin AND
214
+ * the Role is being written in the system org itself (`mayComposeSystemOrgRole`).
215
+ *
216
+ * So there are three grant paths, not one: a superadmin (implicit-all), one of
217
+ * the seeded system-org Roles, and a CUSTOM system-org Role a superadmin
218
+ * composed. The third is what makes the split between `plugins:moderate` and
219
+ * `publishers:verify` usable without waiting for a new seed bundle — worth
220
+ * knowing before reading either permission as "unreachable except via
221
+ * {@link ECOSYSTEM_MANAGER_PERMISSIONS}".
222
+ *
223
+ * `oncall:manage` is carried by **Platform Operator** and by no other named
224
+ * role. That split is deliberate rather than an oversight: paging is the
225
+ * vendor's own operational concern and has nothing to do with ecosystem
226
+ * moderation, so widening the Ecosystem Manager role to carry it would hand the
227
+ * pager to people hired to review plugins. It is not a placeholder — it gates
228
+ * two live routes (the paging posture read and the test page), unlike
229
+ * `registry:*`.
224
230
  */
225
231
  export const SYSTEM_ORG_ONLY_PERMISSIONS = [
226
232
  'plugins:moderate',
@@ -732,9 +738,50 @@ export const ROLE_TEMPLATES = [
732
738
  ],
733
739
  },
734
740
  ];
741
+ /**
742
+ * Seed bundle for the built-in "Ecosystem Manager" Role — the MODERATION job.
743
+ *
744
+ * It carries `plugins:moderate` and NOT `publishers:verify`, because the two are
745
+ * not peers. `plugins:moderate` is the wide surface: yank a version (which
746
+ * breaks pipelines already running it), publish an advisory (which alarms every
747
+ * consumer of a listing), rewrite the auto-approval rules (which decide what
748
+ * publishes with no human review at all), reserve names, moderate reviews,
749
+ * re-sign. `publishers:verify` is three routes — suspend, unsuspend, tier — but
750
+ * one of them GRANTS VERIFIED STATUS, which is the badge consumers read as "this
751
+ * deployment vouches for the publisher".
752
+ *
753
+ * Bundling them, as this Role used to, meant everyone hired to triage the queue
754
+ * could also mint a Verified publisher. Three mechanisms already assume the
755
+ * split can bind — `requiredDecisionPermission` per request kind, the queue's
756
+ * per-row `can(requiredPermission)`, and the approver-shortage counts that
757
+ * `EcosystemEligibility` tracks SEPARATELY for each permission — and with one
758
+ * combined Role none of them could ever discriminate.
759
+ *
760
+ * {@link PUBLISHER_VERIFIER_PERMISSIONS} is the other half.
761
+ */
735
762
  export const ECOSYSTEM_MANAGER_PERMISSIONS = [
736
763
  'plugins:read',
737
764
  'plugins:moderate',
765
+ 'messages:read',
766
+ 'observability:read',
767
+ ];
768
+ /**
769
+ * Seed bundle for the built-in "Publisher Verifier" Role — the TRUST decision.
770
+ *
771
+ * The other half of the ecosystem split described on
772
+ * {@link ECOSYSTEM_MANAGER_PERMISSIONS}: who may award Verified, suspend a
773
+ * publisher and lift a suspension. Carries `plugins:read` so the holder can see
774
+ * what a publisher ships before vouching for them, and the same two ambient
775
+ * reads as its sibling.
776
+ *
777
+ * STAFF AT LEAST TWO PEOPLE. A Verified application and an unsuspend are both
778
+ * `needsTwoPerson`, and `conflictOfInterest` refuses the same person twice, so a
779
+ * single holder cannot complete either decision alone. The console's approver
780
+ * standing notice is what surfaces that shortage — and splitting this Role out
781
+ * is what finally lets that notice report a figure its sibling's does not.
782
+ */
783
+ export const PUBLISHER_VERIFIER_PERMISSIONS = [
784
+ 'plugins:read',
738
785
  'publishers:verify',
739
786
  'messages:read',
740
787
  'observability:read',
@@ -877,6 +924,7 @@ export function hasPermission(granted, permission, isSuperAdmin) {
877
924
  */
878
925
  export const SEED_BUNDLES = {
879
926
  ecosystem_manager: { name: 'Ecosystem Manager', permissions: ECOSYSTEM_MANAGER_PERMISSIONS },
927
+ publisher_verifier: { name: 'Publisher Verifier', permissions: PUBLISHER_VERIFIER_PERMISSIONS },
880
928
  team_lead: { name: 'Team Lead', permissions: TEAM_LEAD_PERMISSIONS },
881
929
  platform_observer: { name: 'Platform Observer', permissions: PLATFORM_OBSERVER_PERMISSIONS },
882
930
  platform_operator: { name: 'Platform Operator', permissions: PLATFORM_OPERATOR_PERMISSIONS },
@@ -903,6 +951,7 @@ export const SEED_BUNDLE_IDS = Object.keys(SEED_BUNDLES);
903
951
  */
904
952
  export const SYSTEM_ORG_JOB_BUNDLES = [
905
953
  'ecosystem_manager',
954
+ 'publisher_verifier',
906
955
  'platform_observer',
907
956
  'platform_operator',
908
957
  'account_manager',
@@ -940,4 +989,4 @@ export const AUTOMATION_ACCOUNT_BUNDLES = {
940
989
  'reporting-ingest': null,
941
990
  'registry-push': null,
942
991
  };
943
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQWtQdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQXNCO0lBQ25ELE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU07SUFDcEMsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUztDQUN6RSxDQUFDO0FBRUYscUdBQXFHO0FBQ3JHLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLDBCQUEwQixDQUFDO0FBRTlELDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQTBCO0lBQ3BELGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLHlCQUF5QjtJQUNuRixnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUI7SUFDeEQsY0FBYyxFQUFFLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEQsaUJBQWlCLEVBQUUsd0JBQXdCLEVBQUUsbUJBQW1CO0lBQ2hFLGtCQUFrQixFQUFFLG1CQUFtQjtJQUN2QyxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQjtJQUMvQyw0QkFBNEIsRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEI7SUFDakYsZUFBZTtJQUNmLHFCQUFxQixFQUFFLHVCQUF1QjtJQUM5QyxvQkFBb0IsRUFBRSxzQkFBc0I7SUFDNUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxxQkFBcUI7SUFDckQsaUJBQWlCLEVBQUUsa0JBQWtCO0lBQ3JDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUI7SUFDakYsaUJBQWlCLEVBQUUsa0JBQWtCO0lB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cEIsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUE0QjtJQUM3RCxxQkFBcUI7SUFDckIsdUJBQXVCO0NBQ3hCLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHO0lBQ3hDLHFCQUFxQixFQUFFLHFCQUFxQjtJQUM1QyxtQkFBbUIsRUFBRSx1QkFBdUI7SUFDNUMsa0JBQWtCLEVBQUUsSUFBSTtJQUN4QixlQUFlLEVBQUUsSUFBSTtDQUNpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgT3JnUm9sZSB9IGZyb20gJy4vY29tbW9uLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBlcm1pc3Npb24gaWRlbnRpZmllcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2Fub25pY2FsIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9uIGlkZW50aWZpZXJzLCBpbiBgcmVzb3VyY2U6YWN0aW9uYCBmb3JtLlxuICpcbiAqIFRoZXNlIGFyZSB0aGUgT1JHLVNDT1BFRCBjYXBhYmlsaXRpZXMgYSBSb2xlIGNhbiBncmFudCAoUkJBQykuIENvYXJzZSBieVxuICogZGVzaWduIOKAlCBgOndyaXRlYCBjb3ZlcnMgY3JlYXRlL3VwZGF0ZS9kZWxldGUgZm9yIGEgcmVzb3VyY2Ug4oCUIHNvIHRoZSBjYXRhbG9nXG4gKiBhbmQgcGVybWlzc2lvbi1waWNrZXIgVUkgc3RheSBzbWFsbDsgc3BsaXQgYSBgOndyaXRlYCBpbnRvIGA6Y3JlYXRlYC9gOmRlbGV0ZWBcbiAqIGxhdGVyIGlmIGEgcmVzb3VyY2UgbmVlZHMgaXQuXG4gKlxuICogTk9UIG1vZGVsZWQgaGVyZSAoaW50ZW50aW9uYWxseSk6IHBsYXRmb3JtLW9wZXJhdG9yIGFjdGlvbnMgKG9yZyBkZWxldGUsIHRpZXIvXG4gKiBxdW90YSBvdmVycmlkZSwgdXNlciBhZG1pbiwgaW1wZXJzb25hdGlvbiwgcGxhdGZvcm0gc2V0dGluZ3MpIHN0YXkgYmVoaW5kIHRoZVxuICogZ2xvYmFsIGBpc1N1cGVyQWRtaW5gIGZsYWcsIG5vdCBhIHBlci1vcmcgcGVybWlzc2lvbjsgYW5kIGByZXF1aXJlU3RlcFVwYFxuICogKE1GQSkgLyBgcmVxdWlyZUZlYXR1cmVgIChwbGFuIGVudGl0bGVtZW50cykgcmVtYWluIG9ydGhvZ29uYWwgZ2F0ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb24gPVxuICAvLyBQaXBlbGluZXNcbiAgfCAncGlwZWxpbmVzOnJlYWQnXG4gIHwgJ3BpcGVsaW5lczp3cml0ZSdcbiAgfCAncGlwZWxpbmVzOnB1Ymxpc2gnXG4gIC8vIFRoZSBwaXBlbGluZSBSRUdJU1RSWSAoYFBPU1RgL2BERUxFVEUgL3BpcGVsaW5lcy9yZWdpc3RyeWApOiB3aGljaCBkZXBsb3llZFxuICAvLyBzdGFjayBiYWNrcyBhIHBpcGVsaW5lLCBhbmQgdGhlIHN0ZXAgbWFuaWZlc3Qgb2YgcGx1Z2luIGRpZ2VzdHMgaXQgcnVucy5cbiAgLy8gU3BsaXQgb3V0IG9mIGBwaXBlbGluZXM6d3JpdGVgIHNvIHRoZSBDb2RlQnVpbGQgc3ludGggY2FuIGtlZXAgdGhhdCByZWNvcmRcbiAgLy8gY3VycmVudCB3aXRoIGEgY3JlZGVudGlhbCB0aGF0IGNhbiBkbyBub3RoaW5nIGVsc2Ug4oCUIGEga2V5IGhvbGRpbmdcbiAgLy8gYHBpcGVsaW5lczp3cml0ZWAgY291bGQgcmV3cml0ZSBldmVyeSBwaXBlbGluZSB0aGUgb3JnIG93bnMuIFBlb3BsZSBnZXQgaXRcbiAgLy8gYmVzaWRlIGBwaXBlbGluZXM6d3JpdGVgICh0aGUgTWVtYmVyIGJ1bmRsZSk7IHRoZSBgcGlwZWxpbmUtcmVnaXN0ZXJgXG4gIC8vIHNlcnZpY2UgYWNjb3VudCBob2xkcyBpdCBhbG9uZS5cbiAgfCAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnXG4gIC8vIEdvbGRlbi1wYXRoIHBpcGVsaW5lIHRlbXBsYXRlcy4gU3BsaXQgb3V0IG9mIGBwaXBlbGluZXM6KmAgc28gYSBwbGF0Zm9ybVxuICAvLyB0ZWFtIGNhbiBjdXJhdGUgdGhlIHN0YXJ0ZXIgY2F0YWxvZyBXSVRIT1VUIHdyaXRlIGFjY2VzcyB0byBldmVyeSBwaXBlbGluZVxuICAvLyAoYW5kIHZpY2UgdmVyc2EpLiBgOnB1Ymxpc2hgIG1hcHMgdG8gdGhlXG4gIC8vIHRlbXBsYXRlIGxhZGRlcidzIGBwdWJsaWNgIHJ1bmc7IGBvcmdgIGFuZCBgcHJpdmF0ZWAgbmVlZCBvbmx5IGA6d3JpdGVgLlxuICB8ICd0ZW1wbGF0ZXM6cmVhZCdcbiAgfCAndGVtcGxhdGVzOndyaXRlJ1xuICB8ICd0ZW1wbGF0ZXM6cHVibGlzaCdcbiAgLy8gUGx1Z2luc1xuICB8ICdwbHVnaW5zOnJlYWQnXG4gIHwgJ3BsdWdpbnM6d3JpdGUnXG4gIHwgJ3BsdWdpbnM6cHVibGlzaCdcbiAgLy8gUGx1Z2luIGVjb3N5c3RlbSAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCkuIE9yZy1hc3NpZ25hYmxlOlxuICAvLyAgLSBgcGx1Z2luczppbnN0YWxsYCAgICAgICAg4oCUIGluc3RhbGwvdXBncmFkZS91bmluc3RhbGwgbGlzdGluZ3MgKG9yIFJFUVVFU1RcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gaW5zdGFsbCB3aGVuIHRoZSBvcmcncyBwb2xpY3kgbmVlZHMgYXBwcm92YWwpLlxuICAvLyAgLSBgcGx1Z2luX2luc3RhbGxzOm1hbmFnZWAg4oCUIHRoZSBvcmcncyBjb25zdW1wdGlvbiBwb2xpY3kgKyBkZWNpZGluZyBpbnN0YWxsXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzIFdJVEhJTiB0aGUgb3JnIChvcmctbG9jYWwgb25seSkuXG4gIC8vICAtIGBwdWJsaXNoZXJzOm1hbmFnZWAgICAgICDigJQgdGhlIG9yZydzIHB1Ymxpc2hlciBwcm9maWxlICsgc3VibWl0dGluZ1xuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY29zeXN0ZW0gcmVxdWVzdHMgKGV2ZXJ5IGRlY2lzaW9uIGlzIHN5c3RlbS1vcmcpLlxuICAvLyBTeXN0ZW0tb3JnLW9ubHkgKHNlZSBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlMpOlxuICAvLyAgLSBgcGx1Z2luczptb2RlcmF0ZWAgICAgICAg4oCUIGRlY2lkZSBwdWJsaXNoIHJlcXVlc3RzLCBtb2RlcmF0ZSwgeWFuaywgYWR2aXNvcmllcy5cbiAgLy8gIC0gYHB1Ymxpc2hlcnM6dmVyaWZ5YCAgICAgIOKAlCBwdWJsaXNoZXIgdGllcnMsIHByb2ZpbGUgY2hhbmdlcywgdHJhbnNmZXJzLlxuICB8ICdwbHVnaW5zOmluc3RhbGwnXG4gIHwgJ3BsdWdpbl9pbnN0YWxsczptYW5hZ2UnXG4gIHwgJ3B1Ymxpc2hlcnM6bWFuYWdlJ1xuICB8ICdwbHVnaW5zOm1vZGVyYXRlJ1xuICB8ICdwdWJsaXNoZXJzOnZlcmlmeSdcbiAgLy8gUGxhdGZvcm0gb3BlcmF0aW9ucyAoc3lzdGVtLW9yZyBvbmx5KS4gVGhlIGNyb3NzLXRlbmFudCBvcGVyYXRvciBzdXJmYWNlc1xuICAvLyB0aGF0IHVzZWQgdG8gcmVxdWlyZSB0aGUgc3VwZXJhZG1pbiBGTEFHLCBzbyBhIGRlcGxveW1lbnQgY2FuIHN0YWZmIHRoZW1cbiAgLy8gd2l0aCBhIFJvbGUgaW5zdGVhZCBvZiBoYW5kaW5nIG91dCBpbXBsaWNpdC1hbGwuIFNwbGl0IGJlY2F1c2UgdGhlIHR3byBjYXJyeVxuICAvLyBkaWZmZXJlbnQgcmlzazogcmVhZGluZyB3aGF0IGEgZGVwbG95IGNvbmZpZ3VyZWQgaXMgbm90IHRoZSBzYW1lIGFzIG1vdmluZ1xuICAvLyBhbm90aGVyIG9yZ2FuaXNhdGlvbidzIG1vbmV5LlxuICB8ICdwbGF0Zm9ybTpyZWFkJ1xuICAvLyBUaGUgY3Jvc3MtdGVuYW50IE9SRyBMSVNULCBzcGxpdCBvdXQgb2YgYHBsYXRmb3JtOnJlYWRgIGJlY2F1c2UgdGhhdCBvbmVcbiAgLy8gcGVybWlzc2lvbiB3YXMgZG9pbmcgdHdvIGpvYnMgd2l0aCBkaWZmZXJlbnQgYmxhc3QgcmFkaWk6IHJlYWRpbmcgd2hhdCBhXG4gIC8vIERFUExPWSB3YXMgY29uZmlndXJlZCB0byBkbyAoUkxTIG1vZGUsIEtNUyBwb3N0dXJlLCB0aGUgcmVuZGVyZWQgYWxlcnRcbiAgLy8gcnVsZXMpIGFuZCByZWFkaW5nIHRoZSByb3N0ZXIgb2YgZXZlcnkgQ1VTVE9NRVIuIFRocmVlIG9mIHRoZSBmb3VyIGpvYlxuICAvLyBidW5kbGVzIGNhcnJpZWQgaXQsIGFuZCBvbmx5IG9uZSBvZiB0aGVtIHdhbnRlZCB0aGUgZGVwbG95IGludGVybmFscyDigJRcbiAgLy8gQ29uc29sZSBBZG1pbmlzdHJhdG9yIGFuZCBTdXBwb3J0IEFnZW50IGdvdCB0aGVtIHB1cmVseSBiZWNhdXNlIHRoZXkgbmVlZGVkXG4gIC8vIHRvIGZpbmQgYW4gb3JnIGJ5IG5hbWUuXG4gIC8vXG4gIC8vIFNhbWUgbWlzdGFrZSwgYW5kIHNhbWUgZml4LCBhcyBgY29uc29sZXM6ZGF0YXN0b3JlYCBiZWZvcmUgaXQgd2FzIHNwbGl0IGJ5XG4gIC8vIHdoYXQgYSBtaXN0YWtlbiBncmFudCBjb3N0cy5cbiAgfCAnb3JnczpyZWFkJ1xuICB8ICdiaWxsaW5nOm9wZXJhdGUnXG4gIC8vIFRoZSBvcGVyYXRvciBjb25zb2xlcywgc3BsaXQgYnkgQkxBU1QgUkFESVVTIHJhdGhlciB0aGFuIGJ5IHByb2R1Y3QuIFRocmVlXG4gIC8vIHBlcm1pc3Npb25zIGZvciBmaXZlIGNvbnNvbGVzLCBiZWNhdXNlIHdoYXQgYSBtaXN0YWtlbiBncmFudCBjb3N0cyBkaWZmZXJzXG4gIC8vIGJ5IGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBhdCBlYWNoIHN0ZXA6XG4gIC8vXG4gIC8vICAtIGBvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbmAg4oCUIEdyYWZhbmEgYW5kIEtpYWxpLiBSZWFkLW9ubHkgdmlld3M7IHRoZSB3b3JzdFxuICAvLyAgICBvdXRjb21lIG9mIGEgbWlzdGFrZW4gZ3JhbnQgaXMgc2VlaW5nIHRlbGVtZXRyeS5cbiAgLy8gIC0gYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgICAgIOKAlCBwZ0FkbWluIGFuZCBtb25nby1leHByZXNzLiBBIGRhdGFiYXNlIHNoZWxsXG4gIC8vICAgIG92ZXIgZXZlcnkgdGVuYW50J3Mgcm93czogaXQgY2FuIHJlYWQgYW5kIHJld3JpdGUgdGVuYW50IGRhdGEsIGJ1dCB0aGVcbiAgLy8gICAgYXVkaXQgY2hhaW4gbGl2ZXMgZWxzZXdoZXJlLCBzbyB0aGUgZGFtYWdlIGlzIHJlY29yZGVkLlxuICAvLyAgLSBgb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuYCAgIOKAlCB0aGUgUnVzdEZTIChTMykgY29uc29sZS4gSXQgY2FuIExJU1QgYW5kXG4gIC8vICAgIERFTEVURSBvYmplY3RzIGluIHRoZSByZWdpc3RyeSwgTG9raSwgVGhhbm9zLCBwbHVnaW4tYnVpbGQgYW5kXG4gIC8vICAgIGF1ZGl0LWNoYWluIGJ1Y2tldHMuIFNwbGl0IGZyb20gdGhlIHBhaXIgYWJvdmUgYmVjYXVzZSB0aGUgdHdvIGFyZSB0aGVcbiAgLy8gICAgdHdvIEhBTFZFUyBvZiB0aGUgYXVkaXQgdGFtcGVyLWV2aWRlbmNlIGRlc2lnbjogdGhlIGNoYWluJ3MgSE1BQyBrZXlcbiAgLy8gICAgbGl2ZXMgb3V0c2lkZSB0aGUgREIsIHNvIGEgTW9uZ28gc2hlbGwgY2FuIHRhbXBlciBidXQgY2Fubm90IGZvcmdlIGFcbiAgLy8gICAgY29uc2lzdGVudCBjaGFpbiDigJQgZXhjZXB0IGJ5IHRydW5jYXRpbmcgdGhlIHRhaWwsIHdoaWNoIGEgY2hhaW4gY2Fubm90XG4gIC8vICAgIHNlZSBmcm9tIHRoZSBpbnNpZGUsIGFuZCB0aGUgZGVmZW5jZSBhZ2FpbnN0IFRIQVQgaXMgdGhlIHNpZ25lZFxuICAvLyAgICBjaGFpbi1oZWFkIGV4cG9ydCB0byBvYmplY3Qgc3RvcmFnZS4gT25lIHNoZWxsIGNhbiB0cnVuY2F0ZTsgdGhlIG90aGVyXG4gIC8vICAgIGNhbiBkZWxldGUgdGhlIGhlYWRzIHRoYXQgd291bGQgZXhwb3NlIHRoZSB0cnVuY2F0aW9uLlxuICAvL1xuICAvLyBBbGwgdGhyZWUgYXJlIHN5c3RlbS1vcmctb25seSwgc28gbm9uZSBjYW4gYmUgaGVsZCBpbnNpZGUgYSB0ZW5hbnQsIGFuZCBvbmx5XG4gIC8vIHRoZSBmaXJzdCBpcyBpbiB0aGUgUGxhdGZvcm0gT3BlcmF0b3IgYnVuZGxlOiBzdGFmZmluZyBhbiBvcGVyYXRvciBtdXN0IG5ldmVyXG4gIC8vIGhhbmQgb3ZlciBhIGRhdGEgc2hlbGwgYXMgYSBzaWRlIGVmZmVjdC4gR3JhbnRpbmcgZWl0aGVyIG9mIHRoZSBvdGhlciB0d28gaXNcbiAgLy8gYSBzZXBhcmF0ZSwgZXhwbGljaXQgYWN0IGJ5IGEgc3VwZXJhZG1pbiBjb21wb3NpbmcgYSBSb2xlIGZvciBleGFjdGx5IHRoYXRcbiAgLy8gcHVycG9zZS5cbiAgLy9cbiAgLy8gV0hBVCBUSEUgU1BMSVQgRE9FUyBOT1QgRE8sIHNvIG5vYm9keSBidWlsZHMgb24gaXQ6IGl0IGlzIG5vdCBhIGNvbnRhaW5tZW50XG4gIC8vIGJvdW5kYXJ5LiBSb2xlcyBsaXZlIGluIE1vbmdvIChgY29sbGVjdGlvbjogJ3JvbGVzJ2ApLCBzbyBhXG4gIC8vIGBkYXRhYmFzZV9jb25zb2xlOm9wZW5gIGhvbGRlciBjYW4gd3JpdGUgdGhhdCBjb2xsZWN0aW9uIGFuZCBncmFudCB0aGVtc2VsdmVzXG4gIC8vIGBvYmplY3RzdG9yZV9jb25zb2xlOm9wZW5gIOKAlCBkYXRhc3RvcmUgY29udGFpbnMgb2JqZWN0c3RvcmUgYnkgZXNjYWxhdGlvbi4gVGhlXG4gIC8vIHNwbGl0IGV4cHJlc3NlcyBpbnRlbnQsIGtlZXBzIHRoZSBkZWZhdWx0IGdyYW50IHNtYWxsIGFuZCBnaXZlcyBlYWNoIGNsYXNzXG4gIC8vIGl0cyBvd24gcmVmdXNhbCBzaWduYWwuIFdoYXQgYWN0dWFsbHkgcHJvdGVjdHMgdGhlIGF1ZGl0IGhlYWRzIGZyb20gd2hvZXZlclxuICAvLyBvcGVucyB0aGF0IGNvbnNvbGUgaXMgUzMgT2JqZWN0IExvY2sgd2l0aCBhIHJldGFpbi11bnRpbC1kYXRlXG4gIC8vIChgcGxhdGZvcm0vc3JjL3NlcnZpY2VzL2F1ZGl0LWhlYWQtZXhwb3J0LnRzYCksIHdoaWNoIGhvbGRzIHJlZ2FyZGxlc3Mgb2ZcbiAgLy8gYW55IHBlcm1pc3Npb24gaGVyZS5cbiAgfCAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nXG4gIHwgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbidcbiAgfCAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJ1xuICAvLyBPbi1jYWxsIChzeXN0ZW0tb3JnIG9ubHkpLiBSZWFkcyB0aGUgcGFnaW5nIFBPU1RVUkUgYW5kIHNlbmRzIGEgdGVzdCBwYWdlLlxuICAvLyBOb3QgYSBzY2hlZHVsZSBlZGl0b3Ig4oCUIHRoZSBwcm92aWRlciBvd25zIHRoZSByb3RhIOKAlCBhbmQgZGVsaWJlcmF0ZWx5IG5vdCBhXG4gIC8vIHNldHRpbmdzIHN1cmZhY2UgZWl0aGVyLCBiZWNhdXNlIGV2ZXJ5IGtub2IgaXMgb3BlcmF0b3Itc2lkZSBlbnYuIFdoYXQgaXRcbiAgLy8gZ3JhbnRzIGlzIHRoZSBvbmUgdGhpbmcgYSBwcm9kdWN0IHN1cmZhY2UgY2FuIGdpdmUgdGhhdCBhIHNoZWxsIGNhbm5vdDpcbiAgLy8gXCJ3aWxsIHdlIGFjdHVhbGx5IGJlIHBhZ2VkXCIsIGFuc3dlcmFibGUgd2l0aG91dCBjbHVzdGVyIGFjY2Vzcy5cbiAgfCAnb25jYWxsOm1hbmFnZSdcbiAgLy8gVGhlIHZlbmRvcidzIG90aGVyIG9wZXJhdGlvbmFsIFRBU0tTIChzeXN0ZW0gb3JnIG9ubHkpLiBFYWNoIGV4aXN0cyBzbyBhXG4gIC8vIHN1cGVyYWRtaW4gY2FuIHN0YWZmIG9uZSBqb2Igd2l0aCBhIFJvbGUgaW5zdGVhZCBvZiB0aGUgc3VwZXJhZG1pbiBmbGFnIOKAlFxuICAvLyBiZWZvcmUgdGhlc2UsIDM0IHJvdXRlcyB3ZXJlIHJlYWNoYWJsZSBvbmx5IGJ5IHNvbWVvbmUgd2hvIGFsc28gaGVsZFxuICAvLyBpbXBlcnNvbmF0aW9uLCBhIGRhdGFiYXNlIHNoZWxsIGFuZCB0aGUgYWJpbGl0eSB0byBtaW50IGFub3RoZXIgc3VwZXJhZG1pbi5cbiAgLy9cbiAgLy8gU3VwcG9ydCBkZXNrLCBzcGxpdCBpbiB0d28gYmVjYXVzZSB0aGUgY29udGVudCBpcyByZXVzZWQgYWNyb3NzIGV2ZXJ5XG4gIC8vIGN1c3RvbWVyIHdoaWxlIGEgY2FzZSBiZWxvbmdzIHRvIG9uZTogYHN1cHBvcnRfY2FzZXM6d3JpdGVgIGlzIHRoZSBkZXNrJ3NcbiAgLy8gb3duIHdvcmsgKHRyaWFnZSwgYXNzaWdubWVudCwgc2V2ZXJpdHksIGludGVybmFsIG5vdGVzLCByZWNvcmRpbmcgYW5cbiAgLy8gaW5jaWRlbnQgYWdhaW5zdCBhIHN1cHBvcnQgY29udHJhY3QpLCBgc3VwcG9ydF9jb250ZW50OndyaXRlYCBpcyBhdXRob3JpbmdcbiAgLy8gdGhlIGNhbm5lZCByZXBsaWVzLiBFYWNoIGdhdGVzIGl0cyB0YXNrJ3MgUkVBRFMgYXMgd2VsbCBhcyBpdHMgd3JpdGVzLFxuICAvLyBhZ2FpbnN0IHRoZSB1c3VhbCBjb252ZW50aW9uLCBiZWNhdXNlIHRoZXNlIHRhYmxlcyBjYXJyeSBubyBgb3JnX2lkYCDigJQgdGhlcmVcbiAgLy8gaXMgbm8gdGVuYW5jeSBib3VuZGFyeSB1bmRlcm5lYXRoIHRvIGZhbGwgYmFjayBvbi5cbiAgfCAnc3VwcG9ydF9jYXNlczp3cml0ZSdcbiAgfCAnc3VwcG9ydF9jb250ZW50OndyaXRlJ1xuICAvLyBDcm9zcy10ZW5hbnQgc3Vic2NyaXB0aW9ucy4gUmVhZCBpcyBzcGxpdCBmcm9tIHdyaXRlIGJlY2F1c2UgYSByZWFkLW9ubHlcbiAgLy8gaG9sZGVyIGlzIGEgcmVhbCBqb2IgaGVyZTogc29tZW9uZSB3aG8gcmVwb3J0cyBvbiByZXZlbnVlIGFuZCBwbGFuIG1peFxuICAvLyB3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hhbmdlIGEgcGxhbiBvciBjYW5jZWwgb25lLlxuICB8ICdzdWJzY3JpcHRpb25zOnJlYWQnXG4gIHwgJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJ1xuICAvLyBUaGUgb3JnIGxpZmVjeWNsZSBBQ1JPU1MgdGVuYW50czogcmVuYW1lLCBkZWxldGUsIGNoYW5nZSB0aWVyLCBtb3ZlIHVuZGVyIGFcbiAgLy8gbmV3IHBhcmVudC4gRGlzdGluY3QgZnJvbSBgb3JnX3NldHRpbmdzOndyaXRlYCwgd2hpY2ggaXMgYW4gb3JnIGFjdGluZyBvblxuICAvLyBpdHNlbGYuXG4gIHwgJ29yZ3M6bWFuYWdlJ1xuICAvLyBDcm9zcy10ZW5hbnQgcXVvdGEgd3JpdGVzLiBUaGUgbWF0Y2hpbmcgcmVhZHMgKGAvcXVvdGFzL2FsbGAsIGAvYXQtcmlza2ApXG4gIC8vIHJpZGUgYHBsYXRmb3JtOnJlYWRgIHdpdGggdGhlIHJlc3Qgb2YgdGhlIG9wZXJhdG9yIGRhc2hib2FyZCwgc28gc29tZW9uZVxuICAvLyB3YXRjaGluZyBmb3IgZXhoYXVzdGlvbiBkb2VzIG5vdCBuZWVkIHRoZSBhYmlsaXR5IHRvIHJhaXNlIGEgbGltaXQuXG4gIHwgJ3F1b3RhczptYW5hZ2UnXG4gIC8vIFRoZSBwbHVnaW4gQlVJTEQgcXVldWUg4oCUIGRlcHRoLCBzdGFsbHMsIGFuZCBwdXJnaW5nIHRoZSBkZWFkLWxldHRlciBxdWV1ZS5cbiAgLy8gRGlzdGluY3QgZnJvbSBgcGx1Z2luczptb2RlcmF0ZWAsIHdoaWNoIGlzIGVjb3N5c3RlbSBnb3Zlcm5hbmNlOiB0aGlzIGlzXG4gIC8vIGluZnJhc3RydWN0dXJlLCBhbmQgdGhlIHBlb3BsZSB3aG8gcnVuIGl0IGFyZSBub3QgdGhlIHBlb3BsZSB3aG8gcmV2aWV3XG4gIC8vIHN1Ym1pc3Npb25zLlxuICB8ICdwbHVnaW5fcXVldWU6bWFuYWdlJ1xuICAvLyBDb21wbGlhbmNlXG4gIHwgJ2NvbXBsaWFuY2U6cmVhZCdcbiAgfCAnY29tcGxpYW5jZTp3cml0ZSdcbiAgLy8gTWVtYmVycyAmIGFjY2Vzc1xuICB8ICdtZW1iZXJzOm1hbmFnZSdcbiAgfCAncm9sZXM6bWFuYWdlJ1xuICB8ICdpbnZpdGF0aW9uczptYW5hZ2UnXG4gIC8vIE9yZy1zY29wZWQgc2VydmljZSBhY2NvdW50cyAobm9uLWh1bWFuIHByaW5jaXBhbHMpIGFuZCB0aGVpciBhY2Nlc3Mga2V5cy5cbiAgLy8gU3BsaXQgb3V0IG9mIGBtZW1iZXJzOm1hbmFnZWAgYmVjYXVzZSBhIHNlcnZpY2UgYWNjb3VudCBpcyBhIENSRURFTlRJQUxcbiAgLy8gaG9sZGVyLCBub3QgYSBwZXJzb246IGdyYW50aW5nIHNvbWVvbmUgdGhlIGFiaWxpdHkgdG8gbWludCBsb25nLWxpdmVkXG4gIC8vIG1hY2hpbmUga2V5cyBpcyBhIGRpZmZlcmVudCBkZWNpc2lvbiBmcm9tIGxldHRpbmcgdGhlbSBtYW5hZ2UgdGhlIHJvc3Rlci5cbiAgfCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnXG4gIC8vIE9ic2VydmFiaWxpdHlcbiAgfCAnZGFzaGJvYXJkczpyZWFkJ1xuICB8ICdkYXNoYm9hcmRzOndyaXRlJ1xuICB8ICdvYnNlcnZhYmlsaXR5OnJlYWQnXG4gIHwgJ29ic2VydmFiaWxpdHk6d3JpdGUnXG4gIC8vIGBsb2dzOmV4cG9ydGAgaXMgc3BsaXQgT1VUIG9mIGBvYnNlcnZhYmlsaXR5OnJlYWRgIGRlbGliZXJhdGVseS4gUmVhZGluZ1xuICAvLyBsb2dzIGluIHRoZSBVSSBpcyBwYWdlZCBhbmQgZXBoZW1lcmFsOyBFWFBPUlRJTkcgdGhlbSBpcyBidWxrIGVncmVzcyB0aGF0XG4gIC8vIGxlYXZlcyB0aGUgYnVpbGRpbmcgYW5kIG91dGxpdmVzIGEgcmV2b2tlZCBzZXNzaW9uLCBzbyBhbiBvcmcgYWRtaW4gbXVzdCBiZVxuICAvLyBhYmxlIHRvIGdyYW50IGxvZyB2aWV3aW5nIHdpdGhvdXQgZ3JhbnRpbmcgZG93bmxvYWRzLlxuICB8ICdsb2dzOmV4cG9ydCdcbiAgLy8gVGhlIG9yZydzIG93biBoYXNoLWNoYWluZWQgYXVkaXQgdHJhaWwuIE9SRy1BU1NJR05BQkxFLCB1bmxpa2UgdGhlIHBsYXRmb3JtXG4gIC8vIG9wZXJhdGlvbnMgcGFpcjogdGhlIHJvd3MgYW4gb3JnIHJlYWRzIGFyZSBpdHMgb3duICh0aGUgcXVlcnkgcHJlZGljYXRlIGlzXG4gIC8vIGBvcmdJZGAgT1IgYGFmZmVjdGVkT3JnSWRgKSwgc28gZGVsZWdhdGluZyBpdCBpcyBhbiBvcmcncyBkZWNpc2lvbiDigJQgYVxuICAvLyBjb21wbGlhbmNlIHJldmlld2VyIGNhbiBiZSBnaXZlbiB0aGUgdHJhaWwgd2l0aG91dCBiZWluZyBtYWRlIGFuIGFkbWluIG9mXG4gIC8vIGV2ZXJ5dGhpbmcgdGhhdCBwcm9kdWNlZCBpdC4gUmVhZC1vbmx5IGJ5IGNvbnN0cnVjdGlvbjsgdGhlcmUgaXMgbm8gd3JpdGUuXG4gIHwgJ2F1ZGl0OnJlYWQnXG4gIC8vIEluc2lnaHRzXG4gIHwgJ3JlcG9ydHM6cmVhZCdcbiAgfCAncmVwb3J0czpyb2xsdXAnXG4gIC8vIFN0YWtlaG9sZGVyIHJlcG9ydHMuIGByZXBvcnRzOnJlYWRgIHN0YXlzIHRoZSBGUkVFIG9uLWRlbWFuZCBkYXNoYm9hcmQgcmVhZDtcbiAgLy8gdGhlc2UgdHdvIGFyZSB0aGUgYWRkLW9uJ3Mgd3JpdGUgc3VyZmFjZSDigJQgYGF1dGhvcmAgc2F2ZXMvc2NoZWR1bGVzL2RyYWZ0cyBhXG4gIC8vIHJlcG9ydCwgYHNoYXJlYCBwdWJsaXNoZXMgaXQgYmV5b25kIHRoZSBwbGF0Zm9ybSAoUERGLCBlbWFpbCwgc2hhcmUgbGlua3MpLlxuICAvLyBTcGxpdCBiZWNhdXNlIHB1Ymxpc2hpbmcgZXh0ZXJuYWxseSBpcyBhIGRpZmZlcmVudCByaXNrIGZyb20gY29tcG9zaW5nOlxuICAvLyBhIGxlYWQgY2FuIGJlIGFsbG93ZWQgdG8gYnVpbGQgcmVwb3J0cyB3aXRob3V0IGJlaW5nIGFsbG93ZWQgdG8gZW1haWwgdGhlbSBvdXQuXG4gIHwgJ3JlcG9ydHM6d3JpdGUnXG4gIHwgJ3JlcG9ydHM6cHVibGlzaCdcbiAgLy8gTWVzc2FnaW5nXG4gIHwgJ21lc3NhZ2VzOnJlYWQnXG4gIHwgJ21lc3NhZ2VzOndyaXRlJ1xuICAvLyBCaWxsaW5nICYgcXVvdGFzXG4gIHwgJ2JpbGxpbmc6cmVhZCdcbiAgfCAnYmlsbGluZzptYW5hZ2UnXG4gIHwgJ3F1b3RhczpyZWFkJ1xuICAvLyBJbXBlcnNvbmF0aW9uIOKAlCB2aWV3aW5nIHRoZSBwbGF0Zm9ybSBhcyBzb21lYm9keSBlbHNlLiBUaHJlZSBpZHMsIGJlY2F1c2VcbiAgLy8gdGhyZWUgZGlmZmVyZW50IHBhcnRpZXMgYXJlIGludm9sdmVkIGFuZCBlYWNoIGRlY2lzaW9uIGJlbG9uZ3MgdG8gYVxuICAvLyBkaWZmZXJlbnQgb25lIG9mIHRoZW0gKGRvY3MvcGVybWlzc2lvbnMubWQjaW1wZXJzb25hdGlvbik6XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOm9wZW5gICAgdGhlIFZFTkRPUiBvcGVuaW5nIGEgY3Jvc3MtdGVuYW50IHNlc3Npb24sIHdoaWNoXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3lzdGVtLW9yZy1vbmx5IGFuZCBzdGlsbCBjb25zZW50LWdhdGVkO1xuICAvLyAgLSBgdGVhbV9hY2Nlc3M6b3BlbmAgICAgIGEgUEFSRU5UIG9yZydzIGFkbWluIHZpZXdpbmcgb25lIG9mIGl0cyBvd24gdGVhbXMnXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVycywgd2hpY2ggbmV2ZXIgbGVhdmVzIHRoZSB0ZW5hbnQ7XG4gIC8vICAtIGBpbXBlcnNvbmF0aW9uOmFwcHJvdmVgIHRoZSBURU5BTlQgYW5zd2VyaW5nIGEgY29uc2VudCByZXF1ZXN0LlxuICAvLyBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIGJlbG93IGlzIGEgZm91cnRoIHRoaW5nIGFnYWluOiB0aGUgUE9MSUNZIHRoYXRcbiAgLy8gZGVjaWRlcyB3aGV0aGVyIGNvbnNlbnQgaXMgbmVlZGVkIGF0IGFsbC5cbiAgfCAnaW1wZXJzb25hdGlvbjpvcGVuJ1xuICB8ICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnXG4gIHwgJ3RlYW1fYWNjZXNzOm9wZW4nXG4gIC8vIFJlZ2lzdHJ5LiBUaHJlZSBydW5ncywgYmVjYXVzZSB0aGUgd3JpdGUgaGFsZiBoYXMgdHdvIHZlcnkgZGlmZmVyZW50XG4gIC8vIGJsYXN0IHJhZGlpOiBgd3JpdGVgIENPUElFUyBhIG1hbmlmZXN0IChhZGRpdGl2ZSDigJQgaXQgY3JlYXRlcyBhIHRhZyxcbiAgLy8gbm90aGluZyBzdG9wcyByZXNvbHZpbmcpLCBgcHVyZ2VgIERFTEVURVMgb25lIChhIHRlbmFudCdzIHBpcGVsaW5lIG9yIGFcbiAgLy8gZGlnZXN0LXBpbm5lZCBwbHVnaW4gaW1hZ2UgY2FuIHN0b3AgcmVzb2x2aW5nLCB3aXRoIG5vIHVuZG8pLlxuICB8ICdyZWdpc3RyeTpyZWFkJ1xuICB8ICdyZWdpc3RyeTp3cml0ZSdcbiAgfCAncmVnaXN0cnk6cHVyZ2UnXG4gIC8vIE9yZ2FuaXphdGlvbiBzZXR0aW5ncy4gRm91ciBSRVNPVVJDRVMsIGVhY2ggd2l0aCB0aGUgYDp3cml0ZWAgYWN0aW9uLCByYXRoZXJcbiAgLy8gdGhhbiBvbmUgYG9yZ2AgcmVzb3VyY2Ugd2l0aCBmb3VyIG5vdW4tc2hhcGVkIGFjdGlvbnMg4oCUIHRoZXNlIGFyZSB0aGUgb3JnJ3NcbiAgLy8gb3duIGNvbmZpZ3VyYXRpb24gc3RhdGUsIHdoaWNoIGlzIHdoYXQgYDp3cml0ZWAgbWVhbnMgaGVyZSAoYDptYW5hZ2VgIGlzXG4gIC8vIHJlc2VydmVkIGZvciBhZG1pbmlzdGVyaW5nIGEgY29sbGVjdGlvbiBvZiBvdGhlciBlbnRpdGllczogbWVtYmVycywgcm9sZXMsXG4gIC8vIGludml0YXRpb25zLCBzZXJ2aWNlIGFjY291bnRzLCBiaWxsaW5nKS5cbiAgLy9cbiAgLy8gIC0gYG9yZ19zZXR0aW5nczp3cml0ZWAgICAgICDigJQgZ2VuZXJhbCBvcmcgc2V0dGluZ3MgKyBBSSBjb25maWcuXG4gIC8vICAtIGBvcmdfaWRwOndyaXRlYCAgICAgICAgICAg4oCUIFNTTyAvIElkUCBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6IGNvbnRyb2xzIGxvZ2luKS5cbiAgLy8gIC0gYG9yZ19rbXM6d3JpdGVgICAgICAgICAgICDigJQgY3VzdG9tZXItbWFuYWdlZCBLTVMga2V5IGNvbmZpZ3VyYXRpb25cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZW5zaXRpdmU6IGNvbnRyb2xzIGVuY3J5cHRpb24gb2Ygb3JnIGRhdGEpLlxuICAvLyAgLSBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIOKAlCB0aGUgaW1wZXJzb25hdGlvbiBwb2xpY3kgKHNlbnNpdGl2ZTogY29udHJvbHNcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdobyBtYXkgVklFVyB0aGUgb3JnJ3MgZGF0YSBhcyBhIG1lbWJlcikuXG4gIC8vXG4gIC8vIFRoZSBsYXN0IHRocmVlIHdlcmUgc3BsaXQgT1VUIG9mIGBvcmdfc2V0dGluZ3M6d3JpdGVgIHNvIGEgY3VzdG9tIHJvbGUgY2FuXG4gIC8vIGdyYW50IGdlbmVyYWwgc2V0dGluZ3MgV0lUSE9VVCB0aGUgc2Vuc2l0aXZlIHN1cmZhY2VzIOKAlCBhIFwic2V0dGluZ3MgbWFuYWdlclwiXG4gIC8vIHJvbGUgZm9yIG9yZyBuYW1lIG9yIEFJIHByb3ZpZGVyIG11c3Qgbm90IGFsc28gYmUgYWJsZSB0byBzd2l0Y2ggdGhlIG9yZyB0b1xuICAvLyBgb3BlbmAuIEFsbCByZW1haW4gb3JnLWFzc2lnbmFibGUgYW5kIGFyZSBzZWVkZWQgaW50byB0aGUgYWRtaW4vb3duZXJcbiAgLy8gYnVuZGxlcyAodmlhIE9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TKSBzbyBleGlzdGluZyBhZG1pbnMga2VlcCBmdWxsXG4gIC8vIGFjY2Vzcy5cbiAgfCAnb3JnX3NldHRpbmdzOndyaXRlJ1xuICB8ICdvcmdfaWRwOndyaXRlJ1xuICB8ICdvcmdfa21zOndyaXRlJ1xuICB8ICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZSc7XG5cbi8qKlxuICogVGhlIENMT1NFRCBzZXQgb2YgYWN0aW9ucyBhIHBlcm1pc3Npb24gaWQgbWF5IGVuZCBpbiDigJQgdGhlIHNlY29uZCBoYWxmIG9mIHRoZVxuICogYHJlc291cmNlOmFjdGlvbmAgc3RyYXRlZ3kgdGhlIGRvY3MgZGVzY3JpYmUuXG4gKlxuICogSXQgaXMgY2xvc2VkIGZvciBvbmUgY29uY3JldGUgcmVhc29uOiBgaXNNdXRhdGlvblBlcm1pc3Npb25gIChmcm9udGVuZFxuICogYGxpYi9hdXRoLWhlbHBlcnMudHNgKSBjbGFzc2lmaWVzIHJlYWQgdnMgd3JpdGUgQlkgU1VGRklYLCBhbmQgdGhhdCBpcyB3aGF0XG4gKiBkaXNhYmxlcyBldmVyeSB3cml0ZSBhZmZvcmRhbmNlIGR1cmluZyBhIHJlYWQtb25seSBpbXBlcnNvbmF0aW9uIHNlc3Npb24uIEFcbiAqIG5vdW4tc2hhcGVkIGFjdGlvbiAodGhlIGZvcm1lciBgb3JnOnNldHRpbmdzYCBhbmQgYGNvbnNvbGVzOmRhdGFzdG9yZWApIGNhbm5vdCBiZSBjbGFzc2lmaWVkXG4gKiBieSBuYW1lLCBzbyBlYWNoIG9uZSBoYWQgdG8gYmUgaGFuZC1saXN0ZWQg4oCUIGFuZCBhIHBlcm1pc3Npb24gYWRkZWQgd2l0aG91dFxuICogcmVtZW1iZXJpbmcgdGhhdCBsaXN0IHJlbmRlcnMgYW4gZW5hYmxlZCBjb250cm9sIHRoYXQgZGVhZC1lbmRzIG9uIGEgNDAzLlxuICpcbiAqIFJlYWRzIGFyZSBgOnJlYWRgIGFuZCBgOnJvbGx1cGAgKGEgcmVhZC1WSVNJQklMSVRZIHNjb3BlKS4gRXZlcnl0aGluZyBlbHNlIGlzXG4gKiBhIHdyaXRlLiBUaGUgZml2ZSBkb21haW4gdmVyYnMgYXJlIGtlcHQgYmVjYXVzZSBlYWNoIG5hbWVzIGFuIGFjdGlvbiB3aXRoIG5vXG4gKiBzeW5vbnltIGluIHRoaXMgdm9jYWJ1bGFyeSDigJQgYDpleHBvcnRgIGlzIGVncmVzcyByYXRoZXIgdGhhbiBtdXRhdGlvbixcbiAqIGA6aW5zdGFsbGAgaXMgY29uc3VtcHRpb24gcmF0aGVyIHRoYW4gYXV0aG9yaW5nLCBgOm1vZGVyYXRlYCBhbmQgYDp2ZXJpZnlgIGFyZVxuICogZWNvc3lzdGVtIGRlY2lzaW9ucywgYW5kIGA6b3BlcmF0ZWAgbW92ZXMgYW5vdGhlciB0ZW5hbnQncyBtb25leS5cbiAqXG4gKiBgUEVSTUlTU0lPTl9JRF9TSEFQRWAgYW5kIHRoaXMgbGlzdCBhcmUgYXNzZXJ0ZWQgb3ZlciB0aGUgd2hvbGUgY2F0YWxvZyBpblxuICogYXBpLWNvcmUncyBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYCwgc28gYWRkaW5nIGFuIG9mZi1zdHJhdGVneSBpZCBmYWlsc1xuICogdGhlcmUgcmF0aGVyIHRoYW4gYXQgYSA0MDMuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0FDVElPTlM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAncmVhZCcsICdyb2xsdXAnLFxuICAnd3JpdGUnLCAnbWFuYWdlJywgJ3B1Ymxpc2gnLCAnb3BlbicsXG4gICdleHBvcnQnLCAnaW5zdGFsbCcsICdtb2RlcmF0ZScsICd2ZXJpZnknLCAnb3BlcmF0ZScsICdwdXJnZScsICdhcHByb3ZlJyxcbl07XG5cbi8qKiBgcmVzb3VyY2U6YWN0aW9uYCwgd2hlcmUgcmVzb3VyY2UgaXMgYHNuYWtlX2Nhc2VgIGFuZCBhY3Rpb24gaXMgaW4ge0BsaW5rIFBFUk1JU1NJT05fQUNUSU9OU30uICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9JRF9TSEFQRSA9IC9eW2Etel1bYS16MC05X10qOlthLXpdKyQvO1xuXG4vKiogQWxsIHZhbGlkIHBlcm1pc3Npb25zIChvcmRlciBkZXRlcm1pbmVzIGRpc3BsYXkgb3JkZXIgaW4gdGhlIHBpY2tlcikuICovXG5leHBvcnQgY29uc3QgQUxMX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZXM6cmVhZCcsICdwaXBlbGluZXM6d3JpdGUnLCAncGlwZWxpbmVzOnB1Ymxpc2gnLCAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnLFxuICAndGVtcGxhdGVzOnJlYWQnLCAndGVtcGxhdGVzOndyaXRlJywgJ3RlbXBsYXRlczpwdWJsaXNoJyxcbiAgJ3BsdWdpbnM6cmVhZCcsICdwbHVnaW5zOndyaXRlJywgJ3BsdWdpbnM6cHVibGlzaCcsXG4gICdwbHVnaW5zOmluc3RhbGwnLCAncGx1Z2luX2luc3RhbGxzOm1hbmFnZScsICdwdWJsaXNoZXJzOm1hbmFnZScsXG4gICdwbHVnaW5zOm1vZGVyYXRlJywgJ3B1Ymxpc2hlcnM6dmVyaWZ5JyxcbiAgJ3BsYXRmb3JtOnJlYWQnLCAnb3JnczpyZWFkJywgJ2JpbGxpbmc6b3BlcmF0ZScsXG4gICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbicsICdkYXRhYmFzZV9jb25zb2xlOm9wZW4nLCAnb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuJyxcbiAgJ29uY2FsbDptYW5hZ2UnLFxuICAnc3VwcG9ydF9jYXNlczp3cml0ZScsICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJywgJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJyxcbiAgJ29yZ3M6bWFuYWdlJywgJ3F1b3RhczptYW5hZ2UnLCAncGx1Z2luX3F1ZXVlOm1hbmFnZScsXG4gICdjb21wbGlhbmNlOnJlYWQnLCAnY29tcGxpYW5jZTp3cml0ZScsXG4gICdtZW1iZXJzOm1hbmFnZScsICdyb2xlczptYW5hZ2UnLCAnaW52aXRhdGlvbnM6bWFuYWdlJywgJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsICdkYXNoYm9hcmRzOndyaXRlJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsICdvYnNlcnZhYmlsaXR5OndyaXRlJyxcbiAgJ2xvZ3M6ZXhwb3J0JywgJ2F1ZGl0OnJlYWQnLFxuICAncmVwb3J0czpyZWFkJywgJ3JlcG9ydHM6cm9sbHVwJywgJ3JlcG9ydHM6d3JpdGUnLCAncmVwb3J0czpwdWJsaXNoJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLCAnbWVzc2FnZXM6d3JpdGUnLFxuICAnYmlsbGluZzpyZWFkJywgJ2JpbGxpbmc6bWFuYWdlJyxcbiAgJ3F1b3RhczpyZWFkJyxcbiAgJ3JlZ2lzdHJ5OnJlYWQnLCAncmVnaXN0cnk6d3JpdGUnLCAncmVnaXN0cnk6cHVyZ2UnLFxuICAnaW1wZXJzb25hdGlvbjpvcGVuJywgJ2ltcGVyc29uYXRpb246YXBwcm92ZScsICd0ZWFtX2FjY2VzczpvcGVuJyxcbiAgJ29yZ19zZXR0aW5nczp3cml0ZScsICdvcmdfaWRwOndyaXRlJywgJ29yZ19rbXM6d3JpdGUnLCAnb3JnX2ltcGVyc29uYXRpb246d3JpdGUnLFxuXTtcblxuLyoqXG4gKiBUaGUgQ0xPU0VEIHNldCBvZiBmdW5jdGlvbnMgdGhhdCB0YWtlIGEge0BsaW5rIFBlcm1pc3Npb259IGFuZCBkZWNpZGUgYWNjZXNzLlxuICpcbiAqIFwiSXMgcGVybWlzc2lvbiBYIGVuZm9yY2VkIGFueXdoZXJlP1wiIGhhcyB0byBiZSBhbnN3ZXJhYmxlIHN0YXRpY2FsbHksIHdoaWNoXG4gKiBhIGdyZXAgY2FuJ3QgZG86IGZvdXIgZGlmZmVyZW50IGNhbGwgc2hhcGVzIGNvbnN1bWUgYSBwZXJtaXNzaW9uIGlkXG4gKiAoYHJlcXVpcmVQZXJtaXNzaW9uKCd4JylgIGF0IGEgcm91dGUsIGB1c2VySGFzUGVybWlzc2lvbihyZXEsICd4JylgIGluc2lkZSBhXG4gKiBjb250cm9sbGVyLCBhbmQgYHJlc29sdmVWaXNpYmlsaXR5KHJlcSwgdiwgJ3gnKWAgL1xuICogYHJlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3Mo4oCmLCAneCcpYCBpbiB0aGUgdmlzaWJpbGl0eSBoZWxwZXJzKSwgc28gYSBuYWl2ZVxuICogZ3JlcCBmb3IgYSByb3V0ZS1sZXZlbCBnYXRlIHJlcG9ydHMgYHRlbXBsYXRlczpwdWJsaXNoYCBhcyBVTkVORk9SQ0VEIHdoZW4gaXRcbiAqIGlzIGluIGZhY3QgZW5mb3JjZWQgb24gZXZlcnkgdGVtcGxhdGUgcHVibGlzaC5cbiAqXG4gKiBUaGV5IGFsbCBib3R0b20gb3V0IGluIGB1c2VySGFzUGVybWlzc2lvbmAsIHNvIHRoZSBSVU5USU1FIHByaW1pdGl2ZSB3YXNcbiAqIGFscmVhZHkgb25lLiBUaGlzIGNvbnN0YW50IG1ha2VzIHRoZSBTVEFUSUMgc3VyZmFjZSBvbmUgYXMgd2VsbDogaXQgbmFtZXNcbiAqIGV2ZXJ5IGVudHJ5IHBvaW50LCBzbyBgcGVybWlzc2lvbi1jb3ZlcmFnZS50ZXN0LnRzYCBjYW4gZW51bWVyYXRlIHRoZSBjYXRhbG9nXG4gKiBhbmQgcmVwb3J0IGVhY2ggcGVybWlzc2lvbidzIGVuZm9yY2VtZW50IHNpdGVzIHdpdGhvdXQgZ3Vlc3NpbmcuIEEgbmV3IGdhdGVcbiAqIHRoYXQgdGFrZXMgYSBgUGVybWlzc2lvbmAgbXVzdCBiZSBsaXN0ZWQgaGVyZSwgb3IgdGhlIGNvdmVyYWdlIHJlcG9ydCBzdGFydHNcbiAqIGx5aW5nIGFib3V0IHRoZSBwZXJtaXNzaW9ucyBvbmx5IHRoYXQgZ2F0ZSBlbmZvcmNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fR0FURVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAvLyBNaWRkbGV3YXJlIGdhdGVzIChyb3V0ZSBsZXZlbCkg4oCUIGFsbCBhbnktb2YgZXhjZXB0IHJlcXVpcmVBbGxQZXJtaXNzaW9ucy5cbiAgJ3JlcXVpcmVQZXJtaXNzaW9uJyxcbiAgJ3JlcXVpcmVBbGxQZXJtaXNzaW9ucycsXG4gICdyZXF1aXJlUGVybWlzc2lvbk9yU2VydmljZScsXG4gIC8vIFRoZSBwbHVnaW4tZWNvc3lzdGVtIGdvdmVybmFuY2UgY2hhaW4gKHN5c3RlbSBvcmcgKyBwZXJtaXNzaW9uICsgYWFsMikuXG4gICdyZXF1aXJlU3lzdGVtT3JnUGVybWlzc2lvbicsXG4gIC8vIFRoZSBzaW5nbGUgcnVudGltZSBwcmltaXRpdmUgZXZlcnkgZ2F0ZSBhYm92ZSBkZWxlZ2F0ZXMgdG87IGFsc28gY2FsbGVkXG4gIC8vIGRpcmVjdGx5IHdoZXJlIGEgY29udHJvbGxlciBicmFuY2hlcyBvbiBhIGNhcGFiaWxpdHkgcmF0aGVyIHRoYW4gcmVqZWN0aW5nLlxuICAndXNlckhhc1Blcm1pc3Npb24nLFxuICAnaGFzUGVybWlzc2lvbicsXG4gIC8vIFZpc2liaWxpdHkgaGVscGVycyDigJQgdGhleSB0YWtlIHRoZSBlbnRpdHkncyBQVUJMSVNIIHBlcm1pc3Npb24uXG4gICdyZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzJyxcbiAgJ2NoZWNrVmlzaWJpbGl0eVdyaXRlQWNjZXNzJyxcbiAgJ3Jlc29sdmVWaXNpYmlsaXR5JyxcbiAgLy8gcXVvdGEncyBvd24gd3JhcHBlci4gSXQgZGVsZWdhdGVzIHRvIGByZXF1aXJlUGVybWlzc2lvbmAsIGJ1dCBpdCB0YWtlcyB0aGVcbiAgLy8gaWQgYXMgYW4gT1BUSU9OIChgYXV0aG9yaXplT3JnKHsgcGVybWlzc2lvbjogJ3F1b3RhczptYW5hZ2UnIH0pYCkgYmVjYXVzZSBpdFxuICAvLyBhbHNvIGNhbm9uaWNhbGl6ZXMgdGhlIGA6b3JnSWRgIHBhcmFtLCB3aGljaCB0aGUgcm91dGUgY2Fubm90IGRyb3AuIFdpdGhvdXRcbiAgLy8gdGhpcyBlbnRyeSB0aGUgY292ZXJhZ2Ugc2NhbiByZXBvcnRlZCBgcXVvdGFzOm1hbmFnZWAgYXMgZW5mb3JjZWQgbm93aGVyZS5cbiAgJ2F1dGhvcml6ZU9yZycsXG5dO1xuXG4vKipcbiAqIERpc3BsYXkgbWV0YWRhdGEgZm9yIG9uZSBwZXJtaXNzaW9uOiB0aGUgbGFiZWwgKyBkZXNjcmlwdGlvbiB0aGVcbiAqIHBlcm1pc3Npb24tcGlja2VyIFVJIHNob3dzLCBhbmQgdGhlIGNhdGVnb3J5IGl0IGdyb3VwcyB1bmRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uTWV0YSB7XG4gIGlkOiBQZXJtaXNzaW9uO1xuICBsYWJlbDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjYXRlZ29yeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwZXJtaXNzaW9uIGNhdGFsb2cgd2l0aCBkaXNwbGF5IG1ldGFkYXRhLCBpbiBwaWNrZXIgb3JkZXIuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgdGhlIFNJTkdMRSBjYXRhbG9nIGZvciBiYWNrZW5kIGFuZCBicm93c2VyIGFsaWtlOiBpdCBoYXMgbm9cbiAqIHJ1bnRpbWUgZGVwZW5kZW5jaWVzICh0aGUgb25seSBpbXBvcnQgaXMgYSB0eXBlKSwgc28gdGhlIGZyb250ZW5kIGltcG9ydHMgaXRcbiAqIHRocm91Z2ggdGhlIGBAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZS9wZXJtaXNzaW9uc2Agc3VicGF0aCBpbnN0ZWFkIG9mIGtlZXBpbmdcbiAqIGEgaGFuZC1tYWludGFpbmVkIG1pcnJvci4gRXZlcnkgaWQgaW4ge0BsaW5rIEFMTF9QRVJNSVNTSU9OU30gbXVzdCBhcHBlYXIgaGVyZVxuICogZXhhY3RseSBvbmNlIChhc3NlcnRlZCBieSBgcGVybWlzc2lvbnMudGVzdC50c2ApLlxuICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9DQVRBTE9HOiByZWFkb25seSBQZXJtaXNzaW9uTWV0YVtdID0gW1xuICB7IGlkOiAncGlwZWxpbmVzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcGlwZWxpbmVzJywgZGVzY3JpcHRpb246ICdWaWV3IHBpcGVsaW5lcyBhbmQgdGhlaXIgZXhlY3V0aW9ucycsIGNhdGVnb3J5OiAnUGlwZWxpbmVzJyB9LFxuICB7IGlkOiAncGlwZWxpbmVzOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgcGlwZWxpbmVzJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIGVkaXQsIGFuZCBkZWxldGUgcGlwZWxpbmVzJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZXM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ01ha2UgcGlwZWxpbmVzIHB1YmxpYyAob3JnLXdpZGUvY2F0YWxvZyB2aXNpYmlsaXR5KScsIGNhdGVnb3J5OiAnUGlwZWxpbmVzJyB9LFxuICB7IGlkOiAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnLCBsYWJlbDogJ1JlZ2lzdGVyIGRlcGxveW1lbnRzJywgZGVzY3JpcHRpb246ICdSZWNvcmQgYW5kIHJlbW92ZSB0aGUgZGVwbG95ZWQgc3RhY2sgYW5kIHN0ZXAgbWFuaWZlc3QgYmVoaW5kIGEgcGlwZWxpbmUgKHRoZSBwaXBlbGluZSByZWdpc3RyeSknLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgeyBpZDogJ3RlbXBsYXRlczpyZWFkJywgbGFiZWw6ICdWaWV3IHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnVmlldyB0aGUgZ29sZGVuLXBhdGggdGVtcGxhdGUgY2F0YWxvZycsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICB7IGlkOiAndGVtcGxhdGVzOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdBdXRob3IsIGVkaXQsIGFuZCBkZWxldGUgcGlwZWxpbmUgdGVtcGxhdGVzJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gIHsgaWQ6ICd0ZW1wbGF0ZXM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ1NoYXJlIGEgdGVtcGxhdGUgYmV5b25kIHlvdXIgb3JnIChwdWJsaWMgdmlzaWJpbGl0eSknLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6cmVhZCcsIGxhYmVsOiAnVmlldyBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdWaWV3IHBsdWdpbnMgYW5kIGJ1aWxkcycsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdDcmVhdGUsIHVwbG9hZCwgZWRpdCwgYW5kIGRlbGV0ZSBwbHVnaW5zJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICB7IGlkOiAncGx1Z2luczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ01ha2UgcGx1Z2lucyBwdWJsaWMgKG9yZy13aWRlL2NhdGFsb2cgdmlzaWJpbGl0eSknLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOmluc3RhbGwnLCBsYWJlbDogJ0luc3RhbGwgcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnSW5zdGFsbCwgdXBncmFkZSwgYW5kIHVuaW5zdGFsbCBlY29zeXN0ZW0gcGx1Z2lucyAob3IgcmVxdWVzdCBhbiBpbnN0YWxsIHdoZW4geW91ciBvcmcgcmVxdWlyZXMgYXBwcm92YWwpJywgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncGx1Z2luX2luc3RhbGxzOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIHBsdWdpbiBpbnN0YWxscycsIGRlc2NyaXB0aW9uOiBcIlNldCB5b3VyIG9yZydzIHBsdWdpbiBjb25zdW1wdGlvbiBwb2xpY3kgYW5kIGFwcHJvdmUgb3IgZGVueSBpbnN0YWxsIHJlcXVlc3RzIHdpdGhpbiB0aGUgb3JnXCIsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3B1Ymxpc2hlcnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgcHVibGlzaGVyIHByb2ZpbGUnLCBkZXNjcmlwdGlvbjogXCJNYW5hZ2UgeW91ciBvcmcncyBwdWJsaXNoZXIgcHJvZmlsZSBhbmQgc3VibWl0IHB1Ymxpc2gsIHZlcmlmaWNhdGlvbiwgdHJhbnNmZXIsIGFuZCBhZHZpc29yeSByZXF1ZXN0c1wiLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOm1vZGVyYXRlJywgbGFiZWw6ICdNb2RlcmF0ZSB0aGUgcGx1Z2luIGVjb3N5c3RlbScsIGRlc2NyaXB0aW9uOiAnRGVjaWRlIHB1Ymxpc2ggcmVxdWVzdHMsIG1vZGVyYXRlIHN1Ym1pc3Npb25zIGFuZCByZXZpZXdzLCB5YW5rIHZlcnNpb25zLCBhbmQgcHVibGlzaCBhZHZpc29yaWVzIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncHVibGlzaGVyczp2ZXJpZnknLCBsYWJlbDogJ1ZlcmlmeSBwdWJsaXNoZXJzJywgZGVzY3JpcHRpb246ICdBcHByb3ZlIFZlcmlmaWVkIGFwcGxpY2F0aW9ucywgcHVibGlzaGVyIHRpZXIgYW5kIHByb2ZpbGUgY2hhbmdlcywgYW5kIG93bmVyc2hpcCB0cmFuc2ZlcnMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwbGF0Zm9ybTpyZWFkJywgbGFiZWw6ICdWaWV3IHBsYXRmb3JtIG9wZXJhdGlvbnMnLCBkZXNjcmlwdGlvbjogJ1JlYWQgdGhlIHBsYXRmb3JtIHNldHRpbmdzIGFuZCB0aGUgY3Jvc3MtdGVuYW50IG9yZ2FuaXphdGlvbiBsaXN0IChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnb3JnczpyZWFkJywgbGFiZWw6ICdWaWV3IGFsbCBvcmdhbml6YXRpb25zJywgZGVzY3JpcHRpb246ICdMaXN0IGFuZCBvcGVuIGV2ZXJ5IG9yZ2FuaXphdGlvbiBvbiB0aGUgZGVwbG95bWVudCBcXHUyMDE0IHRoZSByb3N0ZXIgdGhlIG9wZXJhdG9yIHN1cmZhY2VzIHdvcmsgZnJvbSAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ2JpbGxpbmc6b3BlcmF0ZScsIGxhYmVsOiAnT3BlcmF0ZSBkaXNjb3VudHMgYW5kIHByb21vdGlvbnMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgYXBwbHkgYW5kIHJldm9rZSBkaXNjb3VudCB0b2tlbnMgYW5kIHByb21vdGlvbiBjYW1wYWlnbnMgYWNyb3NzIHRlbmFudHMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbicsIGxhYmVsOiAnT3BlbiB0aGUgb2JzZXJ2YWJpbGl0eSBjb25zb2xlcycsIGRlc2NyaXB0aW9uOiAnT3BlbiBHcmFmYW5hIGFuZCBLaWFsaSDigJQgZGFzaGJvYXJkcywgdHJhZmZpYyBhbmQgbWVzaCBoZWFsdGggYWNyb3NzIGV2ZXJ5IHRlbmFudCAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsIGxhYmVsOiAnT3BlbiB0aGUgZGF0YWJhc2UgY29uc29sZXMnLCBkZXNjcmlwdGlvbjogJ09wZW4gcGdBZG1pbiBhbmQgbW9uZ28tZXhwcmVzcyDigJQgYSBkaXJlY3QgcmVhZC93cml0ZSBzaGVsbCBvdmVyIGV2ZXJ5IHRlbmFudFxcdTIwMTlzIHJvd3MgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLCBsYWJlbDogJ09wZW4gdGhlIG9iamVjdC1zdG9yZSBjb25zb2xlJywgZGVzY3JpcHRpb246ICdPcGVuIHRoZSBSdXN0RlMgKFMzKSBjb25zb2xlIOKAlCBsaXN0IGFuZCBkZWxldGUgb2JqZWN0cyBpbiBldmVyeSBidWNrZXQsIGluY2x1ZGluZyB0aGUgYXVkaXQgY2hhaW4gKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvbmNhbGw6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2Ugb24tY2FsbCBwYWdpbmcnLCBkZXNjcmlwdGlvbjogJ1JlYWQgdGhlIHBhZ2luZyBwb3N0dXJlIGFuZCBzZW5kIGEgdGVzdCBwYWdlIChzeXN0ZW0gb3JnIG9ubHk7IHRoZSByb3RhIGxpdmVzIHdpdGggdGhlIHByb3ZpZGVyKScsIGNhdGVnb3J5OiAnT24tY2FsbCcgfSxcbiAgeyBpZDogJ3N1cHBvcnRfY2FzZXM6d3JpdGUnLCBsYWJlbDogJ1dvcmsgdGhlIHN1cHBvcnQgZGVzaycsIGRlc2NyaXB0aW9uOiAnVHJpYWdlIHRoZSBzdXBwb3J0IHF1ZXVlLCBhc3NpZ24gYW5kIHJlLXByaW9yaXRpc2UgY2FzZXMsIHdyaXRlIGludGVybmFsIG5vdGVzLCBhbmQgcmVjb3JkIGluY2lkZW50cyBhZ2FpbnN0IGEgc3VwcG9ydCBjb250cmFjdCAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnU3VwcG9ydCBkZXNrJyB9LFxuICB7IGlkOiAnc3VwcG9ydF9jb250ZW50OndyaXRlJywgbGFiZWw6ICdBdXRob3IgY2FubmVkIHJlcGxpZXMnLCBkZXNjcmlwdGlvbjogJ1dyaXRlIGFuZCByZXRpcmUgdGhlIHJldXNhYmxlIHN1cHBvcnQgcmVwbGllcyBvZmZlcmVkIHRvIGV2ZXJ5IGN1c3RvbWVyIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdTdXBwb3J0IGRlc2snIH0sXG4gIHsgaWQ6ICdzdWJzY3JpcHRpb25zOnJlYWQnLCBsYWJlbDogJ1ZpZXcgYWxsIHN1YnNjcmlwdGlvbnMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgZXZlcnkgb3JnYW5pemF0aW9uXFx1MjAxOXMgc3Vic2NyaXB0aW9uLCBwbGFuIG1peCBhbmQgYmlsbGluZyBldmVudHMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdzdWJzY3JpcHRpb25zOm1hbmFnZScsIGxhYmVsOiAnQ2hhbmdlIGFueSBzdWJzY3JpcHRpb24nLCBkZXNjcmlwdGlvbjogJ0NoYW5nZSBhIHBsYW4sIHNldCBhIHN1cHBvcnQgZmxvb3IsIGFuZCBjYW5jZWwgYW4gb3JnYW5pemF0aW9uXFx1MjAxOXMgc3Vic2NyaXB0aW9uIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnb3JnczptYW5hZ2UnLCBsYWJlbDogJ0FkbWluaXN0ZXIgYW55IG9yZ2FuaXphdGlvbicsIGRlc2NyaXB0aW9uOiAnUmVuYW1lLCByZS10aWVyLCBtb3ZlIGFuZCBkZWxldGUgYW55IG9yZ2FuaXphdGlvbiAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ3F1b3RhczptYW5hZ2UnLCBsYWJlbDogJ0NoYW5nZSBhbnkgcXVvdGEnLCBkZXNjcmlwdGlvbjogJ1JhaXNlLCByZXNldCBhbmQgY2xlYXIgYW5vdGhlciBvcmdhbml6YXRpb25cXHUyMDE5cyBxdW90YXMgKHN5c3RlbSBvcmcgb25seTsgdmlld2luZyB0aGVtIHJpZGVzIHBsYXRmb3JtOnJlYWQpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAncGx1Z2luX3F1ZXVlOm1hbmFnZScsIGxhYmVsOiAnUnVuIHRoZSBwbHVnaW4gYnVpbGQgcXVldWUnLCBkZXNjcmlwdGlvbjogJ1JlYWQgYnVpbGQtcXVldWUgZGVwdGggYW5kIHB1cmdlIHRoZSBkZWFkLWxldHRlciBxdWV1ZSAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ2NvbXBsaWFuY2U6cmVhZCcsIGxhYmVsOiAnVmlldyBjb21wbGlhbmNlJywgZGVzY3JpcHRpb246ICdWaWV3IGNvbXBsaWFuY2UgcnVsZXMsIHBvbGljaWVzLCBhbmQgc2NhbnMnLCBjYXRlZ29yeTogJ0NvbXBsaWFuY2UnIH0sXG4gIHsgaWQ6ICdjb21wbGlhbmNlOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgY29tcGxpYW5jZScsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGFuZCBlZGl0IHJ1bGVzLCBwb2xpY2llcywgYW5kIGV4ZW1wdGlvbnMnLCBjYXRlZ29yeTogJ0NvbXBsaWFuY2UnIH0sXG4gIHsgaWQ6ICdtZW1iZXJzOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIG1lbWJlcnMnLCBkZXNjcmlwdGlvbjogJ0FkZCwgcmVtb3ZlLCBhbmQgY2hhbmdlIHJvbGVzIG9mIG9yZyBtZW1iZXJzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAncm9sZXM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2Ugcm9sZXMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgZWRpdCwgYW5kIGRlbGV0ZSByb2xlcycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ2ludml0YXRpb25zOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIGludml0YXRpb25zJywgZGVzY3JpcHRpb246ICdTZW5kLCByZXNlbmQsIGFuZCByZXZva2UgaW52aXRhdGlvbnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIHNlcnZpY2UgYWNjb3VudHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBvcmcgc2VydmljZSBhY2NvdW50cywgYXNzaWduIHRoZWlyIHJvbGVzLCBhbmQgaXNzdWUgb3IgcmV2b2tlIHRoZWlyIGtleXMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdkYXNoYm9hcmRzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgZGFzaGJvYXJkcycsIGRlc2NyaXB0aW9uOiAnVmlldyBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ2Rhc2hib2FyZHM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBkYXNoYm9hcmRzJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgY3VzdG9tIGRhc2hib2FyZHMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdvYnNlcnZhYmlsaXR5OnJlYWQnLCBsYWJlbDogJ1ZpZXcgYWxlcnRpbmcnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgYWxlcnQgcnVsZXMgYW5kIGRlc3RpbmF0aW9ucycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ29ic2VydmFiaWxpdHk6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBhbGVydGluZycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGFuZCBlZGl0IGFsZXJ0IHJ1bGVzIGFuZCBkZXN0aW5hdGlvbnMnLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdsb2dzOmV4cG9ydCcsIGxhYmVsOiAnRG93bmxvYWQgbG9ncycsIGRlc2NyaXB0aW9uOiBcIkRvd25sb2FkIHlvdXIgb3JnYW5pemF0aW9uJ3MgbG9nIGVudHJpZXMgYXMgYSBmaWxlICh2aWV3aW5nIGxvZ3Mgb25seSBuZWVkcyAnVmlldyBhbGVydGluZycpXCIsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ2F1ZGl0OnJlYWQnLCBsYWJlbDogJ1ZpZXcgdGhlIGF1ZGl0IGxvZycsIGRlc2NyaXB0aW9uOiBcIlJlYWQgdGhlIG9yZ2FuaXphdGlvbidzIG93biB0YW1wZXItZXZpZGVudCBhdWRpdCB0cmFpbFwiLCBjYXRlZ29yeTogJ09ic2VydmFiaWxpdHknIH0sXG4gIHsgaWQ6ICdyZXBvcnRzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnVmlldyBhbmFseXRpY3MgYW5kIHJlcG9ydHMnLCBjYXRlZ29yeTogJ0luc2lnaHRzJyB9LFxuICB7IGlkOiAncmVwb3J0czpyb2xsdXAnLCBsYWJlbDogJ1JvbGwgdXAgdGVhbSByZXBvcnRzJywgZGVzY3JpcHRpb246ICdJbmNsdWRlIGRlc2NlbmRhbnQgdGVhbXMgd2hlbiB2aWV3aW5nIHJlcG9ydHMnLCBjYXRlZ29yeTogJ0luc2lnaHRzJyB9LFxuICB7IGlkOiAncmVwb3J0czp3cml0ZScsIGxhYmVsOiAnQXV0aG9yIHN0YWtlaG9sZGVyIHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgc2NoZWR1bGUgYW5kIGRyYWZ0IHNjaGVkdWxlZCByZXBvcnRzIGZvciBtYW5hZ2VycycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gIHsgaWQ6ICdyZXBvcnRzOnB1Ymxpc2gnLCBsYWJlbDogJ1B1Ymxpc2ggcmVwb3J0cyBleHRlcm5hbGx5JywgZGVzY3JpcHRpb246ICdQdWJsaXNoIGEgcmVwb3J0IGFuZCBtaW50IGV4cGlyaW5nIHNoYXJlIGxpbmtzIGZvciBwZW9wbGUgb3V0c2lkZSB0aGUgcGxhdGZvcm0nLCBjYXRlZ29yeTogJ0luc2lnaHRzJyB9LFxuICB7IGlkOiAnbWVzc2FnZXM6cmVhZCcsIGxhYmVsOiAnVmlldyBtZXNzYWdlcycsIGRlc2NyaXB0aW9uOiAnVmlldyBtZXNzYWdlcyBhbmQgYW5ub3VuY2VtZW50cycsIGNhdGVnb3J5OiAnTWVzc2FnaW5nJyB9LFxuICB7IGlkOiAnbWVzc2FnZXM6d3JpdGUnLCBsYWJlbDogJ1NlbmQgbWVzc2FnZXMnLCBkZXNjcmlwdGlvbjogJ1NlbmQgbWVzc2FnZXMgYW5kIGFubm91bmNlbWVudHMnLCBjYXRlZ29yeTogJ01lc3NhZ2luZycgfSxcbiAgeyBpZDogJ2JpbGxpbmc6cmVhZCcsIGxhYmVsOiAnVmlldyBiaWxsaW5nJywgZGVzY3JpcHRpb246ICdWaWV3IHN1YnNjcmlwdGlvbnMgYW5kIHVzYWdlJywgY2F0ZWdvcnk6ICdCaWxsaW5nICYgUXVvdGFzJyB9LFxuICB7IGlkOiAnYmlsbGluZzptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBiaWxsaW5nJywgZGVzY3JpcHRpb246ICdNYW5hZ2Ugc3Vic2NyaXB0aW9ucywgYWRkLW9ucywgYW5kIHRoZSBiaWxsaW5nIHBvcnRhbCcsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgeyBpZDogJ3F1b3RhczpyZWFkJywgbGFiZWw6ICdWaWV3IHF1b3RhcycsIGRlc2NyaXB0aW9uOiAnVmlldyBvcmdhbml6YXRpb24gcXVvdGFzIGFuZCB1c2FnZScsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgeyBpZDogJ3JlZ2lzdHJ5OnJlYWQnLCBsYWJlbDogJ1ZpZXcgcmVnaXN0cnknLCBkZXNjcmlwdGlvbjogJ1ZpZXcgdGhlIGNvbnRhaW5lciBpbWFnZSByZWdpc3RyeScsIGNhdGVnb3J5OiAnUmVnaXN0cnknIH0sXG4gIHsgaWQ6ICdyZWdpc3RyeTp3cml0ZScsIGxhYmVsOiAnQ29weSBjb250YWluZXIgaW1hZ2VzJywgZGVzY3JpcHRpb246ICdDb3B5IGFuZCBwcm9tb3RlIGEgY29udGFpbmVyIGltYWdlIGludG8gYW5vdGhlciByZXBvc2l0b3J5JywgY2F0ZWdvcnk6ICdSZWdpc3RyeScgfSxcbiAgeyBpZDogJ3JlZ2lzdHJ5OnB1cmdlJywgbGFiZWw6ICdEZWxldGUgY29udGFpbmVyIGltYWdlcycsIGRlc2NyaXB0aW9uOiAnRGVsZXRlIGltYWdlcyBhbmQgcmVwb3NpdG9yaWVzLCBhbmQgcnVuIHJlZ2lzdHJ5IGdhcmJhZ2UgY29sbGVjdGlvbicsIGNhdGVnb3J5OiAnUmVnaXN0cnknIH0sXG4gIHsgaWQ6ICdpbXBlcnNvbmF0aW9uOm9wZW4nLCBsYWJlbDogJ09wZW4gYW4gaW1wZXJzb25hdGlvbiBzZXNzaW9uJywgZGVzY3JpcHRpb246IFwiVmlldyBhIGN1c3RvbWVyJ3MgYWNjb3VudCBhcyBvbmUgb2YgaXRzIHVzZXJzLCB3aXRoIHRoYXQgb3JnYW5pemF0aW9uJ3MgY29uc2VudFwiLCBjYXRlZ29yeTogJ0ltcGVyc29uYXRpb24nIH0sXG4gIHsgaWQ6ICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnLCBsYWJlbDogJ0Fuc3dlciBpbXBlcnNvbmF0aW9uIHJlcXVlc3RzJywgZGVzY3JpcHRpb246ICdBcHByb3ZlIG9yIGRlbnkgYSByZXF1ZXN0IHRvIHZpZXcgYSBtZW1iZXIgb2YgdGhpcyBvcmdhbml6YXRpb24gYXMgdGhhdCBtZW1iZXInLCBjYXRlZ29yeTogJ0ltcGVyc29uYXRpb24nIH0sXG4gIHsgaWQ6ICd0ZWFtX2FjY2VzczpvcGVuJywgbGFiZWw6IFwiVmlldyBhIHRlYW0gbWVtYmVyJ3MgYWNjb3VudFwiLCBkZXNjcmlwdGlvbjogXCJWaWV3IGEgbWVtYmVyIG9mIG9uZSBvZiB0aGlzIG9yZ2FuaXphdGlvbidzIHRlYW1zIGFzIHRoYXQgbWVtYmVyIChyZWFkLW9ubHkpXCIsIGNhdGVnb3J5OiAnSW1wZXJzb25hdGlvbicgfSxcbiAgeyBpZDogJ29yZ19zZXR0aW5nczp3cml0ZScsIGxhYmVsOiAnT3JnYW5pemF0aW9uIHNldHRpbmdzJywgZGVzY3JpcHRpb246ICdNYW5hZ2UgZ2VuZXJhbCBvcmcgc2V0dGluZ3MgYW5kIEFJIGNvbmZpZycsIGNhdGVnb3J5OiAnT3JnYW5pemF0aW9uJyB9LFxuICB7IGlkOiAnb3JnX2lkcDp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIFNTTy9JZFAnLCBkZXNjcmlwdGlvbjogJ0NvbmZpZ3VyZSBzaW5nbGUgc2lnbi1vbiBhbmQgaWRlbnRpdHkgcHJvdmlkZXJzJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG4gIHsgaWQ6ICdvcmdfa21zOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgZW5jcnlwdGlvbiBrZXlzJywgZGVzY3JpcHRpb246ICdDb25maWd1cmUgY3VzdG9tZXItbWFuYWdlZCBLTVMgZW5jcnlwdGlvbiBrZXlzJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG4gIHsgaWQ6ICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGltcGVyc29uYXRpb24gcG9saWN5JywgZGVzY3JpcHRpb246ICdDb250cm9sIHdoZXRoZXIgcGxhdGZvcm0gb3BlcmF0b3JzIG1heSB2aWV3IHRoZSBvcmdhbml6YXRpb24gYXMgb25lIG9mIGl0cyBtZW1iZXJzJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG5dO1xuXG5jb25zdCBQRVJNSVNTSU9OX0xBQkVMUyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFBFUk1JU1NJT05fQ0FUQUxPRy5tYXAoKHApID0+IFtwLmlkLCBwLmxhYmVsXSkpO1xuXG4vKiogSHVtYW4gbGFiZWwgZm9yIGEgcGVybWlzc2lvbiBpZCAoZmFsbHMgYmFjayB0byB0aGUgcmF3IGlkIGZvciBhbiB1bmtub3duIG9uZSkuICovXG5leHBvcnQgZnVuY3Rpb24gcGVybWlzc2lvbkxhYmVsKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gUEVSTUlTU0lPTl9MQUJFTFMuZ2V0KGlkKSA/PyBpZDtcbn1cblxuLyoqIE9uZSBwaWNrZXIgc2VjdGlvbjogYSBjYXRlZ29yeSBhbmQgdGhlIHBlcm1pc3Npb25zIGl0IGNvbnRhaW5zLCBpbiBjYXRhbG9nIG9yZGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uQ2F0ZWdvcnkge1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogUGVybWlzc2lvbk1ldGFbXTtcbn1cblxuLyoqIEdyb3VwIGEgcGVybWlzc2lvbiBsaXN0IGludG8gY2F0ZWdvcmllcywgcHJlc2VydmluZyBjYXRhbG9nIG9yZGVyLiAqL1xuZnVuY3Rpb24gZ3JvdXBCeUNhdGVnb3J5KHBlcm1zOiByZWFkb25seSBQZXJtaXNzaW9uTWV0YVtdKTogUGVybWlzc2lvbkNhdGVnb3J5W10ge1xuICBjb25zdCBvcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYnlDYXRlZ29yeSA9IG5ldyBNYXA8c3RyaW5nLCBQZXJtaXNzaW9uTWV0YVtdPigpO1xuICBmb3IgKGNvbnN0IHAgb2YgcGVybXMpIHtcbiAgICBpZiAoIWJ5Q2F0ZWdvcnkuaGFzKHAuY2F0ZWdvcnkpKSB7IGJ5Q2F0ZWdvcnkuc2V0KHAuY2F0ZWdvcnksIFtdKTsgb3JkZXIucHVzaChwLmNhdGVnb3J5KTsgfVxuICAgIGJ5Q2F0ZWdvcnkuZ2V0KHAuY2F0ZWdvcnkpIS5wdXNoKHApO1xuICB9XG4gIHJldHVybiBvcmRlci5tYXAoKGNhdGVnb3J5KSA9PiAoeyBjYXRlZ29yeSwgcGVybWlzc2lvbnM6IGJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5KSEgfSkpO1xufVxuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFBlcm1pc3Npb24uICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFBlcm1pc3Npb24odmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFBlcm1pc3Npb24ge1xuICByZXR1cm4gKEFMTF9QRVJNSVNTSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vKipcbiAqIFBlcm1pc3Npb25zIHRoYXQgbXVzdCBORVZFUiBiZSBncmFudGFibGUgdGhyb3VnaCBhIHVzZXItYXV0aG9yZWQgQ1VTVE9NIFJvbGUg4oCUXG4gKiB0aGV5IGdhdGUgcGxhdGZvcm0tb3BlcmF0b3Igc3VyZmFjZXMgKHRoZSBzaGFyZWQgaW1hZ2UgcmVnaXN0cnkpLCBzbyBhbGxvd2luZ1xuICogYW4gb3JnIGFkbWluIHRvIG1pbnQgYSBSb2xlIGNhcnJ5aW5nIHRoZW0gd291bGQgYmUgYSBsYXRlbnQgcHJpdmlsZWdlXG4gKiBlc2NhbGF0aW9uLiBUaGV5IGFyZSBOT1Qgc2VlZGVkIGludG8gQU5ZIGJ1aWx0LWluIFJvbGUgYnVuZGxlIChuZWl0aGVyXG4gKiBgbWVtYmVyYCBub3IgYGFkbWluYCksIHNvIHRoZSBvbmx5IGhvbGRlciBpcyBhIHN1cGVyYWRtaW4gKGltcGxpY2l0LWFsbCkg4oCUXG4gKiB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBpbWFnZS1yZWdpc3RyeSBnYXRlcyB0aGF0IHJlcXVpcmUgdGhlbSBlZmZlY3RpdmVseVxuICogc3VwZXJhZG1pbi1vbmx5LiBUaGlzIGxpc3QgQUxTTyBibG9ja3MgY3VzdG9tLVJvbGUgYXV0aG9yaW5nIGZyb20gcmVxdWVzdGluZ1xuICogdGhlbSAoc2VlIHBsYXRmb3JtIGBzYW5pdGl6ZVBlcm1pc3Npb25zYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLy8gYHJlZ2lzdHJ5OnJlYWRgIGFuZCBgcmVnaXN0cnk6d3JpdGVgIHdlcmUgYm90aCBoZXJlLiBXaGF0IHN0YXlzIGlzIHRoZVxuICAvLyBkZXN0cnVjdGl2ZSBydW5nIGFsb25lOiBkZWxldGluZyBhIG1hbmlmZXN0IG9yIGEgd2hvbGUgcmVwb3NpdG9yeSwgYW5kIHRoZVxuICAvLyBHQyBwcnVuZSwgZWFjaCBvZiB3aGljaCBjYW4gcmVtb3ZlIGFuIGltYWdlIGEgdGVuYW50J3MgcGlwZWxpbmUgc3RpbGxcbiAgLy8gcmVzb2x2ZXMg4oCUIGluY2x1ZGluZyB0aGUgZGlnZXN0LXBpbm5lZCBwbHVnaW4gaW1hZ2VzIHRoZSBzdXBwbHkgY2hhaW5cbiAgLy8gdmVyaWZpZXMgYWdhaW5zdC4gVGhhdCBpcyB0aGUgb25lIHJlZ2lzdHJ5IGFjdGlvbiB3aXRoIG5vIHVuZG8sIHNvIGl0IGtlZXBzXG4gIC8vIHRoZSBuYXJyb3dlc3QgcG9zc2libGUgYXVkaWVuY2U6IHRoZSBmbGFnLCBhbmQgbmV2ZXIgYSBSb2xlLlxuICAncmVnaXN0cnk6cHVyZ2UnLFxuXTtcblxuLyoqXG4gKiBQZXJtaXNzaW9ucyB0aGF0IGdvdmVybiB0aGUgUExVR0lOIEVDT1NZU1RFTSBhbmQgbWF5IGJlIGhlbGQgb25seSBpbnNpZGUgdGhlXG4gKiBzeXN0ZW0gb3JnIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gTGlrZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gdGhleSBhcmUgaW4gbm8gbWVtYmVyL2FkbWluL293bmVyIGJ1bmRsZVxuICogYW5kIGFyZSBuZXZlciBncmFudGFibGUgdGhyb3VnaCBhIGN1c3RvbSBSb2xlIGluIEFOWSBvcmcgKHBsYXRmb3JtXG4gKiBgc2FuaXRpemVQZXJtaXNzaW9uc2AgcmVmdXNlcyB0aGVtKS4gVGhlIG9ubHkgaG9sZGVycyBhcmUgc3VwZXJhZG1pbnNcbiAqIChpbXBsaWNpdC1hbGwpIGFuZCBtZW1iZXJzIG9mIHRoZSBidWlsdC1pbiBcIkVjb3N5c3RlbSBNYW5hZ2VyXCIgUm9sZSwgd2hpY2ggaXNcbiAqIHNlZWRlZCBpbiB0aGUgc3lzdGVtIG9yZyBhbG9uZSBmcm9tIHtAbGluayBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OU30gYW5kXG4gKiBhc3NpZ25hYmxlIG9ubHkgYnkgYSBzdXBlcmFkbWluLlxuICpcbiAqIGBvbmNhbGw6bWFuYWdlYCBpcyBpbiBORUlUSEVSIG5hbWVkIHJvbGUsIHdoaWNoIG1ha2VzIGl0IHN1cGVyYWRtaW4tb25seSBpblxuICogcHJhY3RpY2UuIFRoYXQgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvdmVyc2lnaHQ6IHBhZ2luZyBpcyB0aGUgdmVuZG9yJ3NcbiAqIG93biBvcGVyYXRpb25hbCBjb25jZXJuIGFuZCBoYXMgbm90aGluZyB0byBkbyB3aXRoIGVjb3N5c3RlbSBtb2RlcmF0aW9uLCBzb1xuICogd2lkZW5pbmcgdGhlIEVjb3N5c3RlbSBNYW5hZ2VyIHJvbGUgdG8gY2FycnkgaXQgd291bGQgaGFuZCB0aGUgcGFnZXIgdG9cbiAqIHBlb3BsZSBoaXJlZCB0byByZXZpZXcgcGx1Z2lucy4gSXQgaXMgbm90IGEgcGxhY2Vob2xkZXIg4oCUIGl0IGdhdGVzIHR3byBsaXZlXG4gKiByb3V0ZXMgKHRoZSBwYWdpbmcgcG9zdHVyZSByZWFkIGFuZCB0aGUgdGVzdCBwYWdlKSwgdW5saWtlIGByZWdpc3RyeToqYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGx1Z2luczptb2RlcmF0ZScsXG4gICdwdWJsaXNoZXJzOnZlcmlmeScsXG4gIC8vIFRoZSBjcm9zcy10ZW5hbnQgb3BlcmF0b3Igc3VyZmFjZXMsIHN5c3RlbS1vcmctb25seSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZVxuICAvLyBjb25zb2xlcyBhcmU6IHRoZXkgcmVhZCBhbmQgbW92ZSB0aGluZ3MgYmVsb25naW5nIHRvIG9yZ2FuaXNhdGlvbnMgdGhlXG4gIC8vIGhvbGRlciBpcyBub3QgYSBtZW1iZXIgb2YsIHNvIHRoZXkgbXVzdCBuZXZlciBiZSBncmFudGFibGUgaW5zaWRlIGEgdGVuYW50LlxuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAvLyBSZWFkaW5nIHRoZSBpbWFnZSByZWdpc3RyeTogcmVwb3NpdG9yeSBuYW1lcywgdGFncywgbWFuaWZlc3RzLCBibG9icyBhbmQgdGhlXG4gIC8vIHN0b3JhZ2Ugcm9sbHVwLiBQcm9tb3RlZCBvdXQgb2YgU1VQRVJBRE1JTl9PTkxZIGJlY2F1c2UgdGhlIHJlZ2lzdHJ5IGJyb3dzZXJcbiAgLy8gd2FzIGludmlzaWJsZSB0byBldmVyeSBSb2xlLCBzbyBhIFBsYXRmb3JtIE9wZXJhdG9yIGRlYnVnZ2luZyBhIGZhaWxlZFxuICAvLyBwbHVnaW4gYnVpbGQgY291bGQgc2VlIHRoZSBidWlsZCBxdWV1ZSBhbmQgaXRzIGRlYWQgbGV0dGVycyBidXQgbm90IHRoZVxuICAvLyBpbWFnZXMgdGhlIGJ1aWxkIHByb2R1Y2VkIOKAlCBhbmQgdGhlIG9ubHkgd2F5IHRvIGxvb2sgd2FzIHRoZSBzdXBlcmFkbWluXG4gIC8vIGZsYWcuIEl0IHN0YXlzIHN5c3RlbS1vcmctb25seSAobm8gdGVuYW50IFJvbGUgbWF5IGNhcnJ5IGl0KSBhbmQgaXMgcGFpcmVkXG4gIC8vIHdpdGggYSBwZXItcmVwbyBvcmctb3duZXJzaGlwIGZpbHRlciB0aGF0IHJ1bnMgQUZURVIgaXQsIHNvIHdpZGVuaW5nIHRoZVxuICAvLyBwZXJtaXNzaW9uIGRvZXMgbm90IHdpZGVuIHdoaWNoIHJlcG9zaXRvcmllcyBhIGhvbGRlciBjYW4gcmVhY2g6IGFcbiAgLy8gc3lzdGVtLW9yZyBtZW1iZXIgd2hvIGlzIG5vdCBhIHN1cGVyYWRtaW4gc2VlcyBgc3lzdGVtLypgLCBgbGlicmFyeS8qYCBhbmRcbiAgLy8gYHB1YmxpYy8qYCDigJQgdGhpcyBkZXBsb3ltZW50J3Mgb3duIGJhc2UgYW5kIHBsdWdpbiBpbWFnZXMg4oCUIGFuZCBubyB0ZW5hbnQnc1xuICAvLyBgb3JnLSpgIHJlcG9zaXRvcmllcyBhdCBhbGwgKGBjYW5SZWFkUmVwb2AgaW4gdGhlIGltYWdlLXJlZ2lzdHJ5IHNlcnZpY2UpLlxuICAncmVnaXN0cnk6cmVhZCcsXG4gIC8vIENvcHlpbmcvcHJvbW90aW5nIGFuIGltYWdlLiBTeXN0ZW0tb3JnLW9ubHkgcmF0aGVyIHRoYW4gc3VwZXJhZG1pbi1vbmx5XG4gIC8vIGJlY2F1c2UgaXQgaXMgQURESVRJVkU6IGl0IHdyaXRlcyBhIG5ldyB0YWcgYW5kIG1ha2VzIG5vdGhpbmcgc3RvcFxuICAvLyByZXNvbHZpbmcsIGFuZCBgY2FuV3JpdGVSZXBvYCBjb25maW5lcyBhIG5vbi1zdXBlcmFkbWluIHN5c3RlbS1vcmcgY2FsbGVyXG4gIC8vIHRvIGBzeXN0ZW0vKmAgcmVnYXJkbGVzcy4gRGVsaWJlcmF0ZWx5IGNhcnJpZWQgYnkgTk8gYnVpbHQtaW4gYnVuZGxlIHRvZGF5XG4gIC8vIOKAlCBwcm9tb3RpbmcgYW4gaW1hZ2UgaXMgYSBqb2IsIG5vdCBhIHNpZGUgZWZmZWN0IG9mIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQsXG4gIC8vIHNvIGl0IHdhaXRzIGZvciBhIFJvbGUgb2YgaXRzIG93biByYXRoZXIgdGhhbiByaWRpbmcgYWxvbmcgd2l0aFxuICAvLyBgcGxhdGZvcm06cmVhZGAuXG4gICdyZWdpc3RyeTp3cml0ZScsXG4gICdiaWxsaW5nOm9wZXJhdGUnLFxuICAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nLFxuICAnZGF0YWJhc2VfY29uc29sZTpvcGVuJyxcbiAgJ29iamVjdHN0b3JlX2NvbnNvbGU6b3BlbicsXG4gIC8vIE9wZW5pbmcgYSBjcm9zcy10ZW5hbnQgaW1wZXJzb25hdGlvbiBzZXNzaW9uLiBTeXN0ZW0tb3JnLW9ubHkgZm9yIHRoZVxuICAvLyBvYnZpb3VzIHJlYXNvbiDigJQgaXQgdmlld3MgYW4gb3JnYW5pc2F0aW9uIHRoZSBob2xkZXIgaXMgbm90IGEgbWVtYmVyIG9mIOKAlFxuICAvLyBhbmQgaXQgaXMgdGhlIE9ORSBwZXJtaXNzaW9uIGluIHRoaXMgbGlzdCB0aGF0IGFsc28gaGFzIHRvIGNsZWFyIGEgZ2F0ZSB0aGVcbiAgLy8gcGVybWlzc2lvbiBzeXN0ZW0gZG9lcyBub3Qgb3duOiB0aGUgdGFyZ2V0IG9yZ2FuaXNhdGlvbidzIGNvbnNlbnQgKGl0c1xuICAvLyBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIHBvbGljeSksIHBsdXMgYWFsMiBhbmQgYSBzdHJvbmcgc3RlcC11cC4gVGhlXG4gIC8vIHBlcm1pc3Npb24gc2F5cyB3aG8gbWF5IEFTSzsgdGhlIHRlbmFudCBzdGlsbCBhbnN3ZXJzLlxuICAvL1xuICAvLyBJdCBkb2VzIE5PVCBjb3ZlciBlbWVyZ2VuY3kgYWNjZXNzLiBgUE9TVCAvOnVzZXJJZC9icmVha2dsYXNzYCBieXBhc3Nlc1xuICAvLyB0ZW5hbnQgY29uc2VudCBhbmQgc28gc3RheXMgb24gdGhlIHN1cGVyYWRtaW4gZmxhZyBhbG9uZSwgYXBwcm92ZWQgYnkgYVxuICAvLyBTRUNPTkQgc3VwZXJhZG1pbiAoZm91ci1leWVzKS4gQSBwZXJtaXNzaW9uIHRoYXQgY291bGQgYmUgZGVsZWdhdGVkIG11c3Qgbm90XG4gIC8vIGJlIGFibGUgdG8gd2FsayBwYXN0IGNvbnNlbnQuXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLFxuICAvLyBQYWdpbmcgaXMgdGhlIHZlbmRvcidzIG93biBvcGVyYXRpb25hbCBjb25jZXJuIGFuZCBncmFudHMgTk8gdGVuYW50IGFjY2Vzc1xuICAvLyDigJQgYGlzU3lzdGVtT3JnSWRgIGlzIGEgY29udGVudC1vd25lciBjaGVjaywgbm90IGEgcHJpdmlsZWdlIGdhdGUg4oCUIHNvIGFcbiAgLy8gdGVuYW50IHJvbGUgbXVzdCBuZXZlciBiZSBhYmxlIHRvIGNhcnJ5IGl0LCBhbmQgYSB0ZW5hbnQgbXVzdCBuZXZlciBiZSBhYmxlXG4gIC8vIHRvIG1ha2UgdGhpcyBkZXBsb3ltZW50IHNlbmQgYSBwYWdlLlxuICAnb25jYWxsOm1hbmFnZScsXG4gIC8vIFRoZSB2ZW5kb3IncyBvd24gb3BlcmF0aW9uYWwgdGFza3MuIEVhY2ggb25lIHJlcGxhY2VkIGEgYHJlcXVpcmVTeXN0ZW1BZG1pbmBcbiAgLy8gZ2F0ZSwgc28gdGhlIHBvaW50IG9mIGxpc3RpbmcgdGhlbSBoZXJlIGlzIHRoZSBzYW1lIGFzIHRoZSBwb2ludCBvZiBhZGRpbmdcbiAgLy8gdGhlbSBhdCBhbGw6IGEgUm9sZSBjb21wb3NlZCBpbiB0aGUgc3lzdGVtIG9yZyBjYW4gY2FycnkgZXhhY3RseSBvbmUgam9iLFxuICAvLyBhbmQgbm8gUm9sZSBpbiBhbnkgdGVuYW50IGNhbiBjYXJyeSBpdCBhdCBhbGwuXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJyxcbiAgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLFxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbl07XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgaGVsZCBvbmx5IGluc2lkZSB0aGUgc3lzdGVtIG9yZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgYW4gb3JnIG1heSBhc3NpZ24gdmlhIGEgQ1VTVE9NIFJvbGUg4oCUIGV2ZXJ5IHBlcm1pc3Npb24gZXhjZXB0IHRoZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9LlxuICogQ3VzdG9tLVJvbGUgY3JlYXRlL3VwZGF0ZSB2YWxpZGF0ZXMgdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHNldCBhZ2FpbnN0IHRoaXNcbiAqIChzZWUgcGxhdGZvcm0gcm9sZXMtc2VydmljZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID1cbiAgQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwKSk7XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgZ3JhbnRlZCB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBjdXN0b20gUm9sZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiBib29sZWFuIHtcbiAgcmV0dXJuICFTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlMuaW5jbHVkZXMocGVybWlzc2lvbikgJiYgIWlzU3lzdGVtT3JnT25seVBlcm1pc3Npb24ocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogQ2F0ZWdvcnkg4oaSIHBlcm1pc3Npb25zIGZvciB0aGUgY3VzdG9tLVJvbGUgQVVUSE9SSU5HIHBpY2tlcjogdGhlIGNhdGFsb2cgbWludXNcbiAqIHRoZSBub24tYXNzaWduYWJsZSBwZXJtaXNzaW9ucywgd2l0aCBhbnkgbm93LWVtcHR5IGNhdGVnb3J5IGRyb3BwZWRcbiAqIChzbyBcIlJlZ2lzdHJ5XCIgZGlzYXBwZWFycykuIFRoZSBncm91cGVkIHZpZXcgb2ZcbiAqIHtAbGluayBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OU30uXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9DQVRFR09SSUVTOiByZWFkb25seSBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSA9XG4gIGdyb3VwQnlDYXRlZ29yeShQRVJNSVNTSU9OX0NBVEFMT0cuZmlsdGVyKChwKSA9PiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHAuaWQpKSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFscyAocGVyc29uYWwgYWNjZXNzIGtleXMgLyBtYWNoaW5lIHRva2Vucylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXZlcnkgYDpyZWFkYCBwZXJtaXNzaW9uIOKAlCB0aGUgXCJyZWFkLW9ubHlcIiBwcmVzZXQgYSBuZXcgcGVyc29uYWwgYWNjZXNzIGtleVxuICogc3RhcnRzIGZyb20uIERlcml2ZWQgZnJvbSB0aGUgY2F0YWxvZyBzbyBhIG5ldyByZXNvdXJjZSdzIHJlYWQgcGVybWlzc2lvblxuICogam9pbnMgdGhlIHByZXNldCB3aXRob3V0IGEgc2Vjb25kIGVkaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUFEX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9XG4gIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IHAuZW5kc1dpdGgoJzpyZWFkJykpO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHN1YnNldDogZXZlcnkgZW50cnkgbXVzdCBiZSBhIGNhdGFsb2cgaWRcbiAqIChhbnl0aGluZyBlbHNlIOKGkiBgbnVsbGAsIHRoZSBjYWxsZXIncyA0MDApLCBkdXBsaWNhdGVzIGNvbGxhcHNlLCBhbmQgdGhlXG4gKiByZXN1bHQgaXMgaW4gY2Fub25pY2FsIGNhdGFsb2cgb3JkZXIgc28gYSBzdG9yZWQgc3Vic2V0IGNvbXBhcmVzIHN0YWJseS5cbiAqIEFuIEVNUFRZIGFycmF5IGlzIHZhbGlkIOKAlCBhIGtleSB0aGF0IGNhbiBhdXRoZW50aWNhdGUgYnV0IGRvIG5vdGhpbmcg4oCUIGFuZFxuICogaXMgZGlzdGluY3QgZnJvbSBcIm5vIHN1YnNldFwiIChgdW5kZWZpbmVkYCksIHdoaWNoIG1lYW5zIGZ1bGwgYWNjZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGVybWlzc2lvblN1YnNldChyZXF1ZXN0ZWQ6IHJlYWRvbmx5IHVua25vd25bXSk6IFBlcm1pc3Npb25bXSB8IG51bGwge1xuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwIG9mIHJlcXVlc3RlZCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycgfHwgIWlzVmFsaWRQZXJtaXNzaW9uKHApKSByZXR1cm4gbnVsbDtcbiAgICB3YW50ZWQuYWRkKHApO1xuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiB3YW50ZWQuaGFzKHApKTtcbn1cblxuLyoqXG4gKiBUaGUgcGVybWlzc2lvbnMgYSBwZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFsIGFjdHVhbGx5IGNhcnJpZXM6IHRoZVxuICogSU5URVJTRUNUSU9OIG9mIHRoZSBzdWJzZXQgaXQgd2FzIGNyZWF0ZWQgd2l0aCBhbmQgdGhlIGhvbGRlcidzIENVUlJFTlRcbiAqIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucywgaW4gY2F0YWxvZyBvcmRlci4gUmUtZXZhbHVhdGVkIGF0IGV2ZXJ5IGlzc3VlLCBzb1xuICogbG9zaW5nIGEgUm9sZSBzaHJpbmtzIHRoZSBjcmVkZW50aWFsIGFuZCBub3RoaW5nIGNhbiBldmVyIGdyb3cgaXQgcGFzdCB0aGVcbiAqIHN1YnNldCBpdCB3YXMgY3JlYXRlZCB3aXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0UGVybWlzc2lvbnMoXG4gIGVmZmVjdGl2ZTogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHN1YnNldDogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQZXJtaXNzaW9uW10ge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChzdWJzZXQpO1xuICBjb25zdCBoZWxkID0gbmV3IFNldChlZmZlY3RpdmUpO1xuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gYWxsb3dlZC5oYXMocCkgJiYgaGVsZC5oYXMocCkpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGVybWlzc2lvbiBidW5kbGVzIHVzZWQgdG8gU0VFRCB0aGUgYnVpbHQtaW4gUm9sZXMgKFwiQWRtaW5cIiwgXCJNZW1iZXJcIikuXG4gKlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIGRlZmluaXRpb24gb2Ygd2hhdCB0aG9zZSBidWlsdC1pbiBSb2xlcyBncmFudCDigJQgaXQgaXMgdXNlZFxuICogd2hlbiBhIFJvbGUgcmVjb3JkIGlzIGNyZWF0ZWQgKGFuZCBieSB0aGUgc3RhcnR1cCBiYWNrZmlsbCkgdG8gcG9wdWxhdGUgdGhhdFxuICogUm9sZSdzIG93biBgcGVybWlzc2lvbnNbXWAuIEl0IGlzIE5PVCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBzb3VyY2U6IGEgdXNlcidzXG4gKiBlZmZlY3RpdmUgcGVybWlzc2lvbnMgY29tZSBPTkxZIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0gKHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9KS4gVGhlIGNvYXJzZSBgcm9sZWAgbGFiZWwgKG93bmVyL2FkbWluL21lbWJlcilcbiAqIHN1cnZpdmVzIG9ubHkgZm9yIGBpc0FkbWluYC9vd25lcnNoaXAvZGlzcGxheSwgbmV2ZXIgdG8gZ3JhbnQgcGVybWlzc2lvbnMuXG4gKlxuICogLSBgbWVtYmVyYCAg4oCUIGRheS10by1kYXkgYnVpbGRlcjogcmVhZCArIHdyaXRlIG9uIHBpcGVsaW5lcy90ZW1wbGF0ZXMvcGx1Z2lucyxcbiAqICAgcmVhZCBlbHNld2hlcmUuIE5vIG1lbWJlci9yb2xlL2JpbGxpbmcgbWFuYWdlbWVudCwgbm8gY29tcGxpYW5jZS9hbGVydFxuICogICBhdXRob3JpbmcsIGFuZCBubyBgOnB1Ymxpc2hgIG9uIGFueSBjYXRhbG9nLlxuICogLSBgYWRtaW5gICAg4oCUIGZ1bGwgb3JnIGFkbWluaXN0cmF0aW9uOiBldmVyeSBPUkctQVNTSUdOQUJMRSBwZXJtaXNzaW9uIChpLmUuXG4gKiAgIEFMTF9QRVJNSVNTSU9OUyBtaW51cyB0aGUge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHRoZVxuICogICB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfSwgc28gYHJlZ2lzdHJ5OipgIHN0YXlcbiAqICAgc3VwZXJhZG1pbi1pbXBsaWNpdC1vbmx5IGFuZCBlY29zeXN0ZW0gbW9kZXJhdGlvbiBzdGF5cyB3aXRoIHRoZSBzeXN0ZW1cbiAqICAgb3JnJ3MgRWNvc3lzdGVtIE1hbmFnZXJzIOKAlCBuZWl0aGVyIGlzIGdyYW50ZWQgdG8gb3JnIGFkbWlucykuXG4gKiAtIGBvd25lcmAgICDigJQgc2FtZSBhcyBhZG1pbiAob3duZXJzaGlwIGl0c2VsZiDigJQgdHJhbnNmZXIvZGVsZXRlIOKAlCBpcyBnYXRlZFxuICogICBzZXBhcmF0ZWx5LCBub3QgdmlhIGEgcGVybWlzc2lvbikuXG4gKi9cbmNvbnN0IE1FTUJFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOndyaXRlJywgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJyxcbiAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczp3cml0ZScsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsXG4gICdwbHVnaW5zOmluc3RhbGwnLFxuICAnY29tcGxpYW5jZTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAncmVwb3J0czpyZWFkJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLCAnbWVzc2FnZXM6d3JpdGUnLFxuICAnYmlsbGluZzpyZWFkJyxcbiAgJ3F1b3RhczpyZWFkJyxcbl07XG5cbmNvbnN0IEFETUlOX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbLi4uT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlNdO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciBlYWNoIGJ1aWx0LWluIFJvbGUsIGtleWVkIGJ5IHRoZSBjb2Fyc2Ugcm9sZSBpdCBncmFudHMuXG4gKiBDb25zdW1lZCBieSB0aGUgUm9sZSBzZWVkZXIgKyB0aGUgc3RhcnR1cCBiYWNrZmlsbCB0byBwb3B1bGF0ZSBhIGJ1aWx0LWluXG4gKiBSb2xlJ3MgYHBlcm1pc3Npb25zW11gLiBOT1QgY29uc3VsdGVkIGF0IHJlcXVlc3QgdGltZSDigJQgc2VlXG4gKiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30uXG4gKi9cbmV4cG9ydCBjb25zdCBST0xFX1BFUk1JU1NJT05TOiBSZWNvcmQ8T3JnUm9sZSwgcmVhZG9ubHkgUGVybWlzc2lvbltdPiA9IHtcbiAgbWVtYmVyOiBNRU1CRVJfUEVSTUlTU0lPTlMsXG4gIGFkbWluOiBBRE1JTl9QRVJNSVNTSU9OUyxcbiAgb3duZXI6IEFETUlOX1BFUk1JU1NJT05TLFxufTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiRWNvc3lzdGVtIE1hbmFnZXJcIiBSb2xlIOKAlCBzZWVkZWQgT05MWSBpbiB0aGVcbiAqIHN5c3RlbSBvcmcgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBJdCBjYXJyaWVzIHRoZVxuICoge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30gcGx1cyB0aGUgcmVhZHMgYSBtb2RlcmF0b3IgbmVlZHMgKHRoZVxuICogaW4tYXBwIGNhdGFsb2csIGluLWFwcCBub3RpY2VzLCB0aGUgbW9kZXJhdGlvbi1TTEEgZGFzaGJvYXJkKSBhbmQgbm90aGluZ1xuICogdGVuYW50LWZhY2luZzogbm8gYHJlZ2lzdHJ5OipgLCBubyBgbWVtYmVyczptYW5hZ2VgLiBUaGUgUm9sZSBncmFudHMgdGhlXG4gKiBjb2Fyc2UgYG1lbWJlcmAgbGFiZWwgYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbi8qKlxuICogVGhlIFBMQVRGT1JNIE9QRVJBVE9SIGJ1bmRsZSDigJQgdGhlIHRoaXJkIHJ1bmcgb2YgdGhlIHN5c3RlbSBvcmcncyBsYWRkZXIuXG4gKlxuICogQmVmb3JlIGl0IHRoZSBsYWRkZXIgaGFkIHR3byBydW5ncyBhbmQgYSBnYXA6IEVjb3N5c3RlbSBNYW5hZ2VyIChwbHVnaW5cbiAqIG1vZGVyYXRpb24pIGFuZCBTdXBlciBBZG1pbiAoaW1wbGljaXQtYWxsLCB3aGljaCBhbHNvIGNhcnJpZXMgaW1wZXJzb25hdGlvbixcbiAqIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MpLiBBbnl0aGluZyBpbiBiZXR3ZWVuIOKAlCByZWFkIHRoZSBwbGF0Zm9ybSBzZXR0aW5ncyxcbiAqIHJ1biBhIHByb21vdGlvbiBjYW1wYWlnbiwgY2hlY2sgd2hldGhlciB0aGUgcGFnZXIgaXMgY29uZmlndXJlZCDigJQgaGFkIHRvIGJlXG4gKiBkb25lIGJ5IG1ha2luZyBzb21lYm9keSBhIGZ1bGwgc3VwZXJhZG1pbi5cbiAqXG4gKiBJdCBpcyBhIEJVTkRMRSByYXRoZXIgdGhhbiBhIGdyYW50YWJsZSBsaXN0IGJlY2F1c2UgYFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU2BcbiAqIGNhbiBuZXZlciBiZSBjYXJyaWVkIGJ5IGEgY3VzdG9tIFJvbGUgaW4gYW55IG9yZzogd2l0aG91dCBhIHNlZWRlZCBidW5kbGVcbiAqIHRoZXNlIHBlcm1pc3Npb25zIGhhZCBubyBncmFudCBwYXRoIGF0IGFsbCBhbmQgd2VyZSBzdXBlcmFkbWluLW9ubHkgaW5cbiAqIHByYWN0aWNlLCB3aGljaCBpcyBleGFjdGx5IHRoZSB0aGluZyB0aGV5IHdlcmUgYWRkZWQgdG8gYXZvaWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBjYXJyeWluZyBgcGx1Z2luczptb2RlcmF0ZWAgLyBgcHVibGlzaGVyczp2ZXJpZnlgOiBlY29zeXN0ZW1cbiAqIG1vZGVyYXRpb24gaXMgYSBkaWZmZXJlbnQgam9iIHdpdGggaXRzIG93biBSb2xlLCBhbmQgYSByZXZpZXdlciBvZiBwbHVnaW5zXG4gKiBzaG91bGQgbm90IGFjcXVpcmUgdGhlIGFiaWxpdHkgdG8gbW92ZSBhbm90aGVyIHRlbmFudCdzIG1vbmV5IGJ5IGJlaW5nIGhhbmRlZFxuICogdGhlIG9wZXJhdG9yIFJvbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAvLyBCT1RIIGhhbHZlcyBvZiB0aGUgb2xkIGBwbGF0Zm9ybTpyZWFkYDogdGhpcyBpcyB0aGUgb25lIGpvYiB0aGF0IGdlbnVpbmVseVxuICAvLyB3YW50cyB0aGUgZGVwbG95J3Mgb3duIGNvbmZpZ3VyYXRpb24gQU5EIHRoZSBjdXN0b21lciByb3N0ZXIuXG4gICdwbGF0Zm9ybTpyZWFkJyxcbiAgJ29yZ3M6cmVhZCcsXG4gICdvbmNhbGw6bWFuYWdlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgLy8gUlVOTklORyB0aGUgZGVwbG95bWVudDogcmFpc2UgYSBxdW90YSBkdXJpbmcgYW4gaW5jaWRlbnQsIHdhdGNoIHRoZSBidWlsZFxuICAvLyBxdWV1ZSBhbmQgcHVyZ2UgaXRzIGRlYWQtbGV0dGVyIHF1ZXVlLlxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgLy8gUmVhZHMgdGhhdCBtYWtlIHRoZSBvcGVyYXRvciB2aWV3cyB1c2FibGU6IHRoZSBkYXNoYm9hcmRzIHRoZSBwb3N0dXJlIHBhbmVsc1xuICAvLyBsaXZlIG9uLCB0aGUgY3Jvc3MtdGVuYW50IGxvZyB2aWV3LCBhbmQgdGhlIGN1c3RvbWVyJ3MgcGxhbiB3aGVuIGEgbGltaXQgaXNcbiAgLy8gdGhlIHRoaW5nIGJlaW5nIGRlYnVnZ2VkLlxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAvLyBUaGUgcmVnaXN0cnkgYnJvd3NlcjogcmVwb3NpdG9yeSBuYW1lcywgdGFncyBhbmQgbWFuaWZlc3RzIGZvciB0aGUgaW1hZ2VzXG4gIC8vIHRoaXMgZGVwbG95bWVudCdzIGJ1aWxkcyBwcm9kdWNlLiBJdCB3YXMgd2l0aGhlbGQgd2hpbGUgYHJlZ2lzdHJ5OnJlYWRgIHdhc1xuICAvLyBzdXBlcmFkbWluLW9ubHkg4oCUIGEgc2VlZGVkIGJ1bmRsZSBjYXJyeWluZyBhIHN1cGVyYWRtaW4tb25seSBwZXJtaXNzaW9uXG4gIC8vIHdvdWxkIG1ha2UgdGhhdCBsaXN0IGEgbGllLCBzaW5jZSBidW5kbGVzIGJ5cGFzcyBgc2FuaXRpemVQZXJtaXNzaW9uc2AuIFRoZVxuICAvLyBwZXJtaXNzaW9uIHdhcyBwcm9tb3RlZCB0byBzeXN0ZW0tb3JnLW9ubHkgZGVsaWJlcmF0ZWx5IHJhdGhlciB0aGFuIHNtdWdnbGVkXG4gIC8vIGluIGhlcmUsIHdoaWNoIGlzIHRoZSBvcmRlciB0aG9zZSB0d28gY2hhbmdlcyBoYXZlIHRvIGhhcHBlbiBpbi5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuXTtcblxuLyoqXG4gKiBBQ0NPVU5UIE1BTkFHRVIg4oCUIHRoZSBjb21tZXJjaWFsIHJlbGF0aW9uc2hpcCB3aXRoIGEgY3VzdG9tZXIsIGFzIG9wcG9zZWQgdG9cbiAqIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQuXG4gKlxuICogU3BsaXQgZnJvbSB7QGxpbmsgUExBVEZPUk1fT1BFUkFUT1JfUEVSTUlTU0lPTlN9IHJhdGhlciB0aGFuIHBpbGVkIG9udG8gaXQsXG4gKiBiZWNhdXNlIHRoZSB0d28gam9icyBkaXZlcmdlIGF0IGV4YWN0bHkgdGhlIHBlcm1pc3Npb25zIGFkZGVkIGFsb25nc2lkZSB0aGlzXG4gKiBidW5kbGUuIGBiaWxsaW5nOm9wZXJhdGVgIE1PVkVEIGhlcmUgZnJvbSB0aGUgb3BlcmF0b3IgYnVuZGxlIGZvciB0aGF0IHJlYXNvbjpcbiAqIG1pbnRpbmcgYSBkaXNjb3VudCB0b2tlbiBpcyBhIGNvbW1lcmNpYWwgYWN0LCBub3QgYW4gb3BlcmF0aW9uYWwgb25lLCBhbmQgdGhlXG4gKiBwZXJzb24gd2hvIHJlc3RhcnRzIGEgc3R1Y2sgYnVpbGQgcXVldWUgaGFzIG5vIHJlYXNvbiB0byBob2xkIGl0LlxuICpcbiAqIFRoZSBkZXN0cnVjdGl2ZSBoYWxmIG9mIHRoZSBjYXRhbG9ndWUgbGl2ZXMgaGVyZSDigJQgYG9yZ3M6bWFuYWdlYCBjYW4gREVMRVRFXG4gKiBhbiBvcmdhbmlzYXRpb24gYW5kIGBzdWJzY3JpcHRpb25zOm1hbmFnZWAgY2FuIGNhbmNlbCBpdHMgc3Vic2NyaXB0aW9uIOKAlCBzb1xuICogdGhpcyBpcyBkZWxpYmVyYXRlbHkgdGhlIHNtYWxsZXIsIG1vcmUgcmFyZWx5LWFzc2lnbmVkIG9mIHRoZSB0d28uXG4gKi9cbmV4cG9ydCBjb25zdCBBQ0NPVU5UX01BTkFHRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOm1hbmFnZScsXG4gICdvcmdzOm1hbmFnZScsXG4gICdiaWxsaW5nOm9wZXJhdGUnLFxuICAvLyBBIHF1b3RhIGJ1bXAgaXMgYXMgb2Z0ZW4gYSBjb21tZXJjaWFsIGNvbmNlc3Npb24gYXMgYW4gb3BlcmF0aW9uYWwgb25lLCBzb1xuICAvLyBib3RoIGJ1bmRsZXMgY2FycnkgaXQuXG4gICdxdW90YXM6bWFuYWdlJyxcbiAgLy8gVGhlIGFsbC1vcmdhbml6YXRpb25zIGxpc3QsIHdoaWNoIGlzIHRoZSBzdXJmYWNlIHRoaXMgam9iIHdvcmtzIGZyb20g4oCUIGFuZFxuICAvLyBvbmx5IHRoYXQuIEl0IHVzZWQgdG8gdGFrZSBgcGxhdGZvcm06cmVhZGAsIHdoaWNoIGFsc28gaGFuZGVkIG92ZXIgdGhlXG4gIC8vIGRlcGxveSdzIFJMUyBtb2RlLCBLTVMgcG9zdHVyZSBhbmQgcmVuZGVyZWQgYWxlcnQgcnVsZXM6IGludGVybmFscyBhXG4gIC8vIGNvbW1lcmNpYWwgcm9sZSBoYXMgbm8gdXNlIGZvci5cbiAgJ29yZ3M6cmVhZCcsXG5dO1xuXG4vKipcbiAqIENPTlNPTEUgQURNSU5JU1RSQVRPUiDigJQgdGhlIG9wZXJhdG9yIGNvbnNvbGVzLCBhcyBhIFJvbGUuXG4gKlxuICogV0hZIFRISVMgRVhJU1RTIGV2ZW4gdGhvdWdoIGVhY2ggY29uc29sZSBwZXJtaXNzaW9uIGlzIGdyYW50YWJsZSBieSBoYW5kOiB3aXRoXG4gKiBubyBzZWVkZWQgUm9sZSwgdGhlIG9ubHkgcGF0aCB0byBwZ0FkbWluIHdhcyBhIHN1cGVyYWRtaW4gY29tcG9zaW5nIGEgY3VzdG9tXG4gKiBSb2xlIGZvciBpdCwgYW5kIHRoZSBvYnNlcnZlZCBvdXRjb21lIG9mIGFza2luZyBwZW9wbGUgdG8gZG8gdGhhdCBpcyB0aGF0IHRoZXlcbiAqIHJlYWNoIGZvciB0aGUgc3VwZXJhZG1pbiBGTEFHIGluc3RlYWQg4oCUIHRoZSBleGFjdCBmYWlsdXJlIHRoZXNlIHBlcm1pc3Npb25zXG4gKiB3ZXJlIGFkZGVkIHRvIHJlbW92ZS4gQSBuYW1lZCBSb2xlIGFsc28gbWFrZXMgXCJ3aG8gY2FuIG9wZW4gYSBkYXRhIHNoZWxsP1wiIG9uZVxuICogcXVlcnkgaW5zdGVhZCBvZiBhbiBhdWRpdCBvZiBldmVyeSBjdXN0b20gUm9sZS5cbiAqXG4gKiBJdCBjYXJyaWVzIGFsbCB0aHJlZSBjb25zb2xlcywgd2hpY2ggaXMgdGhlIHdob2xlIGpvYiBmb3IgdGhlIHBlcnNvbiB3aG8gaG9sZHNcbiAqIGl0LiBPTkUgQ09OU0VRVUVOQ0UgV09SVEggS05PV0lORzogYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgYW5kXG4gKiBgb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuYCBhcmUgdGhlIHR3byBoYWx2ZXMgb2YgdGhlIGF1ZGl0IHRhbXBlci1ldmlkZW5jZVxuICogZGVzaWduIOKAlCBhIE1vbmdvIHNoZWxsIGNhbiB0cnVuY2F0ZSBhIGhhc2ggY2hhaW4ncyB0YWlsLCBhbmQgdGhlIG9iamVjdCBzdG9yZVxuICogaG9sZHMgdGhlIHNpZ25lZCBoZWFkcyB0aGF0IHdvdWxkIGV4cG9zZSB0aGUgdHJ1bmNhdGlvbiDigJQgc28gYSBob2xkZXIgb2YgdGhpc1xuICogUm9sZSBjYW4gZG8gYm90aC4gVGhlIHBlcm1pc3Npb25zIHN0YXkgU0VQQVJBVEUgZm9yIGV4YWN0bHkgdGhhdCByZWFzb246IGFcbiAqIGRlcGxveW1lbnQgdGhhdCB3YW50cyB0aGVtIGhlbGQgYnkgZGlmZmVyZW50IHBlb3BsZSBjb21wb3NlcyBhIG5hcnJvd2VyIFJvbGVcbiAqIGJ5IGhhbmQgKGEgc3VwZXJhZG1pbiBtYXkgaW5jbHVkZSBhbnkgc3lzdGVtLW9yZy1vbmx5IHBlcm1pc3Npb24gaW4gYSBSb2xlXG4gKiBhdXRob3JlZCBpbiB0aGUgc3lzdGVtIG9yZykgYW5kIGFzc2lnbnMgdGhpcyBvbmUgdG8gbm9ib2R5LlxuICovXG4vKipcbiAqIFBMQVRGT1JNIE9CU0VSVkVSIOKAlCBsb29rLCBkb24ndCB0b3VjaC4gVGhlIGxhZGRlcidzIG1pc3NpbmcgYm90dG9tIHJ1bmcuXG4gKlxuICogRXZlcnkgb3RoZXIgc3lzdGVtLW9yZyBidW5kbGUgZ3JhbnRzIGEgd3JpdGUuIFRoZSBvbmUgdGhhdCBkb2VzIG5vdCDigJRcbiAqIENvbnNvbGUgQWRtaW5pc3RyYXRvciDigJQgZ3JhbnRzIGEgcmVhZCB0aGF0IElTIGEgZGF0YWJhc2Ugc2hlbGwuIFNvIHNvbWVib2R5XG4gKiB3aG8gc2hvdWxkIHNlZSB0aGUgZGVwbG95bWVudCBhbmQgY2hhbmdlIG5vdGhpbmcgKGEgbmV3IG9wZXJhdG9yIHNoYWRvd2luZywgYW5cbiAqIGF1ZGl0b3IsIGFuIG9uLWNhbGwgZW5naW5lZXIgZHVyaW5nIGEgaGFuZG92ZXIpIGhhZCB0d28gb3B0aW9uczogU3VwZXIgQWRtaW4sXG4gKiBvciBub3RoaW5nLiBUaGUgdXN1YWwgb3V0Y29tZSBvZiBhIGNob2ljZSBsaWtlIHRoYXQgaXMgdGhlIGZsYWcuXG4gKlxuICogU3RyaWN0bHkgcmVhZC1vbmx5IGJ5IGNvbnN0cnVjdGlvbjogZXZlcnkgcGVybWlzc2lvbiBoZXJlIGVuZHMgYDpyZWFkYCwgd2hpY2hcbiAqIGBpc011dGF0aW9uUGVybWlzc2lvbmAgY2xhc3NpZmllcyBhcyBhIHJlYWQsIHNvIHRoZSBkYXNoYm9hcmQgZGlzYWJsZXMgZXZlcnlcbiAqIHdyaXRlIGFmZm9yZGFuY2UgZm9yIGEgaG9sZGVyIHJhdGhlciB0aGFuIG9mZmVyaW5nIGNvbnRyb2xzIHRoYXQgNDAzLlxuICpcbiAqIE5PVCBgYXVkaXQ6cmVhZGAuIEl0IHdvdWxkIGJlIHRoZSBvYnZpb3VzIGFkZGl0aW9uIGFuZCBpdCBpcyB0aGUgd3Jvbmcgb25lOlxuICogYGxpc3RBdWRpdEV2ZW50c2AgcGlucyBldmVyeSBub24tc3VwZXJhZG1pbiB0byB0aGVpciBPV04gb3JnLCBzbyBhIHN5c3RlbS1vcmdcbiAqIG9ic2VydmVyIGhvbGRpbmcgaXQgd291bGQgc2VlIHRoZSBzeXN0ZW0gb3JnJ3MgYXVkaXQgdHJhaWwgYW5kIG5vdGhpbmcgZWxzZSDigJRcbiAqIGFuIGFmZm9yZGFuY2UgdGhhdCBsb29rcyBsaWtlIGZsZWV0LXdpZGUgYXVkaXQgYWNjZXNzIGFuZCBpcyBub3QuIFJlYWRpbmdcbiAqIGFub3RoZXIgdGVuYW50J3MgdHJhaWwgaXMgZGVsaWJlcmF0ZWx5IHRoZSBmbGFnJ3MgYWxvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PQlNFUlZFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG4gICdkYXNoYm9hcmRzOnJlYWQnLFxuICAvLyBBIHJlYWQsIGFuZCB0aGlzIFJvbGUgaXMgcmVhZHMg4oCUIHRoZSByZWdpc3RyeSBicm93c2VyIHdpdGggbmVpdGhlciBvZiB0aGVcbiAgLy8gdHdvIHdyaXRlIHJ1bmdzIChgcmVnaXN0cnk6d3JpdGVgIGNvcGllcywgYHJlZ2lzdHJ5OnB1cmdlYCBkZWxldGVzKS5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuXTtcblxuZXhwb3J0IGNvbnN0IENPTlNPTEVfQURNSU5fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsXG4gICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAvLyBUaGUgYWxsLW9yZ2FuaXphdGlvbnMgbGlzdCwgc28gYSBob2xkZXIgY2FuIGZpbmQgdGhlIG9yZyB0aGV5IHdlcmUgYXNrZWRcbiAgLy8gYWJvdXQgd2l0aG91dCBhIHNlY29uZCBSb2xlIOKAlCBhbmQgbm90aGluZyBtb3JlLiBUaGlzIHdhcyBgcGxhdGZvcm06cmVhZGAsXG4gIC8vIHdoaWNoIG1lYW50IG9wZW5pbmcgYSBkYXRhYmFzZSBjb25zb2xlIGFsc28gZ3JhbnRlZCB0aGUgZGVwbG95J3Mgb3duXG4gIC8vIGNvbmZpZ3VyYXRpb24sIGZvciBubyByZWFzb24gYmV5b25kIHRoZSB0d28gc2hhcmluZyBhIGdhdGUuXG4gICdvcmdzOnJlYWQnLFxuXTtcblxuLyoqXG4gKiBSRUdJU1RSWSBPUEVSQVRPUiDigJQgbW92ZXMgY29udGFpbmVyIGltYWdlcyBhcm91bmQsIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogVEhFIEdBUCBJVCBGSUxMUy4gUHJvbW90aW5nIGFuIGltYWdlIOKAlCBjb3B5aW5nIGEgYnVpbHQgdGFnIGZyb20gb25lIHJlcG9zaXRvcnlcbiAqIHRvIHRoZSBvbmUgYSByZWxlYXNlIHJlc29sdmVzIOKAlCBpcyBhIGpvYiBzb21lYm9keSBkb2VzLCBhbmQgdW50aWwgbm93IHRoZSBvbmx5XG4gKiBpZGVudGl0eSB0aGF0IGNvdWxkIGRvIGl0IHdhcyBhIHN1cGVyYWRtaW4uIGByZWdpc3RyeTp3cml0ZWAgaGFzIG5vIG90aGVyXG4gKiBjYXJyaWVyLCBhbmQgYSBzeXN0ZW0tb3JnLW9ubHkgcGVybWlzc2lvbiB3aXRoIG5vIHNlZWRlZCBjYXJyaWVyIGlzXG4gKiBzdXBlcmFkbWluLW9ubHkgaW4gcHJhY3RpY2UgKHRoZSBgcGxhdGZvcm06cmVhZGAgZmFpbHVyZSwgcGlubmVkIGJ5IHRoZVxuICogXCJhdCBsZWFzdCBvbmUgc2VlZGVkIGNhcnJpZXJcIiBhc3NlcnRpb24gaW4gYXBpLWNvcmUncyBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKiBTbyBzcGxpdHRpbmcgYHJlZ2lzdHJ5OnB1cmdlYCBvdXQgb2YgYHJlZ2lzdHJ5OndyaXRlYCBpcyBvbmx5IGhhbGYgdGhlIGNoYW5nZTpcbiAqIHRoZSBhZGRpdGl2ZSBoYWxmIG5lZWRzIGEgUm9sZSBvciB0aGUgc3BsaXQgYnV5cyBub3RoaW5nLlxuICpcbiAqIFdIWSBJVCBJUyBOT1QgUEFSVCBPRiBQTEFURk9STSBPUEVSQVRPUi4gVGhhdCBSb2xlIHJ1bnMgdGhlIGRlcGxveW1lbnQgYW5kXG4gKiBhbHJlYWR5IHJlYWRzIHRoZSByZWdpc3RyeS4gUHJvbW90aW5nIGFuIGltYWdlIGlzIGEgcmVsZWFzZSBkZWNpc2lvbiwgbm90IGFuXG4gKiBvcGVyYXRpb25hbCBzaWRlIGVmZmVjdCwgYW5kIHJvbGxpbmcgaXQgaW50byB0aGUgUm9sZSBldmVyeW9uZSBvbiBjYWxsIGhvbGRzXG4gKiB3b3VsZCBtZWFuIHRoZSBwYWdlciByb3RhdGlvbiBjYW4gcmV0YWcgYSByZWxlYXNlIGF0IDNhbS4gVGhlIHR3byBSb2xlc1xuICogY29tcG9zZSBpbnN0ZWFkIOKAlCBhIG1lbWJlciBtYXkgaG9sZCBhbnkgbnVtYmVyLCBhbmQgcGVybWlzc2lvbnMgYXJlIHRoZSB1bmlvbi5cbiAqXG4gKiBXSFkgSVQgSVMgT05MWSBUV08gUEVSTUlTU0lPTlMuIERlbGliZXJhdGVseSBub3RoaW5nIGVsc2U6IG5vIGBwbGF0Zm9ybTpyZWFkYCxcbiAqIG5vIGNvbnNvbGUsIG5vIGBvcmdzOnJlYWRgLiBgY2FuUmVhZFJlcG9gL2BjYW5Xcml0ZVJlcG9gIGNvbmZpbmUgYVxuICogbm9uLXN1cGVyYWRtaW4gc3lzdGVtLW9yZyBob2xkZXIgdG8gYHN5c3RlbS8qYCwgYGxpYnJhcnkvKmAgYW5kIGBwdWJsaWMvKmAg4oCUXG4gKiB0aGlzIGRlcGxveW1lbnQncyBvd24gYmFzZSBhbmQgcGx1Z2luIGltYWdlcyDigJQgc28gdGhlIFJvbGUgY2Fubm90IHJlYWNoIGFcbiAqIHRlbmFudCdzIHJlcG9zaXRvcmllcyBhdCBhbGwsIGFuZCBhIGhvbGRlciB3aG8gYWxzbyBuZWVkcyB0aGUgb3BlcmF0b3Igdmlld3NcbiAqIGdldHMgdGhlIG9wZXJhdG9yIFJvbGUgdG9vLiBJdCBkb2VzIE5PVCBjYXJyeSBgcmVnaXN0cnk6cHVyZ2VgLCB3aGljaCBpcyBpblxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIGluIG5vIGJ1bmRsZSBieSBkZXNpZ246IGFuIGltYWdlXG4gKiBwcm9tb3RlciBoYXMgbm8gYnVzaW5lc3MgZGVsZXRpbmcgdGhlIGltYWdlIGEgdGVuYW50J3MgcGlwZWxpbmUgcmVzb2x2ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncmVnaXN0cnk6cmVhZCcsXG4gICdyZWdpc3RyeTp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFNVUFBPUlQgQUdFTlQg4oCUIHRoZSBzdXBwb3J0IGRlc2ssIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGNhcnJpZXMgbm8gYHBsYXRmb3JtOnJlYWRgLCBubyBjb25zb2xlIGFuZCBubyBiaWxsaW5nIHdyaXRlOiBhblxuICogYWdlbnQgYW5zd2VycyBjYXNlcyBhbmQgd3JpdGVzIHRoZSBjYW5uZWQgcmVwbGllcy4gYHN1YnNjcmlwdGlvbnM6cmVhZGAgaXNcbiAqIGhlcmUgYmVjYXVzZSB0aGUgZmlyc3QgcXVlc3Rpb24gb24gYW55IGNhc2UgaXMgd2hhdCB0aGUgY3VzdG9tZXIgaXMgZW50aXRsZWRcbiAqIHRvLCBhbmQgd2l0aG91dCBpdCBhbiBhZ2VudCB3b3VsZCBoYXZlIHRvIGFzayBzb21lb25lIGVsc2UgdG8gbG9vay5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUFBPUlRfQUdFTlRfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3N1cHBvcnRfY2FzZXM6d3JpdGUnLFxuICAnc3VwcG9ydF9jb250ZW50OndyaXRlJyxcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gIC8vIE5FVywgYW5kIHRoZSBnYXAgdGhlIHNwbGl0IGV4cG9zZWQ6IGFuIGFnZW50IHRyaWFnaW5nIGEgY2FzZSBuZWVkcyB0byBmaW5kXG4gIC8vIHRoZSBjdXN0b21lcidzIG9yZ2FuaXphdGlvbi4gVGhlIG9ubHkgcGVybWlzc2lvbiB0aGF0IGxpc3RlZCBvcmdzIHdhc1xuICAvLyBgcGxhdGZvcm06cmVhZGAsIHdoaWNoIHdvdWxkIGFsc28gaGF2ZSBoYW5kZWQgYSBzdXBwb3J0IGFnZW50IHRoZSBkZXBsb3knc1xuICAvLyBpbnRlcm5hbHMg4oCUIHNvIHRoZXkgaGFkIG5laXRoZXIsIGFuZCBoYWQgdG8gYXNrIHNvbWVvbmUgZWxzZSB0byBsb29rLlxuICAnb3JnczpyZWFkJyxcbiAgLy8gUmVhZGluZyBhbmQgYW5zd2VyaW5nIHRoZSBjYXNlIGl0c2VsZiByaWRlcyB0aGUgb3JkaW5hcnkgbWVzc2FnaW5nXG4gIC8vIHBlcm1pc3Npb25zIOKAlCBhIHN1cHBvcnQgY2FzZSBJUyBhIG1lc3NhZ2UgdGhyZWFkLlxuICAnbWVzc2FnZXM6cmVhZCcsXG4gICdtZXNzYWdlczp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFNVUFBPUlQgTEVBRCDigJQgdGhlIHN1cHBvcnQgZGVzaywgcGx1cyB0aGUgYXV0aG9yaXR5IHRvIGxvb2suXG4gKlxuICogVEhFIEdBUCBJVCBGSUxMUy4gYGltcGVyc29uYXRpb246b3BlbmAgaXMgc3lzdGVtLW9yZy1vbmx5LCBhbmQgYSBzeXN0ZW0tb3JnLW9ubHlcbiAqIHBlcm1pc3Npb24gd2l0aCBubyBzZWVkZWQgY2FycmllciBpcyBzdXBlcmFkbWluLW9ubHkgaW4gcHJhY3RpY2Ug4oCUIHRoZVxuICogaW52YXJpYW50IGFwaS1jb3JlJ3MgYHRlc3QvcGVybWlzc2lvbnMudGVzdC50c2AgYXNzZXJ0cywgYW5kIHRoZSByZWFzb25cbiAqIGBwbGF0Zm9ybTpyZWFkYCBzaGlwcGVkIHVudXNhYmxlLiBXaXRob3V0IHRoaXMgUm9sZSwgc3BsaXR0aW5nIGltcGVyc29uYXRpb25cbiAqIG91dCBvZiB0aGUgZmxhZyB3b3VsZCBjaGFuZ2Ugbm90aGluZzogdGhlIG9ubHkgd2F5IHRvIGxldCBzb21lYm9keSB2aWV3IGFcbiAqIGN1c3RvbWVyJ3MgYWNjb3VudCB3b3VsZCBzdGlsbCBiZSB0byBtYWtlIHRoZW0gYSBmdWxsIFN1cGVyIEFkbWluLCBoYW5kaW5nXG4gKiBvdmVyIGAvYWRtaW4vdXNlcnMvOmlkL2dyYW50c2AsIHRoZSBzaW5nbGUtcGVyc29uIE1GQSByZXNldCwgdGhlIGRhdGFiYXNlXG4gKiBjb25zb2xlIGFuZCBgcmVnaXN0cnk6cHVyZ2VgIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogV0hZIElUIElTIFRIRSBTVVBQT1JUIERFU0sgQU5EIE5PVCBUSEUgT1BFUkFUT1IuIFRoZSBxdWVzdGlvbiBpbXBlcnNvbmF0aW9uXG4gKiBhbnN3ZXJzIGlzIFwid2hhdCBpcyB0aGlzIGN1c3RvbWVyIGFjdHVhbGx5IHNlZWluZz9cIiwgd2hpY2ggaXMgYSBzdXBwb3J0XG4gKiBxdWVzdGlvbi4gUGxhdGZvcm0gT3BlcmF0b3IgcnVucyB0aGUgZGVwbG95bWVudCBhbmQgaXMgaGVsZCBieSB3aG9ldmVyIGlzIG9uXG4gKiBjYWxsOyBhZGRpbmcgdGhpcyB0byBpdCB3b3VsZCBoYW5kIGV2ZXJ5IHJvdGEgbWVtYmVyIHRoZSBhYmlsaXR5IHRvIGJlY29tZSBhbnlcbiAqIGN1c3RvbWVyJ3MgdXNlciBhdCAzYW0uIFN1cHBvcnQgQWdlbnQncyBidW5kbGUgcGx1cyB0aGUgb25lIHBlcm1pc3Npb24gaXMgdGhlXG4gKiBuYXJyb3dlciwgbW9yZSBob25lc3Qgc2hhcGUg4oCUIGFuZCBhIGxlYWQgd2hvIGFsc28gcnVucyB0aGUgZGVwbG95bWVudCBob2xkc1xuICogYm90aCBSb2xlcy5cbiAqXG4gKiBXSEFUIElUIFNUSUxMIENBTk5PVCBETy4gRW1lcmdlbmN5IGFjY2VzczogYGJyZWFrZ2xhc3NgIGJ5cGFzc2VzIHRlbmFudFxuICogY29uc2VudCBhbmQgc3RheXMgb24gdGhlIGZsYWcsIGFwcHJvdmVkIGJ5IGEgc2Vjb25kIFN1cGVyIEFkbWluLiBBbmQgdGhlXG4gKiB0ZW5hbnQgY2FuIHJlZnVzZSDigJQgYGltcGVyc29uYXRpb246b3BlbmAgaXMgcGVybWlzc2lvbiB0byBBU0suXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JUX0xFQURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLi4uU1VQUE9SVF9BR0VOVF9QRVJNSVNTSU9OUyxcbiAgJ2ltcGVyc29uYXRpb246b3BlbicsXG5dO1xuXG4vKipcbiAqIFNUQVJUSU5HIFBPSU5UUyBmb3IgYSBjdXN0b20gUm9sZSBpbiBhIHRlbmFudCBvcmcg4oCUIHRlbXBsYXRlcywgbm90IFJvbGVzLlxuICpcbiAqIFRIRSBHQVAgVEhFWSBGSUxMLiBBbiBvcmcgc2VlZHMgZXhhY3RseSBUV08gUm9sZXMg4oCUIE1lbWJlciBhbmQgQWRtaW4g4oCUIGFuZFxuICogQWRtaW4gaXMgZXZlcnkgb3JnLWFzc2lnbmFibGUgcGVybWlzc2lvbi4gU28gcHJvbW90aW5nIGFueW9uZSBwYXN0IFwiYXV0aG9yIGFuZFxuICogcmVhZFwiIGhhbmRzIG92ZXIgdGhlIHdob2xlIHJlbWFpbmRlciBhdCBvbmNlOiBgb3JnX2ttczp3cml0ZWAsXG4gKiBgb3JnX2lkcDp3cml0ZWAsIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAsIGBiaWxsaW5nOm1hbmFnZWAsIGByb2xlczptYW5hZ2VgXG4gKiBhbmQgYGF1ZGl0OnJlYWRgIGFtb25nIHRoZW0uIFRoZSBwcm9kdWN0J3MgYW5zd2VyIGlzIFwiYXV0aG9yIGEgY3VzdG9tIFJvbGVcIixcbiAqIGFuZCB0aGUgc2FmZXR5IGlzIGFscmVhZHkgcmlnaHQgKGBzYW5pdGl6ZVBlcm1pc3Npb25zYCBib3VuZHMgYSBjdXN0b20gUm9sZSBieVxuICogaXRzIGF1dGhvcidzIG93biBjZWlsaW5nKS4gV2hhdCB3YXMgbWlzc2luZyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKlxuICogVGhlIGV4YWN0IHNpemVzIG9mIHRoYXQgY2xpZmYgYXJlIGFzc2VydGVkIGluIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgXG4gKiByYXRoZXIgdGhhbiB3cml0dGVuIGhlcmUuIFRoaXMgcGFyYWdyYXBoIHVzZWQgdG8gY2FycnkgdGhlbSBpbmxpbmUg4oCUIFwidGhyZWVcbiAqIFJvbGVzOiBNZW1iZXIgKDE1KSwgVGVhbSBMZWFkICgxNykgYW5kIEFkbWluICgzNylcIiDigJQgYW5kIGV2ZXJ5IG9uZSBvZiB0aG9zZVxuICogbnVtYmVycyB3ZW50IHN0YWxlOiBgVGVhbSBMZWFkYCBzdG9wcGVkIGJlaW5nIHNlZWRlZCB3aGVuIGl0IGJlY2FtZSB0aGUgZmlyc3RcbiAqIHRlbXBsYXRlIGJlbG93LCBhbmQgdGhlIHR3byBidW5kbGVzIGhhdmUgZ3Jvd24gc2luY2UuIEEgY291bnQgbm90aGluZyBjaGVja3NcbiAqIGlzIGEgY2xhaW0gdGhhdCBkZWNheXMsIGFuZCB0aGlzIG9uZSB3YXMgdGhlIHN0YXRlZCByYXRpb25hbGUgZm9yIHRoZSBmZWF0dXJlLlxuICpcbiAqIFdIWSBURU1QTEFURVMgQU5EIE5PVCBTRUVERUQgUk9MRVMuIEEgc2VlZGVkIGJ1aWx0LWluIGlzIGBzeXN0ZW06IHRydWVgIGFuZFxuICogdGhlcmVmb3JlIGltbXV0YWJsZSwgc28gc2VlZGluZyB0aGVzZSB3b3VsZCBwdXQgZm91ciB1bmRlbGV0YWJsZSByb3dzIGluIGV2ZXJ5XG4gKiBvcmcgd2hldGhlciBpdCB3YW50cyB0aGVtLiBBIHRlbXBsYXRlIGxlYXZlcyBubyB0cmFjZSB1bnRpbCBzb21lb25lIHVzZXMgaXQsXG4gKiBhbmQgd2hhdCBpdCBwcm9kdWNlcyBpcyBhbiBvcmRpbmFyeSBjdXN0b20gUm9sZSB0aGUgb3JnIGZ1bGx5IG93bnMg4oCUIGVkaXRhYmxlLFxuICogZGVsZXRhYmxlLCBhbmQgYm91bmRlZCBieSB0aGUgYXV0aG9yJ3MgY2VpbGluZyBsaWtlIGFueSBvdGhlci5cbiAqXG4gKiBXSEFUIFRIRVkgREVMSUJFUkFURUxZIEVYQ0xVREUuIGByb2xlczptYW5hZ2VgIGlzIGluIG5vbmUgb2YgdGhlbS4gSXQgaXMgdGhlXG4gKiBvbmUgcGVybWlzc2lvbiB0aGF0IGNvbXBvdW5kcyDigJQgdGhlIGhvbGRlciBjYW4gbWludCBmdXJ0aGVyIFJvbGVzLCB1cCB0byB0aGVpclxuICogb3duIGNlaWxpbmcg4oCUIHNvIGFjcXVpcmluZyBpdCBzaG91bGQgc3RheSBhIGNvbnNjaW91cyBhY3QgcmF0aGVyIHRoYW4gYSBzaWRlXG4gKiBlZmZlY3Qgb2YgcGlja2luZyBhIHByZXNldC4gRXZlcnkgcGVybWlzc2lvbiBoZXJlIGlzIG9yZy1hc3NpZ25hYmxlLCBzbyBhXG4gKiB0ZW1wbGF0ZSBpcyB2YWxpZCBpbiBhbnkgb3JnIGFuZCBgc2FuaXRpemVQZXJtaXNzaW9uc2AgYWNjZXB0cyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlVGVtcGxhdGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBXaGF0IHRoZSBqb2IgaXMg4oCUIHNob3duIG5leHQgdG8gdGhlIHRlbXBsYXRlLCBhbmQgYSBzZW5zaWJsZSBSb2xlIGRlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogcmVhZG9ubHkgUGVybWlzc2lvbltdO1xufVxuXG5leHBvcnQgY29uc3QgUk9MRV9URU1QTEFURVM6IHJlYWRvbmx5IFJvbGVUZW1wbGF0ZVtdID0gW1xuICB7XG4gICAgLy8gV2FzIGEgU0VFREVEIFJvbGUgaW4gZXZlcnkgb3JnIHVudGlsIGl0IGJlY2FtZSBhIHRlbXBsYXRlLiBJdCBpcyB0aGUgb25seVxuICAgIC8vIGJ1aWx0LWluIHRoYXQgd2FzIGEgam9iIGRlc2NyaXB0aW9uIHJhdGhlciB0aGFuIGEgc3RydWN0dXJhbCByZXF1aXJlbWVudDpcbiAgICAvLyBTdXBlciBBZG1pbiBpcyB3aGVyZSBgaXNTdXBlckFkbWluYCBpcyBkZXJpdmVkIGZyb20sIEFkbWluIGFuZCBNZW1iZXIgYXJlXG4gICAgLy8gdGhlIGZsb29yIGFuIG9yZyBpcyB1bnVzYWJsZSB3aXRob3V0LCBhbmQgdGhlIHN5c3RlbS1vcmcgUm9sZXMgY2FycnlcbiAgICAvLyBwZXJtaXNzaW9ucyBubyBjdXN0b20gUm9sZSBtYXkgaG9sZC4gVGVhbSBMZWFkIHdhcyBub25lIG9mIHRob3NlIOKAlCBpdCBpc1xuICAgIC8vIGBtZW1iZXJgIHBsdXMgdHdvIHJlcG9ydCBwZXJtaXNzaW9ucywgYW5kIGFuIG9yZyB0aGF0IGRvZXMgbm90IGRlbGVnYXRlXG4gICAgLy8gcmVwb3J0IGF1dGhvcmluZyBoYWQgYW4gdW5kZWxldGFibGUgcm93IGZvciBpdCBhbnl3YXkuXG4gICAgLy9cbiAgICAvLyBDT05TRVFVRU5DRSwgc3RhdGVkIHJhdGhlciB0aGFuIGRpc2NvdmVyZWQ6IGEgbmV3IG9yZyBubyBsb25nZXIgaGFzIGEgUm9sZVxuICAgIC8vIHRoYXQgZ3JhbnRzIGByZXBvcnRzOndyaXRlYCB0byBhIG5vbi1hZG1pbi4gQW4gYWRtaW4gaG9sZHMgYm90aCBwZXJtaXNzaW9uc1xuICAgIC8vICh0aGV5IGFyZSBpbiB0aGUgYWRtaW4gYnVuZGxlKSBhbmQgaW5zdGFudGlhdGVzIHRoaXMgdGVtcGxhdGUgdG8gZGVsZWdhdGVcbiAgICAvLyB0aGVtIOKAlCB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgZm91ciBiZWxvdy4gT3JncyB0aGF0IGFscmVhZHkgaGF2ZSB0aGUgc2VlZGVkXG4gICAgLy8gUm9sZSBrZWVwIGl0LCBhbmQgdGhlIGJhY2tmaWxsIGtlZXBzIGl0cyBidW5kbGUgY3VycmVudC5cbiAgICBpZDogJ3RlYW0tbGVhZCcsXG4gICAgbmFtZTogJ1RlYW0gTGVhZCcsXG4gICAgZGVzY3JpcHRpb246ICdBdXRob3JzIGFuZCBzaGFyZXMgc3Rha2Vob2xkZXIgcmVwb3J0cyBmb3IgYSB0ZWFtLCB3aXRob3V0IG9yZy1hZG1pbiBhY2Nlc3MuJyxcbiAgICBwZXJtaXNzaW9uczogWy4uLk1FTUJFUl9QRVJNSVNTSU9OUywgJ3JlcG9ydHM6d3JpdGUnLCAncmVwb3J0czpwdWJsaXNoJ10sXG4gIH0sXG4gIHtcbiAgICAvKipcbiAgICAgKiBNRU1CRVIgQUxSRUFEWSBJUyBUSEUgREVWRUxPUEVSIFJPTEUg4oCUIHRoaXMgdGVtcGxhdGUgZXhpc3RzIGZvciB3aGF0IGl0XG4gICAgICogZG9lcyBOT1QgY292ZXIuXG4gICAgICpcbiAgICAgKiBFdmVyeXRoaW5nIGluIGEgZGV2ZWxvcGVyJ3MgbG9vcCBpcyBgcGlwZWxpbmVzOnJlYWRgICsgYHBpcGVsaW5lczp3cml0ZWAsXG4gICAgICogYm90aCBpbiB0aGUgbWVtYmVyIGJ1bmRsZTogY3JlYXRlLCBlZGl0LCB2YWxpZGF0ZSwgcnVuLCBzdG9wLCB0aGUgYnVsa1xuICAgICAqIG9wcywgQUkgZ2VuZXJhdGlvbiAoYC9waXBlbGluZXMvZ2VuZXJhdGVgLCBpbmNsLiBmcm9tLXVybCBhbmQgc3RyZWFtaW5nKSxcbiAgICAgKiB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIHBsdXMgYHRlbXBsYXRlczpyZWFkYCB0byBpbnN0YW50aWF0ZSBhbmRcbiAgICAgKiBgcGx1Z2luczppbnN0YWxsYCB0byBhZGQgYSBwbHVnaW4uIEEgdGVtcGxhdGUgcmVzdGF0aW5nIHRoYXQgd291bGQgYnV5XG4gICAgICogbm90aGluZy5cbiAgICAgKlxuICAgICAqIFdoYXQgYSBkZXZlbG9wZXIgaGl0cyB0aGUgY2xpZmYgb24gaXMgdGhlIFNFTEYtU0VSVklDRSBvcGVyYXRlIHBhaXI6IHRoZXlcbiAgICAgKiBjYW4gcmVhZCB0aGVpciBzZXJ2aWNlJ3MgZGFzaGJvYXJkcyBhbmQgbWV0cmljcyBhbmQgY2Fubm90IGNoYW5nZSBlaXRoZXIsXG4gICAgICogYmVjYXVzZSBib3RoIHdyaXRlcyBzaXQgaW4gdGhlIGFkbWluIGJ1bmRsZS4gU28gdGhlIHBlcnNvbiB3aG8gb3ducyBhXG4gICAgICogcGlwZWxpbmUgZmlsZXMgYSB0aWNrZXQgdG8gZ2V0IGFuIGFsZXJ0IG9uIGl0LlxuICAgICAqXG4gICAgICogREVMSUJFUkFURUxZIE5PVCBIRVJFLiBgbG9nczpleHBvcnRgIOKAlCB2aWV3aW5nIGxvZ3MgcmlkZXNcbiAgICAgKiBgb2JzZXJ2YWJpbGl0eTpyZWFkYCwgYnV0IGRvd25sb2FkaW5nIHRoZW0gaXMgYnVsayBlZ3Jlc3MgYW4gb3JnIG1heVxuICAgICAqIHdpdGhob2xkIGZyb20gbWVtYmVycyAoZG9jcy9wZXJtaXNzaW9ucy5tZCksIGFuZCBhIHRlbXBsYXRlIGFpbWVkIGF0IGV2ZXJ5XG4gICAgICogZW5naW5lZXIgd291bGQgcmV2ZXJzZSB0aGF0LiBgcGlwZWxpbmVzOnB1Ymxpc2hgIOKAlCBzaGFyaW5nIGJleW9uZCB0aGVcbiAgICAgKiBhdXRob3IgaXMgYSByZWxlYXNlIGRlY2lzaW9uLCB3aGljaCBpcyBSZWxlYXNlIE1hbmFnZXIncyBiZWxvdzsgc29tZWJvZHlcbiAgICAgKiB3aG8gZG9lcyBib3RoIGhvbGRzIGJvdGggUm9sZXMuXG4gICAgICovXG4gICAgaWQ6ICdkZXZlbG9wZXInLFxuICAgIG5hbWU6ICdEZXZlbG9wZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGRzIGFuZCBydW5zIHBpcGVsaW5lcywgYW5kIG93bnMgdGhlIGRhc2hib2FyZHMgYW5kIGFsZXJ0cyBmb3Igd2hhdCB0aGV5IGJ1aWxkLicsXG4gICAgcGVybWlzc2lvbnM6IFsuLi5NRU1CRVJfUEVSTUlTU0lPTlMsICdkYXNoYm9hcmRzOndyaXRlJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnXSxcbiAgfSxcbiAge1xuICAgIGlkOiAncmVsZWFzZS1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnUmVsZWFzZSBNYW5hZ2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RlY2lkZXMgd2hhdCBiZWNvbWVzIHNoYXJlZCBiZXlvbmQgaXRzIGF1dGhvciwgYW5kIGFwcHJvdmVzIHBsdWdpbiBpbnN0YWxscy4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOnB1Ymxpc2gnLFxuICAgICAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczpwdWJsaXNoJyxcbiAgICAgICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczpwdWJsaXNoJyxcbiAgICAgICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdzZWN1cml0eS1vZmZpY2VyJyxcbiAgICBuYW1lOiAnU2VjdXJpdHkgT2ZmaWNlcicsXG4gICAgZGVzY3JpcHRpb246ICdJZGVudGl0eSwgZW5jcnlwdGlvbiBrZXlzIGFuZCB0aGUgZXZpZGVuY2UgdHJhaWwg4oCUIHRoZSBzdXJmYWNlIGFuIGF1ZGl0b3IgYXNrcyBhYm91dC4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnYXVkaXQ6cmVhZCcsICdsb2dzOmV4cG9ydCcsXG4gICAgICAnY29tcGxpYW5jZTpyZWFkJywgJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgICAgJ29yZ19pZHA6d3JpdGUnLCAnb3JnX2ttczp3cml0ZScsICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsXG4gICAgICAvLyBPd25pbmcgdGhlIGltcGVyc29uYXRpb24gUE9MSUNZIChgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgKSB3aXRob3V0XG4gICAgICAvLyBiZWluZyBhYmxlIHRvIGFuc3dlciBhIFJFUVVFU1Qgd2FzIHRoZSBhc3ltbWV0cnkgdGhlIGNvbnNlbnQgZmxvdyBsZWZ0XG4gICAgICAvLyBiZWhpbmQ6IHRoZSBsZXNzZXIgYWN0IGhhZCBhIHBlcm1pc3Npb24gb2YgaXRzIG93biBhbmQgdGhlIGdyZWF0ZXIgb25lXG4gICAgICAvLyBoYWQgbm9uZS4gV2hvZXZlciBkZWNpZGVzIHdoZXRoZXIgY29uc2VudCBpcyByZXF1aXJlZCBzaG91bGQgYmUgYWJsZSB0b1xuICAgICAgLy8gZ2l2ZSBvciB3aXRoaG9sZCBpdC5cbiAgICAgICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogJ3Blb3BsZS1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnUGVvcGxlIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIHJvc3RlciBhbmQgaXRzIG1hY2hpbmUgY3JlZGVudGlhbHMsIGFjcm9zcyB0aGUgYWNjb3VudFxcdTIwMTlzIHRlYW1zIOKAlCB3aXRob3V0IHRoZSBvcmdcXHUyMDE5cyBzZXR0aW5ncyBvciBpdHMgbW9uZXkuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ21lbWJlcnM6bWFuYWdlJywgJ2ludml0YXRpb25zOm1hbmFnZScsICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZScsXG4gICAgICAvLyBUaGUgc2FtZSBqb2IsIG9uZSBsZXZlbCBkb3duOiBlbnRlcmluZyBhIGRlc2NlbmRhbnQgdGVhbSB0byB3b3JrIG9uIGl0c1xuICAgICAgLy8gcm9zdGVyLCBhbmQgdmlld2luZyBvbmUgb2YgaXRzIG1lbWJlcnMgYXMgdGhhdCBtZW1iZXIuIFdpdGhvdXQgaXQgYVxuICAgICAgLy8gcGVvcGxlIG1hbmFnZXIgaW4gYSBwYXJlbnQgb3JnIGNhbiBhZG1pbmlzdGVyIHRoZSBhY2NvdW50J3MgdGVhbXMgb25cbiAgICAgIC8vIHBhcGVyIGFuZCBub3QgcmVhY2ggdGhlbS5cbiAgICAgICd0ZWFtX2FjY2VzczpvcGVuJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdiaWxsaW5nLW1hbmFnZXInLFxuICAgIG5hbWU6ICdCaWxsaW5nIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIHN1YnNjcmlwdGlvbiwgc2VhdHMgYW5kIGludm9pY2VzIGZvciB0aGlzIG9yZ2FuaXphdGlvbi4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnYmlsbGluZzpyZWFkJywgJ2JpbGxpbmc6bWFuYWdlJywgJ3F1b3RhczpyZWFkJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgLyoqXG4gICAgICogVGhlIGpvYiB0aGUgaW1wZXJzb25hdGlvbiBjb25zZW50IGZsb3cgY3JlYXRlZCBJTlNJREUgdGhlIHRlbmFudDogdGhlXG4gICAgICogbmFtZWQgcGVyc29uIHdobyBhbnN3ZXJzIFwibWF5IGEgc3VwcG9ydCBlbmdpbmVlciB2aWV3IHRoaXMgYWNjb3VudD9cIiBhbmRcbiAgICAgKiBjYW4gYWZ0ZXJ3YXJkcyByZWFkIHdoYXQgaGFwcGVuZWQuXG4gICAgICpcbiAgICAgKiBJdCBleGlzdHMgYXMgYSB0ZW1wbGF0ZSBiZWNhdXNlIGBpbXBlcnNvbmF0aW9uOmFwcHJvdmVgIGlzIGluIHRoZSBhZG1pblxuICAgICAqIGFuZCBvd25lciBidW5kbGVzIOKAlCBzbyBieSBkZWZhdWx0IGV2ZXJ5IGFkbWluIG1heSBjb25zZW50IOKAlCBhbmQgdGhlIHdob2xlXG4gICAgICogcG9pbnQgb2Ygc3BsaXR0aW5nIGl0IG91dCB3YXMgdG8gbGV0IGFuIG9yZyBzYXkgXCJ0aGlzIGRlY2lzaW9uIGlzIG9uZVxuICAgICAqIHBlcnNvbidzXCIuIERvaW5nIHRoYXQgbWVhbnMgYXV0aG9yaW5nIGEgUm9sZSB0aGF0IGhvbGRzIGl0IGFuZCB0YWtpbmcgaXRcbiAgICAgKiBvZmYgdGhlIG90aGVycywgYW5kIGhhbmQtY29tcG9zaW5nIHdhcyB0aGUgb25seSByb3V0ZS5cbiAgICAgKlxuICAgICAqIFR3byBwZXJtaXNzaW9ucyBhbmQgbm8gbW9yZTogYXBwcm92aW5nIGlzIG5vdCBhZG1pbmlzdGVyaW5nLiBgYXVkaXQ6cmVhZGBcbiAgICAgKiBpcyBoZXJlIGJlY2F1c2UgY29uc2VudGluZyB3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hlY2sgd2hhdCB0aGUgc2Vzc2lvblxuICAgICAqIHRoZW4gZGlkIGlzIGNvbnNlbnQgaW4gbmFtZSBvbmx5LlxuICAgICAqL1xuICAgIGlkOiAnYWNjZXNzLWFwcHJvdmVyJyxcbiAgICBuYW1lOiAnQWNjZXNzIEFwcHJvdmVyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Fuc3dlcnMgcmVxdWVzdHMgdG8gdmlldyB0aGlzIG9yZ2FuaXphdGlvblxcdTIwMTlzIGFjY291bnRzLCBhbmQgcmVhZHMgdGhlIHRyYWlsIG9mIHdoYXQgaGFwcGVuZWQuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ2ltcGVyc29uYXRpb246YXBwcm92ZScsICdhdWRpdDpyZWFkJyxcbiAgICBdLFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwbHVnaW5zOnJlYWQnLFxuICAncGx1Z2luczptb2RlcmF0ZScsXG4gICdwdWJsaXNoZXJzOnZlcmlmeScsXG4gICdtZXNzYWdlczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG5dO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciB0aGUgYnVpbHQtaW4gXCJUZWFtIExlYWRcIiBSb2xlIOKAlCB0aGUgcGVyc29uIHdobyByZXBvcnRzIFVQV0FSRC5cbiAqXG4gKiBFeGlzdHMgYmVjYXVzZSB0aGUgdGFyZ2V0IHVzZXIgZm9yIHN0YWtlaG9sZGVyIHJlcG9ydHMgaXMgYSBsZWFkLCBub3QgYW4gYWRtaW4sXG4gKiBhbmQgZ3JhbnRpbmcgYHJlcG9ydHM6d3JpdGVgIG9ubHkgdGhyb3VnaCB0aGUgYWRtaW4gYnVuZGxlIHdvdWxkIGhhdmUgZm9yY2VkXG4gKiBldmVyeSByZXBvcnRpbmcgbGVhZCB0byBiZSBhbiBvcmcgYWRtaW4gKG1lbWJlcnM6bWFuYWdlLCByb2xlczptYW5hZ2UsXG4gKiBvcmdfc2V0dGluZ3M6d3JpdGUsIGJpbGxpbmcpIHRvIHNlbmQgdGhlaXIgbWFuYWdlciBhIHdlZWtseSBzdW1tYXJ5LlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgaW5jbHVkZWQ6IGByZXBvcnRzOnJvbGx1cGAuIFJvbGxpbmcgYSByZXBvcnQgdXAgb3ZlciBkZXNjZW5kYW50XG4gKiB0ZWFtcyBpcyBkb3dud2FyZCB2aXNpYmlsaXR5IGFjcm9zcyB0aGUgb3JnIHRyZWUsIHdoaWNoIGlzIGEgZ3JhbnRlZCBjYXBhYmlsaXR5XG4gKiBpbiB0aGlzIG1vZGVsLCBub3Qgc29tZXRoaW5nIGEgdGVhbSdzIG93biBsZWFkIGdldHMgYnkgZGVmYXVsdCDigJQgYSBsZWFkIG9mIGFcbiAqIFBBUkVOVCBvcmcgaXMgZ3JhbnRlZCBpdCBleHBsaWNpdGx5LiBUaGUgUm9sZSBncmFudHMgdGhlIGNvYXJzZSBgbWVtYmVyYCBsYWJlbFxuICogYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbmV4cG9ydCBjb25zdCBURUFNX0xFQURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLi4uTUVNQkVSX1BFUk1JU1NJT05TLFxuICAncmVwb3J0czp3cml0ZScsXG4gICdyZXBvcnRzOnB1Ymxpc2gnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiUGlwZWxpbmUgQXV0b21hdGlvblwiIFJvbGUg4oCUIHdoYXQgdGhlIG9yZydzXG4gKiB1bnNjb3BlZCBzdG9yZWQgY3JlZGVudGlhbCAodGhlIGBwbGF0Zm9ybS1hdXRvbWF0aW9uYCBzZXJ2aWNlIGFjY291bnQgdGhhdFxuICogYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW5gIHByb3Zpc2lvbnMpIG5lZWRzLCBhbmQgbm90aGluZyBtb3JlLlxuICpcbiAqIERlcml2ZWQgYnkgdHJhY2luZyBldmVyeSBjYWxsIG1hZGUgd2l0aCB0aGF0IGtleSwgbm90IGJ5IGd1ZXNzaW5nOlxuICogIC0gYHBpcGVsaW5lczpyZWFkYCDigJQgdGhlIENvZGVCdWlsZCBzeW50aCAoYW5kIGBwaXBlbGluZSBkZXBsb3kgLS1zdG9yZS10b2tlbnNgKVxuICogICAgZmV0Y2hpbmcgdGhlIHBpcGVsaW5lIGl0IGJ1aWxkcyAoYEdFVCAvcGlwZWxpbmVzLzppZGApO1xuICogIC0gYHBsdWdpbnM6cmVhZGAgICDigJQgcGx1Z2luIHJlc29sdXRpb24gYXQgc3ludGgvZGVwbG95IGFuZCBpbiB0aGUgcGx1Z2luLWxvb2t1cFxuICogICAgTGFtYmRhIChgUE9TVCAvcGx1Z2lucy9sb29rdXBgKSwgYW5kIHRoZSBydW4tdGltZSB2dWxuZXJhYmlsaXR5IGNoZWNrIHN0ZXBcbiAqICAgIChgUE9TVCAvcGx1Z2lucy9ydW50aW1lLWNoZWNrYCkuXG4gKlxuICogV2hhdCBpdCBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgY2FycnksIGFuZCB3aGVyZSB0aGF0IHdvcmsgd2VudDpcbiAqICAtIHJlZ2lzdHJ5IHdyaXRlcyAoYHBpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlYCkg4oCUIHRoZSBzeW50aCByZWdpc3RlcnMgaXRzIHN0ZXBcbiAqICAgIG1hbmlmZXN0IHdpdGggdGhlIHNlcGFyYXRlIGBwaXBlbGluZS1yZWdpc3RlcmAga2V5IChQaXBlbGluZSBSZWdpc3RyYXRpb24pO1xuICogIC0gaW1hZ2UgcHVzaGVzIGFuZCBwdWxscyDigJQgQ29kZUJ1aWxkIGF1dGhlbnRpY2F0ZXMgdG8gdGhlIGltYWdlIHJlZ2lzdHJ5IHdpdGhcbiAqICAgIHRoZSBgcmVnaXN0cnktcHVzaGAgc2NvcGVkIGtleSwgbmV2ZXIgdGhpcyBvbmU7XG4gKiAgLSByZXBvcnRpbmcgd3JpdGVzIOKAlCB0aGUgZXZlbnRzIExhbWJkYSBhbmQgc3RlcCByZXBvcnQgdXBsb2FkcyB1c2UgdGhlXG4gKiAgICBgcmVwb3J0aW5nOmluZ2VzdGAgc2NvcGVkIGtleS5cbiAqXG4gKiBJdCB1c2VkIHRvIGJlIHRoZSBvcmcgQURNSU4gUm9sZSwgc28gYSBsZWFrZWQgc3ludGggY3JlZGVudGlhbCBjb3VsZCByZXdyaXRlXG4gKiBldmVyeSBwaXBlbGluZSwgUm9sZSBhbmQgbWVtYmVyIG9mIHRoZSBvcmcuXG4gKi9cbmV4cG9ydCBjb25zdCBQSVBFTElORV9BVVRPTUFUSU9OX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZXM6cmVhZCcsXG4gICdwbHVnaW5zOnJlYWQnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiUGlwZWxpbmUgUmVnaXN0cmF0aW9uXCIgUm9sZSwgaGVsZCBieSB0aGVcbiAqIGBwaXBlbGluZS1yZWdpc3RlcmAgc2VydmljZSBhY2NvdW50OiBgUE9TVGAvYERFTEVURSAvcGlwZWxpbmVzL3JlZ2lzdHJ5YCBmb3JcbiAqIGl0cyBvd24gb3JnIGFuZCBub3RoaW5nIGVsc2Ug4oCUIG5vdCBldmVuIGEgcmVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBJUEVMSU5FX1JFR0lTVFJBVElPTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUnLFxuXTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJlc29sdXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmVzb2x2ZSBhIHVzZXIncyBlZmZlY3RpdmUgb3JnIHBlcm1pc3Npb25zIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0uXG4gKlxuICogU2luZ2xlLXNvdXJjZSBtb2RlbDogYSB1c2VyJ3MgYWJpbGl0aWVzIGFyZSBFWEFDVExZIHRoZSB1bmlvbiBvZiB0aGVcbiAqIHBlcm1pc3Npb25zIGNhcnJpZWQgYnkgdGhlIFJvbGVzIHRoZXkgaG9sZCAoYSBSb2xlID0gYSBuYW1lZCBwZXJtaXNzaW9uIHNldDtcbiAqIGJ1aWx0LWluIFJvbGVzIGNhcnJ5IHRoZWlyIGJ1bmRsZSBleHBsaWNpdGx5LCBzZWVkZWQgZnJvbVxuICoge0BsaW5rIFJPTEVfUEVSTUlTU0lPTlN9KS4gVGhlcmUgaXMgbm8gc2VwYXJhdGUgcm9sZS1kZXJpdmVkIGJhc2VsaW5lIOKAlCB0aGVcbiAqIGNvYXJzZSBgcm9sZWAgbGFiZWwgZ3JhbnRzIG5vdGhpbmcgb24gaXRzIG93bi5cbiAqXG4gKiAxLiBQbGF0Zm9ybSBzdXBlcmFkbWlucyAoYGlzU3VwZXJBZG1pbmApIGFsd2F5cyBnZXQgQUxMIHBlcm1pc3Npb25zLlxuICogMi4gT3RoZXJ3aXNlLCB1bmlvbiBldmVyeSBwZXJtaXNzaW9uIGdyYW50ZWQgYnkgdGhlIHVzZXIncyBhc3NpZ25lZCBSb2xlcy5cbiAqIDMuIEludmFsaWQvdW5rbm93biBwZXJtaXNzaW9uIHN0cmluZ3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIGFzc2lnbmVkUGVybWlzc2lvbnMgLSBGbGF0dGVuZWQgcGVybWlzc2lvbnMgZnJvbSBldmVyeSBSb2xlIHRoZSB1c2VyIGhvbGRzXG4gKiBAcGFyYW0gaXNTdXBlckFkbWluIC0gV2hldGhlciB0aGUgdXNlciBoYXMgdGhlIGdsb2JhbCBzdXBlci1hZG1pbiBmbGFnXG4gKiBAcmV0dXJucyBFZmZlY3RpdmUgcGVybWlzc2lvbnMgaW4gY2Fub25pY2FsIG9yZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlclBlcm1pc3Npb25zKFxuICBhc3NpZ25lZFBlcm1pc3Npb25zPzogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsLFxuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuLFxuKTogUGVybWlzc2lvbltdIHtcbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIFsuLi5BTExfUEVSTUlTU0lPTlNdO1xuXG4gIGNvbnN0IHBlcm1zID0gbmV3IFNldDxQZXJtaXNzaW9uPigpO1xuICBpZiAoYXNzaWduZWRQZXJtaXNzaW9ucykge1xuICAgIGZvciAoY29uc3QgcCBvZiBhc3NpZ25lZFBlcm1pc3Npb25zKSB7XG4gICAgICBpZiAoaXNWYWxpZFBlcm1pc3Npb24ocCkpIHBlcm1zLmFkZChwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIocCA9PiBwZXJtcy5oYXMocCkpO1xufVxuXG4vKipcbiAqIENvbmZpbmUgYSByZXNvbHZlZCBwZXJtaXNzaW9uIGxpc3QgdG8gd2hhdCBtYXkgYmUgaGVsZCBpbiB0aGUgdG9rZW4ncyBBQ1RJVkVcbiAqIG9yZzogb3V0c2lkZSB0aGUgc3lzdGVtIG9yZyBldmVyeSB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfSBlbnRyeSBpc1xuICogZHJvcHBlZCAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCkuIEFwcGxpZWQgYXQgdG9rZW4gaXNzdWUgb25cbiAqIHRvcCBvZiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30g4oCUIGluY2x1ZGluZyBhIHN1cGVyYWRtaW4ncyBpbXBsaWNpdC1hbGwg4oCUXG4gKiBzbyBhIHRva2VuIG1pbnRlZCBpbiBhIHRlbmFudCBvcmcgbmV2ZXIgQ0xBSU1TIGBwbHVnaW5zOm1vZGVyYXRlYCAvXG4gKiBgcHVibGlzaGVyczp2ZXJpZnlgLCBldmVuIGlmIGEgaGFuZC13cml0dGVuIFJvbGUgZG9jdW1lbnQgc29tZWhvdyBjYXJyaWVkXG4gKiB0aGVtIHRoZXJlLiAoU3VwZXJhZG1pbnMgc3RpbGwgcGFzcyBgaGFzUGVybWlzc2lvbmAgdmlhIHRoZSBmbGFnOyB0aGVcbiAqIGVjb3N5c3RlbSByb3V0ZSBnYXRlIGFkZGl0aW9uYWxseSByZXF1aXJlcyB0aGUgc3lzdGVtIG9yZywgc28gdGhhdCBieXBhc3NcbiAqIG5ldmVyIHJlYWNoZXMgYSBnb3Zlcm5hbmNlIHJvdXRlIGZyb20gYSB0ZW5hbnQgb3JnIGVpdGhlci4pXG4gKlxuICogVGFrZXMgYSBib29sZWFuIHJhdGhlciB0aGFuIGFuIG9yZyBpZCBzbyB0aGlzIG1vZHVsZSBzdGF5cyBkZXBlbmRlbmN5LWZyZWVcbiAqICh0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdCk7IGNhbGxlcnMgZGVjaWRlIHdpdGggYXBpLWNvcmUgYGlzU3lzdGVtT3JnSWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZmluZVBlcm1pc3Npb25zVG9Pcmc8UCBleHRlbmRzIHN0cmluZz4oXG4gIHBlcm1pc3Npb25zOiByZWFkb25seSBQW10sXG4gIGFjdGl2ZU9yZ0lzU3lzdGVtT3JnOiBib29sZWFuLFxuKTogUFtdIHtcbiAgcmV0dXJuIGFjdGl2ZU9yZ0lzU3lzdGVtT3JnID8gWy4uLnBlcm1pc3Npb25zXSA6IHBlcm1pc3Npb25zLmZpbHRlcigocCkgPT4gIWlzU3lzdGVtT3JnT25seVBlcm1pc3Npb24ocCkpO1xufVxuXG4vKiogV2hldGhlciBhIHJlc29sdmVkIHBlcm1pc3Npb24gbGlzdCBncmFudHMgYHBlcm1pc3Npb25gIChzdXBlcmFkbWluIOKHkiBhbHdheXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Blcm1pc3Npb24oXG4gIGdyYW50ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgcGVybWlzc2lvbjogUGVybWlzc2lvbixcbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBpZiAoaXNTdXBlckFkbWluKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEhZ3JhbnRlZCAmJiBncmFudGVkLmluY2x1ZGVzKHBlcm1pc3Npb24pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXMsIGFzIGEgVEFCTEVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVGhlIG5hbWVkIHBlcm1pc3Npb24gYnVuZGxlcyBhIGJ1aWx0LWluIFJvbGUgbWF5IGNhcnJ5LCBhbmQgdGhlIFJvbGUgTkFNRSBlYWNoXG4gKiBvbmUgaXMgc2VlZGVkIHVuZGVyLiBPbmUgdGFibGUsIGJlY2F1c2UgdGhlIHRocmVlIGZhY3RzIGFib3V0IGEgam9iIFJvbGUg4oCUXG4gKiBpdHMgaWQsIGl0cyBwZXJtaXNzaW9ucyBhbmQgaXRzIGRpc3BsYXkgbmFtZSDigJQgd2VyZSBwcmV2aW91c2x5IHRocmVlXG4gKiBpbmRlcGVuZGVudCBsaXN0cyBpbiB0aHJlZSBwbGFjZXMsIGFuZCBub3RoaW5nIGhlbGQgdGhlbSB0b2dldGhlci5cbiAqXG4gKiBXSEFUIFdFTlQgV1JPTkcgV0lUSE9VVCBJVC4gVGhlIHBsYXRmb3JtIHJlc29sdmVkIGEgYnVuZGxlIHRocm91Z2ggYVxuICogbmluZS1icmFuY2ggYGlmYCBjaGFpbiB3aXRoIGEgZmFsbC10aHJvdWdoIHRvIHRoZSBjb2Fyc2UgYGdyYW50c1JvbGVgIGJ1bmRsZS5cbiAqIEV2ZXJ5IGpvYiBSb2xlIGdyYW50cyBgbWVtYmVyYCwgc28gYSBidW5kbGUgYWRkZWQgdG8gdGhlIGlkIGxpc3QgV0lUSE9VVCBpdHNcbiAqIGJyYW5jaCBkaWQgbm90IGZhaWwg4oCUIGl0IHNpbGVudGx5IHNlZWRlZCB0aGUgcGxhaW4gTWVtYmVyIGJ1bmRsZSwgYW5kIHRoZVxuICogc3RhcnR1cCBiYWNrZmlsbCB0aGVuIHJlLXN5bmNlZCBpdCB0byB0aGF0IHdyb25nIHZhbHVlIG9uIGV2ZXJ5IGJvb3QuIFRoZVxuICogUm9sZSBleGlzdGVkLCB3YXMgYXNzaWduYWJsZSBmcm9tIHRoZSBzdGFmZmluZyBwYW5lbCwgYW5kIGdyYW50ZWQgZmlmdGVlblxuICogdGVuYW50IHBlcm1pc3Npb25zIGluc3RlYWQgb2YgaXRzIGpvYi4gTm90aGluZyBhbnl3aGVyZSBleGVyY2lzZWQgdGhlXG4gKiByZXNvbHZlciBwZXIgYnVuZGxlLlxuICpcbiAqIEtleWVkIGFjY2VzcyBwbHVzIGBzYXRpc2ZpZXNgIG1ha2VzIGEgbWlzc2luZyBlbnRyeSBhIENPTVBJTEUgZXJyb3IsIGFuZCBhblxuICogZXh0cmEgb25lIHRvbyDigJQgaW4gYm90aCBkaXJlY3Rpb25zLCB3aXRoIG5vIHJ1bnRpbWUgY2hlY2sgdG8gZm9yZ2V0LlxuICpcbiAqIFRoZSBOQU1FIGxpdmVzIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbi4gVGhlIHBsYXRmb3JtIHNlZWRlZCBuYW1lcyBmcm9tIGl0c1xuICogb3duIGNvbnN0YW50cyB3aGlsZSB0aGUgZnJvbnRlbmQncyBzdGFmZmluZyByb3N0ZXIgaGFyZC1jb2RlZCBpdHMgb3duIGNvcHksXG4gKiBlYWNoIHBpbm5lZCBieSBhIHRlc3QgYWdhaW5zdCBpdHNlbGYg4oCUIHNvIHJlbmFtaW5nIGEgUm9sZSBwYXNzZWQgYm90aCBzdWl0ZXNcbiAqIGFuZCB0aGUgcm9zdGVyIHNpbGVudGx5IHJlbmRlcmVkIFwiUm9sZSBub3QgZm91bmRcIiwgd2hpY2ggaXMgdGhlIGdyYW50IHBhdGggZm9yXG4gKiB0aGF0IFJvbGUncyBwZXJtaXNzaW9ucyBkaXNhcHBlYXJpbmcuIEJvdGggc2lkZXMgcmVhZCB0aGlzIG5vdy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFRURfQlVORExFUyA9IHtcbiAgZWNvc3lzdGVtX21hbmFnZXI6IHsgbmFtZTogJ0Vjb3N5c3RlbSBNYW5hZ2VyJywgcGVybWlzc2lvbnM6IEVDT1NZU1RFTV9NQU5BR0VSX1BFUk1JU1NJT05TIH0sXG4gIHRlYW1fbGVhZDogeyBuYW1lOiAnVGVhbSBMZWFkJywgcGVybWlzc2lvbnM6IFRFQU1fTEVBRF9QRVJNSVNTSU9OUyB9LFxuICBwbGF0Zm9ybV9vYnNlcnZlcjogeyBuYW1lOiAnUGxhdGZvcm0gT2JzZXJ2ZXInLCBwZXJtaXNzaW9uczogUExBVEZPUk1fT0JTRVJWRVJfUEVSTUlTU0lPTlMgfSxcbiAgcGxhdGZvcm1fb3BlcmF0b3I6IHsgbmFtZTogJ1BsYXRmb3JtIE9wZXJhdG9yJywgcGVybWlzc2lvbnM6IFBMQVRGT1JNX09QRVJBVE9SX1BFUk1JU1NJT05TIH0sXG4gIGFjY291bnRfbWFuYWdlcjogeyBuYW1lOiAnQWNjb3VudCBNYW5hZ2VyJywgcGVybWlzc2lvbnM6IEFDQ09VTlRfTUFOQUdFUl9QRVJNSVNTSU9OUyB9LFxuICBjb25zb2xlX2FkbWluOiB7IG5hbWU6ICdDb25zb2xlIEFkbWluaXN0cmF0b3InLCBwZXJtaXNzaW9uczogQ09OU09MRV9BRE1JTl9QRVJNSVNTSU9OUyB9LFxuICBzdXBwb3J0X2FnZW50OiB7IG5hbWU6ICdTdXBwb3J0IEFnZW50JywgcGVybWlzc2lvbnM6IFNVUFBPUlRfQUdFTlRfUEVSTUlTU0lPTlMgfSxcbiAgc3VwcG9ydF9sZWFkOiB7IG5hbWU6ICdTdXBwb3J0IExlYWQnLCBwZXJtaXNzaW9uczogU1VQUE9SVF9MRUFEX1BFUk1JU1NJT05TIH0sXG4gIHJlZ2lzdHJ5X29wZXJhdG9yOiB7IG5hbWU6ICdSZWdpc3RyeSBPcGVyYXRvcicsIHBlcm1pc3Npb25zOiBSRUdJU1RSWV9PUEVSQVRPUl9QRVJNSVNTSU9OUyB9LFxuICBwaXBlbGluZV9hdXRvbWF0aW9uOiB7IG5hbWU6ICdQaXBlbGluZSBBdXRvbWF0aW9uJywgcGVybWlzc2lvbnM6IFBJUEVMSU5FX0FVVE9NQVRJT05fUEVSTUlTU0lPTlMgfSxcbiAgcGlwZWxpbmVfcmVnaXN0cmF0aW9uOiB7IG5hbWU6ICdQaXBlbGluZSBSZWdpc3RyYXRpb24nLCBwZXJtaXNzaW9uczogUElQRUxJTkVfUkVHSVNUUkFUSU9OX1BFUk1JU1NJT05TIH0sXG59IGFzIGNvbnN0O1xuXG4vKiogRXZlcnkgc2VlZC1idW5kbGUgaWQuIFRoZSBwbGF0Zm9ybSdzIGBSb2xlLnNlZWRCdW5kbGVgIGVudW0gaXMgdGhpcyBsaXN0LiAqL1xuZXhwb3J0IGNvbnN0IFNFRURfQlVORExFX0lEUyA9IE9iamVjdC5rZXlzKFNFRURfQlVORExFUykgYXMgQXJyYXk8a2V5b2YgdHlwZW9mIFNFRURfQlVORExFUz47XG5leHBvcnQgdHlwZSBTZWVkQnVuZGxlSWQgPSBrZXlvZiB0eXBlb2YgU0VFRF9CVU5ETEVTO1xuXG4vKipcbiAqIFRoZSBTWVNURU0gT1JHJ3Mgam9iIFJvbGVzLCBpbiBzdGFmZmluZyBvcmRlciDigJQgdGhlIHN1YnNldCBvZlxuICoge0BsaW5rIFNFRURfQlVORExFU30gc2VlZGVkIHRoZXJlLCB3aGljaCBpcyBldmVyeSBidW5kbGUgZXhjZXB0IGB0ZWFtX2xlYWRgXG4gKiAoYSB0ZW5hbnQgam9iLCBhbmQgYSB0ZW1wbGF0ZSByYXRoZXIgdGhhbiBhIHNlZWRlZCBSb2xlIHNpbmNlIGl0IHN0b3BwZWRcbiAqIGJlaW5nIHN0cnVjdHVyYWwpLlxuICpcbiAqIGBlY29zeXN0ZW1fbWFuYWdlcmAgSVMgb25lIG9mIHRoZW07IGl0IGlzIGxpc3RlZCBoZXJlIGV2ZW4gdGhvdWdoIGl0cyByb3N0ZXJcbiAqIGxpdmVzIG9uIHRoZSBFY29zeXN0ZW0gY29uc29sZSByYXRoZXIgdGhhbiB0aGUgc3RhZmZpbmcgcGFuZWwsIGJlY2F1c2Ugd2hhdFxuICogdGhpcyBsaXN0IGFuc3dlcnMgaXMgXCJ3aGljaCBSb2xlcyBkb2VzIHRoZSBzeXN0ZW0gb3JnIHNlZWRcIiwgbm90IFwid2hpY2ggcGFuZWxcbiAqIHJlbmRlcnMgdGhlbVwiLlxuICovXG5leHBvcnQgY29uc3QgU1lTVEVNX09SR19KT0JfQlVORExFUzogcmVhZG9ubHkgU2VlZEJ1bmRsZUlkW10gPSBbXG4gICdlY29zeXN0ZW1fbWFuYWdlcicsXG4gICdwbGF0Zm9ybV9vYnNlcnZlcicsXG4gICdwbGF0Zm9ybV9vcGVyYXRvcicsXG4gICdhY2NvdW50X21hbmFnZXInLFxuICAnY29uc29sZV9hZG1pbicsXG4gICdzdXBwb3J0X2FnZW50JyxcbiAgJ3N1cHBvcnRfbGVhZCcsXG4gICdyZWdpc3RyeV9vcGVyYXRvcicsXG5dO1xuXG4vKipcbiAqIFRoZSBNQUNISU5FIFJvbGVzIGV2ZXJ5IG9yZyBzZWVkcyDigJQgdGhlIHN1YnNldCBvZiB7QGxpbmsgU0VFRF9CVU5ETEVTfSBoZWxkIGJ5XG4gKiB0aGUgc2VydmljZSBhY2NvdW50cyBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucy5cbiAqXG4gKiBTZWVkZWQgcmF0aGVyIHRoYW4gb2ZmZXJlZCBhcyBhIHtAbGluayBST0xFX1RFTVBMQVRFU30gZW50cnksIHVubGlrZSB0aGVcbiAqIHRlbmFudCBqb2IgcHJlc2V0cywgYmVjYXVzZSB0aGV5IGFyZSBzdHJ1Y3R1cmFsOiB0aGUgQ0xJIGdyYW50cyBvbmUgdG8gdGhlXG4gKiBhY2NvdW50IGl0IGNyZWF0ZXMgYW5kIHRoZSBzdGFydHVwIGJhY2tmaWxsIG1vdmVzIGV4aXN0aW5nIGFjY291bnRzIG9udG8gaXQsXG4gKiBhbmQgYm90aCBoYXZlIHRvIGZpbmQgaXQgaW4gRVZFUlkgb3JnIGJ5IGEgc3RhYmxlIGlkZW50aXR5LiBBIHRlbXBsYXRlIGxlYXZlc1xuICogbm90aGluZyB0byBmaW5kIHVudGlsIHNvbWVib2R5IGluc3RhbnRpYXRlcyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SR19BVVRPTUFUSU9OX0JVTkRMRVM6IHJlYWRvbmx5IFNlZWRCdW5kbGVJZFtdID0gW1xuICAncGlwZWxpbmVfYXV0b21hdGlvbicsXG4gICdwaXBlbGluZV9yZWdpc3RyYXRpb24nLFxuXTtcblxuLyoqXG4gKiBUaGUgc2VydmljZSBhY2NvdW50cyBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucywga2V5ZWQgYnlcbiAqIGFjY291bnQgbmFtZSwgYW5kIHRoZSBidWlsdC1pbiBSb2xlIGVhY2ggaG9sZHMg4oCUIGBudWxsYCBmb3IgYW4gYWNjb3VudCB3aG9zZVxuICoga2V5IGNhcnJpZXMgYSBjYXBhYmlsaXR5IFNDT1BFIChhIGBUb2tlblNjb3BlYCkgYW5kIHNvIG5lZWRzIG5vIFJvbGUgYXQgYWxsLlxuICpcbiAqIE9uZSB0YWJsZSBmb3IgdGhlIENMSSAod2hpY2ggUm9sZSB0byBncmFudCBhIE5FVyBhY2NvdW50KSBhbmQgdGhlIHBsYXRmb3JtJ3NcbiAqIHN0YXJ0dXAgYmFja2ZpbGwgKHdoaWNoIFJvbGUgdG8gbW92ZSBhbiBFWElTVElORyBhY2NvdW50IG9udG8sIG9mZiB0aGUgb3JnXG4gKiBhZG1pbiBSb2xlIHRoZXNlIGFjY291bnRzIHdlcmUgb25jZSBnaXZlbikuIEEgcmVuYW1lIGhlcmUgbW92ZXMgYm90aC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9NQVRJT05fQUNDT1VOVF9CVU5ETEVTID0ge1xuICAncGxhdGZvcm0tYXV0b21hdGlvbic6ICdwaXBlbGluZV9hdXRvbWF0aW9uJyxcbiAgJ3BpcGVsaW5lLXJlZ2lzdGVyJzogJ3BpcGVsaW5lX3JlZ2lzdHJhdGlvbicsXG4gICdyZXBvcnRpbmctaW5nZXN0JzogbnVsbCxcbiAgJ3JlZ2lzdHJ5LXB1c2gnOiBudWxsLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgU2VlZEJ1bmRsZUlkIHwgbnVsbD47XG4iXX0=
992
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBa1B0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBc0I7SUFDbkQsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTTtJQUNwQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTO0NBQ3pFLENBQUM7QUFFRixxR0FBcUc7QUFDckcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsMEJBQTBCLENBQUM7QUFFOUQsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBMEI7SUFDcEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCO0lBQ25GLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN4RCxjQUFjLEVBQUUsZUFBZSxFQUFFLGlCQUFpQjtJQUNsRCxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSxtQkFBbUI7SUFDaEUsa0JBQWtCLEVBQUUsbUJBQW1CO0lBQ3ZDLGVBQWUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCO0lBQy9DLDRCQUE0QixFQUFFLHVCQUF1QixFQUFFLDBCQUEwQjtJQUNqRixlQUFlO0lBQ2YscUJBQXFCLEVBQUUsdUJBQXVCO0lBQzlDLG9CQUFvQixFQUFFLHNCQUFzQjtJQUM1QyxhQUFhLEVBQUUsZUFBZSxFQUFFLHFCQUFxQjtJQUNyRCxpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLHlCQUF5QjtJQUNqRixpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsb0JBQW9CLEVBQUUs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TUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQXFDLENBQUM7QUFHN0Y7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUE0QjtJQUM3RCxtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixlQUFlO0lBQ2YsY0FBYztJQUNkLG1CQUFtQjtDQUNwQixDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQTRCO0lBQzdELHFCQUFxQjtJQUNyQix1QkFBdUI7Q0FDeEIsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMscUJBQXFCLEVBQUUscUJBQXFCO0lBQzVDLG1CQUFtQixFQUFFLHVCQUF1QjtJQUM1QyxrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLGVBQWUsRUFBRSxJQUFJO0NBQ2lDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBPcmdSb2xlIH0gZnJvbSAnLi9jb21tb24uanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGVybWlzc2lvbiBpZGVudGlmaWVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDYW5vbmljYWwgZmluZS1ncmFpbmVkIHBlcm1pc3Npb24gaWRlbnRpZmllcnMsIGluIGByZXNvdXJjZTphY3Rpb25gIGZvcm0uXG4gKlxuICogVGhlc2UgYXJlIHRoZSBPUkctU0NPUEVEIGNhcGFiaWxpdGllcyBhIFJvbGUgY2FuIGdyYW50IChSQkFDKS4gQ29hcnNlIGJ5XG4gKiBkZXNpZ24g4oCUIGA6d3JpdGVgIGNvdmVycyBjcmVhdGUvdXBkYXRlL2RlbGV0ZSBmb3IgYSByZXNvdXJjZSDigJQgc28gdGhlIGNhdGFsb2dcbiAqIGFuZCBwZXJtaXNzaW9uLXBpY2tlciBVSSBzdGF5IHNtYWxsOyBzcGxpdCBhIGA6d3JpdGVgIGludG8gYDpjcmVhdGVgL2A6ZGVsZXRlYFxuICogbGF0ZXIgaWYgYSByZXNvdXJjZSBuZWVkcyBpdC5cbiAqXG4gKiBOT1QgbW9kZWxlZCBoZXJlIChpbnRlbnRpb25hbGx5KTogcGxhdGZvcm0tb3BlcmF0b3IgYWN0aW9ucyAob3JnIGRlbGV0ZSwgdGllci9cbiAqIHF1b3RhIG92ZXJyaWRlLCB1c2VyIGFkbWluLCBpbXBlcnNvbmF0aW9uLCBwbGF0Zm9ybSBzZXR0aW5ncykgc3RheSBiZWhpbmQgdGhlXG4gKiBnbG9iYWwgYGlzU3VwZXJBZG1pbmAgZmxhZywgbm90IGEgcGVyLW9yZyBwZXJtaXNzaW9uOyBhbmQgYHJlcXVpcmVTdGVwVXBgXG4gKiAoTUZBKSAvIGByZXF1aXJlRmVhdHVyZWAgKHBsYW4gZW50aXRsZW1lbnRzKSByZW1haW4gb3J0aG9nb25hbCBnYXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9XG4gIC8vIFBpcGVsaW5lc1xuICB8ICdwaXBlbGluZXM6cmVhZCdcbiAgfCAncGlwZWxpbmVzOndyaXRlJ1xuICB8ICdwaXBlbGluZXM6cHVibGlzaCdcbiAgLy8gVGhlIHBpcGVsaW5lIFJFR0lTVFJZIChgUE9TVGAvYERFTEVURSAvcGlwZWxpbmVzL3JlZ2lzdHJ5YCk6IHdoaWNoIGRlcGxveWVkXG4gIC8vIHN0YWNrIGJhY2tzIGEgcGlwZWxpbmUsIGFuZCB0aGUgc3RlcCBtYW5pZmVzdCBvZiBwbHVnaW4gZGlnZXN0cyBpdCBydW5zLlxuICAvLyBTcGxpdCBvdXQgb2YgYHBpcGVsaW5lczp3cml0ZWAgc28gdGhlIENvZGVCdWlsZCBzeW50aCBjYW4ga2VlcCB0aGF0IHJlY29yZFxuICAvLyBjdXJyZW50IHdpdGggYSBjcmVkZW50aWFsIHRoYXQgY2FuIGRvIG5vdGhpbmcgZWxzZSDigJQgYSBrZXkgaG9sZGluZ1xuICAvLyBgcGlwZWxpbmVzOndyaXRlYCBjb3VsZCByZXdyaXRlIGV2ZXJ5IHBpcGVsaW5lIHRoZSBvcmcgb3ducy4gUGVvcGxlIGdldCBpdFxuICAvLyBiZXNpZGUgYHBpcGVsaW5lczp3cml0ZWAgKHRoZSBNZW1iZXIgYnVuZGxlKTsgdGhlIGBwaXBlbGluZS1yZWdpc3RlcmBcbiAgLy8gc2VydmljZSBhY2NvdW50IGhvbGRzIGl0IGFsb25lLlxuICB8ICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZSdcbiAgLy8gR29sZGVuLXBhdGggcGlwZWxpbmUgdGVtcGxhdGVzLiBTcGxpdCBvdXQgb2YgYHBpcGVsaW5lczoqYCBzbyBhIHBsYXRmb3JtXG4gIC8vIHRlYW0gY2FuIGN1cmF0ZSB0aGUgc3RhcnRlciBjYXRhbG9nIFdJVEhPVVQgd3JpdGUgYWNjZXNzIHRvIGV2ZXJ5IHBpcGVsaW5lXG4gIC8vIChhbmQgdmljZSB2ZXJzYSkuIGA6cHVibGlzaGAgbWFwcyB0byB0aGVcbiAgLy8gdGVtcGxhdGUgbGFkZGVyJ3MgYHB1YmxpY2AgcnVuZzsgYG9yZ2AgYW5kIGBwcml2YXRlYCBuZWVkIG9ubHkgYDp3cml0ZWAuXG4gIHwgJ3RlbXBsYXRlczpyZWFkJ1xuICB8ICd0ZW1wbGF0ZXM6d3JpdGUnXG4gIHwgJ3RlbXBsYXRlczpwdWJsaXNoJ1xuICAvLyBQbHVnaW5zXG4gIHwgJ3BsdWdpbnM6cmVhZCdcbiAgfCAncGx1Z2luczp3cml0ZSdcbiAgfCAncGx1Z2luczpwdWJsaXNoJ1xuICAvLyBQbHVnaW4gZWNvc3lzdGVtIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gT3JnLWFzc2lnbmFibGU6XG4gIC8vICAtIGBwbHVnaW5zOmluc3RhbGxgICAgICAgICDigJQgaW5zdGFsbC91cGdyYWRlL3VuaW5zdGFsbCBsaXN0aW5ncyAob3IgUkVRVUVTVFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBpbnN0YWxsIHdoZW4gdGhlIG9yZydzIHBvbGljeSBuZWVkcyBhcHByb3ZhbCkuXG4gIC8vICAtIGBwbHVnaW5faW5zdGFsbHM6bWFuYWdlYCDigJQgdGhlIG9yZydzIGNvbnN1bXB0aW9uIHBvbGljeSArIGRlY2lkaW5nIGluc3RhbGxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgV0lUSElOIHRoZSBvcmcgKG9yZy1sb2NhbCBvbmx5KS5cbiAgLy8gIC0gYHB1Ymxpc2hlcnM6bWFuYWdlYCAgICAgIOKAlCB0aGUgb3JnJ3MgcHVibGlzaGVyIHByb2ZpbGUgKyBzdWJtaXR0aW5nXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjb3N5c3RlbSByZXF1ZXN0cyAoZXZlcnkgZGVjaXNpb24gaXMgc3lzdGVtLW9yZykuXG4gIC8vIFN5c3RlbS1vcmctb25seSAoc2VlIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyk6XG4gIC8vICAtIGBwbHVnaW5zOm1vZGVyYXRlYCAgICAgICDigJQgZGVjaWRlIHB1Ymxpc2ggcmVxdWVzdHMsIG1vZGVyYXRlLCB5YW5rLCBhZHZpc29yaWVzLlxuICAvLyAgLSBgcHVibGlzaGVyczp2ZXJpZnlgICAgICAg4oCUIHB1Ymxpc2hlciB0aWVycywgcHJvZmlsZSBjaGFuZ2VzLCB0cmFuc2ZlcnMuXG4gIHwgJ3BsdWdpbnM6aW5zdGFsbCdcbiAgfCAncGx1Z2luX2luc3RhbGxzOm1hbmFnZSdcbiAgfCAncHVibGlzaGVyczptYW5hZ2UnXG4gIHwgJ3BsdWdpbnM6bW9kZXJhdGUnXG4gIHwgJ3B1Ymxpc2hlcnM6dmVyaWZ5J1xuICAvLyBQbGF0Zm9ybSBvcGVyYXRpb25zIChzeXN0ZW0tb3JnIG9ubHkpLiBUaGUgY3Jvc3MtdGVuYW50IG9wZXJhdG9yIHN1cmZhY2VzXG4gIC8vIHRoYXQgdXNlZCB0byByZXF1aXJlIHRoZSBzdXBlcmFkbWluIEZMQUcsIHNvIGEgZGVwbG95bWVudCBjYW4gc3RhZmYgdGhlbVxuICAvLyB3aXRoIGEgUm9sZSBpbnN0ZWFkIG9mIGhhbmRpbmcgb3V0IGltcGxpY2l0LWFsbC4gU3BsaXQgYmVjYXVzZSB0aGUgdHdvIGNhcnJ5XG4gIC8vIGRpZmZlcmVudCByaXNrOiByZWFkaW5nIHdoYXQgYSBkZXBsb3kgY29uZmlndXJlZCBpcyBub3QgdGhlIHNhbWUgYXMgbW92aW5nXG4gIC8vIGFub3RoZXIgb3JnYW5pc2F0aW9uJ3MgbW9uZXkuXG4gIHwgJ3BsYXRmb3JtOnJlYWQnXG4gIC8vIFRoZSBjcm9zcy10ZW5hbnQgT1JHIExJU1QsIHNwbGl0IG91dCBvZiBgcGxhdGZvcm06cmVhZGAgYmVjYXVzZSB0aGF0IG9uZVxuICAvLyBwZXJtaXNzaW9uIHdhcyBkb2luZyB0d28gam9icyB3aXRoIGRpZmZlcmVudCBibGFzdCByYWRpaTogcmVhZGluZyB3aGF0IGFcbiAgLy8gREVQTE9ZIHdhcyBjb25maWd1cmVkIHRvIGRvIChSTFMgbW9kZSwgS01TIHBvc3R1cmUsIHRoZSByZW5kZXJlZCBhbGVydFxuICAvLyBydWxlcykgYW5kIHJlYWRpbmcgdGhlIHJvc3RlciBvZiBldmVyeSBDVVNUT01FUi4gVGhyZWUgb2YgdGhlIGZvdXIgam9iXG4gIC8vIGJ1bmRsZXMgY2FycmllZCBpdCwgYW5kIG9ubHkgb25lIG9mIHRoZW0gd2FudGVkIHRoZSBkZXBsb3kgaW50ZXJuYWxzIOKAlFxuICAvLyBDb25zb2xlIEFkbWluaXN0cmF0b3IgYW5kIFN1cHBvcnQgQWdlbnQgZ290IHRoZW0gcHVyZWx5IGJlY2F1c2UgdGhleSBuZWVkZWRcbiAgLy8gdG8gZmluZCBhbiBvcmcgYnkgbmFtZS5cbiAgLy9cbiAgLy8gU2FtZSBtaXN0YWtlLCBhbmQgc2FtZSBmaXgsIGFzIGBjb25zb2xlczpkYXRhc3RvcmVgIGJlZm9yZSBpdCB3YXMgc3BsaXQgYnlcbiAgLy8gd2hhdCBhIG1pc3Rha2VuIGdyYW50IGNvc3RzLlxuICB8ICdvcmdzOnJlYWQnXG4gIHwgJ2JpbGxpbmc6b3BlcmF0ZSdcbiAgLy8gVGhlIG9wZXJhdG9yIGNvbnNvbGVzLCBzcGxpdCBieSBCTEFTVCBSQURJVVMgcmF0aGVyIHRoYW4gYnkgcHJvZHVjdC4gVGhyZWVcbiAgLy8gcGVybWlzc2lvbnMgZm9yIGZpdmUgY29uc29sZXMsIGJlY2F1c2Ugd2hhdCBhIG1pc3Rha2VuIGdyYW50IGNvc3RzIGRpZmZlcnNcbiAgLy8gYnkgYW4gb3JkZXIgb2YgbWFnbml0dWRlIGF0IGVhY2ggc3RlcDpcbiAgLy9cbiAgLy8gIC0gYG9ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuYCDigJQgR3JhZmFuYSBhbmQgS2lhbGkuIFJlYWQtb25seSB2aWV3czsgdGhlIHdvcnN0XG4gIC8vICAgIG91dGNvbWUgb2YgYSBtaXN0YWtlbiBncmFudCBpcyBzZWVpbmcgdGVsZW1ldHJ5LlxuICAvLyAgLSBgZGF0YWJhc2VfY29uc29sZTpvcGVuYCAgICAg4oCUIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MuIEEgZGF0YWJhc2Ugc2hlbGxcbiAgLy8gICAgb3ZlciBldmVyeSB0ZW5hbnQncyByb3dzOiBpdCBjYW4gcmVhZCBhbmQgcmV3cml0ZSB0ZW5hbnQgZGF0YSwgYnV0IHRoZVxuICAvLyAgICBhdWRpdCBjaGFpbiBsaXZlcyBlbHNld2hlcmUsIHNvIHRoZSBkYW1hZ2UgaXMgcmVjb3JkZWQuXG4gIC8vICAtIGBvYmplY3RzdG9yZV9jb25zb2xlOm9wZW5gICAg4oCUIHRoZSBSdXN0RlMgKFMzKSBjb25zb2xlLiBJdCBjYW4gTElTVCBhbmRcbiAgLy8gICAgREVMRVRFIG9iamVjdHMgaW4gdGhlIHJlZ2lzdHJ5LCBMb2tpLCBUaGFub3MsIHBsdWdpbi1idWlsZCBhbmRcbiAgLy8gICAgYXVkaXQtY2hhaW4gYnVja2V0cy4gU3BsaXQgZnJvbSB0aGUgcGFpciBhYm92ZSBiZWNhdXNlIHRoZSB0d28gYXJlIHRoZVxuICAvLyAgICB0d28gSEFMVkVTIG9mIHRoZSBhdWRpdCB0YW1wZXItZXZpZGVuY2UgZGVzaWduOiB0aGUgY2hhaW4ncyBITUFDIGtleVxuICAvLyAgICBsaXZlcyBvdXRzaWRlIHRoZSBEQiwgc28gYSBNb25nbyBzaGVsbCBjYW4gdGFtcGVyIGJ1dCBjYW5ub3QgZm9yZ2UgYVxuICAvLyAgICBjb25zaXN0ZW50IGNoYWluIOKAlCBleGNlcHQgYnkgdHJ1bmNhdGluZyB0aGUgdGFpbCwgd2hpY2ggYSBjaGFpbiBjYW5ub3RcbiAgLy8gICAgc2VlIGZyb20gdGhlIGluc2lkZSwgYW5kIHRoZSBkZWZlbmNlIGFnYWluc3QgVEhBVCBpcyB0aGUgc2lnbmVkXG4gIC8vICAgIGNoYWluLWhlYWQgZXhwb3J0IHRvIG9iamVjdCBzdG9yYWdlLiBPbmUgc2hlbGwgY2FuIHRydW5jYXRlOyB0aGUgb3RoZXJcbiAgLy8gICAgY2FuIGRlbGV0ZSB0aGUgaGVhZHMgdGhhdCB3b3VsZCBleHBvc2UgdGhlIHRydW5jYXRpb24uXG4gIC8vXG4gIC8vIEFsbCB0aHJlZSBhcmUgc3lzdGVtLW9yZy1vbmx5LCBzbyBub25lIGNhbiBiZSBoZWxkIGluc2lkZSBhIHRlbmFudCwgYW5kIG9ubHlcbiAgLy8gdGhlIGZpcnN0IGlzIGluIHRoZSBQbGF0Zm9ybSBPcGVyYXRvciBidW5kbGU6IHN0YWZmaW5nIGFuIG9wZXJhdG9yIG11c3QgbmV2ZXJcbiAgLy8gaGFuZCBvdmVyIGEgZGF0YSBzaGVsbCBhcyBhIHNpZGUgZWZmZWN0LiBHcmFudGluZyBlaXRoZXIgb2YgdGhlIG90aGVyIHR3byBpc1xuICAvLyBhIHNlcGFyYXRlLCBleHBsaWNpdCBhY3QgYnkgYSBzdXBlcmFkbWluIGNvbXBvc2luZyBhIFJvbGUgZm9yIGV4YWN0bHkgdGhhdFxuICAvLyBwdXJwb3NlLlxuICAvL1xuICAvLyBXSEFUIFRIRSBTUExJVCBET0VTIE5PVCBETywgc28gbm9ib2R5IGJ1aWxkcyBvbiBpdDogaXQgaXMgbm90IGEgY29udGFpbm1lbnRcbiAgLy8gYm91bmRhcnkuIFJvbGVzIGxpdmUgaW4gTW9uZ28gKGBjb2xsZWN0aW9uOiAncm9sZXMnYCksIHNvIGFcbiAgLy8gYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgaG9sZGVyIGNhbiB3cml0ZSB0aGF0IGNvbGxlY3Rpb24gYW5kIGdyYW50IHRoZW1zZWx2ZXNcbiAgLy8gYG9iamVjdHN0b3JlX2NvbnNvbGU6b3BlbmAg4oCUIGRhdGFzdG9yZSBjb250YWlucyBvYmplY3RzdG9yZSBieSBlc2NhbGF0aW9uLiBUaGVcbiAgLy8gc3BsaXQgZXhwcmVzc2VzIGludGVudCwga2VlcHMgdGhlIGRlZmF1bHQgZ3JhbnQgc21hbGwgYW5kIGdpdmVzIGVhY2ggY2xhc3NcbiAgLy8gaXRzIG93biByZWZ1c2FsIHNpZ25hbC4gV2hhdCBhY3R1YWxseSBwcm90ZWN0cyB0aGUgYXVkaXQgaGVhZHMgZnJvbSB3aG9ldmVyXG4gIC8vIG9wZW5zIHRoYXQgY29uc29sZSBpcyBTMyBPYmplY3QgTG9jayB3aXRoIGEgcmV0YWluLXVudGlsLWRhdGVcbiAgLy8gKGBwbGF0Zm9ybS9zcmMvc2VydmljZXMvYXVkaXQtaGVhZC1leHBvcnQudHNgKSwgd2hpY2ggaG9sZHMgcmVnYXJkbGVzcyBvZlxuICAvLyBhbnkgcGVybWlzc2lvbiBoZXJlLlxuICB8ICdvYnNlcnZhYmlsaXR5X2NvbnNvbGU6b3BlbidcbiAgfCAnZGF0YWJhc2VfY29uc29sZTpvcGVuJ1xuICB8ICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nXG4gIC8vIE9uLWNhbGwgKHN5c3RlbS1vcmcgb25seSkuIFJlYWRzIHRoZSBwYWdpbmcgUE9TVFVSRSBhbmQgc2VuZHMgYSB0ZXN0IHBhZ2UuXG4gIC8vIE5vdCBhIHNjaGVkdWxlIGVkaXRvciDigJQgdGhlIHByb3ZpZGVyIG93bnMgdGhlIHJvdGEg4oCUIGFuZCBkZWxpYmVyYXRlbHkgbm90IGFcbiAgLy8gc2V0dGluZ3Mgc3VyZmFjZSBlaXRoZXIsIGJlY2F1c2UgZXZlcnkga25vYiBpcyBvcGVyYXRvci1zaWRlIGVudi4gV2hhdCBpdFxuICAvLyBncmFudHMgaXMgdGhlIG9uZSB0aGluZyBhIHByb2R1Y3Qgc3VyZmFjZSBjYW4gZ2l2ZSB0aGF0IGEgc2hlbGwgY2Fubm90OlxuICAvLyBcIndpbGwgd2UgYWN0dWFsbHkgYmUgcGFnZWRcIiwgYW5zd2VyYWJsZSB3aXRob3V0IGNsdXN0ZXIgYWNjZXNzLlxuICB8ICdvbmNhbGw6bWFuYWdlJ1xuICAvLyBUaGUgdmVuZG9yJ3Mgb3RoZXIgb3BlcmF0aW9uYWwgVEFTS1MgKHN5c3RlbSBvcmcgb25seSkuIEVhY2ggZXhpc3RzIHNvIGFcbiAgLy8gc3VwZXJhZG1pbiBjYW4gc3RhZmYgb25lIGpvYiB3aXRoIGEgUm9sZSBpbnN0ZWFkIG9mIHRoZSBzdXBlcmFkbWluIGZsYWcg4oCUXG4gIC8vIGJlZm9yZSB0aGVzZSwgMzQgcm91dGVzIHdlcmUgcmVhY2hhYmxlIG9ubHkgYnkgc29tZW9uZSB3aG8gYWxzbyBoZWxkXG4gIC8vIGltcGVyc29uYXRpb24sIGEgZGF0YWJhc2Ugc2hlbGwgYW5kIHRoZSBhYmlsaXR5IHRvIG1pbnQgYW5vdGhlciBzdXBlcmFkbWluLlxuICAvL1xuICAvLyBTdXBwb3J0IGRlc2ssIHNwbGl0IGluIHR3byBiZWNhdXNlIHRoZSBjb250ZW50IGlzIHJldXNlZCBhY3Jvc3MgZXZlcnlcbiAgLy8gY3VzdG9tZXIgd2hpbGUgYSBjYXNlIGJlbG9uZ3MgdG8gb25lOiBgc3VwcG9ydF9jYXNlczp3cml0ZWAgaXMgdGhlIGRlc2snc1xuICAvLyBvd24gd29yayAodHJpYWdlLCBhc3NpZ25tZW50LCBzZXZlcml0eSwgaW50ZXJuYWwgbm90ZXMsIHJlY29yZGluZyBhblxuICAvLyBpbmNpZGVudCBhZ2FpbnN0IGEgc3VwcG9ydCBjb250cmFjdCksIGBzdXBwb3J0X2NvbnRlbnQ6d3JpdGVgIGlzIGF1dGhvcmluZ1xuICAvLyB0aGUgY2FubmVkIHJlcGxpZXMuIEVhY2ggZ2F0ZXMgaXRzIHRhc2sncyBSRUFEUyBhcyB3ZWxsIGFzIGl0cyB3cml0ZXMsXG4gIC8vIGFnYWluc3QgdGhlIHVzdWFsIGNvbnZlbnRpb24sIGJlY2F1c2UgdGhlc2UgdGFibGVzIGNhcnJ5IG5vIGBvcmdfaWRgIOKAlCB0aGVyZVxuICAvLyBpcyBubyB0ZW5hbmN5IGJvdW5kYXJ5IHVuZGVybmVhdGggdG8gZmFsbCBiYWNrIG9uLlxuICB8ICdzdXBwb3J0X2Nhc2VzOndyaXRlJ1xuICB8ICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnXG4gIC8vIENyb3NzLXRlbmFudCBzdWJzY3JpcHRpb25zLiBSZWFkIGlzIHNwbGl0IGZyb20gd3JpdGUgYmVjYXVzZSBhIHJlYWQtb25seVxuICAvLyBob2xkZXIgaXMgYSByZWFsIGpvYiBoZXJlOiBzb21lb25lIHdobyByZXBvcnRzIG9uIHJldmVudWUgYW5kIHBsYW4gbWl4XG4gIC8vIHdpdGhvdXQgYmVpbmcgYWJsZSB0byBjaGFuZ2UgYSBwbGFuIG9yIGNhbmNlbCBvbmUuXG4gIHwgJ3N1YnNjcmlwdGlvbnM6cmVhZCdcbiAgfCAnc3Vic2NyaXB0aW9uczptYW5hZ2UnXG4gIC8vIFRoZSBvcmcgbGlmZWN5Y2xlIEFDUk9TUyB0ZW5hbnRzOiByZW5hbWUsIGRlbGV0ZSwgY2hhbmdlIHRpZXIsIG1vdmUgdW5kZXIgYVxuICAvLyBuZXcgcGFyZW50LiBEaXN0aW5jdCBmcm9tIGBvcmdfc2V0dGluZ3M6d3JpdGVgLCB3aGljaCBpcyBhbiBvcmcgYWN0aW5nIG9uXG4gIC8vIGl0c2VsZi5cbiAgfCAnb3JnczptYW5hZ2UnXG4gIC8vIENyb3NzLXRlbmFudCBxdW90YSB3cml0ZXMuIFRoZSBtYXRjaGluZyByZWFkcyAoYC9xdW90YXMvYWxsYCwgYC9hdC1yaXNrYClcbiAgLy8gcmlkZSBgcGxhdGZvcm06cmVhZGAgd2l0aCB0aGUgcmVzdCBvZiB0aGUgb3BlcmF0b3IgZGFzaGJvYXJkLCBzbyBzb21lb25lXG4gIC8vIHdhdGNoaW5nIGZvciBleGhhdXN0aW9uIGRvZXMgbm90IG5lZWQgdGhlIGFiaWxpdHkgdG8gcmFpc2UgYSBsaW1pdC5cbiAgfCAncXVvdGFzOm1hbmFnZSdcbiAgLy8gVGhlIHBsdWdpbiBCVUlMRCBxdWV1ZSDigJQgZGVwdGgsIHN0YWxscywgYW5kIHB1cmdpbmcgdGhlIGRlYWQtbGV0dGVyIHF1ZXVlLlxuICAvLyBEaXN0aW5jdCBmcm9tIGBwbHVnaW5zOm1vZGVyYXRlYCwgd2hpY2ggaXMgZWNvc3lzdGVtIGdvdmVybmFuY2U6IHRoaXMgaXNcbiAgLy8gaW5mcmFzdHJ1Y3R1cmUsIGFuZCB0aGUgcGVvcGxlIHdobyBydW4gaXQgYXJlIG5vdCB0aGUgcGVvcGxlIHdobyByZXZpZXdcbiAgLy8gc3VibWlzc2lvbnMuXG4gIHwgJ3BsdWdpbl9xdWV1ZTptYW5hZ2UnXG4gIC8vIENvbXBsaWFuY2VcbiAgfCAnY29tcGxpYW5jZTpyZWFkJ1xuICB8ICdjb21wbGlhbmNlOndyaXRlJ1xuICAvLyBNZW1iZXJzICYgYWNjZXNzXG4gIHwgJ21lbWJlcnM6bWFuYWdlJ1xuICB8ICdyb2xlczptYW5hZ2UnXG4gIHwgJ2ludml0YXRpb25zOm1hbmFnZSdcbiAgLy8gT3JnLXNjb3BlZCBzZXJ2aWNlIGFjY291bnRzIChub24taHVtYW4gcHJpbmNpcGFscykgYW5kIHRoZWlyIGFjY2VzcyBrZXlzLlxuICAvLyBTcGxpdCBvdXQgb2YgYG1lbWJlcnM6bWFuYWdlYCBiZWNhdXNlIGEgc2VydmljZSBhY2NvdW50IGlzIGEgQ1JFREVOVElBTFxuICAvLyBob2xkZXIsIG5vdCBhIHBlcnNvbjogZ3JhbnRpbmcgc29tZW9uZSB0aGUgYWJpbGl0eSB0byBtaW50IGxvbmctbGl2ZWRcbiAgLy8gbWFjaGluZSBrZXlzIGlzIGEgZGlmZmVyZW50IGRlY2lzaW9uIGZyb20gbGV0dGluZyB0aGVtIG1hbmFnZSB0aGUgcm9zdGVyLlxuICB8ICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZSdcbiAgLy8gT2JzZXJ2YWJpbGl0eVxuICB8ICdkYXNoYm9hcmRzOnJlYWQnXG4gIHwgJ2Rhc2hib2FyZHM6d3JpdGUnXG4gIHwgJ29ic2VydmFiaWxpdHk6cmVhZCdcbiAgfCAnb2JzZXJ2YWJpbGl0eTp3cml0ZSdcbiAgLy8gYGxvZ3M6ZXhwb3J0YCBpcyBzcGxpdCBPVVQgb2YgYG9ic2VydmFiaWxpdHk6cmVhZGAgZGVsaWJlcmF0ZWx5LiBSZWFkaW5nXG4gIC8vIGxvZ3MgaW4gdGhlIFVJIGlzIHBhZ2VkIGFuZCBlcGhlbWVyYWw7IEVYUE9SVElORyB0aGVtIGlzIGJ1bGsgZWdyZXNzIHRoYXRcbiAgLy8gbGVhdmVzIHRoZSBidWlsZGluZyBhbmQgb3V0bGl2ZXMgYSByZXZva2VkIHNlc3Npb24sIHNvIGFuIG9yZyBhZG1pbiBtdXN0IGJlXG4gIC8vIGFibGUgdG8gZ3JhbnQgbG9nIHZpZXdpbmcgd2l0aG91dCBncmFudGluZyBkb3dubG9hZHMuXG4gIHwgJ2xvZ3M6ZXhwb3J0J1xuICAvLyBUaGUgb3JnJ3Mgb3duIGhhc2gtY2hhaW5lZCBhdWRpdCB0cmFpbC4gT1JHLUFTU0lHTkFCTEUsIHVubGlrZSB0aGUgcGxhdGZvcm1cbiAgLy8gb3BlcmF0aW9ucyBwYWlyOiB0aGUgcm93cyBhbiBvcmcgcmVhZHMgYXJlIGl0cyBvd24gKHRoZSBxdWVyeSBwcmVkaWNhdGUgaXNcbiAgLy8gYG9yZ0lkYCBPUiBgYWZmZWN0ZWRPcmdJZGApLCBzbyBkZWxlZ2F0aW5nIGl0IGlzIGFuIG9yZydzIGRlY2lzaW9uIOKAlCBhXG4gIC8vIGNvbXBsaWFuY2UgcmV2aWV3ZXIgY2FuIGJlIGdpdmVuIHRoZSB0cmFpbCB3aXRob3V0IGJlaW5nIG1hZGUgYW4gYWRtaW4gb2ZcbiAgLy8gZXZlcnl0aGluZyB0aGF0IHByb2R1Y2VkIGl0LiBSZWFkLW9ubHkgYnkgY29uc3RydWN0aW9uOyB0aGVyZSBpcyBubyB3cml0ZS5cbiAgfCAnYXVkaXQ6cmVhZCdcbiAgLy8gSW5zaWdodHNcbiAgfCAncmVwb3J0czpyZWFkJ1xuICB8ICdyZXBvcnRzOnJvbGx1cCdcbiAgLy8gU3Rha2Vob2xkZXIgcmVwb3J0cy4gYHJlcG9ydHM6cmVhZGAgc3RheXMgdGhlIEZSRUUgb24tZGVtYW5kIGRhc2hib2FyZCByZWFkO1xuICAvLyB0aGVzZSB0d28gYXJlIHRoZSBhZGQtb24ncyB3cml0ZSBzdXJmYWNlIOKAlCBgYXV0aG9yYCBzYXZlcy9zY2hlZHVsZXMvZHJhZnRzIGFcbiAgLy8gcmVwb3J0LCBgc2hhcmVgIHB1Ymxpc2hlcyBpdCBiZXlvbmQgdGhlIHBsYXRmb3JtIChQREYsIGVtYWlsLCBzaGFyZSBsaW5rcykuXG4gIC8vIFNwbGl0IGJlY2F1c2UgcHVibGlzaGluZyBleHRlcm5hbGx5IGlzIGEgZGlmZmVyZW50IHJpc2sgZnJvbSBjb21wb3Npbmc6XG4gIC8vIGEgbGVhZCBjYW4gYmUgYWxsb3dlZCB0byBidWlsZCByZXBvcnRzIHdpdGhvdXQgYmVpbmcgYWxsb3dlZCB0byBlbWFpbCB0aGVtIG91dC5cbiAgfCAncmVwb3J0czp3cml0ZSdcbiAgfCAncmVwb3J0czpwdWJsaXNoJ1xuICAvLyBNZXNzYWdpbmdcbiAgfCAnbWVzc2FnZXM6cmVhZCdcbiAgfCAnbWVzc2FnZXM6d3JpdGUnXG4gIC8vIEJpbGxpbmcgJiBxdW90YXNcbiAgfCAnYmlsbGluZzpyZWFkJ1xuICB8ICdiaWxsaW5nOm1hbmFnZSdcbiAgfCAncXVvdGFzOnJlYWQnXG4gIC8vIEltcGVyc29uYXRpb24g4oCUIHZpZXdpbmcgdGhlIHBsYXRmb3JtIGFzIHNvbWVib2R5IGVsc2UuIFRocmVlIGlkcywgYmVjYXVzZVxuICAvLyB0aHJlZSBkaWZmZXJlbnQgcGFydGllcyBhcmUgaW52b2x2ZWQgYW5kIGVhY2ggZGVjaXNpb24gYmVsb25ncyB0byBhXG4gIC8vIGRpZmZlcmVudCBvbmUgb2YgdGhlbSAoZG9jcy9wZXJtaXNzaW9ucy5tZCNpbXBlcnNvbmF0aW9uKTpcbiAgLy8gIC0gYGltcGVyc29uYXRpb246b3BlbmAgICB0aGUgVkVORE9SIG9wZW5pbmcgYSBjcm9zcy10ZW5hbnQgc2Vzc2lvbiwgd2hpY2hcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzeXN0ZW0tb3JnLW9ubHkgYW5kIHN0aWxsIGNvbnNlbnQtZ2F0ZWQ7XG4gIC8vICAtIGB0ZWFtX2FjY2VzczpvcGVuYCAgICAgYSBQQVJFTlQgb3JnJ3MgYWRtaW4gdmlld2luZyBvbmUgb2YgaXRzIG93biB0ZWFtcydcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzLCB3aGljaCBuZXZlciBsZWF2ZXMgdGhlIHRlbmFudDtcbiAgLy8gIC0gYGltcGVyc29uYXRpb246YXBwcm92ZWAgdGhlIFRFTkFOVCBhbnN3ZXJpbmcgYSBjb25zZW50IHJlcXVlc3QuXG4gIC8vIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAgYmVsb3cgaXMgYSBmb3VydGggdGhpbmcgYWdhaW46IHRoZSBQT0xJQ1kgdGhhdFxuICAvLyBkZWNpZGVzIHdoZXRoZXIgY29uc2VudCBpcyBuZWVkZWQgYXQgYWxsLlxuICB8ICdpbXBlcnNvbmF0aW9uOm9wZW4nXG4gIHwgJ2ltcGVyc29uYXRpb246YXBwcm92ZSdcbiAgfCAndGVhbV9hY2Nlc3M6b3BlbidcbiAgLy8gUmVnaXN0cnkuIFRocmVlIHJ1bmdzLCBiZWNhdXNlIHRoZSB3cml0ZSBoYWxmIGhhcyB0d28gdmVyeSBkaWZmZXJlbnRcbiAgLy8gYmxhc3QgcmFkaWk6IGB3cml0ZWAgQ09QSUVTIGEgbWFuaWZlc3QgKGFkZGl0aXZlIOKAlCBpdCBjcmVhdGVzIGEgdGFnLFxuICAvLyBub3RoaW5nIHN0b3BzIHJlc29sdmluZyksIGBwdXJnZWAgREVMRVRFUyBvbmUgKGEgdGVuYW50J3MgcGlwZWxpbmUgb3IgYVxuICAvLyBkaWdlc3QtcGlubmVkIHBsdWdpbiBpbWFnZSBjYW4gc3RvcCByZXNvbHZpbmcsIHdpdGggbm8gdW5kbykuXG4gIHwgJ3JlZ2lzdHJ5OnJlYWQnXG4gIHwgJ3JlZ2lzdHJ5OndyaXRlJ1xuICB8ICdyZWdpc3RyeTpwdXJnZSdcbiAgLy8gT3JnYW5pemF0aW9uIHNldHRpbmdzLiBGb3VyIFJFU09VUkNFUywgZWFjaCB3aXRoIHRoZSBgOndyaXRlYCBhY3Rpb24sIHJhdGhlclxuICAvLyB0aGFuIG9uZSBgb3JnYCByZXNvdXJjZSB3aXRoIGZvdXIgbm91bi1zaGFwZWQgYWN0aW9ucyDigJQgdGhlc2UgYXJlIHRoZSBvcmcnc1xuICAvLyBvd24gY29uZmlndXJhdGlvbiBzdGF0ZSwgd2hpY2ggaXMgd2hhdCBgOndyaXRlYCBtZWFucyBoZXJlIChgOm1hbmFnZWAgaXNcbiAgLy8gcmVzZXJ2ZWQgZm9yIGFkbWluaXN0ZXJpbmcgYSBjb2xsZWN0aW9uIG9mIG90aGVyIGVudGl0aWVzOiBtZW1iZXJzLCByb2xlcyxcbiAgLy8gaW52aXRhdGlvbnMsIHNlcnZpY2UgYWNjb3VudHMsIGJpbGxpbmcpLlxuICAvL1xuICAvLyAgLSBgb3JnX3NldHRpbmdzOndyaXRlYCAgICAgIOKAlCBnZW5lcmFsIG9yZyBzZXR0aW5ncyArIEFJIGNvbmZpZy5cbiAgLy8gIC0gYG9yZ19pZHA6d3JpdGVgICAgICAgICAgICDigJQgU1NPIC8gSWRQIGNvbmZpZ3VyYXRpb24gKHNlbnNpdGl2ZTogY29udHJvbHMgbG9naW4pLlxuICAvLyAgLSBgb3JnX2ttczp3cml0ZWAgICAgICAgICAgIOKAlCBjdXN0b21lci1tYW5hZ2VkIEtNUyBrZXkgY29uZmlndXJhdGlvblxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbnNpdGl2ZTogY29udHJvbHMgZW5jcnlwdGlvbiBvZiBvcmcgZGF0YSkuXG4gIC8vICAtIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAg4oCUIHRoZSBpbXBlcnNvbmF0aW9uIHBvbGljeSAoc2Vuc2l0aXZlOiBjb250cm9sc1xuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvIG1heSBWSUVXIHRoZSBvcmcncyBkYXRhIGFzIGEgbWVtYmVyKS5cbiAgLy9cbiAgLy8gVGhlIGxhc3QgdGhyZWUgd2VyZSBzcGxpdCBPVVQgb2YgYG9yZ19zZXR0aW5nczp3cml0ZWAgc28gYSBjdXN0b20gcm9sZSBjYW5cbiAgLy8gZ3JhbnQgZ2VuZXJhbCBzZXR0aW5ncyBXSVRIT1VUIHRoZSBzZW5zaXRpdmUgc3VyZmFjZXMg4oCUIGEgXCJzZXR0aW5ncyBtYW5hZ2VyXCJcbiAgLy8gcm9sZSBmb3Igb3JnIG5hbWUgb3IgQUkgcHJvdmlkZXIgbXVzdCBub3QgYWxzbyBiZSBhYmxlIHRvIHN3aXRjaCB0aGUgb3JnIHRvXG4gIC8vIGBvcGVuYC4gQWxsIHJlbWFpbiBvcmctYXNzaWduYWJsZSBhbmQgYXJlIHNlZWRlZCBpbnRvIHRoZSBhZG1pbi9vd25lclxuICAvLyBidW5kbGVzICh2aWEgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlMpIHNvIGV4aXN0aW5nIGFkbWlucyBrZWVwIGZ1bGxcbiAgLy8gYWNjZXNzLlxuICB8ICdvcmdfc2V0dGluZ3M6d3JpdGUnXG4gIHwgJ29yZ19pZHA6d3JpdGUnXG4gIHwgJ29yZ19rbXM6d3JpdGUnXG4gIHwgJ29yZ19pbXBlcnNvbmF0aW9uOndyaXRlJztcblxuLyoqXG4gKiBUaGUgQ0xPU0VEIHNldCBvZiBhY3Rpb25zIGEgcGVybWlzc2lvbiBpZCBtYXkgZW5kIGluIOKAlCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlXG4gKiBgcmVzb3VyY2U6YWN0aW9uYCBzdHJhdGVneSB0aGUgZG9jcyBkZXNjcmliZS5cbiAqXG4gKiBJdCBpcyBjbG9zZWQgZm9yIG9uZSBjb25jcmV0ZSByZWFzb246IGBpc011dGF0aW9uUGVybWlzc2lvbmAgKGZyb250ZW5kXG4gKiBgbGliL2F1dGgtaGVscGVycy50c2ApIGNsYXNzaWZpZXMgcmVhZCB2cyB3cml0ZSBCWSBTVUZGSVgsIGFuZCB0aGF0IGlzIHdoYXRcbiAqIGRpc2FibGVzIGV2ZXJ5IHdyaXRlIGFmZm9yZGFuY2UgZHVyaW5nIGEgcmVhZC1vbmx5IGltcGVyc29uYXRpb24gc2Vzc2lvbi4gQVxuICogbm91bi1zaGFwZWQgYWN0aW9uICh0aGUgZm9ybWVyIGBvcmc6c2V0dGluZ3NgIGFuZCBgY29uc29sZXM6ZGF0YXN0b3JlYCkgY2Fubm90IGJlIGNsYXNzaWZpZWRcbiAqIGJ5IG5hbWUsIHNvIGVhY2ggb25lIGhhZCB0byBiZSBoYW5kLWxpc3RlZCDigJQgYW5kIGEgcGVybWlzc2lvbiBhZGRlZCB3aXRob3V0XG4gKiByZW1lbWJlcmluZyB0aGF0IGxpc3QgcmVuZGVycyBhbiBlbmFibGVkIGNvbnRyb2wgdGhhdCBkZWFkLWVuZHMgb24gYSA0MDMuXG4gKlxuICogUmVhZHMgYXJlIGA6cmVhZGAgYW5kIGA6cm9sbHVwYCAoYSByZWFkLVZJU0lCSUxJVFkgc2NvcGUpLiBFdmVyeXRoaW5nIGVsc2UgaXNcbiAqIGEgd3JpdGUuIFRoZSBmaXZlIGRvbWFpbiB2ZXJicyBhcmUga2VwdCBiZWNhdXNlIGVhY2ggbmFtZXMgYW4gYWN0aW9uIHdpdGggbm9cbiAqIHN5bm9ueW0gaW4gdGhpcyB2b2NhYnVsYXJ5IOKAlCBgOmV4cG9ydGAgaXMgZWdyZXNzIHJhdGhlciB0aGFuIG11dGF0aW9uLFxuICogYDppbnN0YWxsYCBpcyBjb25zdW1wdGlvbiByYXRoZXIgdGhhbiBhdXRob3JpbmcsIGA6bW9kZXJhdGVgIGFuZCBgOnZlcmlmeWAgYXJlXG4gKiBlY29zeXN0ZW0gZGVjaXNpb25zLCBhbmQgYDpvcGVyYXRlYCBtb3ZlcyBhbm90aGVyIHRlbmFudCdzIG1vbmV5LlxuICpcbiAqIGBQRVJNSVNTSU9OX0lEX1NIQVBFYCBhbmQgdGhpcyBsaXN0IGFyZSBhc3NlcnRlZCBvdmVyIHRoZSB3aG9sZSBjYXRhbG9nIGluXG4gKiBhcGktY29yZSdzIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgLCBzbyBhZGRpbmcgYW4gb2ZmLXN0cmF0ZWd5IGlkIGZhaWxzXG4gKiB0aGVyZSByYXRoZXIgdGhhbiBhdCBhIDQwMy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fQUNUSU9OUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdyZWFkJywgJ3JvbGx1cCcsXG4gICd3cml0ZScsICdtYW5hZ2UnLCAncHVibGlzaCcsICdvcGVuJyxcbiAgJ2V4cG9ydCcsICdpbnN0YWxsJywgJ21vZGVyYXRlJywgJ3ZlcmlmeScsICdvcGVyYXRlJywgJ3B1cmdlJywgJ2FwcHJvdmUnLFxuXTtcblxuLyoqIGByZXNvdXJjZTphY3Rpb25gLCB3aGVyZSByZXNvdXJjZSBpcyBgc25ha2VfY2FzZWAgYW5kIGFjdGlvbiBpcyBpbiB7QGxpbmsgUEVSTUlTU0lPTl9BQ1RJT05TfS4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0lEX1NIQVBFID0gL15bYS16XVthLXowLTlfXSo6W2Etel0rJC87XG5cbi8qKiBBbGwgdmFsaWQgcGVybWlzc2lvbnMgKG9yZGVyIGRldGVybWluZXMgZGlzcGxheSBvcmRlciBpbiB0aGUgcGlja2VyKS4gKi9cbmV4cG9ydCBjb25zdCBBTExfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lczpyZWFkJywgJ3BpcGVsaW5lczp3cml0ZScsICdwaXBlbGluZXM6cHVibGlzaCcsICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsXG4gICd0ZW1wbGF0ZXM6cmVhZCcsICd0ZW1wbGF0ZXM6d3JpdGUnLCAndGVtcGxhdGVzOnB1Ymxpc2gnLFxuICAncGx1Z2luczpyZWFkJywgJ3BsdWdpbnM6d3JpdGUnLCAncGx1Z2luczpwdWJsaXNoJyxcbiAgJ3BsdWdpbnM6aW5zdGFsbCcsICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJywgJ3B1Ymxpc2hlcnM6bWFuYWdlJyxcbiAgJ3BsdWdpbnM6bW9kZXJhdGUnLCAncHVibGlzaGVyczp2ZXJpZnknLFxuICAncGxhdGZvcm06cmVhZCcsICdvcmdzOnJlYWQnLCAnYmlsbGluZzpvcGVyYXRlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJywgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAnb25jYWxsOm1hbmFnZScsXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJywgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLCAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLCAncXVvdGFzOm1hbmFnZScsICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgJ2NvbXBsaWFuY2U6cmVhZCcsICdjb21wbGlhbmNlOndyaXRlJyxcbiAgJ21lbWJlcnM6bWFuYWdlJywgJ3JvbGVzOm1hbmFnZScsICdpbnZpdGF0aW9uczptYW5hZ2UnLCAnc2VydmljZV9hY2NvdW50czptYW5hZ2UnLFxuICAnZGFzaGJvYXJkczpyZWFkJywgJ2Rhc2hib2FyZHM6d3JpdGUnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnLFxuICAnbG9nczpleHBvcnQnLCAnYXVkaXQ6cmVhZCcsXG4gICdyZXBvcnRzOnJlYWQnLCAncmVwb3J0czpyb2xsdXAnLCAncmVwb3J0czp3cml0ZScsICdyZXBvcnRzOnB1Ymxpc2gnLFxuICAnbWVzc2FnZXM6cmVhZCcsICdtZXNzYWdlczp3cml0ZScsXG4gICdiaWxsaW5nOnJlYWQnLCAnYmlsbGluZzptYW5hZ2UnLFxuICAncXVvdGFzOnJlYWQnLFxuICAncmVnaXN0cnk6cmVhZCcsICdyZWdpc3RyeTp3cml0ZScsICdyZWdpc3RyeTpwdXJnZScsXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLCAnaW1wZXJzb25hdGlvbjphcHByb3ZlJywgJ3RlYW1fYWNjZXNzOm9wZW4nLFxuICAnb3JnX3NldHRpbmdzOndyaXRlJywgJ29yZ19pZHA6d3JpdGUnLCAnb3JnX2ttczp3cml0ZScsICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFRoZSBDTE9TRUQgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSB7QGxpbmsgUGVybWlzc2lvbn0gYW5kIGRlY2lkZSBhY2Nlc3MuXG4gKlxuICogXCJJcyBwZXJtaXNzaW9uIFggZW5mb3JjZWQgYW55d2hlcmU/XCIgaGFzIHRvIGJlIGFuc3dlcmFibGUgc3RhdGljYWxseSwgd2hpY2hcbiAqIGEgZ3JlcCBjYW4ndCBkbzogZm91ciBkaWZmZXJlbnQgY2FsbCBzaGFwZXMgY29uc3VtZSBhIHBlcm1pc3Npb24gaWRcbiAqIChgcmVxdWlyZVBlcm1pc3Npb24oJ3gnKWAgYXQgYSByb3V0ZSwgYHVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgJ3gnKWAgaW5zaWRlIGFcbiAqIGNvbnRyb2xsZXIsIGFuZCBgcmVzb2x2ZVZpc2liaWxpdHkocmVxLCB2LCAneCcpYCAvXG4gKiBgcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcyjigKYsICd4JylgIGluIHRoZSB2aXNpYmlsaXR5IGhlbHBlcnMpLCBzbyBhIG5haXZlXG4gKiBncmVwIGZvciBhIHJvdXRlLWxldmVsIGdhdGUgcmVwb3J0cyBgdGVtcGxhdGVzOnB1Ymxpc2hgIGFzIFVORU5GT1JDRUQgd2hlbiBpdFxuICogaXMgaW4gZmFjdCBlbmZvcmNlZCBvbiBldmVyeSB0ZW1wbGF0ZSBwdWJsaXNoLlxuICpcbiAqIFRoZXkgYWxsIGJvdHRvbSBvdXQgaW4gYHVzZXJIYXNQZXJtaXNzaW9uYCwgc28gdGhlIFJVTlRJTUUgcHJpbWl0aXZlIHdhc1xuICogYWxyZWFkeSBvbmUuIFRoaXMgY29uc3RhbnQgbWFrZXMgdGhlIFNUQVRJQyBzdXJmYWNlIG9uZSBhcyB3ZWxsOiBpdCBuYW1lc1xuICogZXZlcnkgZW50cnkgcG9pbnQsIHNvIGBwZXJtaXNzaW9uLWNvdmVyYWdlLnRlc3QudHNgIGNhbiBlbnVtZXJhdGUgdGhlIGNhdGFsb2dcbiAqIGFuZCByZXBvcnQgZWFjaCBwZXJtaXNzaW9uJ3MgZW5mb3JjZW1lbnQgc2l0ZXMgd2l0aG91dCBndWVzc2luZy4gQSBuZXcgZ2F0ZVxuICogdGhhdCB0YWtlcyBhIGBQZXJtaXNzaW9uYCBtdXN0IGJlIGxpc3RlZCBoZXJlLCBvciB0aGUgY292ZXJhZ2UgcmVwb3J0IHN0YXJ0c1xuICogbHlpbmcgYWJvdXQgdGhlIHBlcm1pc3Npb25zIG9ubHkgdGhhdCBnYXRlIGVuZm9yY2VzLlxuICovXG5leHBvcnQgY29uc3QgUEVSTUlTU0lPTl9HQVRFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIC8vIE1pZGRsZXdhcmUgZ2F0ZXMgKHJvdXRlIGxldmVsKSDigJQgYWxsIGFueS1vZiBleGNlcHQgcmVxdWlyZUFsbFBlcm1pc3Npb25zLlxuICAncmVxdWlyZVBlcm1pc3Npb24nLFxuICAncmVxdWlyZUFsbFBlcm1pc3Npb25zJyxcbiAgJ3JlcXVpcmVQZXJtaXNzaW9uT3JTZXJ2aWNlJyxcbiAgLy8gVGhlIHBsdWdpbi1lY29zeXN0ZW0gZ292ZXJuYW5jZSBjaGFpbiAoc3lzdGVtIG9yZyArIHBlcm1pc3Npb24gKyBhYWwyKS5cbiAgJ3JlcXVpcmVTeXN0ZW1PcmdQZXJtaXNzaW9uJyxcbiAgLy8gVGhlIHNpbmdsZSBydW50aW1lIHByaW1pdGl2ZSBldmVyeSBnYXRlIGFib3ZlIGRlbGVnYXRlcyB0bzsgYWxzbyBjYWxsZWRcbiAgLy8gZGlyZWN0bHkgd2hlcmUgYSBjb250cm9sbGVyIGJyYW5jaGVzIG9uIGEgY2FwYWJpbGl0eSByYXRoZXIgdGhhbiByZWplY3RpbmcuXG4gICd1c2VySGFzUGVybWlzc2lvbicsXG4gICdoYXNQZXJtaXNzaW9uJyxcbiAgLy8gVmlzaWJpbGl0eSBoZWxwZXJzIOKAlCB0aGV5IHRha2UgdGhlIGVudGl0eSdzIFBVQkxJU0ggcGVybWlzc2lvbi5cbiAgJ3JlcXVpcmVWaXNpYmlsaXR5V3JpdGVBY2Nlc3MnLFxuICAnY2hlY2tWaXNpYmlsaXR5V3JpdGVBY2Nlc3MnLFxuICAncmVzb2x2ZVZpc2liaWxpdHknLFxuICAvLyBxdW90YSdzIG93biB3cmFwcGVyLiBJdCBkZWxlZ2F0ZXMgdG8gYHJlcXVpcmVQZXJtaXNzaW9uYCwgYnV0IGl0IHRha2VzIHRoZVxuICAvLyBpZCBhcyBhbiBPUFRJT04gKGBhdXRob3JpemVPcmcoeyBwZXJtaXNzaW9uOiAncXVvdGFzOm1hbmFnZScgfSlgKSBiZWNhdXNlIGl0XG4gIC8vIGFsc28gY2Fub25pY2FsaXplcyB0aGUgYDpvcmdJZGAgcGFyYW0sIHdoaWNoIHRoZSByb3V0ZSBjYW5ub3QgZHJvcC4gV2l0aG91dFxuICAvLyB0aGlzIGVudHJ5IHRoZSBjb3ZlcmFnZSBzY2FuIHJlcG9ydGVkIGBxdW90YXM6bWFuYWdlYCBhcyBlbmZvcmNlZCBub3doZXJlLlxuICAnYXV0aG9yaXplT3JnJyxcbl07XG5cbi8qKlxuICogRGlzcGxheSBtZXRhZGF0YSBmb3Igb25lIHBlcm1pc3Npb246IHRoZSBsYWJlbCArIGRlc2NyaXB0aW9uIHRoZVxuICogcGVybWlzc2lvbi1waWNrZXIgVUkgc2hvd3MsIGFuZCB0aGUgY2F0ZWdvcnkgaXQgZ3JvdXBzIHVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25NZXRhIHtcbiAgaWQ6IFBlcm1pc3Npb247XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBlcm1pc3Npb24gY2F0YWxvZyB3aXRoIGRpc3BsYXkgbWV0YWRhdGEsIGluIHBpY2tlciBvcmRlci5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgU0lOR0xFIGNhdGFsb2cgZm9yIGJhY2tlbmQgYW5kIGJyb3dzZXIgYWxpa2U6IGl0IGhhcyBub1xuICogcnVudGltZSBkZXBlbmRlbmNpZXMgKHRoZSBvbmx5IGltcG9ydCBpcyBhIHR5cGUpLCBzbyB0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdFxuICogdGhyb3VnaCB0aGUgYEBwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3Blcm1pc3Npb25zYCBzdWJwYXRoIGluc3RlYWQgb2Yga2VlcGluZ1xuICogYSBoYW5kLW1haW50YWluZWQgbWlycm9yLiBFdmVyeSBpZCBpbiB7QGxpbmsgQUxMX1BFUk1JU1NJT05TfSBtdXN0IGFwcGVhciBoZXJlXG4gKiBleGFjdGx5IG9uY2UgKGFzc2VydGVkIGJ5IGBwZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0NBVEFMT0c6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10gPSBbXG4gIHsgaWQ6ICdwaXBlbGluZXM6cmVhZCcsIGxhYmVsOiAnVmlldyBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgcGlwZWxpbmVzIGFuZCB0aGVpciBleGVjdXRpb25zJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZXMnLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgeyBpZDogJ3BpcGVsaW5lczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHBpcGVsaW5lcycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwaXBlbGluZXMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScsIGxhYmVsOiAnUmVnaXN0ZXIgZGVwbG95bWVudHMnLCBkZXNjcmlwdGlvbjogJ1JlY29yZCBhbmQgcmVtb3ZlIHRoZSBkZXBsb3llZCBzdGFjayBhbmQgc3RlcCBtYW5pZmVzdCBiZWhpbmQgYSBwaXBlbGluZSAodGhlIHBpcGVsaW5lIHJlZ2lzdHJ5KScsIGNhdGVnb3J5OiAnUGlwZWxpbmVzJyB9LFxuICB7IGlkOiAndGVtcGxhdGVzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdWaWV3IHRoZSBnb2xkZW4tcGF0aCB0ZW1wbGF0ZSBjYXRhbG9nJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gIHsgaWQ6ICd0ZW1wbGF0ZXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ0F1dGhvciwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZSB0ZW1wbGF0ZXMnLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgeyBpZDogJ3RlbXBsYXRlczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnU2hhcmUgYSB0ZW1wbGF0ZSBiZXlvbmQgeW91ciBvcmcgKHB1YmxpYyB2aXNpYmlsaXR5KScsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICB7IGlkOiAncGx1Z2luczpyZWFkJywgbGFiZWw6ICdWaWV3IHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgcGx1Z2lucyBhbmQgYnVpbGRzJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICB7IGlkOiAncGx1Z2luczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIHBsdWdpbnMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgdXBsb2FkLCBlZGl0LCBhbmQgZGVsZXRlIHBsdWdpbnMnLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOnB1Ymxpc2gnLCBsYWJlbDogJ1B1Ymxpc2ggcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwbHVnaW5zIHB1YmxpYyAob3JnLXdpZGUvY2F0YWxvZyB2aXNpYmlsaXR5KScsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6aW5zdGFsbCcsIGxhYmVsOiAnSW5zdGFsbCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdJbnN0YWxsLCB1cGdyYWRlLCBhbmQgdW5pbnN0YWxsIGVjb3N5c3RlbSBwbHVnaW5zIChvciByZXF1ZXN0IGFuIGluc3RhbGwgd2hlbiB5b3VyIG9yZyByZXF1aXJlcyBhcHByb3ZhbCknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgcGx1Z2luIGluc3RhbGxzJywgZGVzY3JpcHRpb246IFwiU2V0IHlvdXIgb3JnJ3MgcGx1Z2luIGNvbnN1bXB0aW9uIHBvbGljeSBhbmQgYXBwcm92ZSBvciBkZW55IGluc3RhbGwgcmVxdWVzdHMgd2l0aGluIHRoZSBvcmdcIiwgY2F0ZWdvcnk6ICdQbHVnaW4gRWNvc3lzdGVtJyB9LFxuICB7IGlkOiAncHVibGlzaGVyczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBwdWJsaXNoZXIgcHJvZmlsZScsIGRlc2NyaXB0aW9uOiBcIk1hbmFnZSB5b3VyIG9yZydzIHB1Ymxpc2hlciBwcm9maWxlIGFuZCBzdWJtaXQgcHVibGlzaCwgdmVyaWZpY2F0aW9uLCB0cmFuc2ZlciwgYW5kIGFkdmlzb3J5IHJlcXVlc3RzXCIsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3BsdWdpbnM6bW9kZXJhdGUnLCBsYWJlbDogJ01vZGVyYXRlIHRoZSBwbHVnaW4gZWNvc3lzdGVtJywgZGVzY3JpcHRpb246ICdEZWNpZGUgcHVibGlzaCByZXF1ZXN0cywgbW9kZXJhdGUgc3VibWlzc2lvbnMgYW5kIHJldmlld3MsIHlhbmsgdmVyc2lvbnMsIGFuZCBwdWJsaXNoIGFkdmlzb3JpZXMgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsdWdpbiBFY29zeXN0ZW0nIH0sXG4gIHsgaWQ6ICdwdWJsaXNoZXJzOnZlcmlmeScsIGxhYmVsOiAnVmVyaWZ5IHB1Ymxpc2hlcnMnLCBkZXNjcmlwdGlvbjogJ0FwcHJvdmUgVmVyaWZpZWQgYXBwbGljYXRpb25zLCBwdWJsaXNoZXIgdGllciBhbmQgcHJvZmlsZSBjaGFuZ2VzLCBhbmQgb3duZXJzaGlwIHRyYW5zZmVycyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGx1Z2luIEVjb3N5c3RlbScgfSxcbiAgeyBpZDogJ3BsYXRmb3JtOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcGxhdGZvcm0gb3BlcmF0aW9ucycsIGRlc2NyaXB0aW9uOiAnUmVhZCB0aGUgcGxhdGZvcm0gc2V0dGluZ3MgYW5kIHRoZSBjcm9zcy10ZW5hbnQgb3JnYW5pemF0aW9uIGxpc3QgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvcmdzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgYWxsIG9yZ2FuaXphdGlvbnMnLCBkZXNjcmlwdGlvbjogJ0xpc3QgYW5kIG9wZW4gZXZlcnkgb3JnYW5pemF0aW9uIG9uIHRoZSBkZXBsb3ltZW50IFxcdTIwMTQgdGhlIHJvc3RlciB0aGUgb3BlcmF0b3Igc3VyZmFjZXMgd29yayBmcm9tIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnYmlsbGluZzpvcGVyYXRlJywgbGFiZWw6ICdPcGVyYXRlIGRpc2NvdW50cyBhbmQgcHJvbW90aW9ucycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBhcHBseSBhbmQgcmV2b2tlIGRpc2NvdW50IHRva2VucyBhbmQgcHJvbW90aW9uIGNhbXBhaWducyBhY3Jvc3MgdGVuYW50cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJywgbGFiZWw6ICdPcGVuIHRoZSBvYnNlcnZhYmlsaXR5IGNvbnNvbGVzJywgZGVzY3JpcHRpb246ICdPcGVuIEdyYWZhbmEgYW5kIEtpYWxpIOKAlCBkYXNoYm9hcmRzLCB0cmFmZmljIGFuZCBtZXNoIGhlYWx0aCBhY3Jvc3MgZXZlcnkgdGVuYW50IChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnZGF0YWJhc2VfY29uc29sZTpvcGVuJywgbGFiZWw6ICdPcGVuIHRoZSBkYXRhYmFzZSBjb25zb2xlcycsIGRlc2NyaXB0aW9uOiAnT3BlbiBwZ0FkbWluIGFuZCBtb25nby1leHByZXNzIOKAlCBhIGRpcmVjdCByZWFkL3dyaXRlIHNoZWxsIG92ZXIgZXZlcnkgdGVuYW50XFx1MjAxOXMgcm93cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29iamVjdHN0b3JlX2NvbnNvbGU6b3BlbicsIGxhYmVsOiAnT3BlbiB0aGUgb2JqZWN0LXN0b3JlIGNvbnNvbGUnLCBkZXNjcmlwdGlvbjogJ09wZW4gdGhlIFJ1c3RGUyAoUzMpIGNvbnNvbGUg4oCUIGxpc3QgYW5kIGRlbGV0ZSBvYmplY3RzIGluIGV2ZXJ5IGJ1Y2tldCwgaW5jbHVkaW5nIHRoZSBhdWRpdCBjaGFpbiAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ29uY2FsbDptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSBvbi1jYWxsIHBhZ2luZycsIGRlc2NyaXB0aW9uOiAnUmVhZCB0aGUgcGFnaW5nIHBvc3R1cmUgYW5kIHNlbmQgYSB0ZXN0IHBhZ2UgKHN5c3RlbSBvcmcgb25seTsgdGhlIHJvdGEgbGl2ZXMgd2l0aCB0aGUgcHJvdmlkZXIpJywgY2F0ZWdvcnk6ICdPbi1jYWxsJyB9LFxuICB7IGlkOiAnc3VwcG9ydF9jYXNlczp3cml0ZScsIGxhYmVsOiAnV29yayB0aGUgc3VwcG9ydCBkZXNrJywgZGVzY3JpcHRpb246ICdUcmlhZ2UgdGhlIHN1cHBvcnQgcXVldWUsIGFzc2lnbiBhbmQgcmUtcHJpb3JpdGlzZSBjYXNlcywgd3JpdGUgaW50ZXJuYWwgbm90ZXMsIGFuZCByZWNvcmQgaW5jaWRlbnRzIGFnYWluc3QgYSBzdXBwb3J0IGNvbnRyYWN0IChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdTdXBwb3J0IGRlc2snIH0sXG4gIHsgaWQ6ICdzdXBwb3J0X2NvbnRlbnQ6d3JpdGUnLCBsYWJlbDogJ0F1dGhvciBjYW5uZWQgcmVwbGllcycsIGRlc2NyaXB0aW9uOiAnV3JpdGUgYW5kIHJldGlyZSB0aGUgcmV1c2FibGUgc3VwcG9ydCByZXBsaWVzIG9mZmVyZWQgdG8gZXZlcnkgY3VzdG9tZXIgKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1N1cHBvcnQgZGVzaycgfSxcbiAgeyBpZDogJ3N1YnNjcmlwdGlvbnM6cmVhZCcsIGxhYmVsOiAnVmlldyBhbGwgc3Vic2NyaXB0aW9ucycsIGRlc2NyaXB0aW9uOiAnVmlldyBldmVyeSBvcmdhbml6YXRpb25cXHUyMDE5cyBzdWJzY3JpcHRpb24sIHBsYW4gbWl4IGFuZCBiaWxsaW5nIGV2ZW50cyAoc3lzdGVtIG9yZyBvbmx5KScsIGNhdGVnb3J5OiAnUGxhdGZvcm0gb3BlcmF0aW9ucycgfSxcbiAgeyBpZDogJ3N1YnNjcmlwdGlvbnM6bWFuYWdlJywgbGFiZWw6ICdDaGFuZ2UgYW55IHN1YnNjcmlwdGlvbicsIGRlc2NyaXB0aW9uOiAnQ2hhbmdlIGEgcGxhbiwgc2V0IGEgc3VwcG9ydCBmbG9vciwgYW5kIGNhbmNlbCBhbiBvcmdhbml6YXRpb25cXHUyMDE5cyBzdWJzY3JpcHRpb24gKHN5c3RlbSBvcmcgb25seSknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdvcmdzOm1hbmFnZScsIGxhYmVsOiAnQWRtaW5pc3RlciBhbnkgb3JnYW5pemF0aW9uJywgZGVzY3JpcHRpb246ICdSZW5hbWUsIHJlLXRpZXIsIG1vdmUgYW5kIGRlbGV0ZSBhbnkgb3JnYW5pemF0aW9uIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAncXVvdGFzOm1hbmFnZScsIGxhYmVsOiAnQ2hhbmdlIGFueSBxdW90YScsIGRlc2NyaXB0aW9uOiAnUmFpc2UsIHJlc2V0IGFuZCBjbGVhciBhbm90aGVyIG9yZ2FuaXphdGlvblxcdTIwMTlzIHF1b3RhcyAoc3lzdGVtIG9yZyBvbmx5OyB2aWV3aW5nIHRoZW0gcmlkZXMgcGxhdGZvcm06cmVhZCknLCBjYXRlZ29yeTogJ1BsYXRmb3JtIG9wZXJhdGlvbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5fcXVldWU6bWFuYWdlJywgbGFiZWw6ICdSdW4gdGhlIHBsdWdpbiBidWlsZCBxdWV1ZScsIGRlc2NyaXB0aW9uOiAnUmVhZCBidWlsZC1xdWV1ZSBkZXB0aCBhbmQgcHVyZ2UgdGhlIGRlYWQtbGV0dGVyIHF1ZXVlIChzeXN0ZW0gb3JnIG9ubHkpJywgY2F0ZWdvcnk6ICdQbGF0Zm9ybSBvcGVyYXRpb25zJyB9LFxuICB7IGlkOiAnY29tcGxpYW5jZTpyZWFkJywgbGFiZWw6ICdWaWV3IGNvbXBsaWFuY2UnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgY29tcGxpYW5jZSBydWxlcywgcG9saWNpZXMsIGFuZCBzY2FucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ2NvbXBsaWFuY2U6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBjb21wbGlhbmNlJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgcnVsZXMsIHBvbGljaWVzLCBhbmQgZXhlbXB0aW9ucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ21lbWJlcnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgbWVtYmVycycsIGRlc2NyaXB0aW9uOiAnQWRkLCByZW1vdmUsIGFuZCBjaGFuZ2Ugcm9sZXMgb2Ygb3JnIG1lbWJlcnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdyb2xlczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSByb2xlcycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBlZGl0LCBhbmQgZGVsZXRlIHJvbGVzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAnaW52aXRhdGlvbnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgaW52aXRhdGlvbnMnLCBkZXNjcmlwdGlvbjogJ1NlbmQsIHJlc2VuZCwgYW5kIHJldm9rZSBpbnZpdGF0aW9ucycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2Ugc2VydmljZSBhY2NvdW50cycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIG9yZyBzZXJ2aWNlIGFjY291bnRzLCBhc3NpZ24gdGhlaXIgcm9sZXMsIGFuZCBpc3N1ZSBvciByZXZva2UgdGhlaXIga2V5cycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ2Rhc2hib2FyZHM6cmVhZCcsIGxhYmVsOiAnVmlldyBkYXNoYm9hcmRzJywgZGVzY3JpcHRpb246ICdWaWV3IGN1c3RvbSBkYXNoYm9hcmRzJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnZGFzaGJvYXJkczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGRhc2hib2FyZHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ29ic2VydmFiaWxpdHk6cmVhZCcsIGxhYmVsOiAnVmlldyBhbGVydGluZycsIGRlc2NyaXB0aW9uOiAnVmlldyBhbGVydCBydWxlcyBhbmQgZGVzdGluYXRpb25zJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnb2JzZXJ2YWJpbGl0eTp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGFsZXJ0aW5nJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgYWxlcnQgcnVsZXMgYW5kIGRlc3RpbmF0aW9ucycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ2xvZ3M6ZXhwb3J0JywgbGFiZWw6ICdEb3dubG9hZCBsb2dzJywgZGVzY3JpcHRpb246IFwiRG93bmxvYWQgeW91ciBvcmdhbml6YXRpb24ncyBsb2cgZW50cmllcyBhcyBhIGZpbGUgKHZpZXdpbmcgbG9ncyBvbmx5IG5lZWRzICdWaWV3IGFsZXJ0aW5nJylcIiwgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnYXVkaXQ6cmVhZCcsIGxhYmVsOiAnVmlldyB0aGUgYXVkaXQgbG9nJywgZGVzY3JpcHRpb246IFwiUmVhZCB0aGUgb3JnYW5pemF0aW9uJ3Mgb3duIHRhbXBlci1ldmlkZW50IGF1ZGl0IHRyYWlsXCIsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ3JlcG9ydHM6cmVhZCcsIGxhYmVsOiAnVmlldyByZXBvcnRzJywgZGVzY3JpcHRpb246ICdWaWV3IGFuYWx5dGljcyBhbmQgcmVwb3J0cycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gIHsgaWQ6ICdyZXBvcnRzOnJvbGx1cCcsIGxhYmVsOiAnUm9sbCB1cCB0ZWFtIHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgZGVzY2VuZGFudCB0ZWFtcyB3aGVuIHZpZXdpbmcgcmVwb3J0cycsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gIHsgaWQ6ICdyZXBvcnRzOndyaXRlJywgbGFiZWw6ICdBdXRob3Igc3Rha2Vob2xkZXIgcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBzY2hlZHVsZSBhbmQgZHJhZnQgc2NoZWR1bGVkIHJlcG9ydHMgZm9yIG1hbmFnZXJzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCByZXBvcnRzIGV4dGVybmFsbHknLCBkZXNjcmlwdGlvbjogJ1B1Ymxpc2ggYSByZXBvcnQgYW5kIG1pbnQgZXhwaXJpbmcgc2hhcmUgbGlua3MgZm9yIHBlb3BsZSBvdXRzaWRlIHRoZSBwbGF0Zm9ybScsIGNhdGVnb3J5OiAnSW5zaWdodHMnIH0sXG4gIHsgaWQ6ICdtZXNzYWdlczpyZWFkJywgbGFiZWw6ICdWaWV3IG1lc3NhZ2VzJywgZGVzY3JpcHRpb246ICdWaWV3IG1lc3NhZ2VzIGFuZCBhbm5vdW5jZW1lbnRzJywgY2F0ZWdvcnk6ICdNZXNzYWdpbmcnIH0sXG4gIHsgaWQ6ICdtZXNzYWdlczp3cml0ZScsIGxhYmVsOiAnU2VuZCBtZXNzYWdlcycsIGRlc2NyaXB0aW9uOiAnU2VuZCBtZXNzYWdlcyBhbmQgYW5ub3VuY2VtZW50cycsIGNhdGVnb3J5OiAnTWVzc2FnaW5nJyB9LFxuICB7IGlkOiAnYmlsbGluZzpyZWFkJywgbGFiZWw6ICdWaWV3IGJpbGxpbmcnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgc3Vic2NyaXB0aW9ucyBhbmQgdXNhZ2UnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gIHsgaWQ6ICdiaWxsaW5nOm1hbmFnZScsIGxhYmVsOiAnTWFuYWdlIGJpbGxpbmcnLCBkZXNjcmlwdGlvbjogJ01hbmFnZSBzdWJzY3JpcHRpb25zLCBhZGQtb25zLCBhbmQgdGhlIGJpbGxpbmcgcG9ydGFsJywgY2F0ZWdvcnk6ICdCaWxsaW5nICYgUXVvdGFzJyB9LFxuICB7IGlkOiAncXVvdGFzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcXVvdGFzJywgZGVzY3JpcHRpb246ICdWaWV3IG9yZ2FuaXphdGlvbiBxdW90YXMgYW5kIHVzYWdlJywgY2F0ZWdvcnk6ICdCaWxsaW5nICYgUXVvdGFzJyB9LFxuICB7IGlkOiAncmVnaXN0cnk6cmVhZCcsIGxhYmVsOiAnVmlldyByZWdpc3RyeScsIGRlc2NyaXB0aW9uOiAnVmlldyB0aGUgY29udGFpbmVyIGltYWdlIHJlZ2lzdHJ5JywgY2F0ZWdvcnk6ICdSZWdpc3RyeScgfSxcbiAgeyBpZDogJ3JlZ2lzdHJ5OndyaXRlJywgbGFiZWw6ICdDb3B5IGNvbnRhaW5lciBpbWFnZXMnLCBkZXNjcmlwdGlvbjogJ0NvcHkgYW5kIHByb21vdGUgYSBjb250YWluZXIgaW1hZ2UgaW50byBhbm90aGVyIHJlcG9zaXRvcnknLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICB7IGlkOiAncmVnaXN0cnk6cHVyZ2UnLCBsYWJlbDogJ0RlbGV0ZSBjb250YWluZXIgaW1hZ2VzJywgZGVzY3JpcHRpb246ICdEZWxldGUgaW1hZ2VzIGFuZCByZXBvc2l0b3JpZXMsIGFuZCBydW4gcmVnaXN0cnkgZ2FyYmFnZSBjb2xsZWN0aW9uJywgY2F0ZWdvcnk6ICdSZWdpc3RyeScgfSxcbiAgeyBpZDogJ2ltcGVyc29uYXRpb246b3BlbicsIGxhYmVsOiAnT3BlbiBhbiBpbXBlcnNvbmF0aW9uIHNlc3Npb24nLCBkZXNjcmlwdGlvbjogXCJWaWV3IGEgY3VzdG9tZXIncyBhY2NvdW50IGFzIG9uZSBvZiBpdHMgdXNlcnMsIHdpdGggdGhhdCBvcmdhbml6YXRpb24ncyBjb25zZW50XCIsIGNhdGVnb3J5OiAnSW1wZXJzb25hdGlvbicgfSxcbiAgeyBpZDogJ2ltcGVyc29uYXRpb246YXBwcm92ZScsIGxhYmVsOiAnQW5zd2VyIGltcGVyc29uYXRpb24gcmVxdWVzdHMnLCBkZXNjcmlwdGlvbjogJ0FwcHJvdmUgb3IgZGVueSBhIHJlcXVlc3QgdG8gdmlldyBhIG1lbWJlciBvZiB0aGlzIG9yZ2FuaXphdGlvbiBhcyB0aGF0IG1lbWJlcicsIGNhdGVnb3J5OiAnSW1wZXJzb25hdGlvbicgfSxcbiAgeyBpZDogJ3RlYW1fYWNjZXNzOm9wZW4nLCBsYWJlbDogXCJWaWV3IGEgdGVhbSBtZW1iZXIncyBhY2NvdW50XCIsIGRlc2NyaXB0aW9uOiBcIlZpZXcgYSBtZW1iZXIgb2Ygb25lIG9mIHRoaXMgb3JnYW5pemF0aW9uJ3MgdGVhbXMgYXMgdGhhdCBtZW1iZXIgKHJlYWQtb25seSlcIiwgY2F0ZWdvcnk6ICdJbXBlcnNvbmF0aW9uJyB9LFxuICB7IGlkOiAnb3JnX3NldHRpbmdzOndyaXRlJywgbGFiZWw6ICdPcmdhbml6YXRpb24gc2V0dGluZ3MnLCBkZXNjcmlwdGlvbjogJ01hbmFnZSBnZW5lcmFsIG9yZyBzZXR0aW5ncyBhbmQgQUkgY29uZmlnJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG4gIHsgaWQ6ICdvcmdfaWRwOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgU1NPL0lkUCcsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIHNpbmdsZSBzaWduLW9uIGFuZCBpZGVudGl0eSBwcm92aWRlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZ19rbXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBlbmNyeXB0aW9uIGtleXMnLCBkZXNjcmlwdGlvbjogJ0NvbmZpZ3VyZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBlbmNyeXB0aW9uIGtleXMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZ19pbXBlcnNvbmF0aW9uOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgaW1wZXJzb25hdGlvbiBwb2xpY3knLCBkZXNjcmlwdGlvbjogJ0NvbnRyb2wgd2hldGhlciBwbGF0Zm9ybSBvcGVyYXRvcnMgbWF5IHZpZXcgdGhlIG9yZ2FuaXphdGlvbiBhcyBvbmUgb2YgaXRzIG1lbWJlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbl07XG5cbmNvbnN0IFBFUk1JU1NJT05fTEFCRUxTID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oUEVSTUlTU0lPTl9DQVRBTE9HLm1hcCgocCkgPT4gW3AuaWQsIHAubGFiZWxdKSk7XG5cbi8qKiBIdW1hbiBsYWJlbCBmb3IgYSBwZXJtaXNzaW9uIGlkIChmYWxscyBiYWNrIHRvIHRoZSByYXcgaWQgZm9yIGFuIHVua25vd24gb25lKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJtaXNzaW9uTGFiZWwoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBQRVJNSVNTSU9OX0xBQkVMUy5nZXQoaWQpID8/IGlkO1xufVxuXG4vKiogT25lIHBpY2tlciBzZWN0aW9uOiBhIGNhdGVnb3J5IGFuZCB0aGUgcGVybWlzc2lvbnMgaXQgY29udGFpbnMsIGluIGNhdGFsb2cgb3JkZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25DYXRlZ29yeSB7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uTWV0YVtdO1xufVxuXG4vKiogR3JvdXAgYSBwZXJtaXNzaW9uIGxpc3QgaW50byBjYXRlZ29yaWVzLCBwcmVzZXJ2aW5nIGNhdGFsb2cgb3JkZXIuICovXG5mdW5jdGlvbiBncm91cEJ5Q2F0ZWdvcnkocGVybXM6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10pOiBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSB7XG4gIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBieUNhdGVnb3J5ID0gbmV3IE1hcDxzdHJpbmcsIFBlcm1pc3Npb25NZXRhW10+KCk7XG4gIGZvciAoY29uc3QgcCBvZiBwZXJtcykge1xuICAgIGlmICghYnlDYXRlZ29yeS5oYXMocC5jYXRlZ29yeSkpIHsgYnlDYXRlZ29yeS5zZXQocC5jYXRlZ29yeSwgW10pOyBvcmRlci5wdXNoKHAuY2F0ZWdvcnkpOyB9XG4gICAgYnlDYXRlZ29yeS5nZXQocC5jYXRlZ29yeSkhLnB1c2gocCk7XG4gIH1cbiAgcmV0dXJuIG9yZGVyLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGNhdGVnb3J5LCBwZXJtaXNzaW9uczogYnlDYXRlZ29yeS5nZXQoY2F0ZWdvcnkpISB9KSk7XG59XG5cbi8qKiBDaGVjayB3aGV0aGVyIGEgc3RyaW5nIGlzIGEgdmFsaWQgUGVybWlzc2lvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUGVybWlzc2lvbih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUGVybWlzc2lvbiB7XG4gIHJldHVybiAoQUxMX1BFUk1JU1NJT05TIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgdGhhdCBtdXN0IE5FVkVSIGJlIGdyYW50YWJsZSB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBDVVNUT00gUm9sZSDigJRcbiAqIHRoZXkgZ2F0ZSBwbGF0Zm9ybS1vcGVyYXRvciBzdXJmYWNlcyAodGhlIHNoYXJlZCBpbWFnZSByZWdpc3RyeSksIHNvIGFsbG93aW5nXG4gKiBhbiBvcmcgYWRtaW4gdG8gbWludCBhIFJvbGUgY2FycnlpbmcgdGhlbSB3b3VsZCBiZSBhIGxhdGVudCBwcml2aWxlZ2VcbiAqIGVzY2FsYXRpb24uIFRoZXkgYXJlIE5PVCBzZWVkZWQgaW50byBBTlkgYnVpbHQtaW4gUm9sZSBidW5kbGUgKG5laXRoZXJcbiAqIGBtZW1iZXJgIG5vciBgYWRtaW5gKSwgc28gdGhlIG9ubHkgaG9sZGVyIGlzIGEgc3VwZXJhZG1pbiAoaW1wbGljaXQtYWxsKSDigJRcbiAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGltYWdlLXJlZ2lzdHJ5IGdhdGVzIHRoYXQgcmVxdWlyZSB0aGVtIGVmZmVjdGl2ZWx5XG4gKiBzdXBlcmFkbWluLW9ubHkuIFRoaXMgbGlzdCBBTFNPIGJsb2NrcyBjdXN0b20tUm9sZSBhdXRob3JpbmcgZnJvbSByZXF1ZXN0aW5nXG4gKiB0aGVtIChzZWUgcGxhdGZvcm0gYHNhbml0aXplUGVybWlzc2lvbnNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAvLyBgcmVnaXN0cnk6cmVhZGAgYW5kIGByZWdpc3RyeTp3cml0ZWAgd2VyZSBib3RoIGhlcmUuIFdoYXQgc3RheXMgaXMgdGhlXG4gIC8vIGRlc3RydWN0aXZlIHJ1bmcgYWxvbmU6IGRlbGV0aW5nIGEgbWFuaWZlc3Qgb3IgYSB3aG9sZSByZXBvc2l0b3J5LCBhbmQgdGhlXG4gIC8vIEdDIHBydW5lLCBlYWNoIG9mIHdoaWNoIGNhbiByZW1vdmUgYW4gaW1hZ2UgYSB0ZW5hbnQncyBwaXBlbGluZSBzdGlsbFxuICAvLyByZXNvbHZlcyDigJQgaW5jbHVkaW5nIHRoZSBkaWdlc3QtcGlubmVkIHBsdWdpbiBpbWFnZXMgdGhlIHN1cHBseSBjaGFpblxuICAvLyB2ZXJpZmllcyBhZ2FpbnN0LiBUaGF0IGlzIHRoZSBvbmUgcmVnaXN0cnkgYWN0aW9uIHdpdGggbm8gdW5kbywgc28gaXQga2VlcHNcbiAgLy8gdGhlIG5hcnJvd2VzdCBwb3NzaWJsZSBhdWRpZW5jZTogdGhlIGZsYWcsIGFuZCBuZXZlciBhIFJvbGUuXG4gICdyZWdpc3RyeTpwdXJnZScsXG5dO1xuXG4vKipcbiAqIFBlcm1pc3Npb25zIHRoYXQgZ292ZXJuIHRoZSBQTFVHSU4gRUNPU1lTVEVNIGFuZCBtYXkgYmUgaGVsZCBvbmx5IGluc2lkZSB0aGVcbiAqIHN5c3RlbSBvcmcgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBMaWtlXG4gKiB7QGxpbmsgU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TfSB0aGV5IGFyZSBpbiBubyBtZW1iZXIvYWRtaW4vb3duZXIgYnVuZGxlLFxuICogYW5kIG5vIFJvbGUgYXV0aG9yZWQgaW4gYSBURU5BTlQgbWF5IGNhcnJ5IG9uZTogcGxhdGZvcm0nc1xuICogYHNhbml0aXplUGVybWlzc2lvbnNgIGFkbWl0cyB0aGVtIG9ubHkgd2hlbiB0aGUgYXV0aG9yIGlzIGEgc3VwZXJhZG1pbiBBTkRcbiAqIHRoZSBSb2xlIGlzIGJlaW5nIHdyaXR0ZW4gaW4gdGhlIHN5c3RlbSBvcmcgaXRzZWxmIChgbWF5Q29tcG9zZVN5c3RlbU9yZ1JvbGVgKS5cbiAqXG4gKiBTbyB0aGVyZSBhcmUgdGhyZWUgZ3JhbnQgcGF0aHMsIG5vdCBvbmU6IGEgc3VwZXJhZG1pbiAoaW1wbGljaXQtYWxsKSwgb25lIG9mXG4gKiB0aGUgc2VlZGVkIHN5c3RlbS1vcmcgUm9sZXMsIGFuZCBhIENVU1RPTSBzeXN0ZW0tb3JnIFJvbGUgYSBzdXBlcmFkbWluXG4gKiBjb21wb3NlZC4gVGhlIHRoaXJkIGlzIHdoYXQgbWFrZXMgdGhlIHNwbGl0IGJldHdlZW4gYHBsdWdpbnM6bW9kZXJhdGVgIGFuZFxuICogYHB1Ymxpc2hlcnM6dmVyaWZ5YCB1c2FibGUgd2l0aG91dCB3YWl0aW5nIGZvciBhIG5ldyBzZWVkIGJ1bmRsZSDigJQgd29ydGhcbiAqIGtub3dpbmcgYmVmb3JlIHJlYWRpbmcgZWl0aGVyIHBlcm1pc3Npb24gYXMgXCJ1bnJlYWNoYWJsZSBleGNlcHQgdmlhXG4gKiB7QGxpbmsgRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlN9XCIuXG4gKlxuICogYG9uY2FsbDptYW5hZ2VgIGlzIGNhcnJpZWQgYnkgKipQbGF0Zm9ybSBPcGVyYXRvcioqIGFuZCBieSBubyBvdGhlciBuYW1lZFxuICogcm9sZS4gVGhhdCBzcGxpdCBpcyBkZWxpYmVyYXRlIHJhdGhlciB0aGFuIGFuIG92ZXJzaWdodDogcGFnaW5nIGlzIHRoZVxuICogdmVuZG9yJ3Mgb3duIG9wZXJhdGlvbmFsIGNvbmNlcm4gYW5kIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggZWNvc3lzdGVtXG4gKiBtb2RlcmF0aW9uLCBzbyB3aWRlbmluZyB0aGUgRWNvc3lzdGVtIE1hbmFnZXIgcm9sZSB0byBjYXJyeSBpdCB3b3VsZCBoYW5kIHRoZVxuICogcGFnZXIgdG8gcGVvcGxlIGhpcmVkIHRvIHJldmlldyBwbHVnaW5zLiBJdCBpcyBub3QgYSBwbGFjZWhvbGRlciDigJQgaXQgZ2F0ZXNcbiAqIHR3byBsaXZlIHJvdXRlcyAodGhlIHBhZ2luZyBwb3N0dXJlIHJlYWQgYW5kIHRoZSB0ZXN0IHBhZ2UpLCB1bmxpa2VcbiAqIGByZWdpc3RyeToqYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGx1Z2luczptb2RlcmF0ZScsXG4gICdwdWJsaXNoZXJzOnZlcmlmeScsXG4gIC8vIFRoZSBjcm9zcy10ZW5hbnQgb3BlcmF0b3Igc3VyZmFjZXMsIHN5c3RlbS1vcmctb25seSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZVxuICAvLyBjb25zb2xlcyBhcmU6IHRoZXkgcmVhZCBhbmQgbW92ZSB0aGluZ3MgYmVsb25naW5nIHRvIG9yZ2FuaXNhdGlvbnMgdGhlXG4gIC8vIGhvbGRlciBpcyBub3QgYSBtZW1iZXIgb2YsIHNvIHRoZXkgbXVzdCBuZXZlciBiZSBncmFudGFibGUgaW5zaWRlIGEgdGVuYW50LlxuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAvLyBSZWFkaW5nIHRoZSBpbWFnZSByZWdpc3RyeTogcmVwb3NpdG9yeSBuYW1lcywgdGFncywgbWFuaWZlc3RzLCBibG9icyBhbmQgdGhlXG4gIC8vIHN0b3JhZ2Ugcm9sbHVwLiBQcm9tb3RlZCBvdXQgb2YgU1VQRVJBRE1JTl9PTkxZIGJlY2F1c2UgdGhlIHJlZ2lzdHJ5IGJyb3dzZXJcbiAgLy8gd2FzIGludmlzaWJsZSB0byBldmVyeSBSb2xlLCBzbyBhIFBsYXRmb3JtIE9wZXJhdG9yIGRlYnVnZ2luZyBhIGZhaWxlZFxuICAvLyBwbHVnaW4gYnVpbGQgY291bGQgc2VlIHRoZSBidWlsZCBxdWV1ZSBhbmQgaXRzIGRlYWQgbGV0dGVycyBidXQgbm90IHRoZVxuICAvLyBpbWFnZXMgdGhlIGJ1aWxkIHByb2R1Y2VkIOKAlCBhbmQgdGhlIG9ubHkgd2F5IHRvIGxvb2sgd2FzIHRoZSBzdXBlcmFkbWluXG4gIC8vIGZsYWcuIEl0IHN0YXlzIHN5c3RlbS1vcmctb25seSAobm8gdGVuYW50IFJvbGUgbWF5IGNhcnJ5IGl0KSBhbmQgaXMgcGFpcmVkXG4gIC8vIHdpdGggYSBwZXItcmVwbyBvcmctb3duZXJzaGlwIGZpbHRlciB0aGF0IHJ1bnMgQUZURVIgaXQsIHNvIHdpZGVuaW5nIHRoZVxuICAvLyBwZXJtaXNzaW9uIGRvZXMgbm90IHdpZGVuIHdoaWNoIHJlcG9zaXRvcmllcyBhIGhvbGRlciBjYW4gcmVhY2g6IGFcbiAgLy8gc3lzdGVtLW9yZyBtZW1iZXIgd2hvIGlzIG5vdCBhIHN1cGVyYWRtaW4gc2VlcyBgc3lzdGVtLypgLCBgbGlicmFyeS8qYCBhbmRcbiAgLy8gYHB1YmxpYy8qYCDigJQgdGhpcyBkZXBsb3ltZW50J3Mgb3duIGJhc2UgYW5kIHBsdWdpbiBpbWFnZXMg4oCUIGFuZCBubyB0ZW5hbnQnc1xuICAvLyBgb3JnLSpgIHJlcG9zaXRvcmllcyBhdCBhbGwgKGBjYW5SZWFkUmVwb2AgaW4gdGhlIGltYWdlLXJlZ2lzdHJ5IHNlcnZpY2UpLlxuICAncmVnaXN0cnk6cmVhZCcsXG4gIC8vIENvcHlpbmcvcHJvbW90aW5nIGFuIGltYWdlLiBTeXN0ZW0tb3JnLW9ubHkgcmF0aGVyIHRoYW4gc3VwZXJhZG1pbi1vbmx5XG4gIC8vIGJlY2F1c2UgaXQgaXMgQURESVRJVkU6IGl0IHdyaXRlcyBhIG5ldyB0YWcgYW5kIG1ha2VzIG5vdGhpbmcgc3RvcFxuICAvLyByZXNvbHZpbmcsIGFuZCBgY2FuV3JpdGVSZXBvYCBjb25maW5lcyBhIG5vbi1zdXBlcmFkbWluIHN5c3RlbS1vcmcgY2FsbGVyXG4gIC8vIHRvIGBzeXN0ZW0vKmAgcmVnYXJkbGVzcy4gRGVsaWJlcmF0ZWx5IGNhcnJpZWQgYnkgTk8gYnVpbHQtaW4gYnVuZGxlIHRvZGF5XG4gIC8vIOKAlCBwcm9tb3RpbmcgYW4gaW1hZ2UgaXMgYSBqb2IsIG5vdCBhIHNpZGUgZWZmZWN0IG9mIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQsXG4gIC8vIHNvIGl0IHdhaXRzIGZvciBhIFJvbGUgb2YgaXRzIG93biByYXRoZXIgdGhhbiByaWRpbmcgYWxvbmcgd2l0aFxuICAvLyBgcGxhdGZvcm06cmVhZGAuXG4gICdyZWdpc3RyeTp3cml0ZScsXG4gICdiaWxsaW5nOm9wZXJhdGUnLFxuICAnb2JzZXJ2YWJpbGl0eV9jb25zb2xlOm9wZW4nLFxuICAnZGF0YWJhc2VfY29uc29sZTpvcGVuJyxcbiAgJ29iamVjdHN0b3JlX2NvbnNvbGU6b3BlbicsXG4gIC8vIE9wZW5pbmcgYSBjcm9zcy10ZW5hbnQgaW1wZXJzb25hdGlvbiBzZXNzaW9uLiBTeXN0ZW0tb3JnLW9ubHkgZm9yIHRoZVxuICAvLyBvYnZpb3VzIHJlYXNvbiDigJQgaXQgdmlld3MgYW4gb3JnYW5pc2F0aW9uIHRoZSBob2xkZXIgaXMgbm90IGEgbWVtYmVyIG9mIOKAlFxuICAvLyBhbmQgaXQgaXMgdGhlIE9ORSBwZXJtaXNzaW9uIGluIHRoaXMgbGlzdCB0aGF0IGFsc28gaGFzIHRvIGNsZWFyIGEgZ2F0ZSB0aGVcbiAgLy8gcGVybWlzc2lvbiBzeXN0ZW0gZG9lcyBub3Qgb3duOiB0aGUgdGFyZ2V0IG9yZ2FuaXNhdGlvbidzIGNvbnNlbnQgKGl0c1xuICAvLyBgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgIHBvbGljeSksIHBsdXMgYWFsMiBhbmQgYSBzdHJvbmcgc3RlcC11cC4gVGhlXG4gIC8vIHBlcm1pc3Npb24gc2F5cyB3aG8gbWF5IEFTSzsgdGhlIHRlbmFudCBzdGlsbCBhbnN3ZXJzLlxuICAvL1xuICAvLyBJdCBkb2VzIE5PVCBjb3ZlciBlbWVyZ2VuY3kgYWNjZXNzLiBgUE9TVCAvOnVzZXJJZC9icmVha2dsYXNzYCBieXBhc3Nlc1xuICAvLyB0ZW5hbnQgY29uc2VudCBhbmQgc28gc3RheXMgb24gdGhlIHN1cGVyYWRtaW4gZmxhZyBhbG9uZSwgYXBwcm92ZWQgYnkgYVxuICAvLyBTRUNPTkQgc3VwZXJhZG1pbiAoZm91ci1leWVzKS4gQSBwZXJtaXNzaW9uIHRoYXQgY291bGQgYmUgZGVsZWdhdGVkIG11c3Qgbm90XG4gIC8vIGJlIGFibGUgdG8gd2FsayBwYXN0IGNvbnNlbnQuXG4gICdpbXBlcnNvbmF0aW9uOm9wZW4nLFxuICAvLyBQYWdpbmcgaXMgdGhlIHZlbmRvcidzIG93biBvcGVyYXRpb25hbCBjb25jZXJuIGFuZCBncmFudHMgTk8gdGVuYW50IGFjY2Vzc1xuICAvLyDigJQgYGlzU3lzdGVtT3JnSWRgIGlzIGEgY29udGVudC1vd25lciBjaGVjaywgbm90IGEgcHJpdmlsZWdlIGdhdGUg4oCUIHNvIGFcbiAgLy8gdGVuYW50IHJvbGUgbXVzdCBuZXZlciBiZSBhYmxlIHRvIGNhcnJ5IGl0LCBhbmQgYSB0ZW5hbnQgbXVzdCBuZXZlciBiZSBhYmxlXG4gIC8vIHRvIG1ha2UgdGhpcyBkZXBsb3ltZW50IHNlbmQgYSBwYWdlLlxuICAnb25jYWxsOm1hbmFnZScsXG4gIC8vIFRoZSB2ZW5kb3IncyBvd24gb3BlcmF0aW9uYWwgdGFza3MuIEVhY2ggb25lIHJlcGxhY2VkIGEgYHJlcXVpcmVTeXN0ZW1BZG1pbmBcbiAgLy8gZ2F0ZSwgc28gdGhlIHBvaW50IG9mIGxpc3RpbmcgdGhlbSBoZXJlIGlzIHRoZSBzYW1lIGFzIHRoZSBwb2ludCBvZiBhZGRpbmdcbiAgLy8gdGhlbSBhdCBhbGw6IGEgUm9sZSBjb21wb3NlZCBpbiB0aGUgc3lzdGVtIG9yZyBjYW4gY2FycnkgZXhhY3RseSBvbmUgam9iLFxuICAvLyBhbmQgbm8gUm9sZSBpbiBhbnkgdGVuYW50IGNhbiBjYXJyeSBpdCBhdCBhbGwuXG4gICdzdXBwb3J0X2Nhc2VzOndyaXRlJyxcbiAgJ3N1cHBvcnRfY29udGVudDp3cml0ZScsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczptYW5hZ2UnLFxuICAnb3JnczptYW5hZ2UnLFxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbl07XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgaGVsZCBvbmx5IGluc2lkZSB0aGUgc3lzdGVtIG9yZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgYW4gb3JnIG1heSBhc3NpZ24gdmlhIGEgQ1VTVE9NIFJvbGUg4oCUIGV2ZXJ5IHBlcm1pc3Npb24gZXhjZXB0IHRoZVxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHtAbGluayBTWVNURU1fT1JHX09OTFlfUEVSTUlTU0lPTlN9LlxuICogQ3VzdG9tLVJvbGUgY3JlYXRlL3VwZGF0ZSB2YWxpZGF0ZXMgdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHNldCBhZ2FpbnN0IHRoaXNcbiAqIChzZWUgcGxhdGZvcm0gcm9sZXMtc2VydmljZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID1cbiAgQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gaXNPcmdBc3NpZ25hYmxlUGVybWlzc2lvbihwKSk7XG5cbi8qKiBXaGV0aGVyIGBwZXJtaXNzaW9uYCBtYXkgYmUgZ3JhbnRlZCB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBjdXN0b20gUm9sZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHBlcm1pc3Npb246IFBlcm1pc3Npb24pOiBib29sZWFuIHtcbiAgcmV0dXJuICFTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlMuaW5jbHVkZXMocGVybWlzc2lvbikgJiYgIWlzU3lzdGVtT3JnT25seVBlcm1pc3Npb24ocGVybWlzc2lvbik7XG59XG5cbi8qKlxuICogQ2F0ZWdvcnkg4oaSIHBlcm1pc3Npb25zIGZvciB0aGUgY3VzdG9tLVJvbGUgQVVUSE9SSU5HIHBpY2tlcjogdGhlIGNhdGFsb2cgbWludXNcbiAqIHRoZSBub24tYXNzaWduYWJsZSBwZXJtaXNzaW9ucywgd2l0aCBhbnkgbm93LWVtcHR5IGNhdGVnb3J5IGRyb3BwZWRcbiAqIChzbyBcIlJlZ2lzdHJ5XCIgZGlzYXBwZWFycykuIFRoZSBncm91cGVkIHZpZXcgb2ZcbiAqIHtAbGluayBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OU30uXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfQVNTSUdOQUJMRV9DQVRFR09SSUVTOiByZWFkb25seSBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSA9XG4gIGdyb3VwQnlDYXRlZ29yeShQRVJNSVNTSU9OX0NBVEFMT0cuZmlsdGVyKChwKSA9PiBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uKHAuaWQpKSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFscyAocGVyc29uYWwgYWNjZXNzIGtleXMgLyBtYWNoaW5lIHRva2Vucylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXZlcnkgYDpyZWFkYCBwZXJtaXNzaW9uIOKAlCB0aGUgXCJyZWFkLW9ubHlcIiBwcmVzZXQgYSBuZXcgcGVyc29uYWwgYWNjZXNzIGtleVxuICogc3RhcnRzIGZyb20uIERlcml2ZWQgZnJvbSB0aGUgY2F0YWxvZyBzbyBhIG5ldyByZXNvdXJjZSdzIHJlYWQgcGVybWlzc2lvblxuICogam9pbnMgdGhlIHByZXNldCB3aXRob3V0IGEgc2Vjb25kIGVkaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUFEX09OTFlfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9XG4gIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IHAuZW5kc1dpdGgoJzpyZWFkJykpO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHN1YnNldDogZXZlcnkgZW50cnkgbXVzdCBiZSBhIGNhdGFsb2cgaWRcbiAqIChhbnl0aGluZyBlbHNlIOKGkiBgbnVsbGAsIHRoZSBjYWxsZXIncyA0MDApLCBkdXBsaWNhdGVzIGNvbGxhcHNlLCBhbmQgdGhlXG4gKiByZXN1bHQgaXMgaW4gY2Fub25pY2FsIGNhdGFsb2cgb3JkZXIgc28gYSBzdG9yZWQgc3Vic2V0IGNvbXBhcmVzIHN0YWJseS5cbiAqIEFuIEVNUFRZIGFycmF5IGlzIHZhbGlkIOKAlCBhIGtleSB0aGF0IGNhbiBhdXRoZW50aWNhdGUgYnV0IGRvIG5vdGhpbmcg4oCUIGFuZFxuICogaXMgZGlzdGluY3QgZnJvbSBcIm5vIHN1YnNldFwiIChgdW5kZWZpbmVkYCksIHdoaWNoIG1lYW5zIGZ1bGwgYWNjZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGVybWlzc2lvblN1YnNldChyZXF1ZXN0ZWQ6IHJlYWRvbmx5IHVua25vd25bXSk6IFBlcm1pc3Npb25bXSB8IG51bGwge1xuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwIG9mIHJlcXVlc3RlZCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycgfHwgIWlzVmFsaWRQZXJtaXNzaW9uKHApKSByZXR1cm4gbnVsbDtcbiAgICB3YW50ZWQuYWRkKHApO1xuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiB3YW50ZWQuaGFzKHApKTtcbn1cblxuLyoqXG4gKiBUaGUgcGVybWlzc2lvbnMgYSBwZXJtaXNzaW9uLXNjb3BlZCBjcmVkZW50aWFsIGFjdHVhbGx5IGNhcnJpZXM6IHRoZVxuICogSU5URVJTRUNUSU9OIG9mIHRoZSBzdWJzZXQgaXQgd2FzIGNyZWF0ZWQgd2l0aCBhbmQgdGhlIGhvbGRlcidzIENVUlJFTlRcbiAqIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucywgaW4gY2F0YWxvZyBvcmRlci4gUmUtZXZhbHVhdGVkIGF0IGV2ZXJ5IGlzc3VlLCBzb1xuICogbG9zaW5nIGEgUm9sZSBzaHJpbmtzIHRoZSBjcmVkZW50aWFsIGFuZCBub3RoaW5nIGNhbiBldmVyIGdyb3cgaXQgcGFzdCB0aGVcbiAqIHN1YnNldCBpdCB3YXMgY3JlYXRlZCB3aXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0UGVybWlzc2lvbnMoXG4gIGVmZmVjdGl2ZTogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHN1YnNldDogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQZXJtaXNzaW9uW10ge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChzdWJzZXQpO1xuICBjb25zdCBoZWxkID0gbmV3IFNldChlZmZlY3RpdmUpO1xuICByZXR1cm4gQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gYWxsb3dlZC5oYXMocCkgJiYgaGVsZC5oYXMocCkpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnVpbHQtaW4gUm9sZSBzZWVkIGJ1bmRsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGVybWlzc2lvbiBidW5kbGVzIHVzZWQgdG8gU0VFRCB0aGUgYnVpbHQtaW4gUm9sZXMgKFwiQWRtaW5cIiwgXCJNZW1iZXJcIikuXG4gKlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIGRlZmluaXRpb24gb2Ygd2hhdCB0aG9zZSBidWlsdC1pbiBSb2xlcyBncmFudCDigJQgaXQgaXMgdXNlZFxuICogd2hlbiBhIFJvbGUgcmVjb3JkIGlzIGNyZWF0ZWQgKGFuZCBieSB0aGUgc3RhcnR1cCBiYWNrZmlsbCkgdG8gcG9wdWxhdGUgdGhhdFxuICogUm9sZSdzIG93biBgcGVybWlzc2lvbnNbXWAuIEl0IGlzIE5PVCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBzb3VyY2U6IGEgdXNlcidzXG4gKiBlZmZlY3RpdmUgcGVybWlzc2lvbnMgY29tZSBPTkxZIGZyb20gdGhlIFJvbGVzIGFzc2lnbmVkIHRvIHRoZW0gKHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9KS4gVGhlIGNvYXJzZSBgcm9sZWAgbGFiZWwgKG93bmVyL2FkbWluL21lbWJlcilcbiAqIHN1cnZpdmVzIG9ubHkgZm9yIGBpc0FkbWluYC9vd25lcnNoaXAvZGlzcGxheSwgbmV2ZXIgdG8gZ3JhbnQgcGVybWlzc2lvbnMuXG4gKlxuICogLSBgbWVtYmVyYCAg4oCUIGRheS10by1kYXkgYnVpbGRlcjogcmVhZCArIHdyaXRlIG9uIHBpcGVsaW5lcy90ZW1wbGF0ZXMvcGx1Z2lucyxcbiAqICAgcmVhZCBlbHNld2hlcmUuIE5vIG1lbWJlci9yb2xlL2JpbGxpbmcgbWFuYWdlbWVudCwgbm8gY29tcGxpYW5jZS9hbGVydFxuICogICBhdXRob3JpbmcsIGFuZCBubyBgOnB1Ymxpc2hgIG9uIGFueSBjYXRhbG9nLlxuICogLSBgYWRtaW5gICAg4oCUIGZ1bGwgb3JnIGFkbWluaXN0cmF0aW9uOiBldmVyeSBPUkctQVNTSUdOQUJMRSBwZXJtaXNzaW9uIChpLmUuXG4gKiAgIEFMTF9QRVJNSVNTSU9OUyBtaW51cyB0aGUge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIHRoZVxuICogICB7QGxpbmsgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TfSwgc28gYHJlZ2lzdHJ5OipgIHN0YXlcbiAqICAgc3VwZXJhZG1pbi1pbXBsaWNpdC1vbmx5IGFuZCBlY29zeXN0ZW0gbW9kZXJhdGlvbiBzdGF5cyB3aXRoIHRoZSBzeXN0ZW1cbiAqICAgb3JnJ3MgRWNvc3lzdGVtIE1hbmFnZXJzIOKAlCBuZWl0aGVyIGlzIGdyYW50ZWQgdG8gb3JnIGFkbWlucykuXG4gKiAtIGBvd25lcmAgICDigJQgc2FtZSBhcyBhZG1pbiAob3duZXJzaGlwIGl0c2VsZiDigJQgdHJhbnNmZXIvZGVsZXRlIOKAlCBpcyBnYXRlZFxuICogICBzZXBhcmF0ZWx5LCBub3QgdmlhIGEgcGVybWlzc2lvbikuXG4gKi9cbmNvbnN0IE1FTUJFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOndyaXRlJywgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJyxcbiAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczp3cml0ZScsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsXG4gICdwbHVnaW5zOmluc3RhbGwnLFxuICAnY29tcGxpYW5jZTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuICAncmVwb3J0czpyZWFkJyxcbiAgJ21lc3NhZ2VzOnJlYWQnLCAnbWVzc2FnZXM6d3JpdGUnLFxuICAnYmlsbGluZzpyZWFkJyxcbiAgJ3F1b3RhczpyZWFkJyxcbl07XG5cbmNvbnN0IEFETUlOX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbLi4uT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlNdO1xuXG4vKipcbiAqIFNlZWQgYnVuZGxlIGZvciBlYWNoIGJ1aWx0LWluIFJvbGUsIGtleWVkIGJ5IHRoZSBjb2Fyc2Ugcm9sZSBpdCBncmFudHMuXG4gKiBDb25zdW1lZCBieSB0aGUgUm9sZSBzZWVkZXIgKyB0aGUgc3RhcnR1cCBiYWNrZmlsbCB0byBwb3B1bGF0ZSBhIGJ1aWx0LWluXG4gKiBSb2xlJ3MgYHBlcm1pc3Npb25zW11gLiBOT1QgY29uc3VsdGVkIGF0IHJlcXVlc3QgdGltZSDigJQgc2VlXG4gKiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30uXG4gKi9cbmV4cG9ydCBjb25zdCBST0xFX1BFUk1JU1NJT05TOiBSZWNvcmQ8T3JnUm9sZSwgcmVhZG9ubHkgUGVybWlzc2lvbltdPiA9IHtcbiAgbWVtYmVyOiBNRU1CRVJfUEVSTUlTU0lPTlMsXG4gIGFkbWluOiBBRE1JTl9QRVJNSVNTSU9OUyxcbiAgb3duZXI6IEFETUlOX1BFUk1JU1NJT05TLFxufTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiRWNvc3lzdGVtIE1hbmFnZXJcIiBSb2xlIOKAlCBzZWVkZWQgT05MWSBpbiB0aGVcbiAqIHN5c3RlbSBvcmcgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBJdCBjYXJyaWVzIHRoZVxuICoge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30gcGx1cyB0aGUgcmVhZHMgYSBtb2RlcmF0b3IgbmVlZHMgKHRoZVxuICogaW4tYXBwIGNhdGFsb2csIGluLWFwcCBub3RpY2VzLCB0aGUgbW9kZXJhdGlvbi1TTEEgZGFzaGJvYXJkKSBhbmQgbm90aGluZ1xuICogdGVuYW50LWZhY2luZzogbm8gYHJlZ2lzdHJ5OipgLCBubyBgbWVtYmVyczptYW5hZ2VgLiBUaGUgUm9sZSBncmFudHMgdGhlXG4gKiBjb2Fyc2UgYG1lbWJlcmAgbGFiZWwgYW5kIG5ldmVyIHNldHMgYGlzU3VwZXJBZG1pbmAuXG4gKi9cbi8qKlxuICogVGhlIFBMQVRGT1JNIE9QRVJBVE9SIGJ1bmRsZSDigJQgdGhlIHRoaXJkIHJ1bmcgb2YgdGhlIHN5c3RlbSBvcmcncyBsYWRkZXIuXG4gKlxuICogQmVmb3JlIGl0IHRoZSBsYWRkZXIgaGFkIHR3byBydW5ncyBhbmQgYSBnYXA6IEVjb3N5c3RlbSBNYW5hZ2VyIChwbHVnaW5cbiAqIG1vZGVyYXRpb24pIGFuZCBTdXBlciBBZG1pbiAoaW1wbGljaXQtYWxsLCB3aGljaCBhbHNvIGNhcnJpZXMgaW1wZXJzb25hdGlvbixcbiAqIHBnQWRtaW4gYW5kIG1vbmdvLWV4cHJlc3MpLiBBbnl0aGluZyBpbiBiZXR3ZWVuIOKAlCByZWFkIHRoZSBwbGF0Zm9ybSBzZXR0aW5ncyxcbiAqIHJ1biBhIHByb21vdGlvbiBjYW1wYWlnbiwgY2hlY2sgd2hldGhlciB0aGUgcGFnZXIgaXMgY29uZmlndXJlZCDigJQgaGFkIHRvIGJlXG4gKiBkb25lIGJ5IG1ha2luZyBzb21lYm9keSBhIGZ1bGwgc3VwZXJhZG1pbi5cbiAqXG4gKiBJdCBpcyBhIEJVTkRMRSByYXRoZXIgdGhhbiBhIGdyYW50YWJsZSBsaXN0IGJlY2F1c2UgYFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU2BcbiAqIGNhbiBuZXZlciBiZSBjYXJyaWVkIGJ5IGEgY3VzdG9tIFJvbGUgaW4gYW55IG9yZzogd2l0aG91dCBhIHNlZWRlZCBidW5kbGVcbiAqIHRoZXNlIHBlcm1pc3Npb25zIGhhZCBubyBncmFudCBwYXRoIGF0IGFsbCBhbmQgd2VyZSBzdXBlcmFkbWluLW9ubHkgaW5cbiAqIHByYWN0aWNlLCB3aGljaCBpcyBleGFjdGx5IHRoZSB0aGluZyB0aGV5IHdlcmUgYWRkZWQgdG8gYXZvaWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBjYXJyeWluZyBgcGx1Z2luczptb2RlcmF0ZWAgLyBgcHVibGlzaGVyczp2ZXJpZnlgOiBlY29zeXN0ZW1cbiAqIG1vZGVyYXRpb24gaXMgYSBkaWZmZXJlbnQgam9iIHdpdGggaXRzIG93biBSb2xlLCBhbmQgYSByZXZpZXdlciBvZiBwbHVnaW5zXG4gKiBzaG91bGQgbm90IGFjcXVpcmUgdGhlIGFiaWxpdHkgdG8gbW92ZSBhbm90aGVyIHRlbmFudCdzIG1vbmV5IGJ5IGJlaW5nIGhhbmRlZFxuICogdGhlIG9wZXJhdG9yIFJvbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAvLyBCT1RIIGhhbHZlcyBvZiB0aGUgb2xkIGBwbGF0Zm9ybTpyZWFkYDogdGhpcyBpcyB0aGUgb25lIGpvYiB0aGF0IGdlbnVpbmVseVxuICAvLyB3YW50cyB0aGUgZGVwbG95J3Mgb3duIGNvbmZpZ3VyYXRpb24gQU5EIHRoZSBjdXN0b21lciByb3N0ZXIuXG4gICdwbGF0Zm9ybTpyZWFkJyxcbiAgJ29yZ3M6cmVhZCcsXG4gICdvbmNhbGw6bWFuYWdlJyxcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgLy8gUlVOTklORyB0aGUgZGVwbG95bWVudDogcmFpc2UgYSBxdW90YSBkdXJpbmcgYW4gaW5jaWRlbnQsIHdhdGNoIHRoZSBidWlsZFxuICAvLyBxdWV1ZSBhbmQgcHVyZ2UgaXRzIGRlYWQtbGV0dGVyIHF1ZXVlLlxuICAncXVvdGFzOm1hbmFnZScsXG4gICdwbHVnaW5fcXVldWU6bWFuYWdlJyxcbiAgLy8gUmVhZHMgdGhhdCBtYWtlIHRoZSBvcGVyYXRvciB2aWV3cyB1c2FibGU6IHRoZSBkYXNoYm9hcmRzIHRoZSBwb3N0dXJlIHBhbmVsc1xuICAvLyBsaXZlIG9uLCB0aGUgY3Jvc3MtdGVuYW50IGxvZyB2aWV3LCBhbmQgdGhlIGN1c3RvbWVyJ3MgcGxhbiB3aGVuIGEgbGltaXQgaXNcbiAgLy8gdGhlIHRoaW5nIGJlaW5nIGRlYnVnZ2VkLlxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbiAgJ2Rhc2hib2FyZHM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOnJlYWQnLFxuICAvLyBUaGUgcmVnaXN0cnkgYnJvd3NlcjogcmVwb3NpdG9yeSBuYW1lcywgdGFncyBhbmQgbWFuaWZlc3RzIGZvciB0aGUgaW1hZ2VzXG4gIC8vIHRoaXMgZGVwbG95bWVudCdzIGJ1aWxkcyBwcm9kdWNlLiBJdCB3YXMgd2l0aGhlbGQgd2hpbGUgYHJlZ2lzdHJ5OnJlYWRgIHdhc1xuICAvLyBzdXBlcmFkbWluLW9ubHkg4oCUIGEgc2VlZGVkIGJ1bmRsZSBjYXJyeWluZyBhIHN1cGVyYWRtaW4tb25seSBwZXJtaXNzaW9uXG4gIC8vIHdvdWxkIG1ha2UgdGhhdCBsaXN0IGEgbGllLCBzaW5jZSBidW5kbGVzIGJ5cGFzcyBgc2FuaXRpemVQZXJtaXNzaW9uc2AuIFRoZVxuICAvLyBwZXJtaXNzaW9uIHdhcyBwcm9tb3RlZCB0byBzeXN0ZW0tb3JnLW9ubHkgZGVsaWJlcmF0ZWx5IHJhdGhlciB0aGFuIHNtdWdnbGVkXG4gIC8vIGluIGhlcmUsIHdoaWNoIGlzIHRoZSBvcmRlciB0aG9zZSB0d28gY2hhbmdlcyBoYXZlIHRvIGhhcHBlbiBpbi5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuXTtcblxuLyoqXG4gKiBBQ0NPVU5UIE1BTkFHRVIg4oCUIHRoZSBjb21tZXJjaWFsIHJlbGF0aW9uc2hpcCB3aXRoIGEgY3VzdG9tZXIsIGFzIG9wcG9zZWQgdG9cbiAqIHJ1bm5pbmcgdGhlIGRlcGxveW1lbnQuXG4gKlxuICogU3BsaXQgZnJvbSB7QGxpbmsgUExBVEZPUk1fT1BFUkFUT1JfUEVSTUlTU0lPTlN9IHJhdGhlciB0aGFuIHBpbGVkIG9udG8gaXQsXG4gKiBiZWNhdXNlIHRoZSB0d28gam9icyBkaXZlcmdlIGF0IGV4YWN0bHkgdGhlIHBlcm1pc3Npb25zIGFkZGVkIGFsb25nc2lkZSB0aGlzXG4gKiBidW5kbGUuIGBiaWxsaW5nOm9wZXJhdGVgIE1PVkVEIGhlcmUgZnJvbSB0aGUgb3BlcmF0b3IgYnVuZGxlIGZvciB0aGF0IHJlYXNvbjpcbiAqIG1pbnRpbmcgYSBkaXNjb3VudCB0b2tlbiBpcyBhIGNvbW1lcmNpYWwgYWN0LCBub3QgYW4gb3BlcmF0aW9uYWwgb25lLCBhbmQgdGhlXG4gKiBwZXJzb24gd2hvIHJlc3RhcnRzIGEgc3R1Y2sgYnVpbGQgcXVldWUgaGFzIG5vIHJlYXNvbiB0byBob2xkIGl0LlxuICpcbiAqIFRoZSBkZXN0cnVjdGl2ZSBoYWxmIG9mIHRoZSBjYXRhbG9ndWUgbGl2ZXMgaGVyZSDigJQgYG9yZ3M6bWFuYWdlYCBjYW4gREVMRVRFXG4gKiBhbiBvcmdhbmlzYXRpb24gYW5kIGBzdWJzY3JpcHRpb25zOm1hbmFnZWAgY2FuIGNhbmNlbCBpdHMgc3Vic2NyaXB0aW9uIOKAlCBzb1xuICogdGhpcyBpcyBkZWxpYmVyYXRlbHkgdGhlIHNtYWxsZXIsIG1vcmUgcmFyZWx5LWFzc2lnbmVkIG9mIHRoZSB0d28uXG4gKi9cbmV4cG9ydCBjb25zdCBBQ0NPVU5UX01BTkFHRVJfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gICdzdWJzY3JpcHRpb25zOm1hbmFnZScsXG4gICdvcmdzOm1hbmFnZScsXG4gICdiaWxsaW5nOm9wZXJhdGUnLFxuICAvLyBBIHF1b3RhIGJ1bXAgaXMgYXMgb2Z0ZW4gYSBjb21tZXJjaWFsIGNvbmNlc3Npb24gYXMgYW4gb3BlcmF0aW9uYWwgb25lLCBzb1xuICAvLyBib3RoIGJ1bmRsZXMgY2FycnkgaXQuXG4gICdxdW90YXM6bWFuYWdlJyxcbiAgLy8gVGhlIGFsbC1vcmdhbml6YXRpb25zIGxpc3QsIHdoaWNoIGlzIHRoZSBzdXJmYWNlIHRoaXMgam9iIHdvcmtzIGZyb20g4oCUIGFuZFxuICAvLyBvbmx5IHRoYXQuIEl0IHVzZWQgdG8gdGFrZSBgcGxhdGZvcm06cmVhZGAsIHdoaWNoIGFsc28gaGFuZGVkIG92ZXIgdGhlXG4gIC8vIGRlcGxveSdzIFJMUyBtb2RlLCBLTVMgcG9zdHVyZSBhbmQgcmVuZGVyZWQgYWxlcnQgcnVsZXM6IGludGVybmFscyBhXG4gIC8vIGNvbW1lcmNpYWwgcm9sZSBoYXMgbm8gdXNlIGZvci5cbiAgJ29yZ3M6cmVhZCcsXG5dO1xuXG4vKipcbiAqIENPTlNPTEUgQURNSU5JU1RSQVRPUiDigJQgdGhlIG9wZXJhdG9yIGNvbnNvbGVzLCBhcyBhIFJvbGUuXG4gKlxuICogV0hZIFRISVMgRVhJU1RTIGV2ZW4gdGhvdWdoIGVhY2ggY29uc29sZSBwZXJtaXNzaW9uIGlzIGdyYW50YWJsZSBieSBoYW5kOiB3aXRoXG4gKiBubyBzZWVkZWQgUm9sZSwgdGhlIG9ubHkgcGF0aCB0byBwZ0FkbWluIHdhcyBhIHN1cGVyYWRtaW4gY29tcG9zaW5nIGEgY3VzdG9tXG4gKiBSb2xlIGZvciBpdCwgYW5kIHRoZSBvYnNlcnZlZCBvdXRjb21lIG9mIGFza2luZyBwZW9wbGUgdG8gZG8gdGhhdCBpcyB0aGF0IHRoZXlcbiAqIHJlYWNoIGZvciB0aGUgc3VwZXJhZG1pbiBGTEFHIGluc3RlYWQg4oCUIHRoZSBleGFjdCBmYWlsdXJlIHRoZXNlIHBlcm1pc3Npb25zXG4gKiB3ZXJlIGFkZGVkIHRvIHJlbW92ZS4gQSBuYW1lZCBSb2xlIGFsc28gbWFrZXMgXCJ3aG8gY2FuIG9wZW4gYSBkYXRhIHNoZWxsP1wiIG9uZVxuICogcXVlcnkgaW5zdGVhZCBvZiBhbiBhdWRpdCBvZiBldmVyeSBjdXN0b20gUm9sZS5cbiAqXG4gKiBJdCBjYXJyaWVzIGFsbCB0aHJlZSBjb25zb2xlcywgd2hpY2ggaXMgdGhlIHdob2xlIGpvYiBmb3IgdGhlIHBlcnNvbiB3aG8gaG9sZHNcbiAqIGl0LiBPTkUgQ09OU0VRVUVOQ0UgV09SVEggS05PV0lORzogYGRhdGFiYXNlX2NvbnNvbGU6b3BlbmAgYW5kXG4gKiBgb2JqZWN0c3RvcmVfY29uc29sZTpvcGVuYCBhcmUgdGhlIHR3byBoYWx2ZXMgb2YgdGhlIGF1ZGl0IHRhbXBlci1ldmlkZW5jZVxuICogZGVzaWduIOKAlCBhIE1vbmdvIHNoZWxsIGNhbiB0cnVuY2F0ZSBhIGhhc2ggY2hhaW4ncyB0YWlsLCBhbmQgdGhlIG9iamVjdCBzdG9yZVxuICogaG9sZHMgdGhlIHNpZ25lZCBoZWFkcyB0aGF0IHdvdWxkIGV4cG9zZSB0aGUgdHJ1bmNhdGlvbiDigJQgc28gYSBob2xkZXIgb2YgdGhpc1xuICogUm9sZSBjYW4gZG8gYm90aC4gVGhlIHBlcm1pc3Npb25zIHN0YXkgU0VQQVJBVEUgZm9yIGV4YWN0bHkgdGhhdCByZWFzb246IGFcbiAqIGRlcGxveW1lbnQgdGhhdCB3YW50cyB0aGVtIGhlbGQgYnkgZGlmZmVyZW50IHBlb3BsZSBjb21wb3NlcyBhIG5hcnJvd2VyIFJvbGVcbiAqIGJ5IGhhbmQgKGEgc3VwZXJhZG1pbiBtYXkgaW5jbHVkZSBhbnkgc3lzdGVtLW9yZy1vbmx5IHBlcm1pc3Npb24gaW4gYSBSb2xlXG4gKiBhdXRob3JlZCBpbiB0aGUgc3lzdGVtIG9yZykgYW5kIGFzc2lnbnMgdGhpcyBvbmUgdG8gbm9ib2R5LlxuICovXG4vKipcbiAqIFBMQVRGT1JNIE9CU0VSVkVSIOKAlCBsb29rLCBkb24ndCB0b3VjaC4gVGhlIGxhZGRlcidzIG1pc3NpbmcgYm90dG9tIHJ1bmcuXG4gKlxuICogRXZlcnkgb3RoZXIgc3lzdGVtLW9yZyBidW5kbGUgZ3JhbnRzIGEgd3JpdGUuIFRoZSBvbmUgdGhhdCBkb2VzIG5vdCDigJRcbiAqIENvbnNvbGUgQWRtaW5pc3RyYXRvciDigJQgZ3JhbnRzIGEgcmVhZCB0aGF0IElTIGEgZGF0YWJhc2Ugc2hlbGwuIFNvIHNvbWVib2R5XG4gKiB3aG8gc2hvdWxkIHNlZSB0aGUgZGVwbG95bWVudCBhbmQgY2hhbmdlIG5vdGhpbmcgKGEgbmV3IG9wZXJhdG9yIHNoYWRvd2luZywgYW5cbiAqIGF1ZGl0b3IsIGFuIG9uLWNhbGwgZW5naW5lZXIgZHVyaW5nIGEgaGFuZG92ZXIpIGhhZCB0d28gb3B0aW9uczogU3VwZXIgQWRtaW4sXG4gKiBvciBub3RoaW5nLiBUaGUgdXN1YWwgb3V0Y29tZSBvZiBhIGNob2ljZSBsaWtlIHRoYXQgaXMgdGhlIGZsYWcuXG4gKlxuICogU3RyaWN0bHkgcmVhZC1vbmx5IGJ5IGNvbnN0cnVjdGlvbjogZXZlcnkgcGVybWlzc2lvbiBoZXJlIGVuZHMgYDpyZWFkYCwgd2hpY2hcbiAqIGBpc011dGF0aW9uUGVybWlzc2lvbmAgY2xhc3NpZmllcyBhcyBhIHJlYWQsIHNvIHRoZSBkYXNoYm9hcmQgZGlzYWJsZXMgZXZlcnlcbiAqIHdyaXRlIGFmZm9yZGFuY2UgZm9yIGEgaG9sZGVyIHJhdGhlciB0aGFuIG9mZmVyaW5nIGNvbnRyb2xzIHRoYXQgNDAzLlxuICpcbiAqIE5PVCBgYXVkaXQ6cmVhZGAuIEl0IHdvdWxkIGJlIHRoZSBvYnZpb3VzIGFkZGl0aW9uIGFuZCBpdCBpcyB0aGUgd3Jvbmcgb25lOlxuICogYGxpc3RBdWRpdEV2ZW50c2AgcGlucyBldmVyeSBub24tc3VwZXJhZG1pbiB0byB0aGVpciBPV04gb3JnLCBzbyBhIHN5c3RlbS1vcmdcbiAqIG9ic2VydmVyIGhvbGRpbmcgaXQgd291bGQgc2VlIHRoZSBzeXN0ZW0gb3JnJ3MgYXVkaXQgdHJhaWwgYW5kIG5vdGhpbmcgZWxzZSDigJRcbiAqIGFuIGFmZm9yZGFuY2UgdGhhdCBsb29rcyBsaWtlIGZsZWV0LXdpZGUgYXVkaXQgYWNjZXNzIGFuZCBpcyBub3QuIFJlYWRpbmdcbiAqIGFub3RoZXIgdGVuYW50J3MgdHJhaWwgaXMgZGVsaWJlcmF0ZWx5IHRoZSBmbGFnJ3MgYWxvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9PQlNFUlZFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGxhdGZvcm06cmVhZCcsXG4gICdvcmdzOnJlYWQnLFxuICAnc3Vic2NyaXB0aW9uczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG4gICdkYXNoYm9hcmRzOnJlYWQnLFxuICAvLyBBIHJlYWQsIGFuZCB0aGlzIFJvbGUgaXMgcmVhZHMg4oCUIHRoZSByZWdpc3RyeSBicm93c2VyIHdpdGggbmVpdGhlciBvZiB0aGVcbiAgLy8gdHdvIHdyaXRlIHJ1bmdzIChgcmVnaXN0cnk6d3JpdGVgIGNvcGllcywgYHJlZ2lzdHJ5OnB1cmdlYCBkZWxldGVzKS5cbiAgJ3JlZ2lzdHJ5OnJlYWQnLFxuXTtcblxuZXhwb3J0IGNvbnN0IENPTlNPTEVfQURNSU5fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ29ic2VydmFiaWxpdHlfY29uc29sZTpvcGVuJyxcbiAgJ2RhdGFiYXNlX2NvbnNvbGU6b3BlbicsXG4gICdvYmplY3RzdG9yZV9jb25zb2xlOm9wZW4nLFxuICAvLyBUaGUgYWxsLW9yZ2FuaXphdGlvbnMgbGlzdCwgc28gYSBob2xkZXIgY2FuIGZpbmQgdGhlIG9yZyB0aGV5IHdlcmUgYXNrZWRcbiAgLy8gYWJvdXQgd2l0aG91dCBhIHNlY29uZCBSb2xlIOKAlCBhbmQgbm90aGluZyBtb3JlLiBUaGlzIHdhcyBgcGxhdGZvcm06cmVhZGAsXG4gIC8vIHdoaWNoIG1lYW50IG9wZW5pbmcgYSBkYXRhYmFzZSBjb25zb2xlIGFsc28gZ3JhbnRlZCB0aGUgZGVwbG95J3Mgb3duXG4gIC8vIGNvbmZpZ3VyYXRpb24sIGZvciBubyByZWFzb24gYmV5b25kIHRoZSB0d28gc2hhcmluZyBhIGdhdGUuXG4gICdvcmdzOnJlYWQnLFxuXTtcblxuLyoqXG4gKiBSRUdJU1RSWSBPUEVSQVRPUiDigJQgbW92ZXMgY29udGFpbmVyIGltYWdlcyBhcm91bmQsIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogVEhFIEdBUCBJVCBGSUxMUy4gUHJvbW90aW5nIGFuIGltYWdlIOKAlCBjb3B5aW5nIGEgYnVpbHQgdGFnIGZyb20gb25lIHJlcG9zaXRvcnlcbiAqIHRvIHRoZSBvbmUgYSByZWxlYXNlIHJlc29sdmVzIOKAlCBpcyBhIGpvYiBzb21lYm9keSBkb2VzLCBhbmQgdW50aWwgbm93IHRoZSBvbmx5XG4gKiBpZGVudGl0eSB0aGF0IGNvdWxkIGRvIGl0IHdhcyBhIHN1cGVyYWRtaW4uIGByZWdpc3RyeTp3cml0ZWAgaGFzIG5vIG90aGVyXG4gKiBjYXJyaWVyLCBhbmQgYSBzeXN0ZW0tb3JnLW9ubHkgcGVybWlzc2lvbiB3aXRoIG5vIHNlZWRlZCBjYXJyaWVyIGlzXG4gKiBzdXBlcmFkbWluLW9ubHkgaW4gcHJhY3RpY2UgKHRoZSBgcGxhdGZvcm06cmVhZGAgZmFpbHVyZSwgcGlubmVkIGJ5IHRoZVxuICogXCJhdCBsZWFzdCBvbmUgc2VlZGVkIGNhcnJpZXJcIiBhc3NlcnRpb24gaW4gYXBpLWNvcmUncyBgdGVzdC9wZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKiBTbyBzcGxpdHRpbmcgYHJlZ2lzdHJ5OnB1cmdlYCBvdXQgb2YgYHJlZ2lzdHJ5OndyaXRlYCBpcyBvbmx5IGhhbGYgdGhlIGNoYW5nZTpcbiAqIHRoZSBhZGRpdGl2ZSBoYWxmIG5lZWRzIGEgUm9sZSBvciB0aGUgc3BsaXQgYnV5cyBub3RoaW5nLlxuICpcbiAqIFdIWSBJVCBJUyBOT1QgUEFSVCBPRiBQTEFURk9STSBPUEVSQVRPUi4gVGhhdCBSb2xlIHJ1bnMgdGhlIGRlcGxveW1lbnQgYW5kXG4gKiBhbHJlYWR5IHJlYWRzIHRoZSByZWdpc3RyeS4gUHJvbW90aW5nIGFuIGltYWdlIGlzIGEgcmVsZWFzZSBkZWNpc2lvbiwgbm90IGFuXG4gKiBvcGVyYXRpb25hbCBzaWRlIGVmZmVjdCwgYW5kIHJvbGxpbmcgaXQgaW50byB0aGUgUm9sZSBldmVyeW9uZSBvbiBjYWxsIGhvbGRzXG4gKiB3b3VsZCBtZWFuIHRoZSBwYWdlciByb3RhdGlvbiBjYW4gcmV0YWcgYSByZWxlYXNlIGF0IDNhbS4gVGhlIHR3byBSb2xlc1xuICogY29tcG9zZSBpbnN0ZWFkIOKAlCBhIG1lbWJlciBtYXkgaG9sZCBhbnkgbnVtYmVyLCBhbmQgcGVybWlzc2lvbnMgYXJlIHRoZSB1bmlvbi5cbiAqXG4gKiBXSFkgSVQgSVMgT05MWSBUV08gUEVSTUlTU0lPTlMuIERlbGliZXJhdGVseSBub3RoaW5nIGVsc2U6IG5vIGBwbGF0Zm9ybTpyZWFkYCxcbiAqIG5vIGNvbnNvbGUsIG5vIGBvcmdzOnJlYWRgLiBgY2FuUmVhZFJlcG9gL2BjYW5Xcml0ZVJlcG9gIGNvbmZpbmUgYVxuICogbm9uLXN1cGVyYWRtaW4gc3lzdGVtLW9yZyBob2xkZXIgdG8gYHN5c3RlbS8qYCwgYGxpYnJhcnkvKmAgYW5kIGBwdWJsaWMvKmAg4oCUXG4gKiB0aGlzIGRlcGxveW1lbnQncyBvd24gYmFzZSBhbmQgcGx1Z2luIGltYWdlcyDigJQgc28gdGhlIFJvbGUgY2Fubm90IHJlYWNoIGFcbiAqIHRlbmFudCdzIHJlcG9zaXRvcmllcyBhdCBhbGwsIGFuZCBhIGhvbGRlciB3aG8gYWxzbyBuZWVkcyB0aGUgb3BlcmF0b3Igdmlld3NcbiAqIGdldHMgdGhlIG9wZXJhdG9yIFJvbGUgdG9vLiBJdCBkb2VzIE5PVCBjYXJyeSBgcmVnaXN0cnk6cHVyZ2VgLCB3aGljaCBpcyBpblxuICoge0BsaW5rIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OU30gYW5kIGluIG5vIGJ1bmRsZSBieSBkZXNpZ246IGFuIGltYWdlXG4gKiBwcm9tb3RlciBoYXMgbm8gYnVzaW5lc3MgZGVsZXRpbmcgdGhlIGltYWdlIGEgdGVuYW50J3MgcGlwZWxpbmUgcmVzb2x2ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUdJU1RSWV9PUEVSQVRPUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncmVnaXN0cnk6cmVhZCcsXG4gICdyZWdpc3RyeTp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFNVUFBPUlQgQUdFTlQg4oCUIHRoZSBzdXBwb3J0IGRlc2ssIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGNhcnJpZXMgbm8gYHBsYXRmb3JtOnJlYWRgLCBubyBjb25zb2xlIGFuZCBubyBiaWxsaW5nIHdyaXRlOiBhblxuICogYWdlbnQgYW5zd2VycyBjYXNlcyBhbmQgd3JpdGVzIHRoZSBjYW5uZWQgcmVwbGllcy4gYHN1YnNjcmlwdGlvbnM6cmVhZGAgaXNcbiAqIGhlcmUgYmVjYXVzZSB0aGUgZmlyc3QgcXVlc3Rpb24gb24gYW55IGNhc2UgaXMgd2hhdCB0aGUgY3VzdG9tZXIgaXMgZW50aXRsZWRcbiAqIHRvLCBhbmQgd2l0aG91dCBpdCBhbiBhZ2VudCB3b3VsZCBoYXZlIHRvIGFzayBzb21lb25lIGVsc2UgdG8gbG9vay5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUFBPUlRfQUdFTlRfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3N1cHBvcnRfY2FzZXM6d3JpdGUnLFxuICAnc3VwcG9ydF9jb250ZW50OndyaXRlJyxcbiAgJ3N1YnNjcmlwdGlvbnM6cmVhZCcsXG4gIC8vIE5FVywgYW5kIHRoZSBnYXAgdGhlIHNwbGl0IGV4cG9zZWQ6IGFuIGFnZW50IHRyaWFnaW5nIGEgY2FzZSBuZWVkcyB0byBmaW5kXG4gIC8vIHRoZSBjdXN0b21lcidzIG9yZ2FuaXphdGlvbi4gVGhlIG9ubHkgcGVybWlzc2lvbiB0aGF0IGxpc3RlZCBvcmdzIHdhc1xuICAvLyBgcGxhdGZvcm06cmVhZGAsIHdoaWNoIHdvdWxkIGFsc28gaGF2ZSBoYW5kZWQgYSBzdXBwb3J0IGFnZW50IHRoZSBkZXBsb3knc1xuICAvLyBpbnRlcm5hbHMg4oCUIHNvIHRoZXkgaGFkIG5laXRoZXIsIGFuZCBoYWQgdG8gYXNrIHNvbWVvbmUgZWxzZSB0byBsb29rLlxuICAnb3JnczpyZWFkJyxcbiAgLy8gUmVhZGluZyBhbmQgYW5zd2VyaW5nIHRoZSBjYXNlIGl0c2VsZiByaWRlcyB0aGUgb3JkaW5hcnkgbWVzc2FnaW5nXG4gIC8vIHBlcm1pc3Npb25zIOKAlCBhIHN1cHBvcnQgY2FzZSBJUyBhIG1lc3NhZ2UgdGhyZWFkLlxuICAnbWVzc2FnZXM6cmVhZCcsXG4gICdtZXNzYWdlczp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFNVUFBPUlQgTEVBRCDigJQgdGhlIHN1cHBvcnQgZGVzaywgcGx1cyB0aGUgYXV0aG9yaXR5IHRvIGxvb2suXG4gKlxuICogVEhFIEdBUCBJVCBGSUxMUy4gYGltcGVyc29uYXRpb246b3BlbmAgaXMgc3lzdGVtLW9yZy1vbmx5LCBhbmQgYSBzeXN0ZW0tb3JnLW9ubHlcbiAqIHBlcm1pc3Npb24gd2l0aCBubyBzZWVkZWQgY2FycmllciBpcyBzdXBlcmFkbWluLW9ubHkgaW4gcHJhY3RpY2Ug4oCUIHRoZVxuICogaW52YXJpYW50IGFwaS1jb3JlJ3MgYHRlc3QvcGVybWlzc2lvbnMudGVzdC50c2AgYXNzZXJ0cywgYW5kIHRoZSByZWFzb25cbiAqIGBwbGF0Zm9ybTpyZWFkYCBzaGlwcGVkIHVudXNhYmxlLiBXaXRob3V0IHRoaXMgUm9sZSwgc3BsaXR0aW5nIGltcGVyc29uYXRpb25cbiAqIG91dCBvZiB0aGUgZmxhZyB3b3VsZCBjaGFuZ2Ugbm90aGluZzogdGhlIG9ubHkgd2F5IHRvIGxldCBzb21lYm9keSB2aWV3IGFcbiAqIGN1c3RvbWVyJ3MgYWNjb3VudCB3b3VsZCBzdGlsbCBiZSB0byBtYWtlIHRoZW0gYSBmdWxsIFN1cGVyIEFkbWluLCBoYW5kaW5nXG4gKiBvdmVyIGAvYWRtaW4vdXNlcnMvOmlkL2dyYW50c2AsIHRoZSBzaW5nbGUtcGVyc29uIE1GQSByZXNldCwgdGhlIGRhdGFiYXNlXG4gKiBjb25zb2xlIGFuZCBgcmVnaXN0cnk6cHVyZ2VgIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogV0hZIElUIElTIFRIRSBTVVBQT1JUIERFU0sgQU5EIE5PVCBUSEUgT1BFUkFUT1IuIFRoZSBxdWVzdGlvbiBpbXBlcnNvbmF0aW9uXG4gKiBhbnN3ZXJzIGlzIFwid2hhdCBpcyB0aGlzIGN1c3RvbWVyIGFjdHVhbGx5IHNlZWluZz9cIiwgd2hpY2ggaXMgYSBzdXBwb3J0XG4gKiBxdWVzdGlvbi4gUGxhdGZvcm0gT3BlcmF0b3IgcnVucyB0aGUgZGVwbG95bWVudCBhbmQgaXMgaGVsZCBieSB3aG9ldmVyIGlzIG9uXG4gKiBjYWxsOyBhZGRpbmcgdGhpcyB0byBpdCB3b3VsZCBoYW5kIGV2ZXJ5IHJvdGEgbWVtYmVyIHRoZSBhYmlsaXR5IHRvIGJlY29tZSBhbnlcbiAqIGN1c3RvbWVyJ3MgdXNlciBhdCAzYW0uIFN1cHBvcnQgQWdlbnQncyBidW5kbGUgcGx1cyB0aGUgb25lIHBlcm1pc3Npb24gaXMgdGhlXG4gKiBuYXJyb3dlciwgbW9yZSBob25lc3Qgc2hhcGUg4oCUIGFuZCBhIGxlYWQgd2hvIGFsc28gcnVucyB0aGUgZGVwbG95bWVudCBob2xkc1xuICogYm90aCBSb2xlcy5cbiAqXG4gKiBXSEFUIElUIFNUSUxMIENBTk5PVCBETy4gRW1lcmdlbmN5IGFjY2VzczogYGJyZWFrZ2xhc3NgIGJ5cGFzc2VzIHRlbmFudFxuICogY29uc2VudCBhbmQgc3RheXMgb24gdGhlIGZsYWcsIGFwcHJvdmVkIGJ5IGEgc2Vjb25kIFN1cGVyIEFkbWluLiBBbmQgdGhlXG4gKiB0ZW5hbnQgY2FuIHJlZnVzZSDigJQgYGltcGVyc29uYXRpb246b3BlbmAgaXMgcGVybWlzc2lvbiB0byBBU0suXG4gKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JUX0xFQURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgLi4uU1VQUE9SVF9BR0VOVF9QRVJNSVNTSU9OUyxcbiAgJ2ltcGVyc29uYXRpb246b3BlbicsXG5dO1xuXG4vKipcbiAqIFNUQVJUSU5HIFBPSU5UUyBmb3IgYSBjdXN0b20gUm9sZSBpbiBhIHRlbmFudCBvcmcg4oCUIHRlbXBsYXRlcywgbm90IFJvbGVzLlxuICpcbiAqIFRIRSBHQVAgVEhFWSBGSUxMLiBBbiBvcmcgc2VlZHMgZXhhY3RseSBUV08gUm9sZXMg4oCUIE1lbWJlciBhbmQgQWRtaW4g4oCUIGFuZFxuICogQWRtaW4gaXMgZXZlcnkgb3JnLWFzc2lnbmFibGUgcGVybWlzc2lvbi4gU28gcHJvbW90aW5nIGFueW9uZSBwYXN0IFwiYXV0aG9yIGFuZFxuICogcmVhZFwiIGhhbmRzIG92ZXIgdGhlIHdob2xlIHJlbWFpbmRlciBhdCBvbmNlOiBgb3JnX2ttczp3cml0ZWAsXG4gKiBgb3JnX2lkcDp3cml0ZWAsIGBvcmdfaW1wZXJzb25hdGlvbjp3cml0ZWAsIGBiaWxsaW5nOm1hbmFnZWAsIGByb2xlczptYW5hZ2VgXG4gKiBhbmQgYGF1ZGl0OnJlYWRgIGFtb25nIHRoZW0uIFRoZSBwcm9kdWN0J3MgYW5zd2VyIGlzIFwiYXV0aG9yIGEgY3VzdG9tIFJvbGVcIixcbiAqIGFuZCB0aGUgc2FmZXR5IGlzIGFscmVhZHkgcmlnaHQgKGBzYW5pdGl6ZVBlcm1pc3Npb25zYCBib3VuZHMgYSBjdXN0b20gUm9sZSBieVxuICogaXRzIGF1dGhvcidzIG93biBjZWlsaW5nKS4gV2hhdCB3YXMgbWlzc2luZyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKlxuICogVGhlIGV4YWN0IHNpemVzIG9mIHRoYXQgY2xpZmYgYXJlIGFzc2VydGVkIGluIGB0ZXN0L3Blcm1pc3Npb25zLnRlc3QudHNgXG4gKiByYXRoZXIgdGhhbiB3cml0dGVuIGhlcmUuIFRoaXMgcGFyYWdyYXBoIHVzZWQgdG8gY2FycnkgdGhlbSBpbmxpbmUg4oCUIFwidGhyZWVcbiAqIFJvbGVzOiBNZW1iZXIgKDE1KSwgVGVhbSBMZWFkICgxNykgYW5kIEFkbWluICgzNylcIiDigJQgYW5kIGV2ZXJ5IG9uZSBvZiB0aG9zZVxuICogbnVtYmVycyB3ZW50IHN0YWxlOiBgVGVhbSBMZWFkYCBzdG9wcGVkIGJlaW5nIHNlZWRlZCB3aGVuIGl0IGJlY2FtZSB0aGUgZmlyc3RcbiAqIHRlbXBsYXRlIGJlbG93LCBhbmQgdGhlIHR3byBidW5kbGVzIGhhdmUgZ3Jvd24gc2luY2UuIEEgY291bnQgbm90aGluZyBjaGVja3NcbiAqIGlzIGEgY2xhaW0gdGhhdCBkZWNheXMsIGFuZCB0aGlzIG9uZSB3YXMgdGhlIHN0YXRlZCByYXRpb25hbGUgZm9yIHRoZSBmZWF0dXJlLlxuICpcbiAqIFdIWSBURU1QTEFURVMgQU5EIE5PVCBTRUVERUQgUk9MRVMuIEEgc2VlZGVkIGJ1aWx0LWluIGlzIGBzeXN0ZW06IHRydWVgIGFuZFxuICogdGhlcmVmb3JlIGltbXV0YWJsZSwgc28gc2VlZGluZyB0aGVzZSB3b3VsZCBwdXQgZm91ciB1bmRlbGV0YWJsZSByb3dzIGluIGV2ZXJ5XG4gKiBvcmcgd2hldGhlciBpdCB3YW50cyB0aGVtLiBBIHRlbXBsYXRlIGxlYXZlcyBubyB0cmFjZSB1bnRpbCBzb21lb25lIHVzZXMgaXQsXG4gKiBhbmQgd2hhdCBpdCBwcm9kdWNlcyBpcyBhbiBvcmRpbmFyeSBjdXN0b20gUm9sZSB0aGUgb3JnIGZ1bGx5IG93bnMg4oCUIGVkaXRhYmxlLFxuICogZGVsZXRhYmxlLCBhbmQgYm91bmRlZCBieSB0aGUgYXV0aG9yJ3MgY2VpbGluZyBsaWtlIGFueSBvdGhlci5cbiAqXG4gKiBXSEFUIFRIRVkgREVMSUJFUkFURUxZIEVYQ0xVREUuIGByb2xlczptYW5hZ2VgIGlzIGluIG5vbmUgb2YgdGhlbS4gSXQgaXMgdGhlXG4gKiBvbmUgcGVybWlzc2lvbiB0aGF0IGNvbXBvdW5kcyDigJQgdGhlIGhvbGRlciBjYW4gbWludCBmdXJ0aGVyIFJvbGVzLCB1cCB0byB0aGVpclxuICogb3duIGNlaWxpbmcg4oCUIHNvIGFjcXVpcmluZyBpdCBzaG91bGQgc3RheSBhIGNvbnNjaW91cyBhY3QgcmF0aGVyIHRoYW4gYSBzaWRlXG4gKiBlZmZlY3Qgb2YgcGlja2luZyBhIHByZXNldC4gRXZlcnkgcGVybWlzc2lvbiBoZXJlIGlzIG9yZy1hc3NpZ25hYmxlLCBzbyBhXG4gKiB0ZW1wbGF0ZSBpcyB2YWxpZCBpbiBhbnkgb3JnIGFuZCBgc2FuaXRpemVQZXJtaXNzaW9uc2AgYWNjZXB0cyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb2xlVGVtcGxhdGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBXaGF0IHRoZSBqb2IgaXMg4oCUIHNob3duIG5leHQgdG8gdGhlIHRlbXBsYXRlLCBhbmQgYSBzZW5zaWJsZSBSb2xlIGRlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogcmVhZG9ubHkgUGVybWlzc2lvbltdO1xufVxuXG5leHBvcnQgY29uc3QgUk9MRV9URU1QTEFURVM6IHJlYWRvbmx5IFJvbGVUZW1wbGF0ZVtdID0gW1xuICB7XG4gICAgLy8gV2FzIGEgU0VFREVEIFJvbGUgaW4gZXZlcnkgb3JnIHVudGlsIGl0IGJlY2FtZSBhIHRlbXBsYXRlLiBJdCBpcyB0aGUgb25seVxuICAgIC8vIGJ1aWx0LWluIHRoYXQgd2FzIGEgam9iIGRlc2NyaXB0aW9uIHJhdGhlciB0aGFuIGEgc3RydWN0dXJhbCByZXF1aXJlbWVudDpcbiAgICAvLyBTdXBlciBBZG1pbiBpcyB3aGVyZSBgaXNTdXBlckFkbWluYCBpcyBkZXJpdmVkIGZyb20sIEFkbWluIGFuZCBNZW1iZXIgYXJlXG4gICAgLy8gdGhlIGZsb29yIGFuIG9yZyBpcyB1bnVzYWJsZSB3aXRob3V0LCBhbmQgdGhlIHN5c3RlbS1vcmcgUm9sZXMgY2FycnlcbiAgICAvLyBwZXJtaXNzaW9ucyBubyBjdXN0b20gUm9sZSBtYXkgaG9sZC4gVGVhbSBMZWFkIHdhcyBub25lIG9mIHRob3NlIOKAlCBpdCBpc1xuICAgIC8vIGBtZW1iZXJgIHBsdXMgdHdvIHJlcG9ydCBwZXJtaXNzaW9ucywgYW5kIGFuIG9yZyB0aGF0IGRvZXMgbm90IGRlbGVnYXRlXG4gICAgLy8gcmVwb3J0IGF1dGhvcmluZyBoYWQgYW4gdW5kZWxldGFibGUgcm93IGZvciBpdCBhbnl3YXkuXG4gICAgLy9cbiAgICAvLyBDT05TRVFVRU5DRSwgc3RhdGVkIHJhdGhlciB0aGFuIGRpc2NvdmVyZWQ6IGEgbmV3IG9yZyBubyBsb25nZXIgaGFzIGEgUm9sZVxuICAgIC8vIHRoYXQgZ3JhbnRzIGByZXBvcnRzOndyaXRlYCB0byBhIG5vbi1hZG1pbi4gQW4gYWRtaW4gaG9sZHMgYm90aCBwZXJtaXNzaW9uc1xuICAgIC8vICh0aGV5IGFyZSBpbiB0aGUgYWRtaW4gYnVuZGxlKSBhbmQgaW5zdGFudGlhdGVzIHRoaXMgdGVtcGxhdGUgdG8gZGVsZWdhdGVcbiAgICAvLyB0aGVtIOKAlCB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgZm91ciBiZWxvdy4gT3JncyB0aGF0IGFscmVhZHkgaGF2ZSB0aGUgc2VlZGVkXG4gICAgLy8gUm9sZSBrZWVwIGl0LCBhbmQgdGhlIGJhY2tmaWxsIGtlZXBzIGl0cyBidW5kbGUgY3VycmVudC5cbiAgICBpZDogJ3RlYW0tbGVhZCcsXG4gICAgbmFtZTogJ1RlYW0gTGVhZCcsXG4gICAgZGVzY3JpcHRpb246ICdBdXRob3JzIGFuZCBzaGFyZXMgc3Rha2Vob2xkZXIgcmVwb3J0cyBmb3IgYSB0ZWFtLCB3aXRob3V0IG9yZy1hZG1pbiBhY2Nlc3MuJyxcbiAgICBwZXJtaXNzaW9uczogWy4uLk1FTUJFUl9QRVJNSVNTSU9OUywgJ3JlcG9ydHM6d3JpdGUnLCAncmVwb3J0czpwdWJsaXNoJ10sXG4gIH0sXG4gIHtcbiAgICAvKipcbiAgICAgKiBNRU1CRVIgQUxSRUFEWSBJUyBUSEUgREVWRUxPUEVSIFJPTEUg4oCUIHRoaXMgdGVtcGxhdGUgZXhpc3RzIGZvciB3aGF0IGl0XG4gICAgICogZG9lcyBOT1QgY292ZXIuXG4gICAgICpcbiAgICAgKiBFdmVyeXRoaW5nIGluIGEgZGV2ZWxvcGVyJ3MgbG9vcCBpcyBgcGlwZWxpbmVzOnJlYWRgICsgYHBpcGVsaW5lczp3cml0ZWAsXG4gICAgICogYm90aCBpbiB0aGUgbWVtYmVyIGJ1bmRsZTogY3JlYXRlLCBlZGl0LCB2YWxpZGF0ZSwgcnVuLCBzdG9wLCB0aGUgYnVsa1xuICAgICAqIG9wcywgQUkgZ2VuZXJhdGlvbiAoYC9waXBlbGluZXMvZ2VuZXJhdGVgLCBpbmNsLiBmcm9tLXVybCBhbmQgc3RyZWFtaW5nKSxcbiAgICAgKiB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIHBsdXMgYHRlbXBsYXRlczpyZWFkYCB0byBpbnN0YW50aWF0ZSBhbmRcbiAgICAgKiBgcGx1Z2luczppbnN0YWxsYCB0byBhZGQgYSBwbHVnaW4uIEEgdGVtcGxhdGUgcmVzdGF0aW5nIHRoYXQgd291bGQgYnV5XG4gICAgICogbm90aGluZy5cbiAgICAgKlxuICAgICAqIFdoYXQgYSBkZXZlbG9wZXIgaGl0cyB0aGUgY2xpZmYgb24gaXMgdGhlIFNFTEYtU0VSVklDRSBvcGVyYXRlIHBhaXI6IHRoZXlcbiAgICAgKiBjYW4gcmVhZCB0aGVpciBzZXJ2aWNlJ3MgZGFzaGJvYXJkcyBhbmQgbWV0cmljcyBhbmQgY2Fubm90IGNoYW5nZSBlaXRoZXIsXG4gICAgICogYmVjYXVzZSBib3RoIHdyaXRlcyBzaXQgaW4gdGhlIGFkbWluIGJ1bmRsZS4gU28gdGhlIHBlcnNvbiB3aG8gb3ducyBhXG4gICAgICogcGlwZWxpbmUgZmlsZXMgYSB0aWNrZXQgdG8gZ2V0IGFuIGFsZXJ0IG9uIGl0LlxuICAgICAqXG4gICAgICogREVMSUJFUkFURUxZIE5PVCBIRVJFLiBgbG9nczpleHBvcnRgIOKAlCB2aWV3aW5nIGxvZ3MgcmlkZXNcbiAgICAgKiBgb2JzZXJ2YWJpbGl0eTpyZWFkYCwgYnV0IGRvd25sb2FkaW5nIHRoZW0gaXMgYnVsayBlZ3Jlc3MgYW4gb3JnIG1heVxuICAgICAqIHdpdGhob2xkIGZyb20gbWVtYmVycyAoZG9jcy9wZXJtaXNzaW9ucy5tZCksIGFuZCBhIHRlbXBsYXRlIGFpbWVkIGF0IGV2ZXJ5XG4gICAgICogZW5naW5lZXIgd291bGQgcmV2ZXJzZSB0aGF0LiBgcGlwZWxpbmVzOnB1Ymxpc2hgIOKAlCBzaGFyaW5nIGJleW9uZCB0aGVcbiAgICAgKiBhdXRob3IgaXMgYSByZWxlYXNlIGRlY2lzaW9uLCB3aGljaCBpcyBSZWxlYXNlIE1hbmFnZXIncyBiZWxvdzsgc29tZWJvZHlcbiAgICAgKiB3aG8gZG9lcyBib3RoIGhvbGRzIGJvdGggUm9sZXMuXG4gICAgICovXG4gICAgaWQ6ICdkZXZlbG9wZXInLFxuICAgIG5hbWU6ICdEZXZlbG9wZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnQnVpbGRzIGFuZCBydW5zIHBpcGVsaW5lcywgYW5kIG93bnMgdGhlIGRhc2hib2FyZHMgYW5kIGFsZXJ0cyBmb3Igd2hhdCB0aGV5IGJ1aWxkLicsXG4gICAgcGVybWlzc2lvbnM6IFsuLi5NRU1CRVJfUEVSTUlTU0lPTlMsICdkYXNoYm9hcmRzOndyaXRlJywgJ29ic2VydmFiaWxpdHk6d3JpdGUnXSxcbiAgfSxcbiAge1xuICAgIGlkOiAncmVsZWFzZS1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnUmVsZWFzZSBNYW5hZ2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RlY2lkZXMgd2hhdCBiZWNvbWVzIHNoYXJlZCBiZXlvbmQgaXRzIGF1dGhvciwgYW5kIGFwcHJvdmVzIHBsdWdpbiBpbnN0YWxscy4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOnB1Ymxpc2gnLFxuICAgICAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczpwdWJsaXNoJyxcbiAgICAgICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczpwdWJsaXNoJyxcbiAgICAgICdwbHVnaW5faW5zdGFsbHM6bWFuYWdlJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdzZWN1cml0eS1vZmZpY2VyJyxcbiAgICBuYW1lOiAnU2VjdXJpdHkgT2ZmaWNlcicsXG4gICAgZGVzY3JpcHRpb246ICdJZGVudGl0eSwgZW5jcnlwdGlvbiBrZXlzIGFuZCB0aGUgZXZpZGVuY2UgdHJhaWwg4oCUIHRoZSBzdXJmYWNlIGFuIGF1ZGl0b3IgYXNrcyBhYm91dC4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnYXVkaXQ6cmVhZCcsICdsb2dzOmV4cG9ydCcsXG4gICAgICAnY29tcGxpYW5jZTpyZWFkJywgJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgICAgJ29yZ19pZHA6d3JpdGUnLCAnb3JnX2ttczp3cml0ZScsICdvcmdfaW1wZXJzb25hdGlvbjp3cml0ZScsXG4gICAgICAvLyBPd25pbmcgdGhlIGltcGVyc29uYXRpb24gUE9MSUNZIChgb3JnX2ltcGVyc29uYXRpb246d3JpdGVgKSB3aXRob3V0XG4gICAgICAvLyBiZWluZyBhYmxlIHRvIGFuc3dlciBhIFJFUVVFU1Qgd2FzIHRoZSBhc3ltbWV0cnkgdGhlIGNvbnNlbnQgZmxvdyBsZWZ0XG4gICAgICAvLyBiZWhpbmQ6IHRoZSBsZXNzZXIgYWN0IGhhZCBhIHBlcm1pc3Npb24gb2YgaXRzIG93biBhbmQgdGhlIGdyZWF0ZXIgb25lXG4gICAgICAvLyBoYWQgbm9uZS4gV2hvZXZlciBkZWNpZGVzIHdoZXRoZXIgY29uc2VudCBpcyByZXF1aXJlZCBzaG91bGQgYmUgYWJsZSB0b1xuICAgICAgLy8gZ2l2ZSBvciB3aXRoaG9sZCBpdC5cbiAgICAgICdpbXBlcnNvbmF0aW9uOmFwcHJvdmUnLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogJ3Blb3BsZS1tYW5hZ2VyJyxcbiAgICBuYW1lOiAnUGVvcGxlIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIHJvc3RlciBhbmQgaXRzIG1hY2hpbmUgY3JlZGVudGlhbHMsIGFjcm9zcyB0aGUgYWNjb3VudFxcdTIwMTlzIHRlYW1zIOKAlCB3aXRob3V0IHRoZSBvcmdcXHUyMDE5cyBzZXR0aW5ncyBvciBpdHMgbW9uZXkuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ21lbWJlcnM6bWFuYWdlJywgJ2ludml0YXRpb25zOm1hbmFnZScsICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZScsXG4gICAgICAvLyBUaGUgc2FtZSBqb2IsIG9uZSBsZXZlbCBkb3duOiBlbnRlcmluZyBhIGRlc2NlbmRhbnQgdGVhbSB0byB3b3JrIG9uIGl0c1xuICAgICAgLy8gcm9zdGVyLCBhbmQgdmlld2luZyBvbmUgb2YgaXRzIG1lbWJlcnMgYXMgdGhhdCBtZW1iZXIuIFdpdGhvdXQgaXQgYVxuICAgICAgLy8gcGVvcGxlIG1hbmFnZXIgaW4gYSBwYXJlbnQgb3JnIGNhbiBhZG1pbmlzdGVyIHRoZSBhY2NvdW50J3MgdGVhbXMgb25cbiAgICAgIC8vIHBhcGVyIGFuZCBub3QgcmVhY2ggdGhlbS5cbiAgICAgICd0ZWFtX2FjY2VzczpvcGVuJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6ICdiaWxsaW5nLW1hbmFnZXInLFxuICAgIG5hbWU6ICdCaWxsaW5nIE1hbmFnZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIHN1YnNjcmlwdGlvbiwgc2VhdHMgYW5kIGludm9pY2VzIGZvciB0aGlzIG9yZ2FuaXphdGlvbi4nLFxuICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAnYmlsbGluZzpyZWFkJywgJ2JpbGxpbmc6bWFuYWdlJywgJ3F1b3RhczpyZWFkJyxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgLyoqXG4gICAgICogVGhlIGpvYiB0aGUgaW1wZXJzb25hdGlvbiBjb25zZW50IGZsb3cgY3JlYXRlZCBJTlNJREUgdGhlIHRlbmFudDogdGhlXG4gICAgICogbmFtZWQgcGVyc29uIHdobyBhbnN3ZXJzIFwibWF5IGEgc3VwcG9ydCBlbmdpbmVlciB2aWV3IHRoaXMgYWNjb3VudD9cIiBhbmRcbiAgICAgKiBjYW4gYWZ0ZXJ3YXJkcyByZWFkIHdoYXQgaGFwcGVuZWQuXG4gICAgICpcbiAgICAgKiBJdCBleGlzdHMgYXMgYSB0ZW1wbGF0ZSBiZWNhdXNlIGBpbXBlcnNvbmF0aW9uOmFwcHJvdmVgIGlzIGluIHRoZSBhZG1pblxuICAgICAqIGFuZCBvd25lciBidW5kbGVzIOKAlCBzbyBieSBkZWZhdWx0IGV2ZXJ5IGFkbWluIG1heSBjb25zZW50IOKAlCBhbmQgdGhlIHdob2xlXG4gICAgICogcG9pbnQgb2Ygc3BsaXR0aW5nIGl0IG91dCB3YXMgdG8gbGV0IGFuIG9yZyBzYXkgXCJ0aGlzIGRlY2lzaW9uIGlzIG9uZVxuICAgICAqIHBlcnNvbidzXCIuIERvaW5nIHRoYXQgbWVhbnMgYXV0aG9yaW5nIGEgUm9sZSB0aGF0IGhvbGRzIGl0IGFuZCB0YWtpbmcgaXRcbiAgICAgKiBvZmYgdGhlIG90aGVycywgYW5kIGhhbmQtY29tcG9zaW5nIHdhcyB0aGUgb25seSByb3V0ZS5cbiAgICAgKlxuICAgICAqIFR3byBwZXJtaXNzaW9ucyBhbmQgbm8gbW9yZTogYXBwcm92aW5nIGlzIG5vdCBhZG1pbmlzdGVyaW5nLiBgYXVkaXQ6cmVhZGBcbiAgICAgKiBpcyBoZXJlIGJlY2F1c2UgY29uc2VudGluZyB3aXRob3V0IGJlaW5nIGFibGUgdG8gY2hlY2sgd2hhdCB0aGUgc2Vzc2lvblxuICAgICAqIHRoZW4gZGlkIGlzIGNvbnNlbnQgaW4gbmFtZSBvbmx5LlxuICAgICAqL1xuICAgIGlkOiAnYWNjZXNzLWFwcHJvdmVyJyxcbiAgICBuYW1lOiAnQWNjZXNzIEFwcHJvdmVyJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Fuc3dlcnMgcmVxdWVzdHMgdG8gdmlldyB0aGlzIG9yZ2FuaXphdGlvblxcdTIwMTlzIGFjY291bnRzLCBhbmQgcmVhZHMgdGhlIHRyYWlsIG9mIHdoYXQgaGFwcGVuZWQuJyxcbiAgICBwZXJtaXNzaW9uczogW1xuICAgICAgJ2ltcGVyc29uYXRpb246YXBwcm92ZScsICdhdWRpdDpyZWFkJyxcbiAgICBdLFxuICB9LFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiRWNvc3lzdGVtIE1hbmFnZXJcIiBSb2xlIOKAlCB0aGUgTU9ERVJBVElPTiBqb2IuXG4gKlxuICogSXQgY2FycmllcyBgcGx1Z2luczptb2RlcmF0ZWAgYW5kIE5PVCBgcHVibGlzaGVyczp2ZXJpZnlgLCBiZWNhdXNlIHRoZSB0d28gYXJlXG4gKiBub3QgcGVlcnMuIGBwbHVnaW5zOm1vZGVyYXRlYCBpcyB0aGUgd2lkZSBzdXJmYWNlOiB5YW5rIGEgdmVyc2lvbiAod2hpY2hcbiAqIGJyZWFrcyBwaXBlbGluZXMgYWxyZWFkeSBydW5uaW5nIGl0KSwgcHVibGlzaCBhbiBhZHZpc29yeSAod2hpY2ggYWxhcm1zIGV2ZXJ5XG4gKiBjb25zdW1lciBvZiBhIGxpc3RpbmcpLCByZXdyaXRlIHRoZSBhdXRvLWFwcHJvdmFsIHJ1bGVzICh3aGljaCBkZWNpZGUgd2hhdFxuICogcHVibGlzaGVzIHdpdGggbm8gaHVtYW4gcmV2aWV3IGF0IGFsbCksIHJlc2VydmUgbmFtZXMsIG1vZGVyYXRlIHJldmlld3MsXG4gKiByZS1zaWduLiBgcHVibGlzaGVyczp2ZXJpZnlgIGlzIHRocmVlIHJvdXRlcyDigJQgc3VzcGVuZCwgdW5zdXNwZW5kLCB0aWVyIOKAlCBidXRcbiAqIG9uZSBvZiB0aGVtIEdSQU5UUyBWRVJJRklFRCBTVEFUVVMsIHdoaWNoIGlzIHRoZSBiYWRnZSBjb25zdW1lcnMgcmVhZCBhcyBcInRoaXNcbiAqIGRlcGxveW1lbnQgdm91Y2hlcyBmb3IgdGhlIHB1Ymxpc2hlclwiLlxuICpcbiAqIEJ1bmRsaW5nIHRoZW0sIGFzIHRoaXMgUm9sZSB1c2VkIHRvLCBtZWFudCBldmVyeW9uZSBoaXJlZCB0byB0cmlhZ2UgdGhlIHF1ZXVlXG4gKiBjb3VsZCBhbHNvIG1pbnQgYSBWZXJpZmllZCBwdWJsaXNoZXIuIFRocmVlIG1lY2hhbmlzbXMgYWxyZWFkeSBhc3N1bWUgdGhlXG4gKiBzcGxpdCBjYW4gYmluZCDigJQgYHJlcXVpcmVkRGVjaXNpb25QZXJtaXNzaW9uYCBwZXIgcmVxdWVzdCBraW5kLCB0aGUgcXVldWUnc1xuICogcGVyLXJvdyBgY2FuKHJlcXVpcmVkUGVybWlzc2lvbilgLCBhbmQgdGhlIGFwcHJvdmVyLXNob3J0YWdlIGNvdW50cyB0aGF0XG4gKiBgRWNvc3lzdGVtRWxpZ2liaWxpdHlgIHRyYWNrcyBTRVBBUkFURUxZIGZvciBlYWNoIHBlcm1pc3Npb24g4oCUIGFuZCB3aXRoIG9uZVxuICogY29tYmluZWQgUm9sZSBub25lIG9mIHRoZW0gY291bGQgZXZlciBkaXNjcmltaW5hdGUuXG4gKlxuICoge0BsaW5rIFBVQkxJU0hFUl9WRVJJRklFUl9QRVJNSVNTSU9OU30gaXMgdGhlIG90aGVyIGhhbGYuXG4gKi9cbmV4cG9ydCBjb25zdCBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGx1Z2luczpyZWFkJyxcbiAgJ3BsdWdpbnM6bW9kZXJhdGUnLFxuICAnbWVzc2FnZXM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiUHVibGlzaGVyIFZlcmlmaWVyXCIgUm9sZSDigJQgdGhlIFRSVVNUIGRlY2lzaW9uLlxuICpcbiAqIFRoZSBvdGhlciBoYWxmIG9mIHRoZSBlY29zeXN0ZW0gc3BsaXQgZGVzY3JpYmVkIG9uXG4gKiB7QGxpbmsgRUNPU1lTVEVNX01BTkFHRVJfUEVSTUlTU0lPTlN9OiB3aG8gbWF5IGF3YXJkIFZlcmlmaWVkLCBzdXNwZW5kIGFcbiAqIHB1Ymxpc2hlciBhbmQgbGlmdCBhIHN1c3BlbnNpb24uIENhcnJpZXMgYHBsdWdpbnM6cmVhZGAgc28gdGhlIGhvbGRlciBjYW4gc2VlXG4gKiB3aGF0IGEgcHVibGlzaGVyIHNoaXBzIGJlZm9yZSB2b3VjaGluZyBmb3IgdGhlbSwgYW5kIHRoZSBzYW1lIHR3byBhbWJpZW50XG4gKiByZWFkcyBhcyBpdHMgc2libGluZy5cbiAqXG4gKiBTVEFGRiBBVCBMRUFTVCBUV08gUEVPUExFLiBBIFZlcmlmaWVkIGFwcGxpY2F0aW9uIGFuZCBhbiB1bnN1c3BlbmQgYXJlIGJvdGhcbiAqIGBuZWVkc1R3b1BlcnNvbmAsIGFuZCBgY29uZmxpY3RPZkludGVyZXN0YCByZWZ1c2VzIHRoZSBzYW1lIHBlcnNvbiB0d2ljZSwgc28gYVxuICogc2luZ2xlIGhvbGRlciBjYW5ub3QgY29tcGxldGUgZWl0aGVyIGRlY2lzaW9uIGFsb25lLiBUaGUgY29uc29sZSdzIGFwcHJvdmVyXG4gKiBzdGFuZGluZyBub3RpY2UgaXMgd2hhdCBzdXJmYWNlcyB0aGF0IHNob3J0YWdlIOKAlCBhbmQgc3BsaXR0aW5nIHRoaXMgUm9sZSBvdXRcbiAqIGlzIHdoYXQgZmluYWxseSBsZXRzIHRoYXQgbm90aWNlIHJlcG9ydCBhIGZpZ3VyZSBpdHMgc2libGluZydzIGRvZXMgbm90LlxuICovXG5leHBvcnQgY29uc3QgUFVCTElTSEVSX1ZFUklGSUVSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwbHVnaW5zOnJlYWQnLFxuICAncHVibGlzaGVyczp2ZXJpZnknLFxuICAnbWVzc2FnZXM6cmVhZCcsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLFxuXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgdGhlIGJ1aWx0LWluIFwiVGVhbSBMZWFkXCIgUm9sZSDigJQgdGhlIHBlcnNvbiB3aG8gcmVwb3J0cyBVUFdBUkQuXG4gKlxuICogRXhpc3RzIGJlY2F1c2UgdGhlIHRhcmdldCB1c2VyIGZvciBzdGFrZWhvbGRlciByZXBvcnRzIGlzIGEgbGVhZCwgbm90IGFuIGFkbWluLFxuICogYW5kIGdyYW50aW5nIGByZXBvcnRzOndyaXRlYCBvbmx5IHRocm91Z2ggdGhlIGFkbWluIGJ1bmRsZSB3b3VsZCBoYXZlIGZvcmNlZFxuICogZXZlcnkgcmVwb3J0aW5nIGxlYWQgdG8gYmUgYW4gb3JnIGFkbWluIChtZW1iZXJzOm1hbmFnZSwgcm9sZXM6bWFuYWdlLFxuICogb3JnX3NldHRpbmdzOndyaXRlLCBiaWxsaW5nKSB0byBzZW5kIHRoZWlyIG1hbmFnZXIgYSB3ZWVrbHkgc3VtbWFyeS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGluY2x1ZGVkOiBgcmVwb3J0czpyb2xsdXBgLiBSb2xsaW5nIGEgcmVwb3J0IHVwIG92ZXIgZGVzY2VuZGFudFxuICogdGVhbXMgaXMgZG93bndhcmQgdmlzaWJpbGl0eSBhY3Jvc3MgdGhlIG9yZyB0cmVlLCB3aGljaCBpcyBhIGdyYW50ZWQgY2FwYWJpbGl0eVxuICogaW4gdGhpcyBtb2RlbCwgbm90IHNvbWV0aGluZyBhIHRlYW0ncyBvd24gbGVhZCBnZXRzIGJ5IGRlZmF1bHQg4oCUIGEgbGVhZCBvZiBhXG4gKiBQQVJFTlQgb3JnIGlzIGdyYW50ZWQgaXQgZXhwbGljaXRseS4gVGhlIFJvbGUgZ3JhbnRzIHRoZSBjb2Fyc2UgYG1lbWJlcmAgbGFiZWxcbiAqIGFuZCBuZXZlciBzZXRzIGBpc1N1cGVyQWRtaW5gLlxuICovXG5leHBvcnQgY29uc3QgVEVBTV9MRUFEX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gIC4uLk1FTUJFUl9QRVJNSVNTSU9OUyxcbiAgJ3JlcG9ydHM6d3JpdGUnLFxuICAncmVwb3J0czpwdWJsaXNoJyxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIlBpcGVsaW5lIEF1dG9tYXRpb25cIiBSb2xlIOKAlCB3aGF0IHRoZSBvcmcnc1xuICogdW5zY29wZWQgc3RvcmVkIGNyZWRlbnRpYWwgKHRoZSBgcGxhdGZvcm0tYXV0b21hdGlvbmAgc2VydmljZSBhY2NvdW50IHRoYXRcbiAqIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYCBwcm92aXNpb25zKSBuZWVkcywgYW5kIG5vdGhpbmcgbW9yZS5cbiAqXG4gKiBEZXJpdmVkIGJ5IHRyYWNpbmcgZXZlcnkgY2FsbCBtYWRlIHdpdGggdGhhdCBrZXksIG5vdCBieSBndWVzc2luZzpcbiAqICAtIGBwaXBlbGluZXM6cmVhZGAg4oCUIHRoZSBDb2RlQnVpbGQgc3ludGggKGFuZCBgcGlwZWxpbmUgZGVwbG95IC0tc3RvcmUtdG9rZW5zYClcbiAqICAgIGZldGNoaW5nIHRoZSBwaXBlbGluZSBpdCBidWlsZHMgKGBHRVQgL3BpcGVsaW5lcy86aWRgKTtcbiAqICAtIGBwbHVnaW5zOnJlYWRgICAg4oCUIHBsdWdpbiByZXNvbHV0aW9uIGF0IHN5bnRoL2RlcGxveSBhbmQgaW4gdGhlIHBsdWdpbi1sb29rdXBcbiAqICAgIExhbWJkYSAoYFBPU1QgL3BsdWdpbnMvbG9va3VwYCksIGFuZCB0aGUgcnVuLXRpbWUgdnVsbmVyYWJpbGl0eSBjaGVjayBzdGVwXG4gKiAgICAoYFBPU1QgL3BsdWdpbnMvcnVudGltZS1jaGVja2ApLlxuICpcbiAqIFdoYXQgaXQgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGNhcnJ5LCBhbmQgd2hlcmUgdGhhdCB3b3JrIHdlbnQ6XG4gKiAgLSByZWdpc3RyeSB3cml0ZXMgKGBwaXBlbGluZV9yZWdpc3RyeTp3cml0ZWApIOKAlCB0aGUgc3ludGggcmVnaXN0ZXJzIGl0cyBzdGVwXG4gKiAgICBtYW5pZmVzdCB3aXRoIHRoZSBzZXBhcmF0ZSBgcGlwZWxpbmUtcmVnaXN0ZXJgIGtleSAoUGlwZWxpbmUgUmVnaXN0cmF0aW9uKTtcbiAqICAtIGltYWdlIHB1c2hlcyBhbmQgcHVsbHMg4oCUIENvZGVCdWlsZCBhdXRoZW50aWNhdGVzIHRvIHRoZSBpbWFnZSByZWdpc3RyeSB3aXRoXG4gKiAgICB0aGUgYHJlZ2lzdHJ5LXB1c2hgIHNjb3BlZCBrZXksIG5ldmVyIHRoaXMgb25lO1xuICogIC0gcmVwb3J0aW5nIHdyaXRlcyDigJQgdGhlIGV2ZW50cyBMYW1iZGEgYW5kIHN0ZXAgcmVwb3J0IHVwbG9hZHMgdXNlIHRoZVxuICogICAgYHJlcG9ydGluZzppbmdlc3RgIHNjb3BlZCBrZXkuXG4gKlxuICogSXQgdXNlZCB0byBiZSB0aGUgb3JnIEFETUlOIFJvbGUsIHNvIGEgbGVha2VkIHN5bnRoIGNyZWRlbnRpYWwgY291bGQgcmV3cml0ZVxuICogZXZlcnkgcGlwZWxpbmUsIFJvbGUgYW5kIG1lbWJlciBvZiB0aGUgb3JnLlxuICovXG5leHBvcnQgY29uc3QgUElQRUxJTkVfQVVUT01BVElPTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLFxuICAncGx1Z2luczpyZWFkJyxcbl07XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIHRoZSBidWlsdC1pbiBcIlBpcGVsaW5lIFJlZ2lzdHJhdGlvblwiIFJvbGUsIGhlbGQgYnkgdGhlXG4gKiBgcGlwZWxpbmUtcmVnaXN0ZXJgIHNlcnZpY2UgYWNjb3VudDogYFBPU1RgL2BERUxFVEUgL3BpcGVsaW5lcy9yZWdpc3RyeWAgZm9yXG4gKiBpdHMgb3duIG9yZyBhbmQgbm90aGluZyBlbHNlIOKAlCBub3QgZXZlbiBhIHJlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBQSVBFTElORV9SRUdJU1RSQVRJT05fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFtcbiAgJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJyxcbl07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZXNvbHV0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFJlc29sdmUgYSB1c2VyJ3MgZWZmZWN0aXZlIG9yZyBwZXJtaXNzaW9ucyBmcm9tIHRoZSBSb2xlcyBhc3NpZ25lZCB0byB0aGVtLlxuICpcbiAqIFNpbmdsZS1zb3VyY2UgbW9kZWw6IGEgdXNlcidzIGFiaWxpdGllcyBhcmUgRVhBQ1RMWSB0aGUgdW5pb24gb2YgdGhlXG4gKiBwZXJtaXNzaW9ucyBjYXJyaWVkIGJ5IHRoZSBSb2xlcyB0aGV5IGhvbGQgKGEgUm9sZSA9IGEgbmFtZWQgcGVybWlzc2lvbiBzZXQ7XG4gKiBidWlsdC1pbiBSb2xlcyBjYXJyeSB0aGVpciBidW5kbGUgZXhwbGljaXRseSwgc2VlZGVkIGZyb21cbiAqIHtAbGluayBST0xFX1BFUk1JU1NJT05TfSkuIFRoZXJlIGlzIG5vIHNlcGFyYXRlIHJvbGUtZGVyaXZlZCBiYXNlbGluZSDigJQgdGhlXG4gKiBjb2Fyc2UgYHJvbGVgIGxhYmVsIGdyYW50cyBub3RoaW5nIG9uIGl0cyBvd24uXG4gKlxuICogMS4gUGxhdGZvcm0gc3VwZXJhZG1pbnMgKGBpc1N1cGVyQWRtaW5gKSBhbHdheXMgZ2V0IEFMTCBwZXJtaXNzaW9ucy5cbiAqIDIuIE90aGVyd2lzZSwgdW5pb24gZXZlcnkgcGVybWlzc2lvbiBncmFudGVkIGJ5IHRoZSB1c2VyJ3MgYXNzaWduZWQgUm9sZXMuXG4gKiAzLiBJbnZhbGlkL3Vua25vd24gcGVybWlzc2lvbiBzdHJpbmdzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSBhc3NpZ25lZFBlcm1pc3Npb25zIC0gRmxhdHRlbmVkIHBlcm1pc3Npb25zIGZyb20gZXZlcnkgUm9sZSB0aGUgdXNlciBob2xkc1xuICogQHBhcmFtIGlzU3VwZXJBZG1pbiAtIFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZSBnbG9iYWwgc3VwZXItYWRtaW4gZmxhZ1xuICogQHJldHVybnMgRWZmZWN0aXZlIHBlcm1pc3Npb25zIGluIGNhbm9uaWNhbCBvcmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVzZXJQZXJtaXNzaW9ucyhcbiAgYXNzaWduZWRQZXJtaXNzaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbixcbik6IFBlcm1pc3Npb25bXSB7XG4gIGlmIChpc1N1cGVyQWRtaW4pIHJldHVybiBbLi4uQUxMX1BFUk1JU1NJT05TXTtcblxuICBjb25zdCBwZXJtcyA9IG5ldyBTZXQ8UGVybWlzc2lvbj4oKTtcbiAgaWYgKGFzc2lnbmVkUGVybWlzc2lvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHAgb2YgYXNzaWduZWRQZXJtaXNzaW9ucykge1xuICAgICAgaWYgKGlzVmFsaWRQZXJtaXNzaW9uKHApKSBwZXJtcy5hZGQocCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKHAgPT4gcGVybXMuaGFzKHApKTtcbn1cblxuLyoqXG4gKiBDb25maW5lIGEgcmVzb2x2ZWQgcGVybWlzc2lvbiBsaXN0IHRvIHdoYXQgbWF5IGJlIGhlbGQgaW4gdGhlIHRva2VuJ3MgQUNUSVZFXG4gKiBvcmc6IG91dHNpZGUgdGhlIHN5c3RlbSBvcmcgZXZlcnkge0BsaW5rIFNZU1RFTV9PUkdfT05MWV9QRVJNSVNTSU9OU30gZW50cnkgaXNcbiAqIGRyb3BwZWQgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBBcHBsaWVkIGF0IHRva2VuIGlzc3VlIG9uXG4gKiB0b3Agb2Yge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9IOKAlCBpbmNsdWRpbmcgYSBzdXBlcmFkbWluJ3MgaW1wbGljaXQtYWxsIOKAlFxuICogc28gYSB0b2tlbiBtaW50ZWQgaW4gYSB0ZW5hbnQgb3JnIG5ldmVyIENMQUlNUyBgcGx1Z2luczptb2RlcmF0ZWAgL1xuICogYHB1Ymxpc2hlcnM6dmVyaWZ5YCwgZXZlbiBpZiBhIGhhbmQtd3JpdHRlbiBSb2xlIGRvY3VtZW50IHNvbWVob3cgY2FycmllZFxuICogdGhlbSB0aGVyZS4gKFN1cGVyYWRtaW5zIHN0aWxsIHBhc3MgYGhhc1Blcm1pc3Npb25gIHZpYSB0aGUgZmxhZzsgdGhlXG4gKiBlY29zeXN0ZW0gcm91dGUgZ2F0ZSBhZGRpdGlvbmFsbHkgcmVxdWlyZXMgdGhlIHN5c3RlbSBvcmcsIHNvIHRoYXQgYnlwYXNzXG4gKiBuZXZlciByZWFjaGVzIGEgZ292ZXJuYW5jZSByb3V0ZSBmcm9tIGEgdGVuYW50IG9yZyBlaXRoZXIuKVxuICpcbiAqIFRha2VzIGEgYm9vbGVhbiByYXRoZXIgdGhhbiBhbiBvcmcgaWQgc28gdGhpcyBtb2R1bGUgc3RheXMgZGVwZW5kZW5jeS1mcmVlXG4gKiAodGhlIGZyb250ZW5kIGltcG9ydHMgaXQpOyBjYWxsZXJzIGRlY2lkZSB3aXRoIGFwaS1jb3JlIGBpc1N5c3RlbU9yZ0lkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpbmVQZXJtaXNzaW9uc1RvT3JnPFAgZXh0ZW5kcyBzdHJpbmc+KFxuICBwZXJtaXNzaW9uczogcmVhZG9ubHkgUFtdLFxuICBhY3RpdmVPcmdJc1N5c3RlbU9yZzogYm9vbGVhbixcbik6IFBbXSB7XG4gIHJldHVybiBhY3RpdmVPcmdJc1N5c3RlbU9yZyA/IFsuLi5wZXJtaXNzaW9uc10gOiBwZXJtaXNzaW9ucy5maWx0ZXIoKHApID0+ICFpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uKHApKTtcbn1cblxuLyoqIFdoZXRoZXIgYSByZXNvbHZlZCBwZXJtaXNzaW9uIGxpc3QgZ3JhbnRzIGBwZXJtaXNzaW9uYCAoc3VwZXJhZG1pbiDih5IgYWx3YXlzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQZXJtaXNzaW9uKFxuICBncmFudGVkOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhIWdyYW50ZWQgJiYgZ3JhbnRlZC5pbmNsdWRlcyhwZXJtaXNzaW9uKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWx0LWluIFJvbGUgc2VlZCBidW5kbGVzLCBhcyBhIFRBQkxFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFRoZSBuYW1lZCBwZXJtaXNzaW9uIGJ1bmRsZXMgYSBidWlsdC1pbiBSb2xlIG1heSBjYXJyeSwgYW5kIHRoZSBSb2xlIE5BTUUgZWFjaFxuICogb25lIGlzIHNlZWRlZCB1bmRlci4gT25lIHRhYmxlLCBiZWNhdXNlIHRoZSB0aHJlZSBmYWN0cyBhYm91dCBhIGpvYiBSb2xlIOKAlFxuICogaXRzIGlkLCBpdHMgcGVybWlzc2lvbnMgYW5kIGl0cyBkaXNwbGF5IG5hbWUg4oCUIHdlcmUgcHJldmlvdXNseSB0aHJlZVxuICogaW5kZXBlbmRlbnQgbGlzdHMgaW4gdGhyZWUgcGxhY2VzLCBhbmQgbm90aGluZyBoZWxkIHRoZW0gdG9nZXRoZXIuXG4gKlxuICogV0hBVCBXRU5UIFdST05HIFdJVEhPVVQgSVQuIFRoZSBwbGF0Zm9ybSByZXNvbHZlZCBhIGJ1bmRsZSB0aHJvdWdoIGFcbiAqIG5pbmUtYnJhbmNoIGBpZmAgY2hhaW4gd2l0aCBhIGZhbGwtdGhyb3VnaCB0byB0aGUgY29hcnNlIGBncmFudHNSb2xlYCBidW5kbGUuXG4gKiBFdmVyeSBqb2IgUm9sZSBncmFudHMgYG1lbWJlcmAsIHNvIGEgYnVuZGxlIGFkZGVkIHRvIHRoZSBpZCBsaXN0IFdJVEhPVVQgaXRzXG4gKiBicmFuY2ggZGlkIG5vdCBmYWlsIOKAlCBpdCBzaWxlbnRseSBzZWVkZWQgdGhlIHBsYWluIE1lbWJlciBidW5kbGUsIGFuZCB0aGVcbiAqIHN0YXJ0dXAgYmFja2ZpbGwgdGhlbiByZS1zeW5jZWQgaXQgdG8gdGhhdCB3cm9uZyB2YWx1ZSBvbiBldmVyeSBib290LiBUaGVcbiAqIFJvbGUgZXhpc3RlZCwgd2FzIGFzc2lnbmFibGUgZnJvbSB0aGUgc3RhZmZpbmcgcGFuZWwsIGFuZCBncmFudGVkIGZpZnRlZW5cbiAqIHRlbmFudCBwZXJtaXNzaW9ucyBpbnN0ZWFkIG9mIGl0cyBqb2IuIE5vdGhpbmcgYW55d2hlcmUgZXhlcmNpc2VkIHRoZVxuICogcmVzb2x2ZXIgcGVyIGJ1bmRsZS5cbiAqXG4gKiBLZXllZCBhY2Nlc3MgcGx1cyBgc2F0aXNmaWVzYCBtYWtlcyBhIG1pc3NpbmcgZW50cnkgYSBDT01QSUxFIGVycm9yLCBhbmQgYW5cbiAqIGV4dHJhIG9uZSB0b28g4oCUIGluIGJvdGggZGlyZWN0aW9ucywgd2l0aCBubyBydW50aW1lIGNoZWNrIHRvIGZvcmdldC5cbiAqXG4gKiBUaGUgTkFNRSBsaXZlcyBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24uIFRoZSBwbGF0Zm9ybSBzZWVkZWQgbmFtZXMgZnJvbSBpdHNcbiAqIG93biBjb25zdGFudHMgd2hpbGUgdGhlIGZyb250ZW5kJ3Mgc3RhZmZpbmcgcm9zdGVyIGhhcmQtY29kZWQgaXRzIG93biBjb3B5LFxuICogZWFjaCBwaW5uZWQgYnkgYSB0ZXN0IGFnYWluc3QgaXRzZWxmIOKAlCBzbyByZW5hbWluZyBhIFJvbGUgcGFzc2VkIGJvdGggc3VpdGVzXG4gKiBhbmQgdGhlIHJvc3RlciBzaWxlbnRseSByZW5kZXJlZCBcIlJvbGUgbm90IGZvdW5kXCIsIHdoaWNoIGlzIHRoZSBncmFudCBwYXRoIGZvclxuICogdGhhdCBSb2xlJ3MgcGVybWlzc2lvbnMgZGlzYXBwZWFyaW5nLiBCb3RoIHNpZGVzIHJlYWQgdGhpcyBub3cuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUVEX0JVTkRMRVMgPSB7XG4gIGVjb3N5c3RlbV9tYW5hZ2VyOiB7IG5hbWU6ICdFY29zeXN0ZW0gTWFuYWdlcicsIHBlcm1pc3Npb25zOiBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OUyB9LFxuICBwdWJsaXNoZXJfdmVyaWZpZXI6IHsgbmFtZTogJ1B1Ymxpc2hlciBWZXJpZmllcicsIHBlcm1pc3Npb25zOiBQVUJMSVNIRVJfVkVSSUZJRVJfUEVSTUlTU0lPTlMgfSxcbiAgdGVhbV9sZWFkOiB7IG5hbWU6ICdUZWFtIExlYWQnLCBwZXJtaXNzaW9uczogVEVBTV9MRUFEX1BFUk1JU1NJT05TIH0sXG4gIHBsYXRmb3JtX29ic2VydmVyOiB7IG5hbWU6ICdQbGF0Zm9ybSBPYnNlcnZlcicsIHBlcm1pc3Npb25zOiBQTEFURk9STV9PQlNFUlZFUl9QRVJNSVNTSU9OUyB9LFxuICBwbGF0Zm9ybV9vcGVyYXRvcjogeyBuYW1lOiAnUGxhdGZvcm0gT3BlcmF0b3InLCBwZXJtaXNzaW9uczogUExBVEZPUk1fT1BFUkFUT1JfUEVSTUlTU0lPTlMgfSxcbiAgYWNjb3VudF9tYW5hZ2VyOiB7IG5hbWU6ICdBY2NvdW50IE1hbmFnZXInLCBwZXJtaXNzaW9uczogQUNDT1VOVF9NQU5BR0VSX1BFUk1JU1NJT05TIH0sXG4gIGNvbnNvbGVfYWRtaW46IHsgbmFtZTogJ0NvbnNvbGUgQWRtaW5pc3RyYXRvcicsIHBlcm1pc3Npb25zOiBDT05TT0xFX0FETUlOX1BFUk1JU1NJT05TIH0sXG4gIHN1cHBvcnRfYWdlbnQ6IHsgbmFtZTogJ1N1cHBvcnQgQWdlbnQnLCBwZXJtaXNzaW9uczogU1VQUE9SVF9BR0VOVF9QRVJNSVNTSU9OUyB9LFxuICBzdXBwb3J0X2xlYWQ6IHsgbmFtZTogJ1N1cHBvcnQgTGVhZCcsIHBlcm1pc3Npb25zOiBTVVBQT1JUX0xFQURfUEVSTUlTU0lPTlMgfSxcbiAgcmVnaXN0cnlfb3BlcmF0b3I6IHsgbmFtZTogJ1JlZ2lzdHJ5IE9wZXJhdG9yJywgcGVybWlzc2lvbnM6IFJFR0lTVFJZX09QRVJBVE9SX1BFUk1JU1NJT05TIH0sXG4gIHBpcGVsaW5lX2F1dG9tYXRpb246IHsgbmFtZTogJ1BpcGVsaW5lIEF1dG9tYXRpb24nLCBwZXJtaXNzaW9uczogUElQRUxJTkVfQVVUT01BVElPTl9QRVJNSVNTSU9OUyB9LFxuICBwaXBlbGluZV9yZWdpc3RyYXRpb246IHsgbmFtZTogJ1BpcGVsaW5lIFJlZ2lzdHJhdGlvbicsIHBlcm1pc3Npb25zOiBQSVBFTElORV9SRUdJU1RSQVRJT05fUEVSTUlTU0lPTlMgfSxcbn0gYXMgY29uc3Q7XG5cbi8qKiBFdmVyeSBzZWVkLWJ1bmRsZSBpZC4gVGhlIHBsYXRmb3JtJ3MgYFJvbGUuc2VlZEJ1bmRsZWAgZW51bSBpcyB0aGlzIGxpc3QuICovXG5leHBvcnQgY29uc3QgU0VFRF9CVU5ETEVfSURTID0gT2JqZWN0LmtleXMoU0VFRF9CVU5ETEVTKSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgU0VFRF9CVU5ETEVTPjtcbmV4cG9ydCB0eXBlIFNlZWRCdW5kbGVJZCA9IGtleW9mIHR5cGVvZiBTRUVEX0JVTkRMRVM7XG5cbi8qKlxuICogVGhlIFNZU1RFTSBPUkcncyBqb2IgUm9sZXMsIGluIHN0YWZmaW5nIG9yZGVyIOKAlCB0aGUgc3Vic2V0IG9mXG4gKiB7QGxpbmsgU0VFRF9CVU5ETEVTfSBzZWVkZWQgdGhlcmUsIHdoaWNoIGlzIGV2ZXJ5IGJ1bmRsZSBleGNlcHQgYHRlYW1fbGVhZGBcbiAqIChhIHRlbmFudCBqb2IsIGFuZCBhIHRlbXBsYXRlIHJhdGhlciB0aGFuIGEgc2VlZGVkIFJvbGUgc2luY2UgaXQgc3RvcHBlZFxuICogYmVpbmcgc3RydWN0dXJhbCkuXG4gKlxuICogYGVjb3N5c3RlbV9tYW5hZ2VyYCBJUyBvbmUgb2YgdGhlbTsgaXQgaXMgbGlzdGVkIGhlcmUgZXZlbiB0aG91Z2ggaXRzIHJvc3RlclxuICogbGl2ZXMgb24gdGhlIEVjb3N5c3RlbSBjb25zb2xlIHJhdGhlciB0aGFuIHRoZSBzdGFmZmluZyBwYW5lbCwgYmVjYXVzZSB3aGF0XG4gKiB0aGlzIGxpc3QgYW5zd2VycyBpcyBcIndoaWNoIFJvbGVzIGRvZXMgdGhlIHN5c3RlbSBvcmcgc2VlZFwiLCBub3QgXCJ3aGljaCBwYW5lbFxuICogcmVuZGVycyB0aGVtXCIuXG4gKi9cbmV4cG9ydCBjb25zdCBTWVNURU1fT1JHX0pPQl9CVU5ETEVTOiByZWFkb25seSBTZWVkQnVuZGxlSWRbXSA9IFtcbiAgJ2Vjb3N5c3RlbV9tYW5hZ2VyJyxcbiAgJ3B1Ymxpc2hlcl92ZXJpZmllcicsXG4gICdwbGF0Zm9ybV9vYnNlcnZlcicsXG4gICdwbGF0Zm9ybV9vcGVyYXRvcicsXG4gICdhY2NvdW50X21hbmFnZXInLFxuICAnY29uc29sZV9hZG1pbicsXG4gICdzdXBwb3J0X2FnZW50JyxcbiAgJ3N1cHBvcnRfbGVhZCcsXG4gICdyZWdpc3RyeV9vcGVyYXRvcicsXG5dO1xuXG4vKipcbiAqIFRoZSBNQUNISU5FIFJvbGVzIGV2ZXJ5IG9yZyBzZWVkcyDigJQgdGhlIHN1YnNldCBvZiB7QGxpbmsgU0VFRF9CVU5ETEVTfSBoZWxkIGJ5XG4gKiB0aGUgc2VydmljZSBhY2NvdW50cyBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucy5cbiAqXG4gKiBTZWVkZWQgcmF0aGVyIHRoYW4gb2ZmZXJlZCBhcyBhIHtAbGluayBST0xFX1RFTVBMQVRFU30gZW50cnksIHVubGlrZSB0aGVcbiAqIHRlbmFudCBqb2IgcHJlc2V0cywgYmVjYXVzZSB0aGV5IGFyZSBzdHJ1Y3R1cmFsOiB0aGUgQ0xJIGdyYW50cyBvbmUgdG8gdGhlXG4gKiBhY2NvdW50IGl0IGNyZWF0ZXMgYW5kIHRoZSBzdGFydHVwIGJhY2tmaWxsIG1vdmVzIGV4aXN0aW5nIGFjY291bnRzIG9udG8gaXQsXG4gKiBhbmQgYm90aCBoYXZlIHRvIGZpbmQgaXQgaW4gRVZFUlkgb3JnIGJ5IGEgc3RhYmxlIGlkZW50aXR5LiBBIHRlbXBsYXRlIGxlYXZlc1xuICogbm90aGluZyB0byBmaW5kIHVudGlsIHNvbWVib2R5IGluc3RhbnRpYXRlcyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SR19BVVRPTUFUSU9OX0JVTkRMRVM6IHJlYWRvbmx5IFNlZWRCdW5kbGVJZFtdID0gW1xuICAncGlwZWxpbmVfYXV0b21hdGlvbicsXG4gICdwaXBlbGluZV9yZWdpc3RyYXRpb24nLFxuXTtcblxuLyoqXG4gKiBUaGUgc2VydmljZSBhY2NvdW50cyBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbmAgcHJvdmlzaW9ucywga2V5ZWQgYnlcbiAqIGFjY291bnQgbmFtZSwgYW5kIHRoZSBidWlsdC1pbiBSb2xlIGVhY2ggaG9sZHMg4oCUIGBudWxsYCBmb3IgYW4gYWNjb3VudCB3aG9zZVxuICoga2V5IGNhcnJpZXMgYSBjYXBhYmlsaXR5IFNDT1BFIChhIGBUb2tlblNjb3BlYCkgYW5kIHNvIG5lZWRzIG5vIFJvbGUgYXQgYWxsLlxuICpcbiAqIE9uZSB0YWJsZSBmb3IgdGhlIENMSSAod2hpY2ggUm9sZSB0byBncmFudCBhIE5FVyBhY2NvdW50KSBhbmQgdGhlIHBsYXRmb3JtJ3NcbiAqIHN0YXJ0dXAgYmFja2ZpbGwgKHdoaWNoIFJvbGUgdG8gbW92ZSBhbiBFWElTVElORyBhY2NvdW50IG9udG8sIG9mZiB0aGUgb3JnXG4gKiBhZG1pbiBSb2xlIHRoZXNlIGFjY291bnRzIHdlcmUgb25jZSBnaXZlbikuIEEgcmVuYW1lIGhlcmUgbW92ZXMgYm90aC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9NQVRJT05fQUNDT1VOVF9CVU5ETEVTID0ge1xuICAncGxhdGZvcm0tYXV0b21hdGlvbic6ICdwaXBlbGluZV9hdXRvbWF0aW9uJyxcbiAgJ3BpcGVsaW5lLXJlZ2lzdGVyJzogJ3BpcGVsaW5lX3JlZ2lzdHJhdGlvbicsXG4gICdyZXBvcnRpbmctaW5nZXN0JzogbnVsbCxcbiAgJ3JlZ2lzdHJ5LXB1c2gnOiBudWxsLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgU2VlZEJ1bmRsZUlkIHwgbnVsbD47XG4iXX0=