@dollhousemcp/mcp-server 2.0.0-rc.6 → 2.0.1

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 (229) hide show
  1. package/CHANGELOG.md +52 -61
  2. package/README.github.md +2 -2
  3. package/README.md +284 -224
  4. package/README.md.backup +284 -224
  5. package/README.npm.md +284 -224
  6. package/dist/cache/LRUCache.d.ts +3 -0
  7. package/dist/cache/LRUCache.d.ts.map +1 -1
  8. package/dist/cache/LRUCache.js +36 -26
  9. package/dist/config/env.d.ts +14 -4
  10. package/dist/config/env.d.ts.map +1 -1
  11. package/dist/config/env.js +20 -6
  12. package/dist/di/Container.d.ts +21 -0
  13. package/dist/di/Container.d.ts.map +1 -1
  14. package/dist/di/Container.js +250 -53
  15. package/dist/elements/BaseElement.d.ts.map +1 -1
  16. package/dist/elements/BaseElement.js +5 -10
  17. package/dist/elements/base/BaseElementManager.d.ts +22 -0
  18. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  19. package/dist/elements/base/BaseElementManager.js +47 -7
  20. package/dist/elements/memories/Memory.d.ts +1 -0
  21. package/dist/elements/memories/Memory.d.ts.map +1 -1
  22. package/dist/elements/memories/Memory.js +12 -8
  23. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  24. package/dist/elements/memories/MemoryManager.js +23 -42
  25. package/dist/elements/memories/MemorySearchIndex.js +2 -2
  26. package/dist/generated/version.d.ts +2 -2
  27. package/dist/generated/version.d.ts.map +1 -1
  28. package/dist/generated/version.js +3 -3
  29. package/dist/handlers/EnhancedIndexHandler.js +6 -6
  30. package/dist/handlers/element-crud/listElements.d.ts +2 -0
  31. package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
  32. package/dist/handlers/element-crud/listElements.js +3 -1
  33. package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
  35. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
  36. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  37. package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
  38. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  39. package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
  40. package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
  41. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  42. package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
  43. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
  44. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
  45. package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
  46. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  47. package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -3
  50. package/dist/logging/LogHooks.js +11 -11
  51. package/dist/logging/LogManager.d.ts +0 -2
  52. package/dist/logging/LogManager.d.ts.map +1 -1
  53. package/dist/logging/LogManager.js +1 -3
  54. package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
  55. package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
  56. package/dist/logging/sinks/MemoryLogSink.js +12 -3
  57. package/dist/logging/types.d.ts +0 -2
  58. package/dist/logging/types.d.ts.map +1 -1
  59. package/dist/logging/types.js +1 -1
  60. package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
  61. package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
  62. package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
  63. package/dist/metrics/MetricsManager.d.ts +47 -0
  64. package/dist/metrics/MetricsManager.d.ts.map +1 -0
  65. package/dist/metrics/MetricsManager.js +232 -0
  66. package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
  67. package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
  68. package/dist/metrics/OperationMetricsTracker.js +53 -0
  69. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
  70. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
  71. package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
  72. package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
  73. package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
  74. package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
  75. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
  76. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
  77. package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
  78. package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
  79. package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
  80. package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
  81. package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
  82. package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
  83. package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
  84. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
  85. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
  86. package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
  87. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
  88. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
  89. package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
  90. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
  91. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
  92. package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
  93. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
  94. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
  95. package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
  96. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
  97. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
  98. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
  99. package/dist/metrics/collectors/index.d.ts +11 -0
  100. package/dist/metrics/collectors/index.d.ts.map +1 -0
  101. package/dist/metrics/collectors/index.js +11 -0
  102. package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
  103. package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
  104. package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
  105. package/dist/metrics/types.d.ts +98 -0
  106. package/dist/metrics/types.d.ts.map +1 -0
  107. package/dist/metrics/types.js +24 -0
  108. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  109. package/dist/portfolio/DefaultElementProvider.js +1 -7
  110. package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
  111. package/dist/portfolio/EnhancedIndexManager.js +18 -18
  112. package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
  113. package/dist/portfolio/NLPScoringManager.js +5 -9
  114. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  115. package/dist/portfolio/RelationshipManager.js +2 -2
  116. package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
  117. package/dist/portfolio/VerbTriggerManager.js +5 -19
  118. package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
  119. package/dist/portfolio/config/IndexConfig.js +1 -12
  120. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
  121. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
  122. package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
  123. package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
  124. package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
  125. package/dist/portfolio/types/RelationshipTypes.js +3 -17
  126. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  127. package/dist/security/audit/config/suppressions.js +36 -8
  128. package/dist/security/constants.d.ts.map +1 -1
  129. package/dist/security/constants.js +10 -6
  130. package/dist/security/fileLockManager.d.ts.map +1 -1
  131. package/dist/security/fileLockManager.js +8 -6
  132. package/dist/security/secureYamlParser.d.ts.map +1 -1
  133. package/dist/security/secureYamlParser.js +1 -13
  134. package/dist/security/securityMonitor.d.ts +2 -1
  135. package/dist/security/securityMonitor.d.ts.map +1 -1
  136. package/dist/security/securityMonitor.js +14 -3
  137. package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
  138. package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
  139. package/dist/security/telemetry/SecurityTelemetry.js +30 -2
  140. package/dist/security/tokenManager.d.ts +3 -0
  141. package/dist/security/tokenManager.d.ts.map +1 -1
  142. package/dist/security/tokenManager.js +13 -5
  143. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  144. package/dist/security/validation/BackgroundValidator.js +7 -7
  145. package/dist/server/startup.d.ts.map +1 -1
  146. package/dist/server/startup.js +8 -24
  147. package/dist/server/tools/MCPAQLTools.js +4 -1
  148. package/dist/services/ActivationStore.d.ts.map +1 -1
  149. package/dist/services/ActivationStore.js +9 -3
  150. package/dist/services/FileWatchService.d.ts +1 -0
  151. package/dist/services/FileWatchService.d.ts.map +1 -1
  152. package/dist/services/FileWatchService.js +83 -48
  153. package/dist/services/MetadataService.d.ts.map +1 -1
  154. package/dist/services/MetadataService.js +7 -2
  155. package/dist/services/query/ElementQueryService.d.ts.map +1 -1
  156. package/dist/services/query/ElementQueryService.js +1 -41
  157. package/dist/services/query/PaginationService.d.ts.map +1 -1
  158. package/dist/services/query/PaginationService.js +1 -14
  159. package/dist/services/query/SortService.d.ts.map +1 -1
  160. package/dist/services/query/SortService.js +1 -6
  161. package/dist/services/validation/ValidationService.d.ts.map +1 -1
  162. package/dist/services/validation/ValidationService.js +3 -8
  163. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  164. package/dist/storage/ElementStorageLayer.js +5 -2
  165. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  166. package/dist/storage/MemoryStorageLayer.js +5 -2
  167. package/dist/telemetry/OperationalTelemetry.js +2 -2
  168. package/dist/utils/EventDeduplicator.d.ts +44 -0
  169. package/dist/utils/EventDeduplicator.d.ts.map +1 -0
  170. package/dist/utils/EventDeduplicator.js +93 -0
  171. package/dist/utils/FileLock.d.ts.map +1 -1
  172. package/dist/utils/FileLock.js +1 -9
  173. package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
  174. package/dist/utils/PerformanceMonitor.js +5 -5
  175. package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
  176. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  177. package/dist/utils/SlidingWindowRateLimiter.js +23 -0
  178. package/dist/web/console/IngestRoutes.d.ts +84 -0
  179. package/dist/web/console/IngestRoutes.d.ts.map +1 -0
  180. package/dist/web/console/IngestRoutes.js +252 -0
  181. package/dist/web/console/LeaderElection.d.ts +89 -0
  182. package/dist/web/console/LeaderElection.d.ts.map +1 -0
  183. package/dist/web/console/LeaderElection.js +205 -0
  184. package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
  185. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
  186. package/dist/web/console/LeaderForwardingSink.js +197 -0
  187. package/dist/web/console/SessionNames.d.ts +46 -0
  188. package/dist/web/console/SessionNames.d.ts.map +1 -0
  189. package/dist/web/console/SessionNames.js +257 -0
  190. package/dist/web/console/UnifiedConsole.d.ts +64 -0
  191. package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
  192. package/dist/web/console/UnifiedConsole.js +119 -0
  193. package/dist/web/contentPipeline.d.ts +58 -0
  194. package/dist/web/contentPipeline.d.ts.map +1 -0
  195. package/dist/web/contentPipeline.js +112 -0
  196. package/dist/web/portDiscovery.d.ts +58 -0
  197. package/dist/web/portDiscovery.d.ts.map +1 -0
  198. package/dist/web/portDiscovery.js +143 -0
  199. package/dist/web/public/app.js +148 -60
  200. package/dist/web/public/logs.js +638 -0
  201. package/dist/web/public/metrics.js +682 -0
  202. package/dist/web/public/permissions.js +394 -0
  203. package/dist/web/public/sessions.js +369 -0
  204. package/dist/web/routes/healthRoutes.d.ts +16 -0
  205. package/dist/web/routes/healthRoutes.d.ts.map +1 -0
  206. package/dist/web/routes/healthRoutes.js +29 -0
  207. package/dist/web/routes/logRoutes.d.ts +18 -0
  208. package/dist/web/routes/logRoutes.d.ts.map +1 -0
  209. package/dist/web/routes/logRoutes.js +126 -0
  210. package/dist/web/routes/metricsRoutes.d.ts +17 -0
  211. package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
  212. package/dist/web/routes/metricsRoutes.js +90 -0
  213. package/dist/web/routes/permissionRoutes.d.ts +16 -0
  214. package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
  215. package/dist/web/routes/permissionRoutes.js +133 -0
  216. package/dist/web/routes.d.ts.map +1 -1
  217. package/dist/web/routes.js +309 -339
  218. package/dist/web/server.d.ts +21 -1
  219. package/dist/web/server.d.ts.map +1 -1
  220. package/dist/web/server.js +42 -4
  221. package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
  222. package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
  223. package/dist/web/sinks/WebSSELogSink.js +22 -0
  224. package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
  225. package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
  226. package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
  227. package/package.json +2 -2
  228. package/server.json +2 -2
  229. package/dist/web/public/public/app.js +0 -1878
@@ -38,7 +38,7 @@ import * as os from 'node:os';
38
38
  import { v4 as uuidv4 } from 'uuid';
39
39
  import { PostHog } from 'posthog-node';
40
40
  import { logger } from '../utils/logger.js';
41
- import { VERSION } from '../constants/version.js';
41
+ import { PACKAGE_VERSION as VERSION } from '../generated/version.js';
42
42
  import { detectMCPClient } from './clientDetector.js';
43
43
  import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
44
44
  import { SecurityMonitor } from '../security/securityMonitor.js';
@@ -458,4 +458,4 @@ export class OperationalTelemetry {
458
458
  }
459
459
  }
460
460
  }
461
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uYWxUZWxlbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVsZW1ldHJ5L09wZXJhdGlvbmFsVGVsZW1ldHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBRUgsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWxELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHakUsaUVBQWlFO0FBQ2pFLGdFQUFnRTtBQUNoRSxrRUFBa0U7QUFDbEUsTUFBTSwyQkFBMkIsR0FBRyxpREFBaUQsQ0FBQztBQUV0RixNQUFNLE9BQU8sb0JBQW9CO0lBV1g7SUFWWixTQUFTLEdBQWtCLElBQUksQ0FBQztJQUNoQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLE9BQU8sR0FBbUIsSUFBSSxDQUFDO0lBQy9CLFdBQVcsQ0FBeUc7SUFFNUgsY0FBYyxDQUFDLEVBQXlHO1FBQ3RILElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQs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Z0JBQ3hELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2Ysd0NBQXdDO1lBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUNBQXFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUcsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlcmF0aW9uYWwgVGVsZW1ldHJ5IFN5c3RlbVxuICpcbiAqIFByaXZhY3ktZmlyc3QgYW5vbnltb3VzIGluc3RhbGxhdGlvbiBhbmFseXRpY3NcbiAqXG4gKiBXaGF0IGlzIGNvbGxlY3RlZDpcbiAqIC0gQW5vbnltb3VzIGluc3RhbGxhdGlvbiBVVUlEIChnZW5lcmF0ZWQgbG9jYWxseSwgcGVyc2lzdGVudCBwZXIgaW5zdGFsbClcbiAqIC0gU2VydmVyIHZlcnNpb24sIE9TIHR5cGUsIE5vZGUuanMgdmVyc2lvbiwgTUNQIGNsaWVudCB0eXBlXG4gKiAtIEluc3RhbGxhdGlvbiB0aW1lc3RhbXBcbiAqXG4gKiBXaGF0IGlzIE5PVCBjb2xsZWN0ZWQ6XG4gKiAtIFVzZXIgaWRlbnRpdHksIHBlcnNvbmFsIGluZm9ybWF0aW9uLCBvciBpZGVudGlmaWFibGUgZGF0YVxuICogLSBFbGVtZW50IGNvbnRlbnQsIHBlcnNvbmEgZGF0YSwgb3IgdXNlci1jcmVhdGVkIGNvbnRlbnRcbiAqIC0gVXNhZ2UgcGF0dGVybnMsIGNvbW1hbmRzLCBvciBpbnRlcmFjdGlvbnNcbiAqIC0gTmV0d29yayBkYXRhLCBmaWxlIHBhdGhzLCBvciBzeXN0ZW0gZGV0YWlscyBiZXlvbmQgT1MgdHlwZVxuICpcbiAqIFRlbGVtZXRyeSBjb250cm9sOlxuICogLSBET0xMSE9VU0VfVEVMRU1FVFJZPXRydWUgIC0gRW5hYmxlcyBsb2NhbCB0ZWxlbWV0cnkgKGRlZmF1bHQ6IE9GRilcbiAqIC0gRE9MTEhPVVNFX1RFTEVNRVRSWT1mYWxzZSAtIERpc2FibGVzIGFsbCB0ZWxlbWV0cnkgKGxvY2FsIGFuZCByZW1vdGUpXG4gKiAtIERPTExIT1VTRV9URUxFTUVUUllfT1BUSU49dHJ1ZSAtIEVuYWJsZXMgcmVtb3RlIHRlbGVtZXRyeSB3aXRoIGRlZmF1bHQgUG9zdEhvZyBwcm9qZWN0XG4gKiAtIERPTExIT1VTRV9URUxFTUVUUllfTk9fUkVNT1RFPXRydWUgLSBMb2NhbCB0ZWxlbWV0cnkgb25seSwgbm8gUG9zdEhvZ1xuICogLSBQT1NUSE9HX0FQSV9LRVkgLSBDdXN0b20gUG9zdEhvZyBwcm9qZWN0IGtleSAob3ZlcnJpZGVzIGRlZmF1bHQpXG4gKiAtIERlbGV0ZSB0ZWxlbWV0cnkgZmlsZXM6IHJtIH4vLmRvbGxob3VzZS8udGVsZW1ldHJ5LWlkIH4vLmRvbGxob3VzZS90ZWxlbWV0cnkubG9nXG4gKlxuICogRGF0YSBzdG9yYWdlIChvbmx5IHdoZW4gZW5hYmxlZCk6XG4gKiAtIExvY2FsOiB+Ly5kb2xsaG91c2UvLnRlbGVtZXRyeS1pZCAoVVVJRCkgYW5kIH4vLmRvbGxob3VzZS90ZWxlbWV0cnkubG9nIChldmVudHMpXG4gKiAtIFJlbW90ZSAob3B0LWluKTogUG9zdEhvZyBhbmFseXRpY3Mgd2hlbiBET0xMSE9VU0VfVEVMRU1FVFJZX09QVElOPXRydWUgb3IgUE9TVEhPR19BUElfS0VZIGlzIHNldFxuICpcbiAqIERlc2lnbiBwcmluY2lwbGVzOlxuICogLSBGYWlsIGdyYWNlZnVsbHk6IGVycm9ycyBuZXZlciBjcmFzaCB0aGUgc2VydmVyXG4gKiAtIERlYnVnLW9ubHkgbG9nZ2luZzogbm8gdXNlci1mYWNpbmcgdGVsZW1ldHJ5IG5vaXNlXG4gKiAtIENoZWNrIG9wdC1vdXQgZWFybHk6IG5vIGZpbGUgb3BlcmF0aW9ucyBpZiBkaXNhYmxlZFxuICogLSBSZW1vdGUgdGVsZW1ldHJ5IGlzIG9wdC1pbjogcmVxdWlyZXMgRE9MTEhPVVNFX1RFTEVNRVRSWV9PUFRJTj10cnVlIG9yIGV4cGxpY2l0IFBPU1RIT0dfQVBJX0tFWVxuICogLSBMb2NhbCB0ZWxlbWV0cnkgaXMgb3B0LWluOiByZXF1aXJlcyBET0xMSE9VU0VfVEVMRU1FVFJZPXRydWVcbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgUG9zdEhvZyB9IGZyb20gJ3Bvc3Rob2ctbm9kZSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gJy4uL2NvbnN0YW50cy92ZXJzaW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSW5zdGFsbGF0aW9uRXZlbnQsIFRlbGVtZXRyeUNvbmZpZywgQXV0b0xvYWRNZXRyaWNzIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXRlY3RNQ1BDbGllbnQgfSBmcm9tICcuL2NsaWVudERldGVjdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuXG4vLyBQb3N0SG9nIFByb2plY3QgQVBJIEtleSAoc2FmZSB0byBleHBvc2UgcHVibGljbHkgLSB3cml0ZS1vbmx5KVxuLy8gVXNlZCBmb3Igb3B0LWluIHRlbGVtZXRyeSB3aGVuIERPTExIT1VTRV9URUxFTUVUUllfT1BUSU49dHJ1ZVxuLy8gQ2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBQT1NUSE9HX0FQSV9LRVkgZm9yIGN1c3RvbSBpbnN0YWxsYXRpb25zXG5jb25zdCBERUZBVUxUX1BPU1RIT0dfUFJPSkVDVF9LRVkgPSAncGhjX3hGSktJSEFxUlgxWUxhMFRTZFRHd0dqMTlkMUplb1hES2pKTllxNDkydnEnO1xuXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uYWxUZWxlbWV0cnkge1xuICBwcml2YXRlIGluc3RhbGxJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBwb3N0aG9nOiBQb3N0SG9nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9nTGlzdGVuZXI/OiAobGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcblxuICBhZGRMb2dMaXN0ZW5lcihmbjogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmxvZ0xpc3RlbmVyID0gZm47XG4gICAgcmV0dXJuICgpID0+IHsgdGhpcy5sb2dMaXN0ZW5lciA9IHVuZGVmaW5lZDsgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmlsZU9wZXJhdGlvbnM6IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRlbGVtZXRyeSBpcyBlbmFibGVkXG4gICAqIFJlc3BlY3RzIERPTExIT1VTRV9URUxFTUVUUlkgZW52aXJvbm1lbnQgdmFyaWFibGUgKGRlZmF1bHQ6IGZhbHNlL29wdC1pbilcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0ZWxlbWV0cnkgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVudlZhbHVlID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1RFTEVNRVRSWTtcblxuICAgIGlmICghZW52VmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkID0gZW52VmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWQgPT09ICd0cnVlJyB8fCBub3JtYWxpemVkID09PSAnMScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkID09PSAnZmFsc2UnIHx8IG5vcm1hbGl6ZWQgPT09ICcwJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFVucmVjb2duaXplZCB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgZGlzYWJsZWQgaW4gb3B0LWluIG1vZGVsXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgUG9zdEhvZyBjbGllbnQgZm9yIHJlbW90ZSB0ZWxlbWV0cnlcbiAgICpcbiAgICogVGhyZWUgd2F5cyB0byBlbmFibGUgcmVtb3RlIHRlbGVtZXRyeTpcbiAgICogMS4gRE9MTEhPVVNFX1RFTEVNRVRSWV9PUFRJTj10cnVlIC0gVXNlcyBkZWZhdWx0IFBvc3RIb2cgcHJvamVjdCAoc2ltcGxlc3Qgb3B0LWluKVxuICAgKiAyLiBQT1NUSE9HX0FQSV9LRVk9PGtleT4gLSBVc2VzIGN1c3RvbSBQb3N0SG9nIHByb2plY3QgKGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAqIDMuIERPTExIT1VTRV9URUxFTUVUUllfT1BUSU49dHJ1ZSB3aXRoIFBPU1RIT0dfQVBJX0tFWT08a2V5PiAtIEN1c3RvbSBrZXkgdGFrZXMgcHJlY2VkZW5jZVxuICAgKlxuICAgKiBQb3N0SG9nIHByb2plY3Qga2V5cyBhcmUgc2FmZSB0byBleHBvc2UgcHVibGljbHkgLSB0aGV5IGFyZSB3cml0ZS1vbmx5IGFuZCBjYW5ub3RcbiAgICogYmUgdXNlZCB0byByZWFkIGRhdGEuIFRoaXMgYWxsb3dzIGVtYmVkZGluZyBhIGRlZmF1bHQga2V5IGZvciBzaW1wbGUgb3B0LWluIHRlbGVtZXRyeS5cbiAgICpcbiAgICogUmVzcGVjdHMgRE9MTEhPVVNFX1RFTEVNRVRSWV9OT19SRU1PVEU9dHJ1ZSB0byBkaXNhYmxlIGFsbCByZW1vdGUgdGVsZW1ldHJ5XG4gICAqL1xuICBwcml2YXRlIGluaXRQb3N0SG9nKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICAvLyBTa2lwIGlmIFBvc3RIb2cgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHRoaXMucG9zdGhvZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNraXAgaWYgcmVtb3RlIHRlbGVtZXRyeSBpcyBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1RFTEVNRVRSWV9OT19SRU1PVEUgPT09ICd0cnVlJykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogUmVtb3RlIHRlbGVtZXRyeSBkaXNhYmxlZCB2aWEgRE9MTEhPVVNFX1RFTEVNRVRSWV9OT19SRU1PVEUnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXRlcm1pbmUgaWYgdXNlciBoYXMgb3B0ZWQgaW4gYW5kIHdoaWNoIEFQSSBrZXkgdG8gdXNlXG4gICAgICBjb25zdCBvcHRlZEluID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1RFTEVNRVRSWV9PUFRJTiA9PT0gJ3RydWUnO1xuICAgICAgY29uc3QgY3VzdG9tQXBpS2V5ID0gcHJvY2Vzcy5lbnYuUE9TVEhPR19BUElfS0VZO1xuXG4gICAgICAvLyBTZWxlY3QgQVBJIGtleTogY3VzdG9tIGtleSB0YWtlcyBwcmVjZWRlbmNlLCB0aGVuIGRlZmF1bHQgaWYgb3B0ZWQgaW5cbiAgICAgIGxldCBhcGlLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKGN1c3RvbUFwaUtleSkge1xuICAgICAgICBhcGlLZXkgPSBjdXN0b21BcGlLZXk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnVGVsZW1ldHJ5OiBVc2luZyBjdXN0b20gUE9TVEhPR19BUElfS0VZJyk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGVkSW4pIHtcbiAgICAgICAgYXBpS2V5ID0gREVGQVVMVF9QT1NUSE9HX1BST0pFQ1RfS0VZO1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogVXNpbmcgZGVmYXVsdCBQb3N0SG9nIHByb2plY3Qga2V5IChvcHRlZCBpbiB2aWEgRE9MTEhPVVNFX1RFTEVNRVRSWV9PUFRJTiknKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBpZiBubyBBUEkga2V5IGF2YWlsYWJsZSAobm90IG9wdGVkIGluIGFuZCBubyBjdXN0b20ga2V5KVxuICAgICAgaWYgKCFhcGlLZXkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdUZWxlbWV0cnk6IFJlbW90ZSB0ZWxlbWV0cnkgbm90IGVuYWJsZWQgKG5vIG9wdC1pbiBvciBBUEkga2V5KScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEluaXRpYWxpemUgUG9zdEhvZyBjbGllbnRcbiAgICAgIGNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5QT1NUSE9HX0hPU1QgfHwgJ2h0dHBzOi8vYXBwLnBvc3Rob2cuY29tJztcbiAgICAgIHRoaXMucG9zdGhvZyA9IG5ldyBQb3N0SG9nKGFwaUtleSwge1xuICAgICAgICBob3N0LFxuICAgICAgICBmbHVzaEF0OiAxLCAvLyBGbHVzaCBpbW1lZGlhdGVseSBmb3Igc2VydmVyIGVudmlyb25tZW50c1xuICAgICAgICBmbHVzaEludGVydmFsOiAxMDAwMCwgLy8gRmx1c2ggZXZlcnkgMTAgc2Vjb25kcyBhcyBiYWNrdXBcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYFRlbGVtZXRyeTogUG9zdEhvZyBpbml0aWFsaXplZCB3aXRoIGhvc3Q6ICR7aG9zdH1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFpbCBncmFjZWZ1bGx5IC0gbG9nIGJ1dCBkb24ndCB0aHJvd1xuICAgICAgbG9nZ2VyLmRlYnVnKGBUZWxlbWV0cnk6IEZhaWxlZCB0byBpbml0aWFsaXplIFBvc3RIb2c6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgdGhpcy5wb3N0aG9nID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRlbGVtZXRyeSBjb25maWd1cmF0aW9uIHBhdGhzXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyYXRpb24gd2l0aCBwYXRocyB0byB0ZWxlbWV0cnkgZmlsZXNcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29uZmlnKCk6IFRlbGVtZXRyeUNvbmZpZyB7XG4gICAgLy8gQWxsb3cgb3ZlcnJpZGluZyBob21lIGRpcmVjdG9yeSB2aWEgRE9MTEhPVVNFX0hPTUVfRElSIChmb3IgdGVzdGluZylcbiAgICAvLyBUaGlzIGZvbGxvd3MgdGhlIHBhdHRlcm4gdXNlZCBieSBET0xMSE9VU0VfUE9SVEZPTElPX0RJUiBhbmQgRE9MTEhPVVNFX0NBQ0hFX0RJUlxuICAgIGNvbnN0IGhvbWVEaXIgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfSE9NRV9ESVIgfHwgb3MuaG9tZWRpcigpO1xuICAgIGNvbnN0IGRvbGxob3VzZURpciA9IHBhdGguam9pbihob21lRGlyLCAnLmRvbGxob3VzZScpO1xuICAgIHJldHVybiB7XG4gICAgICBlbmFibGVkOiB0aGlzLmlzRW5hYmxlZCgpLFxuICAgICAgaW5zdGFsbElkUGF0aDogcGF0aC5qb2luKGRvbGxob3VzZURpciwgJy50ZWxlbWV0cnktaWQnKSxcbiAgICAgIGxvZ1BhdGg6IHBhdGguam9pbihkb2xsaG91c2VEaXIsICd0ZWxlbWV0cnkubG9nJyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgaW5zdGFsbGF0aW9uIFVVSUQgZXhpc3RzLCBnZW5lcmF0aW5nIGlmIG5lZWRlZFxuICAgKiBVVUlEIGlzIHBlcnNpc3RlbnQgYWNyb3NzIHNlcnZlciByZXN0YXJ0cyBidXQgdW5pcXVlIHBlciBpbnN0YWxsYXRpb25cbiAgICogQHJldHVybnMgSW5zdGFsbGF0aW9uIFVVSUQgb3IgbnVsbCBpZiB0ZWxlbWV0cnkgZGlzYWJsZWQgb3IgZXJyb3JcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVVVJRCgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgICAgLy8gUmV0dXJuIGNhY2hlZCBVVUlEIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgICBpZiAodGhpcy5pbnN0YWxsSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFsbElkO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBVVUlEIGZpbGUgZXhpc3RzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShjb25maWcuaW5zdGFsbElkUGF0aCwge1xuICAgICAgICAgIHNvdXJjZTogJ09wZXJhdGlvbmFsVGVsZW1ldHJ5LmVuc3VyZVVVSUQnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA0IC0gTm9ybWFsaXplIFVuaWNvZGUgaW4gZmlsZSBjb250ZW50IHRvIHByZXZlbnQgYXR0YWNrc1xuICAgICAgICBjb25zdCBub3JtYWxpemVkUmVzdWx0ID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZXhpc3RpbmdJZCk7XG4gICAgICAgIGNvbnN0IHRyaW1tZWRJZCA9IG5vcm1hbGl6ZWRSZXN1bHQubm9ybWFsaXplZENvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA2IC0gTG9nIHNlY3VyaXR5LXJlbGV2YW50IFVVSUQgdmFsaWRhdGlvbiBvcGVyYXRpb25cbiAgICAgICAgLy8gVmFsaWRhdGUgVVVJRCBmb3JtYXQgKGJhc2ljIGNoZWNrKVxuICAgICAgICBpZiAodHJpbW1lZElkICYmIC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tNFswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfSQvaS50ZXN0KHRyaW1tZWRJZCkpIHtcbiAgICAgICAgICB0aGlzLmluc3RhbGxJZCA9IHRyaW1tZWRJZDtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFRlbGVtZXRyeTogTG9hZGVkIGV4aXN0aW5nIGluc3RhbGxhdGlvbiBJRDogJHt0cmltbWVkSWQuc3Vic3RyaW5nKDAsIDgpfS4uLmApO1xuXG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICd0ZWxlbWV0cnknLFxuICAgICAgICAgICAgZGV0YWlsczogJ0luc3RhbGxhdGlvbiBVVUlEIHZhbGlkYXRlZCBzdWNjZXNzZnVsbHkgZnJvbSBwZXJzaXN0ZW50IHN0b3JhZ2UnXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YWxsSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTG9nIHZhbGlkYXRpb24gZmFpbHVyZSBpZiBVVUlEIGZvcm1hdCBpcyBpbnZhbGlkXG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICBzb3VyY2U6ICd0ZWxlbWV0cnknLFxuICAgICAgICAgICAgZGV0YWlsczogJ0ludmFsaWQgVVVJRCBmb3JtYXQgZGV0ZWN0ZWQgaW4gdGVsZW1ldHJ5IElEIGZpbGUnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaXMgdW5yZWFkYWJsZSwgd2lsbCBnZW5lcmF0ZSBuZXcgVVVJRFxuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogTm8gZXhpc3RpbmcgaW5zdGFsbGF0aW9uIElEIGZvdW5kLCBnZW5lcmF0aW5nIG5ldyBvbmUnKTtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgbmV3IFVVSUQgdjRcbiAgICAgIHRoaXMuaW5zdGFsbElkID0gdXVpZHY0KCk7XG5cbiAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShwYXRoLmRpcm5hbWUoY29uZmlnLmluc3RhbGxJZFBhdGgpKTtcblxuICAgICAgLy8gV3JpdGUgVVVJRCB0byBmaWxlXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShjb25maWcuaW5zdGFsbElkUGF0aCwgdGhpcy5pbnN0YWxsSWQsIHtcbiAgICAgICAgc291cmNlOiAnT3BlcmF0aW9uYWxUZWxlbWV0cnkuZW5zdXJlVVVJRCdcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYFRlbGVtZXRyeTogR2VuZXJhdGVkIG5ldyBpbnN0YWxsYXRpb24gSUQ6ICR7dGhpcy5pbnN0YWxsSWQuc3Vic3RyaW5nKDAsIDgpfS4uLmApO1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFsbElkO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWlsIGdyYWNlZnVsbHkgLSBsb2cgYnV0IGRvbid0IHRocm93XG4gICAgICBsb2dnZXIuZGVidWcoYFRlbGVtZXRyeTogRmFpbGVkIHRvIGVuc3VyZSBVVUlEOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIGlzIHRoZSBmaXJzdCBydW4gZm9yIGN1cnJlbnQgdmVyc2lvblxuICAgKiBMb29rcyBmb3IgZXhpc3RpbmcgaW5zdGFsbGF0aW9uIGV2ZW50IHdpdGggY3VycmVudCBVVUlEIGFuZCB2ZXJzaW9uXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcnVuIChubyBtYXRjaGluZyBpbnN0YWxsIGV2ZW50IGZvdW5kKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpc0ZpcnN0UnVuKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0ZWxlbWV0cnkgbG9nIGV4aXN0c1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbG9nQ29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoY29uZmlnLmxvZ1BhdGgsIHtcbiAgICAgICAgICBzb3VyY2U6ICdPcGVyYXRpb25hbFRlbGVtZXRyeS5pc0ZpcnN0UnVuJ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGSVg6IERNQ1AtU0VDLTAwNCAtIE5vcm1hbGl6ZSBVbmljb2RlIGluIGxvZyBjb250ZW50IGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShsb2dDb250ZW50KTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBub3JtYWxpemVkUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50LnRyaW0oKS5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYW55IGxpbmUgY29udGFpbnMgYW4gaW5zdGFsbCBldmVudCB3aXRoIGN1cnJlbnQgVVVJRCBhbmQgdmVyc2lvblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgICBpZiAoIWxpbmUudHJpbSgpKSBjb250aW51ZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IEpTT04ucGFyc2UobGluZSkgYXMgSW5zdGFsbGF0aW9uRXZlbnQ7XG5cbiAgICAgICAgICAgIC8vIEZvdW5kIG1hdGNoaW5nIGluc3RhbGwgZXZlbnQgZm9yIHRoaXMgVVVJRCBhbmQgdmVyc2lvblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBldmVudC5ldmVudCA9PT0gJ2luc3RhbGwnICYmXG4gICAgICAgICAgICAgIGV2ZW50Lmluc3RhbGxfaWQgPT09IHRoaXMuaW5zdGFsbElkICYmXG4gICAgICAgICAgICAgIGV2ZW50LnZlcnNpb24gPT09IFZFUlNJT05cbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFRlbGVtZXRyeTogRm91bmQgZXhpc3RpbmcgaW5zdGFsbGF0aW9uIGV2ZW50IGZvciB2ZXJzaW9uICR7VkVSU0lPTn1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gU2tpcCBtYWxmb3JtZWQgbGluZXNcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIG1hdGNoaW5nIGluc3RhbGwgZXZlbnQgZm91bmRcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBUZWxlbWV0cnk6IE5vIGluc3RhbGxhdGlvbiBldmVudCBmb3VuZCBmb3IgdmVyc2lvbiAke1ZFUlNJT059YCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIExvZyBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgaXMgdW5yZWFkYWJsZSAtIHRyZWF0IGFzIGZpcnN0IHJ1blxuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogTm8gZXhpc3RpbmcgbG9nIGZpbGUsIHRyZWF0aW5nIGFzIGZpcnN0IHJ1bicpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFpbCBncmFjZWZ1bGx5IC0gaWYgd2UgY2FuJ3QgZGV0ZXJtaW5lLCBhc3N1bWUgbm90IGZpcnN0IHJ1biB0byBhdm9pZCBkdXBsaWNhdGUgZXZlbnRzXG4gICAgICBsb2dnZXIuZGVidWcoYFRlbGVtZXRyeTogRXJyb3IgY2hlY2tpbmcgZmlyc3QgcnVuIHN0YXR1czogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBNQ1AgY2xpZW50IGVudmlyb25tZW50XG4gICAqIFVzZXMgZGVkaWNhdGVkIGNsaWVudERldGVjdG9yIG1vZHVsZSBmb3IgY29uc2lzdGVuY3lcbiAgICogQHJldHVybnMgQ2xpZW50IGlkZW50aWZpZXIgc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIGdldE1DUENsaWVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBkZXRlY3RNQ1BDbGllbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgaW5zdGFsbGF0aW9uIGV2ZW50IHRvIHRlbGVtZXRyeSBsb2dcbiAgICogQXBwZW5kcyBKU09OIGxpbmUgdG8gbG9nIGZpbGUgKEpTT05MIGZvcm1hdClcbiAgICogQWxzbyBzZW5kcyB0byBQb3N0SG9nIGlmIGNvbmZpZ3VyZWRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVjb3JkSW5zdGFsbGF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuaW5zdGFsbElkKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnVGVsZW1ldHJ5OiBDYW5ub3QgcmVjb3JkIGluc3RhbGxhdGlvbiAtIG5vIGluc3RhbGxhdGlvbiBJRCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG5cbiAgICAgIC8vIENyZWF0ZSBpbnN0YWxsYXRpb24gZXZlbnRcbiAgICAgIGNvbnN0IGV2ZW50OiBJbnN0YWxsYXRpb25FdmVudCA9IHtcbiAgICAgICAgZXZlbnQ6ICdpbnN0YWxsJyxcbiAgICAgICAgaW5zdGFsbF9pZDogdGhpcy5pbnN0YWxsSWQsXG4gICAgICAgIHZlcnNpb246IFZFUlNJT04sXG4gICAgICAgIG9zOiBvcy5wbGF0Zm9ybSgpLFxuICAgICAgICBub2RlX3ZlcnNpb246IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgbWNwX2NsaWVudDogdGhpcy5nZXRNQ1BDbGllbnQoKSxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuXG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkocGF0aC5kaXJuYW1lKGNvbmZpZy5sb2dQYXRoKSk7XG5cbiAgICAgIC8vIEFwcGVuZCBldmVudCBhcyBKU09OIGxpbmUgKEpTT05MIGZvcm1hdCkgdG8gbG9jYWwgbG9nXG4gICAgICBjb25zdCBsb2dMaW5lID0gSlNPTi5zdHJpbmdpZnkoZXZlbnQpICsgJ1xcbic7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmFwcGVuZEZpbGUoY29uZmlnLmxvZ1BhdGgsIGxvZ0xpbmUsIHtcbiAgICAgICAgc291cmNlOiAnT3BlcmF0aW9uYWxUZWxlbWV0cnkucmVjb3JkSW5zdGFsbGF0aW9uJ1xuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFRlbGVtZXRyeTogUmVjb3JkZWQgaW5zdGFsbGF0aW9uIGV2ZW50IC0gdmVyc2lvbj0ke2V2ZW50LnZlcnNpb259LCBvcz0ke2V2ZW50Lm9zfSwgY2xpZW50PSR7ZXZlbnQubWNwX2NsaWVudH1gXG4gICAgICApO1xuICAgICAgdGhpcy5sb2dMaXN0ZW5lcj8uKCdpbmZvJywgJ1JlY29yZCBpbnN0YWxsYXRpb24nLCB7XG4gICAgICAgIHZlcnNpb246IGV2ZW50LnZlcnNpb24sXG4gICAgICAgIG9zOiBldmVudC5vcyxcbiAgICAgICAgbWNwX2NsaWVudDogZXZlbnQubWNwX2NsaWVudCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZW5kIHRvIFBvc3RIb2cgaWYgZW5hYmxlZCBhbmQgcmVtb3RlIHRlbGVtZXRyeSBub3QgZGlzYWJsZWRcbiAgICAgIGlmICh0aGlzLnBvc3Rob2cgJiYgcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1RFTEVNRVRSWV9OT19SRU1PVEUgIT09ICd0cnVlJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucG9zdGhvZy5jYXB0dXJlKHtcbiAgICAgICAgICAgIGRpc3RpbmN0SWQ6IHRoaXMuaW5zdGFsbElkLFxuICAgICAgICAgICAgZXZlbnQ6ICdzZXJ2ZXJfaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgdmVyc2lvbjogVkVSU0lPTixcbiAgICAgICAgICAgICAgb3M6IG9zLnBsYXRmb3JtKCksXG4gICAgICAgICAgICAgIG5vZGVfdmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgICAgICAgICBtY3BfY2xpZW50OiB0aGlzLmdldE1DUENsaWVudCgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEZsdXNoIGltbWVkaWF0ZWx5IHRvIGVuc3VyZSBldmVudCBpcyBzZW50XG4gICAgICAgICAgYXdhaXQgdGhpcy5wb3N0aG9nLmZsdXNoKCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdUZWxlbWV0cnk6IFNlbnQgaW5zdGFsbGF0aW9uIGV2ZW50IHRvIFBvc3RIb2cnKTtcbiAgICAgICAgfSBjYXRjaCAocG9zdGhvZ0Vycm9yKSB7XG4gICAgICAgICAgLy8gRmFpbCBncmFjZWZ1bGx5IC0gUG9zdEhvZyBlcnJvcnMgc2hvdWxkbid0IGJyZWFrIHRlbGVtZXRyeVxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBUZWxlbWV0cnk6IEZhaWxlZCB0byBzZW5kIHRvIFBvc3RIb2c6ICR7cG9zdGhvZ0Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBwb3N0aG9nRXJyb3IubWVzc2FnZSA6IFN0cmluZyhwb3N0aG9nRXJyb3IpfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhaWwgZ3JhY2VmdWxseSAtIGxvZyBidXQgZG9uJ3QgdGhyb3dcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFRlbGVtZXRyeTogRmFpbGVkIHRvIHJlY29yZCBpbnN0YWxsYXRpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIHRlbGVtZXRyeSBldmVudCB0byBsb2cgZmlsZVxuICAgKiBJbnRlcm5hbCBtZXRob2QgZm9yIGFwcGVuZGluZyBldmVudHMgdG8gdGVsZW1ldHJ5LmxvZ1xuICAgKiBAcGFyYW0gZXZlbnQgLSBFdmVudCBvYmplY3QgdG8gd3JpdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVFdmVudChldmVudDogSW5zdGFsbGF0aW9uRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHBhdGguZGlybmFtZShjb25maWcubG9nUGF0aCkpO1xuXG4gICAgICAvLyBBcHBlbmQgZXZlbnQgYXMgSlNPTiBsaW5lIChKU09OTCBmb3JtYXQpXG4gICAgICBjb25zdCBsb2dMaW5lID0gSlNPTi5zdHJpbmdpZnkoZXZlbnQpICsgJ1xcbic7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmFwcGVuZEZpbGUoY29uZmlnLmxvZ1BhdGgsIGxvZ0xpbmUsIHtcbiAgICAgICAgc291cmNlOiAnT3BlcmF0aW9uYWxUZWxlbWV0cnkud3JpdGVFdmVudCdcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWlsIGdyYWNlZnVsbHkgLSBsb2cgYnV0IGRvbid0IHRocm93XG4gICAgICBsb2dnZXIuZGVidWcoYFRlbGVtZXRyeTogRmFpbGVkIHRvIHdyaXRlIGV2ZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0ZWxlbWV0cnkgc3lzdGVtXG4gICAqIENoZWNrcyBvcHQtb3V0IHN0YXR1cywgZ2VuZXJhdGVzIFVVSUQgaWYgbmVlZGVkLCByZWNvcmRzIGluc3RhbGxhdGlvbiBldmVudCBvbiBmaXJzdCBydW5cbiAgICpcbiAgICogU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzIC0gd2lsbCBvbmx5IGluaXRpYWxpemUgb25jZVxuICAgKiBBbHdheXMgZmFpbHMgZ3JhY2VmdWxseSAtIGVycm9ycyBhcmUgbG9nZ2VkIGJ1dCBuZXZlciB0aHJvd25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBPbmx5IGluaXRpYWxpemUgb25jZVxuICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdUZWxlbWV0cnk6IEFscmVhZHkgaW5pdGlhbGl6ZWQsIHNraXBwaW5nJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGVsZW1ldHJ5IGlzIGVuYWJsZWRcbiAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogRGlzYWJsZWQgdmlhIERPTExIT1VTRV9URUxFTUVUUlkgZW52aXJvbm1lbnQgdmFyaWFibGUnKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmRlYnVnKCdUZWxlbWV0cnk6IEluaXRpYWxpemluZyBvcGVyYXRpb25hbCB0ZWxlbWV0cnkgc3lzdGVtJyk7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgUG9zdEhvZyBmb3IgcmVtb3RlIHRlbGVtZXRyeSAob3B0aW9uYWwsIG9wdC1pbilcbiAgICAgIHRoaXMuaW5pdFBvc3RIb2coKTtcblxuICAgICAgLy8gRW5zdXJlIGluc3RhbGxhdGlvbiBVVUlEIGV4aXN0c1xuICAgICAgY29uc3QgdXVpZCA9IGF3YWl0IHRoaXMuZW5zdXJlVVVJRCgpO1xuICAgICAgaWYgKCF1dWlkKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnVGVsZW1ldHJ5OiBGYWlsZWQgdG8gZW5zdXJlIFVVSUQsIHNraXBwaW5nIGluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHJ1blxuICAgICAgY29uc3QgZmlyc3RSdW4gPSBhd2FpdCB0aGlzLmlzRmlyc3RSdW4oKTtcbiAgICAgIGlmIChmaXJzdFJ1bikge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogRmlyc3QgcnVuIGRldGVjdGVkLCByZWNvcmRpbmcgaW5zdGFsbGF0aW9uIGV2ZW50Jyk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVjb3JkSW5zdGFsbGF0aW9uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogSW5zdGFsbGF0aW9uIGV2ZW50IGFscmVhZHkgcmVjb3JkZWQgZm9yIHRoaXMgdmVyc2lvbicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnVGVsZW1ldHJ5OiBJbml0aWFsaXphdGlvbiBjb21wbGV0ZScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWlsIGdyYWNlZnVsbHkgLSBsb2cgZXJyb3IgYnV0IG1hcmsgYXMgaW5pdGlhbGl6ZWQgdG8gcHJldmVudCByZXRyeSBsb29wc1xuICAgICAgbG9nZ2VyLmRlYnVnKGBUZWxlbWV0cnk6IEluaXRpYWxpemF0aW9uIGVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYXV0by1sb2FkIG1ldHJpY3MgdG8gdGVsZW1ldHJ5IGxvZ1xuICAgKiBAcGFyYW0gbWV0cmljcyBBdXRvLWxvYWQgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY29yZEF1dG9Mb2FkTWV0cmljcyhtZXRyaWNzOiBBdXRvTG9hZE1ldHJpY3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgICAgLy8gQXBwZW5kIHRvIHRlbGVtZXRyeSBsb2cgKEpTT05MIGZvcm1hdClcbiAgICAgIGNvbnN0IGxvZ0VudHJ5ID0ge1xuICAgICAgICBldmVudDogJ2F1dG9sb2FkX21ldHJpY3MnLFxuICAgICAgICAuLi5tZXRyaWNzLFxuICAgICAgICBpbnN0YWxsSWQ6IHRoaXMuaW5zdGFsbElkXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmFwcGVuZEZpbGUoXG4gICAgICAgIGNvbmZpZy5sb2dQYXRoLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShsb2dFbnRyeSkgKyAnXFxuJyxcbiAgICAgICAgeyBzb3VyY2U6ICdPcGVyYXRpb25hbFRlbGVtZXRyeS5yZWNvcmRBdXRvTG9hZE1ldHJpY3MnIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIFNlbmQgdG8gUG9zdEhvZyBpZiBjb25maWd1cmVkXG4gICAgICBpZiAodGhpcy5wb3N0aG9nICYmIHRoaXMuaW5zdGFsbElkKSB7XG4gICAgICAgIHRoaXMucG9zdGhvZy5jYXB0dXJlKHtcbiAgICAgICAgICBkaXN0aW5jdElkOiB0aGlzLmluc3RhbGxJZCxcbiAgICAgICAgICBldmVudDogJ2F1dG9sb2FkX21ldHJpY3MnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IG1ldHJpY3NcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZygnW1RlbGVtZXRyeV0gUmVjb3JkZWQgYXV0by1sb2FkIG1ldHJpY3M6JywgbWV0cmljcyk7XG4gICAgICB0aGlzLmxvZ0xpc3RlbmVyPy4oJ2RlYnVnJywgJ1JlY29yZCBhdXRvLWxvYWQgbWV0cmljcycsIG1ldHJpY3MgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhaWwgZ3JhY2VmdWxseVxuICAgICAgbG9nZ2VyLmRlYnVnKGBbVGVsZW1ldHJ5XSBGYWlsZWQgdG8gcmVjb3JkIGF1dG8tbG9hZCBtZXRyaWNzOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaHV0ZG93biB0ZWxlbWV0cnkgc3lzdGVtXG4gICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgUG9zdEhvZyBldmVudHMgYW5kIGNsZWFucyB1cCByZXNvdXJjZXNcbiAgICogU2FmZSB0byBjYWxsIGV2ZW4gaWYgbm90IGluaXRpYWxpemVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnBvc3Rob2cpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdUZWxlbWV0cnk6IFNodXR0aW5nIGRvd24gUG9zdEhvZyBjbGllbnQnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wb3N0aG9nLnNodXRkb3duKCk7XG4gICAgICAgIHRoaXMucG9zdGhvZyA9IG51bGw7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhaWwgZ3JhY2VmdWxseSAtIGxvZyBidXQgZG9uJ3QgdGhyb3dcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVGVsZW1ldHJ5OiBFcnJvciBkdXJpbmcgc2h1dGRvd246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxufVxuIl19
461
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uYWxUZWxlbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVsZW1ldHJ5L09wZXJhdGlvbmFsVGVsZW1ldHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBRUgsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsSUFBSSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR2pFLGlFQUFpRTtBQUNqRSxnRUFBZ0U7QUFDaEUsa0VBQWtFO0FBQ2xFLE1BQU0sMkJBQTJCLEdBQUcsaURBQWlELENBQUM7QUFFdEYsTUFBTSxPQUFPLG9CQUFvQjtJQVdYO0lBVlosU0FBUyxHQUFrQixJQUFJLENBQUM7SUFDaEMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUNwQixPQUFPLEdBQW1CLElBQUksQ0FBQztJQUMvQixXQUFXLENBQXlHO0lBRTVILGNBQWMsQ0FBQyxFQUF5RztRQUN0SCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixPQUFPLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxD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Q0FBQyxDQUFDO2dCQUN4RCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLHdDQUF3QztZQUN4QyxNQUFNLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlHLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9wZXJhdGlvbmFsIFRlbGVtZXRyeSBTeXN0ZW1cbiAqXG4gKiBQcml2YWN5LWZpcnN0IGFub255bW91cyBpbnN0YWxsYXRpb24gYW5hbHl0aWNzXG4gKlxuICogV2hhdCBpcyBjb2xsZWN0ZWQ6XG4gKiAtIEFub255bW91cyBpbnN0YWxsYXRpb24gVVVJRCAoZ2VuZXJhdGVkIGxvY2FsbHksIHBlcnNpc3RlbnQgcGVyIGluc3RhbGwpXG4gKiAtIFNlcnZlciB2ZXJzaW9uLCBPUyB0eXBlLCBOb2RlLmpzIHZlcnNpb24sIE1DUCBjbGllbnQgdHlwZVxuICogLSBJbnN0YWxsYXRpb24gdGltZXN0YW1wXG4gKlxuICogV2hhdCBpcyBOT1QgY29sbGVjdGVkOlxuICogLSBVc2VyIGlkZW50aXR5LCBwZXJzb25hbCBpbmZvcm1hdGlvbiwgb3IgaWRlbnRpZmlhYmxlIGRhdGFcbiAqIC0gRWxlbWVudCBjb250ZW50LCBwZXJzb25hIGRhdGEsIG9yIHVzZXItY3JlYXRlZCBjb250ZW50XG4gKiAtIFVzYWdlIHBhdHRlcm5zLCBjb21tYW5kcywgb3IgaW50ZXJhY3Rpb25zXG4gKiAtIE5ldHdvcmsgZGF0YSwgZmlsZSBwYXRocywgb3Igc3lzdGVtIGRldGFpbHMgYmV5b25kIE9TIHR5cGVcbiAqXG4gKiBUZWxlbWV0cnkgY29udHJvbDpcbiAqIC0gRE9MTEhPVVNFX1RFTEVNRVRSWT10cnVlICAtIEVuYWJsZXMgbG9jYWwgdGVsZW1ldHJ5IChkZWZhdWx0OiBPRkYpXG4gKiAtIERPTExIT1VTRV9URUxFTUVUUlk9ZmFsc2UgLSBEaXNhYmxlcyBhbGwgdGVsZW1ldHJ5IChsb2NhbCBhbmQgcmVtb3RlKVxuICogLSBET0xMSE9VU0VfVEVMRU1FVFJZX09QVElOPXRydWUgLSBFbmFibGVzIHJlbW90ZSB0ZWxlbWV0cnkgd2l0aCBkZWZhdWx0IFBvc3RIb2cgcHJvamVjdFxuICogLSBET0xMSE9VU0VfVEVMRU1FVFJZX05PX1JFTU9URT10cnVlIC0gTG9jYWwgdGVsZW1ldHJ5IG9ubHksIG5vIFBvc3RIb2dcbiAqIC0gUE9TVEhPR19BUElfS0VZIC0gQ3VzdG9tIFBvc3RIb2cgcHJvamVjdCBrZXkgKG92ZXJyaWRlcyBkZWZhdWx0KVxuICogLSBEZWxldGUgdGVsZW1ldHJ5IGZpbGVzOiBybSB+Ly5kb2xsaG91c2UvLnRlbGVtZXRyeS1pZCB+Ly5kb2xsaG91c2UvdGVsZW1ldHJ5LmxvZ1xuICpcbiAqIERhdGEgc3RvcmFnZSAob25seSB3aGVuIGVuYWJsZWQpOlxuICogLSBMb2NhbDogfi8uZG9sbGhvdXNlLy50ZWxlbWV0cnktaWQgKFVVSUQpIGFuZCB+Ly5kb2xsaG91c2UvdGVsZW1ldHJ5LmxvZyAoZXZlbnRzKVxuICogLSBSZW1vdGUgKG9wdC1pbik6IFBvc3RIb2cgYW5hbHl0aWNzIHdoZW4gRE9MTEhPVVNFX1RFTEVNRVRSWV9PUFRJTj10cnVlIG9yIFBPU1RIT0dfQVBJX0tFWSBpcyBzZXRcbiAqXG4gKiBEZXNpZ24gcHJpbmNpcGxlczpcbiAqIC0gRmFpbCBncmFjZWZ1bGx5OiBlcnJvcnMgbmV2ZXIgY3Jhc2ggdGhlIHNlcnZlclxuICogLSBEZWJ1Zy1vbmx5IGxvZ2dpbmc6IG5vIHVzZXItZmFjaW5nIHRlbGVtZXRyeSBub2lzZVxuICogLSBDaGVjayBvcHQtb3V0IGVhcmx5OiBubyBmaWxlIG9wZXJhdGlvbnMgaWYgZGlzYWJsZWRcbiAqIC0gUmVtb3RlIHRlbGVtZXRyeSBpcyBvcHQtaW46IHJlcXVpcmVzIERPTExIT1VTRV9URUxFTUVUUllfT1BUSU49dHJ1ZSBvciBleHBsaWNpdCBQT1NUSE9HX0FQSV9LRVlcbiAqIC0gTG9jYWwgdGVsZW1ldHJ5IGlzIG9wdC1pbjogcmVxdWlyZXMgRE9MTEhPVVNFX1RFTEVNRVRSWT10cnVlXG4gKi9cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IFBvc3RIb2cgfSBmcm9tICdwb3N0aG9nLW5vZGUnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFBBQ0tBR0VfVkVSU0lPTiBhcyBWRVJTSU9OIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBJbnN0YWxsYXRpb25FdmVudCwgVGVsZW1ldHJ5Q29uZmlnLCBBdXRvTG9hZE1ldHJpY3MgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRldGVjdE1DUENsaWVudCB9IGZyb20gJy4vY2xpZW50RGV0ZWN0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgSUZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5cbi8vIFBvc3RIb2cgUHJvamVjdCBBUEkgS2V5IChzYWZlIHRvIGV4cG9zZSBwdWJsaWNseSAtIHdyaXRlLW9ubHkpXG4vLyBVc2VkIGZvciBvcHQtaW4gdGVsZW1ldHJ5IHdoZW4gRE9MTEhPVVNFX1RFTEVNRVRSWV9PUFRJTj10cnVlXG4vLyBDYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIFBPU1RIT0dfQVBJX0tFWSBmb3IgY3VzdG9tIGluc3RhbGxhdGlvbnNcbmNvbnN0IERFRkFVTFRfUE9TVEhPR19QUk9KRUNUX0tFWSA9ICdwaGNfeEZKS0lIQXFSWDFZTGEwVFNkVEd3R2oxOWQxSmVvWERLakpOWXE0OTJ2cSc7XG5cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25hbFRlbGVtZXRyeSB7XG4gIHByaXZhdGUgaW5zdGFsbElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIHBvc3Rob2c6IFBvc3RIb2cgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2dMaXN0ZW5lcj86IChsZXZlbDogJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuXG4gIGFkZExvZ0xpc3RlbmVyKGZuOiAobGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubG9nTGlzdGVuZXIgPSBmbjtcbiAgICByZXR1cm4gKCkgPT4geyB0aGlzLmxvZ0xpc3RlbmVyID0gdW5kZWZpbmVkOyB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmaWxlT3BlcmF0aW9uczogSUZpbGVPcGVyYXRpb25zU2VydmljZSkge31cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGVsZW1ldHJ5IGlzIGVuYWJsZWRcbiAgICogUmVzcGVjdHMgRE9MTEhPVVNFX1RFTEVNRVRSWSBlbnZpcm9ubWVudCB2YXJpYWJsZSAoZGVmYXVsdDogZmFsc2Uvb3B0LWluKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRlbGVtZXRyeSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZW52VmFsdWUgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVEVMRU1FVFJZO1xuXG4gICAgaWYgKCFlbnZWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBlbnZWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9ybWFsaXplZCA9PT0gJ3RydWUnIHx8IG5vcm1hbGl6ZWQgPT09ICcxJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWQgPT09ICdmYWxzZScgfHwgbm9ybWFsaXplZCA9PT0gJzAnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVW5yZWNvZ25pemVkIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBkaXNhYmxlZCBpbiBvcHQtaW4gbW9kZWxcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBQb3N0SG9nIGNsaWVudCBmb3IgcmVtb3RlIHRlbGVtZXRyeVxuICAgKlxuICAgKiBUaHJlZSB3YXlzIHRvIGVuYWJsZSByZW1vdGUgdGVsZW1ldHJ5OlxuICAgKiAxLiBET0xMSE9VU0VfVEVMRU1FVFJZX09QVElOPXRydWUgLSBVc2VzIGRlZmF1bHQgUG9zdEhvZyBwcm9qZWN0IChzaW1wbGVzdCBvcHQtaW4pXG4gICAqIDIuIFBPU1RIT0dfQVBJX0tFWT08a2V5PiAtIFVzZXMgY3VzdG9tIFBvc3RIb2cgcHJvamVjdCAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICogMy4gRE9MTEhPVVNFX1RFTEVNRVRSWV9PUFRJTj10cnVlIHdpdGggUE9TVEhPR19BUElfS0VZPTxrZXk+IC0gQ3VzdG9tIGtleSB0YWtlcyBwcmVjZWRlbmNlXG4gICAqXG4gICAqIFBvc3RIb2cgcHJvamVjdCBrZXlzIGFyZSBzYWZlIHRvIGV4cG9zZSBwdWJsaWNseSAtIHRoZXkgYXJlIHdyaXRlLW9ubHkgYW5kIGNhbm5vdFxuICAgKiBiZSB1c2VkIHRvIHJlYWQgZGF0YS4gVGhpcyBhbGxvd3MgZW1iZWRkaW5nIGEgZGVmYXVsdCBrZXkgZm9yIHNpbXBsZSBvcHQtaW4gdGVsZW1ldHJ5LlxuICAgKlxuICAgKiBSZXNwZWN0cyBET0xMSE9VU0VfVEVMRU1FVFJZX05PX1JFTU9URT10cnVlIHRvIGRpc2FibGUgYWxsIHJlbW90ZSB0ZWxlbWV0cnlcbiAgICovXG4gIHByaXZhdGUgaW5pdFBvc3RIb2coKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNraXAgaWYgUG9zdEhvZyBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpZiAodGhpcy5wb3N0aG9nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBpZiByZW1vdGUgdGVsZW1ldHJ5IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICAgIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfVEVMRU1FVFJZX05PX1JFTU9URSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnVGVsZW1ldHJ5OiBSZW1vdGUgdGVsZW1ldHJ5IGRpc2FibGVkIHZpYSBET0xMSE9VU0VfVEVMRU1FVFJZX05PX1JFTU9URScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIERldGVybWluZSBpZiB1c2VyIGhhcyBvcHRlZCBpbiBhbmQgd2hpY2ggQVBJIGtleSB0byB1c2VcbiAgICAgIGNvbnN0IG9wdGVkSW4gPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVEVMRU1FVFJZX09QVElOID09PSAndHJ1ZSc7XG4gICAgICBjb25zdCBjdXN0b21BcGlLZXkgPSBwcm9jZXNzLmVudi5QT1NUSE9HX0FQSV9LRVk7XG5cbiAgICAgIC8vIFNlbGVjdCBBUEkga2V5OiBjdXN0b20ga2V5IHRha2VzIHByZWNlZGVuY2UsIHRoZW4gZGVmYXVsdCBpZiBvcHRlZCBpblxuICAgICAgbGV0IGFwaUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAoY3VzdG9tQXBpS2V5KSB7XG4gICAgICAgIGFwaUtleSA9IGN1c3RvbUFwaUtleTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdUZWxlbWV0cnk6IFVzaW5nIGN1c3RvbSBQT1NUSE9HX0FQSV9LRVknKTtcbiAgICAgIH0gZWxzZSBpZiAob3B0ZWRJbikge1xuICAgICAgICBhcGlLZXkgPSBERUZBVUxUX1BPU1RIT0dfUFJPSkVDVF9LRVk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnVGVsZW1ldHJ5OiBVc2luZyBkZWZhdWx0IFBvc3RIb2cgcHJvamVjdCBrZXkgKG9wdGVkIGluIHZpYSBET0xMSE9VU0VfVEVMRU1FVFJZX09QVElOKScpO1xuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIGlmIG5vIEFQSSBrZXkgYXZhaWxhYmxlIChub3Qgb3B0ZWQgaW4gYW5kIG5vIGN1c3RvbSBrZXkpXG4gICAgICBpZiAoIWFwaUtleSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogUmVtb3RlIHRlbGVtZXRyeSBub3QgZW5hYmxlZCAobm8gb3B0LWluIG9yIEFQSSBrZXkpJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSBQb3N0SG9nIGNsaWVudFxuICAgICAgY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LlBPU1RIT0dfSE9TVCB8fCAnaHR0cHM6Ly9hcHAucG9zdGhvZy5jb20nO1xuICAgICAgdGhpcy5wb3N0aG9nID0gbmV3IFBvc3RIb2coYXBpS2V5LCB7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGZsdXNoQXQ6IDEsIC8vIEZsdXNoIGltbWVkaWF0ZWx5IGZvciBzZXJ2ZXIgZW52aXJvbm1lbnRzXG4gICAgICAgIGZsdXNoSW50ZXJ2YWw6IDEwMDAwLCAvLyBGbHVzaCBldmVyeSAxMCBzZWNvbmRzIGFzIGJhY2t1cFxuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVGVsZW1ldHJ5OiBQb3N0SG9nIGluaXRpYWxpemVkIHdpdGggaG9zdDogJHtob3N0fWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWlsIGdyYWNlZnVsbHkgLSBsb2cgYnV0IGRvbid0IHRocm93XG4gICAgICBsb2dnZXIuZGVidWcoYFRlbGVtZXRyeTogRmFpbGVkIHRvIGluaXRpYWxpemUgUG9zdEhvZzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICB0aGlzLnBvc3Rob2cgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGVsZW1ldHJ5IGNvbmZpZ3VyYXRpb24gcGF0aHNcbiAgICogQHJldHVybnMgQ29uZmlndXJhdGlvbiB3aXRoIHBhdGhzIHRvIHRlbGVtZXRyeSBmaWxlc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb25maWcoKTogVGVsZW1ldHJ5Q29uZmlnIHtcbiAgICAvLyBBbGxvdyBvdmVycmlkaW5nIGhvbWUgZGlyZWN0b3J5IHZpYSBET0xMSE9VU0VfSE9NRV9ESVIgKGZvciB0ZXN0aW5nKVxuICAgIC8vIFRoaXMgZm9sbG93cyB0aGUgcGF0dGVybiB1c2VkIGJ5IERPTExIT1VTRV9QT1JURk9MSU9fRElSIGFuZCBET0xMSE9VU0VfQ0FDSEVfRElSXG4gICAgY29uc3QgaG9tZURpciA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9IT01FX0RJUiB8fCBvcy5ob21lZGlyKCk7XG4gICAgY29uc3QgZG9sbGhvdXNlRGlyID0gcGF0aC5qb2luKGhvbWVEaXIsICcuZG9sbGhvdXNlJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuYWJsZWQ6IHRoaXMuaXNFbmFibGVkKCksXG4gICAgICBpbnN0YWxsSWRQYXRoOiBwYXRoLmpvaW4oZG9sbGhvdXNlRGlyLCAnLnRlbGVtZXRyeS1pZCcpLFxuICAgICAgbG9nUGF0aDogcGF0aC5qb2luKGRvbGxob3VzZURpciwgJ3RlbGVtZXRyeS5sb2cnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBpbnN0YWxsYXRpb24gVVVJRCBleGlzdHMsIGdlbmVyYXRpbmcgaWYgbmVlZGVkXG4gICAqIFVVSUQgaXMgcGVyc2lzdGVudCBhY3Jvc3Mgc2VydmVyIHJlc3RhcnRzIGJ1dCB1bmlxdWUgcGVyIGluc3RhbGxhdGlvblxuICAgKiBAcmV0dXJucyBJbnN0YWxsYXRpb24gVVVJRCBvciBudWxsIGlmIHRlbGVtZXRyeSBkaXNhYmxlZCBvciBlcnJvclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVVVUlEKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuXG4gICAgICAvLyBSZXR1cm4gY2FjaGVkIFVVSUQgaWYgYWxyZWFkeSBsb2FkZWRcbiAgICAgIGlmICh0aGlzLmluc3RhbGxJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YWxsSWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIFVVSUQgZmlsZSBleGlzdHNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGNvbmZpZy5pbnN0YWxsSWRQYXRoLCB7XG4gICAgICAgICAgc291cmNlOiAnT3BlcmF0aW9uYWxUZWxlbWV0cnkuZW5zdXJlVVVJRCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRklYOiBETUNQLVNFQy0wMDQgLSBOb3JtYWxpemUgVW5pY29kZSBpbiBmaWxlIGNvbnRlbnQgdG8gcHJldmVudCBhdHRhY2tzXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShleGlzdGluZ0lkKTtcbiAgICAgICAgY29uc3QgdHJpbW1lZElkID0gbm9ybWFsaXplZFJlc3VsdC5ub3JtYWxpemVkQ29udGVudC50cmltKCk7XG5cbiAgICAgICAgLy8gRklYOiBETUNQLVNFQy0wMDYgLSBMb2cgc2VjdXJpdHktcmVsZXZhbnQgVVVJRCB2YWxpZGF0aW9uIG9wZXJhdGlvblxuICAgICAgICAvLyBWYWxpZGF0ZSBVVUlEIGZvcm1hdCAoYmFzaWMgY2hlY2spXG4gICAgICAgIGlmICh0cmltbWVkSWQgJiYgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS00WzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC9pLnRlc3QodHJpbW1lZElkKSkge1xuICAgICAgICAgIHRoaXMuaW5zdGFsbElkID0gdHJpbW1lZElkO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgVGVsZW1ldHJ5OiBMb2FkZWQgZXhpc3RpbmcgaW5zdGFsbGF0aW9uIElEOiAke3RyaW1tZWRJZC5zdWJzdHJpbmcoMCwgOCl9Li4uYCk7XG5cbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ3RlbGVtZXRyeScsXG4gICAgICAgICAgICBkZXRhaWxzOiAnSW5zdGFsbGF0aW9uIFVVSUQgdmFsaWRhdGVkIHN1Y2Nlc3NmdWxseSBmcm9tIHBlcnNpc3RlbnQgc3RvcmFnZSdcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbGxJZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBMb2cgdmFsaWRhdGlvbiBmYWlsdXJlIGlmIFVVSUQgZm9ybWF0IGlzIGludmFsaWRcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ3RlbGVtZXRyeScsXG4gICAgICAgICAgICBkZXRhaWxzOiAnSW52YWxpZCBVVUlEIGZvcm1hdCBkZXRlY3RlZCBpbiB0ZWxlbWV0cnkgSUQgZmlsZSdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCBvciBpcyB1bnJlYWRhYmxlLCB3aWxsIGdlbmVyYXRlIG5ldyBVVUlEXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnVGVsZW1ldHJ5OiBObyBleGlzdGluZyBpbnN0YWxsYXRpb24gSUQgZm91bmQsIGdlbmVyYXRpbmcgbmV3IG9uZScpO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSBuZXcgVVVJRCB2NFxuICAgICAgdGhpcy5pbnN0YWxsSWQgPSB1dWlkdjQoKTtcblxuICAgICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHBhdGguZGlybmFtZShjb25maWcuaW5zdGFsbElkUGF0aCkpO1xuXG4gICAgICAvLyBXcml0ZSBVVUlEIHRvIGZpbGVcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMud3JpdGVGaWxlKGNvbmZpZy5pbnN0YWxsSWRQYXRoLCB0aGlzLmluc3RhbGxJZCwge1xuICAgICAgICBzb3VyY2U6ICdPcGVyYXRpb25hbFRlbGVtZXRyeS5lbnN1cmVVVUlEJ1xuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVGVsZW1ldHJ5OiBHZW5lcmF0ZWQgbmV3IGluc3RhbGxhdGlvbiBJRDogJHt0aGlzLmluc3RhbGxJZC5zdWJzdHJpbmcoMCwgOCl9Li4uYCk7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YWxsSWQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhaWwgZ3JhY2VmdWxseSAtIGxvZyBidXQgZG9uJ3QgdGhyb3dcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVGVsZW1ldHJ5OiBGYWlsZWQgdG8gZW5zdXJlIFVVSUQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHJ1biBmb3IgY3VycmVudCB2ZXJzaW9uXG4gICAqIExvb2tzIGZvciBleGlzdGluZyBpbnN0YWxsYXRpb24gZXZlbnQgd2l0aCBjdXJyZW50IFVVSUQgYW5kIHZlcnNpb25cbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBydW4gKG5vIG1hdGNoaW5nIGluc3RhbGwgZXZlbnQgZm91bmQpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGlzRmlyc3RSdW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRlbGVtZXRyeSBsb2cgZXhpc3RzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBsb2dDb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShjb25maWcubG9nUGF0aCwge1xuICAgICAgICAgIHNvdXJjZTogJ09wZXJhdGlvbmFsVGVsZW1ldHJ5LmlzRmlyc3RSdW4nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZJWDogRE1DUC1TRUMtMDA0IC0gTm9ybWFsaXplIFVuaWNvZGUgaW4gbG9nIGNvbnRlbnQgYmVmb3JlIHByb2Nlc3NpbmdcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGxvZ0NvbnRlbnQpO1xuICAgICAgICBjb25zdCBsaW5lcyA9IG5vcm1hbGl6ZWRSZXN1bHQubm9ybWFsaXplZENvbnRlbnQudHJpbSgpLnNwbGl0KCdcXG4nKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBhbnkgbGluZSBjb250YWlucyBhbiBpbnN0YWxsIGV2ZW50IHdpdGggY3VycmVudCBVVUlEIGFuZCB2ZXJzaW9uXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgIGlmICghbGluZS50cmltKCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gSlNPTi5wYXJzZShsaW5lKSBhcyBJbnN0YWxsYXRpb25FdmVudDtcblxuICAgICAgICAgICAgLy8gRm91bmQgbWF0Y2hpbmcgaW5zdGFsbCBldmVudCBmb3IgdGhpcyBVVUlEIGFuZCB2ZXJzaW9uXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGV2ZW50LmV2ZW50ID09PSAnaW5zdGFsbCcgJiZcbiAgICAgICAgICAgICAgZXZlbnQuaW5zdGFsbF9pZCA9PT0gdGhpcy5pbnN0YWxsSWQgJiZcbiAgICAgICAgICAgICAgZXZlbnQudmVyc2lvbiA9PT0gVkVSU0lPTlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgVGVsZW1ldHJ5OiBGb3VuZCBleGlzdGluZyBpbnN0YWxsYXRpb24gZXZlbnQgZm9yIHZlcnNpb24gJHtWRVJTSU9OfWApO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBTa2lwIG1hbGZvcm1lZCBsaW5lc1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gbWF0Y2hpbmcgaW5zdGFsbCBldmVudCBmb3VuZFxuICAgICAgICBsb2dnZXIuZGVidWcoYFRlbGVtZXRyeTogTm8gaW5zdGFsbGF0aW9uIGV2ZW50IGZvdW5kIGZvciB2ZXJzaW9uICR7VkVSU0lPTn1gKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTG9nIGZpbGUgZG9lc24ndCBleGlzdCBvciBpcyB1bnJlYWRhYmxlIC0gdHJlYXQgYXMgZmlyc3QgcnVuXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnVGVsZW1ldHJ5OiBObyBleGlzdGluZyBsb2cgZmlsZSwgdHJlYXRpbmcgYXMgZmlyc3QgcnVuJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWlsIGdyYWNlZnVsbHkgLSBpZiB3ZSBjYW4ndCBkZXRlcm1pbmUsIGFzc3VtZSBub3QgZmlyc3QgcnVuIHRvIGF2b2lkIGR1cGxpY2F0ZSBldmVudHNcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVGVsZW1ldHJ5OiBFcnJvciBjaGVja2luZyBmaXJzdCBydW4gc3RhdHVzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IE1DUCBjbGllbnQgZW52aXJvbm1lbnRcbiAgICogVXNlcyBkZWRpY2F0ZWQgY2xpZW50RGV0ZWN0b3IgbW9kdWxlIGZvciBjb25zaXN0ZW5jeVxuICAgKiBAcmV0dXJucyBDbGllbnQgaWRlbnRpZmllciBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgZ2V0TUNQQ2xpZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRldGVjdE1DUENsaWVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBpbnN0YWxsYXRpb24gZXZlbnQgdG8gdGVsZW1ldHJ5IGxvZ1xuICAgKiBBcHBlbmRzIEpTT04gbGluZSB0byBsb2cgZmlsZSAoSlNPTkwgZm9ybWF0KVxuICAgKiBBbHNvIHNlbmRzIHRvIFBvc3RIb2cgaWYgY29uZmlndXJlZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvcmRJbnN0YWxsYXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5pbnN0YWxsSWQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdUZWxlbWV0cnk6IENhbm5vdCByZWNvcmQgaW5zdGFsbGF0aW9uIC0gbm8gaW5zdGFsbGF0aW9uIElEJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgICAgLy8gQ3JlYXRlIGluc3RhbGxhdGlvbiBldmVudFxuICAgICAgY29uc3QgZXZlbnQ6IEluc3RhbGxhdGlvbkV2ZW50ID0ge1xuICAgICAgICBldmVudDogJ2luc3RhbGwnLFxuICAgICAgICBpbnN0YWxsX2lkOiB0aGlzLmluc3RhbGxJZCxcbiAgICAgICAgdmVyc2lvbjogVkVSU0lPTixcbiAgICAgICAgb3M6IG9zLnBsYXRmb3JtKCksXG4gICAgICAgIG5vZGVfdmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgICBtY3BfY2xpZW50OiB0aGlzLmdldE1DUENsaWVudCgpLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShwYXRoLmRpcm5hbWUoY29uZmlnLmxvZ1BhdGgpKTtcblxuICAgICAgLy8gQXBwZW5kIGV2ZW50IGFzIEpTT04gbGluZSAoSlNPTkwgZm9ybWF0KSB0byBsb2NhbCBsb2dcbiAgICAgIGNvbnN0IGxvZ0xpbmUgPSBKU09OLnN0cmluZ2lmeShldmVudCkgKyAnXFxuJztcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuYXBwZW5kRmlsZShjb25maWcubG9nUGF0aCwgbG9nTGluZSwge1xuICAgICAgICBzb3VyY2U6ICdPcGVyYXRpb25hbFRlbGVtZXRyeS5yZWNvcmRJbnN0YWxsYXRpb24nXG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgVGVsZW1ldHJ5OiBSZWNvcmRlZCBpbnN0YWxsYXRpb24gZXZlbnQgLSB2ZXJzaW9uPSR7ZXZlbnQudmVyc2lvbn0sIG9zPSR7ZXZlbnQub3N9LCBjbGllbnQ9JHtldmVudC5tY3BfY2xpZW50fWBcbiAgICAgICk7XG4gICAgICB0aGlzLmxvZ0xpc3RlbmVyPy4oJ2luZm8nLCAnUmVjb3JkIGluc3RhbGxhdGlvbicsIHtcbiAgICAgICAgdmVyc2lvbjogZXZlbnQudmVyc2lvbixcbiAgICAgICAgb3M6IGV2ZW50Lm9zLFxuICAgICAgICBtY3BfY2xpZW50OiBldmVudC5tY3BfY2xpZW50LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNlbmQgdG8gUG9zdEhvZyBpZiBlbmFibGVkIGFuZCByZW1vdGUgdGVsZW1ldHJ5IG5vdCBkaXNhYmxlZFxuICAgICAgaWYgKHRoaXMucG9zdGhvZyAmJiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVEVMRU1FVFJZX05PX1JFTU9URSAhPT0gJ3RydWUnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5wb3N0aG9nLmNhcHR1cmUoe1xuICAgICAgICAgICAgZGlzdGluY3RJZDogdGhpcy5pbnN0YWxsSWQsXG4gICAgICAgICAgICBldmVudDogJ3NlcnZlcl9pbnN0YWxsYXRpb24nLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICB2ZXJzaW9uOiBWRVJTSU9OLFxuICAgICAgICAgICAgICBvczogb3MucGxhdGZvcm0oKSxcbiAgICAgICAgICAgICAgbm9kZV92ZXJzaW9uOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICAgICAgICAgIG1jcF9jbGllbnQ6IHRoaXMuZ2V0TUNQQ2xpZW50KCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRmx1c2ggaW1tZWRpYXRlbHkgdG8gZW5zdXJlIGV2ZW50IGlzIHNlbnRcbiAgICAgICAgICBhd2FpdCB0aGlzLnBvc3Rob2cuZmx1c2goKTtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogU2VudCBpbnN0YWxsYXRpb24gZXZlbnQgdG8gUG9zdEhvZycpO1xuICAgICAgICB9IGNhdGNoIChwb3N0aG9nRXJyb3IpIHtcbiAgICAgICAgICAvLyBGYWlsIGdyYWNlZnVsbHkgLSBQb3N0SG9nIGVycm9ycyBzaG91bGRuJ3QgYnJlYWsgdGVsZW1ldHJ5XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFRlbGVtZXRyeTogRmFpbGVkIHRvIHNlbmQgdG8gUG9zdEhvZzogJHtwb3N0aG9nRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHBvc3Rob2dFcnJvci5tZXNzYWdlIDogU3RyaW5nKHBvc3Rob2dFcnJvcil9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFpbCBncmFjZWZ1bGx5IC0gbG9nIGJ1dCBkb24ndCB0aHJvd1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgVGVsZW1ldHJ5OiBGYWlsZWQgdG8gcmVjb3JkIGluc3RhbGxhdGlvbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgdGVsZW1ldHJ5IGV2ZW50IHRvIGxvZyBmaWxlXG4gICAqIEludGVybmFsIG1ldGhvZCBmb3IgYXBwZW5kaW5nIGV2ZW50cyB0byB0ZWxlbWV0cnkubG9nXG4gICAqIEBwYXJhbSBldmVudCAtIEV2ZW50IG9iamVjdCB0byB3cml0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUV2ZW50KGV2ZW50OiBJbnN0YWxsYXRpb25FdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuXG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkocGF0aC5kaXJuYW1lKGNvbmZpZy5sb2dQYXRoKSk7XG5cbiAgICAgIC8vIEFwcGVuZCBldmVudCBhcyBKU09OIGxpbmUgKEpTT05MIGZvcm1hdClcbiAgICAgIGNvbnN0IGxvZ0xpbmUgPSBKU09OLnN0cmluZ2lmeShldmVudCkgKyAnXFxuJztcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuYXBwZW5kRmlsZShjb25maWcubG9nUGF0aCwgbG9nTGluZSwge1xuICAgICAgICBzb3VyY2U6ICdPcGVyYXRpb25hbFRlbGVtZXRyeS53cml0ZUV2ZW50J1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhaWwgZ3JhY2VmdWxseSAtIGxvZyBidXQgZG9uJ3QgdGhyb3dcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVGVsZW1ldHJ5OiBGYWlsZWQgdG8gd3JpdGUgZXZlbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRlbGVtZXRyeSBzeXN0ZW1cbiAgICogQ2hlY2tzIG9wdC1vdXQgc3RhdHVzLCBnZW5lcmF0ZXMgVVVJRCBpZiBuZWVkZWQsIHJlY29yZHMgaW5zdGFsbGF0aW9uIGV2ZW50IG9uIGZpcnN0IHJ1blxuICAgKlxuICAgKiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMgLSB3aWxsIG9ubHkgaW5pdGlhbGl6ZSBvbmNlXG4gICAqIEFsd2F5cyBmYWlscyBncmFjZWZ1bGx5IC0gZXJyb3JzIGFyZSBsb2dnZWQgYnV0IG5ldmVyIHRocm93blxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE9ubHkgaW5pdGlhbGl6ZSBvbmNlXG4gICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogQWxyZWFkeSBpbml0aWFsaXplZCwgc2tpcHBpbmcnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0ZWxlbWV0cnkgaXMgZW5hYmxlZFxuICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnVGVsZW1ldHJ5OiBEaXNhYmxlZCB2aWEgRE9MTEhPVVNFX1RFTEVNRVRSWSBlbnZpcm9ubWVudCB2YXJpYWJsZScpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogSW5pdGlhbGl6aW5nIG9wZXJhdGlvbmFsIHRlbGVtZXRyeSBzeXN0ZW0nKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBQb3N0SG9nIGZvciByZW1vdGUgdGVsZW1ldHJ5IChvcHRpb25hbCwgb3B0LWluKVxuICAgICAgdGhpcy5pbml0UG9zdEhvZygpO1xuXG4gICAgICAvLyBFbnN1cmUgaW5zdGFsbGF0aW9uIFVVSUQgZXhpc3RzXG4gICAgICBjb25zdCB1dWlkID0gYXdhaXQgdGhpcy5lbnN1cmVVVUlEKCk7XG4gICAgICBpZiAoIXV1aWQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdUZWxlbWV0cnk6IEZhaWxlZCB0byBlbnN1cmUgVVVJRCwgc2tpcHBpbmcgaW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcnVuXG4gICAgICBjb25zdCBmaXJzdFJ1biA9IGF3YWl0IHRoaXMuaXNGaXJzdFJ1bigpO1xuICAgICAgaWYgKGZpcnN0UnVuKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnVGVsZW1ldHJ5OiBGaXJzdCBydW4gZGV0ZWN0ZWQsIHJlY29yZGluZyBpbnN0YWxsYXRpb24gZXZlbnQnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWNvcmRJbnN0YWxsYXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnVGVsZW1ldHJ5OiBJbnN0YWxsYXRpb24gZXZlbnQgYWxyZWFkeSByZWNvcmRlZCBmb3IgdGhpcyB2ZXJzaW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdUZWxlbWV0cnk6IEluaXRpYWxpemF0aW9uIGNvbXBsZXRlJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhaWwgZ3JhY2VmdWxseSAtIGxvZyBlcnJvciBidXQgbWFyayBhcyBpbml0aWFsaXplZCB0byBwcmV2ZW50IHJldHJ5IGxvb3BzXG4gICAgICBsb2dnZXIuZGVidWcoYFRlbGVtZXRyeTogSW5pdGlhbGl6YXRpb24gZXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhdXRvLWxvYWQgbWV0cmljcyB0byB0ZWxlbWV0cnkgbG9nXG4gICAqIEBwYXJhbSBtZXRyaWNzIEF1dG8tbG9hZCBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjb3JkQXV0b0xvYWRNZXRyaWNzKG1ldHJpY3M6IEF1dG9Mb2FkTWV0cmljcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuXG4gICAgICAvLyBBcHBlbmQgdG8gdGVsZW1ldHJ5IGxvZyAoSlNPTkwgZm9ybWF0KVxuICAgICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICAgIGV2ZW50OiAnYXV0b2xvYWRfbWV0cmljcycsXG4gICAgICAgIC4uLm1ldHJpY3MsXG4gICAgICAgIGluc3RhbGxJZDogdGhpcy5pbnN0YWxsSWRcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuYXBwZW5kRmlsZShcbiAgICAgICAgY29uZmlnLmxvZ1BhdGgsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5KSArICdcXG4nLFxuICAgICAgICB7IHNvdXJjZTogJ09wZXJhdGlvbmFsVGVsZW1ldHJ5LnJlY29yZEF1dG9Mb2FkTWV0cmljcycgfVxuICAgICAgKTtcblxuICAgICAgLy8gU2VuZCB0byBQb3N0SG9nIGlmIGNvbmZpZ3VyZWRcbiAgICAgIGlmICh0aGlzLnBvc3Rob2cgJiYgdGhpcy5pbnN0YWxsSWQpIHtcbiAgICAgICAgdGhpcy5wb3N0aG9nLmNhcHR1cmUoe1xuICAgICAgICAgIGRpc3RpbmN0SWQ6IHRoaXMuaW5zdGFsbElkLFxuICAgICAgICAgIGV2ZW50OiAnYXV0b2xvYWRfbWV0cmljcycsXG4gICAgICAgICAgcHJvcGVydGllczogbWV0cmljc1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmRlYnVnKCdbVGVsZW1ldHJ5XSBSZWNvcmRlZCBhdXRvLWxvYWQgbWV0cmljczonLCBtZXRyaWNzKTtcbiAgICAgIHRoaXMubG9nTGlzdGVuZXI/LignZGVidWcnLCAnUmVjb3JkIGF1dG8tbG9hZCBtZXRyaWNzJywgbWV0cmljcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFpbCBncmFjZWZ1bGx5XG4gICAgICBsb2dnZXIuZGVidWcoYFtUZWxlbWV0cnldIEZhaWxlZCB0byByZWNvcmQgYXV0by1sb2FkIG1ldHJpY3M6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNodXRkb3duIHRlbGVtZXRyeSBzeXN0ZW1cbiAgICogRmx1c2hlcyBhbnkgcGVuZGluZyBQb3N0SG9nIGV2ZW50cyBhbmQgY2xlYW5zIHVwIHJlc291cmNlc1xuICAgKiBTYWZlIHRvIGNhbGwgZXZlbiBpZiBub3QgaW5pdGlhbGl6ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMucG9zdGhvZykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbGVtZXRyeTogU2h1dHRpbmcgZG93biBQb3N0SG9nIGNsaWVudCcpO1xuICAgICAgICBhd2FpdCB0aGlzLnBvc3Rob2cuc2h1dGRvd24oKTtcbiAgICAgICAgdGhpcy5wb3N0aG9nID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFpbCBncmFjZWZ1bGx5IC0gbG9nIGJ1dCBkb24ndCB0aHJvd1xuICAgICAgbG9nZ2VyLmRlYnVnKGBUZWxlbWV0cnk6IEVycm9yIGR1cmluZyBzaHV0ZG93bjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Time-windowed event deduplication utility.
3
+ * Suppresses repeated identical events within a configurable window.
4
+ * Used by SecurityMonitor and SecurityTelemetry to prevent log flooding.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const dedup = new EventDeduplicator(60_000, 500);
9
+ *
10
+ * if (!dedup.shouldSuppress('injection\0/api/query\0SQL detected')) {
11
+ * logger.warn('New security event');
12
+ * }
13
+ * // Same key within 60s → suppressed
14
+ * dedup.shouldSuppress('injection\0/api/query\0SQL detected'); // true
15
+ *
16
+ * // Check how much noise was filtered
17
+ * const stats = dedup.getStats();
18
+ * // { suppressedCount: 1, processedCount: 1, cacheSize: 1 }
19
+ * ```
20
+ */
21
+ export declare class EventDeduplicator {
22
+ private readonly windowMs;
23
+ private readonly maxSize;
24
+ private readonly recentKeys;
25
+ private _suppressedCount;
26
+ private _processedCount;
27
+ constructor(windowMs?: number, maxSize?: number);
28
+ /**
29
+ * Returns true if this key should be suppressed (duplicate within window).
30
+ * Returns false if this is a new event that should be processed.
31
+ */
32
+ shouldSuppress(key: string): boolean;
33
+ /** Clear all tracked keys and counters */
34
+ clear(): void;
35
+ get size(): number;
36
+ /** Returns deduplication statistics for metrics and observability */
37
+ getStats(): {
38
+ suppressedCount: number;
39
+ processedCount: number;
40
+ cacheSize: number;
41
+ };
42
+ private cleanup;
43
+ }
44
+ //# sourceMappingURL=EventDeduplicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventDeduplicator.d.ts","sourceRoot":"","sources":["../../src/utils/EventDeduplicator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,eAAe,CAAK;gBAGT,QAAQ,GAAE,MAAe,EACzB,OAAO,GAAE,MAAY;IAGxC;;;OAGG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAoBpC,0CAA0C;IAC1C,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,qEAAqE;IACrE,QAAQ,IAAI;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAQlF,OAAO,CAAC,OAAO;CAiBhB"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Time-windowed event deduplication utility.
3
+ * Suppresses repeated identical events within a configurable window.
4
+ * Used by SecurityMonitor and SecurityTelemetry to prevent log flooding.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const dedup = new EventDeduplicator(60_000, 500);
9
+ *
10
+ * if (!dedup.shouldSuppress('injection\0/api/query\0SQL detected')) {
11
+ * logger.warn('New security event');
12
+ * }
13
+ * // Same key within 60s → suppressed
14
+ * dedup.shouldSuppress('injection\0/api/query\0SQL detected'); // true
15
+ *
16
+ * // Check how much noise was filtered
17
+ * const stats = dedup.getStats();
18
+ * // { suppressedCount: 1, processedCount: 1, cacheSize: 1 }
19
+ * ```
20
+ */
21
+ export class EventDeduplicator {
22
+ windowMs;
23
+ maxSize;
24
+ recentKeys = new Map();
25
+ _suppressedCount = 0;
26
+ _processedCount = 0;
27
+ constructor(windowMs = 60_000, maxSize = 500) {
28
+ this.windowMs = windowMs;
29
+ this.maxSize = maxSize;
30
+ }
31
+ /**
32
+ * Returns true if this key should be suppressed (duplicate within window).
33
+ * Returns false if this is a new event that should be processed.
34
+ */
35
+ shouldSuppress(key) {
36
+ // NFC-normalize to ensure canonical Unicode equivalents deduplicate correctly
37
+ // (e.g. 'Café' decomposed vs composed). Uses String.normalize directly to
38
+ // avoid circular dependency with UnicodeValidator → SecurityMonitor → this.
39
+ // Falls back to raw key if normalize throws (e.g. mocked in tests).
40
+ try {
41
+ key = key.normalize('NFC');
42
+ }
43
+ catch { /* use raw key */ }
44
+ const now = Date.now();
45
+ const lastSeen = this.recentKeys.get(key);
46
+ if (lastSeen && (now - lastSeen) < this.windowMs) {
47
+ this._suppressedCount++;
48
+ return true;
49
+ }
50
+ this._processedCount++;
51
+ this.recentKeys.set(key, now);
52
+ try {
53
+ this.cleanup(now);
54
+ }
55
+ catch { /* eviction failure is non-fatal */ }
56
+ return false;
57
+ }
58
+ /** Clear all tracked keys and counters */
59
+ clear() {
60
+ this.recentKeys.clear();
61
+ this._suppressedCount = 0;
62
+ this._processedCount = 0;
63
+ }
64
+ get size() {
65
+ return this.recentKeys.size;
66
+ }
67
+ /** Returns deduplication statistics for metrics and observability */
68
+ getStats() {
69
+ return {
70
+ suppressedCount: this._suppressedCount,
71
+ processedCount: this._processedCount,
72
+ cacheSize: this.recentKeys.size,
73
+ };
74
+ }
75
+ cleanup(now) {
76
+ if (this.recentKeys.size <= this.maxSize)
77
+ return;
78
+ // First pass: evict expired entries
79
+ for (const [key, ts] of this.recentKeys) {
80
+ if ((now - ts) >= this.windowMs)
81
+ this.recentKeys.delete(key);
82
+ }
83
+ // Fallback: if still over capacity (all entries within window), evict oldest
84
+ if (this.recentKeys.size > this.maxSize) {
85
+ const entries = [...this.recentKeys.entries()].sort((a, b) => a[1] - b[1]);
86
+ const toRemove = entries.length - this.maxSize;
87
+ for (let i = 0; i < toRemove; i++) {
88
+ this.recentKeys.delete(entries[i][0]);
89
+ }
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnREZWR1cGxpY2F0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvRXZlbnREZWR1cGxpY2F0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBTVQ7SUFDQTtJQU5GLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUNoRCxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFDckIsZUFBZSxHQUFHLENBQUMsQ0FBQztJQUU1QixZQUNtQixXQUFtQixNQUFNLEVBQ3pCLFVBQWtCLEdBQUc7UUFEckIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsWUFBTyxHQUFQLE9BQU8sQ0FBYztJQUNyQyxDQUFDO0lBRUo7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLEdBQVc7UUFDeEIsOEVBQThFO1FBQzlFLDBFQUEwRTtRQUMxRSw0RUFBNEU7UUFDNUUsb0VBQW9FO1FBQ3BFLElBQUksQ0FBQztZQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTFDLElBQUksUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQztZQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN4RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsS0FBSztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLFFBQVE7UUFDTixPQUFPO1lBQ0wsZUFBZSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdEMsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7U0FDaEMsQ0FBQztJQUNKLENBQUM7SUFFTyxPQUFPLENBQUMsR0FBVztRQUN6QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUVqRCxvQ0FBb0M7UUFDcEMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRO2dCQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCw2RUFBNkU7UUFDN0UsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0UsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRpbWUtd2luZG93ZWQgZXZlbnQgZGVkdXBsaWNhdGlvbiB1dGlsaXR5LlxuICogU3VwcHJlc3NlcyByZXBlYXRlZCBpZGVudGljYWwgZXZlbnRzIHdpdGhpbiBhIGNvbmZpZ3VyYWJsZSB3aW5kb3cuXG4gKiBVc2VkIGJ5IFNlY3VyaXR5TW9uaXRvciBhbmQgU2VjdXJpdHlUZWxlbWV0cnkgdG8gcHJldmVudCBsb2cgZmxvb2RpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBkZWR1cCA9IG5ldyBFdmVudERlZHVwbGljYXRvcig2MF8wMDAsIDUwMCk7XG4gKlxuICogaWYgKCFkZWR1cC5zaG91bGRTdXBwcmVzcygnaW5qZWN0aW9uXFwwL2FwaS9xdWVyeVxcMFNRTCBkZXRlY3RlZCcpKSB7XG4gKiAgIGxvZ2dlci53YXJuKCdOZXcgc2VjdXJpdHkgZXZlbnQnKTtcbiAqIH1cbiAqIC8vIFNhbWUga2V5IHdpdGhpbiA2MHMg4oaSIHN1cHByZXNzZWRcbiAqIGRlZHVwLnNob3VsZFN1cHByZXNzKCdpbmplY3Rpb25cXDAvYXBpL3F1ZXJ5XFwwU1FMIGRldGVjdGVkJyk7IC8vIHRydWVcbiAqXG4gKiAvLyBDaGVjayBob3cgbXVjaCBub2lzZSB3YXMgZmlsdGVyZWRcbiAqIGNvbnN0IHN0YXRzID0gZGVkdXAuZ2V0U3RhdHMoKTtcbiAqIC8vIHsgc3VwcHJlc3NlZENvdW50OiAxLCBwcm9jZXNzZWRDb3VudDogMSwgY2FjaGVTaXplOiAxIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnREZWR1cGxpY2F0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY2VudEtleXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIF9zdXBwcmVzc2VkQ291bnQgPSAwO1xuICBwcml2YXRlIF9wcm9jZXNzZWRDb3VudCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB3aW5kb3dNczogbnVtYmVyID0gNjBfMDAwLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4U2l6ZTogbnVtYmVyID0gNTAwLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGtleSBzaG91bGQgYmUgc3VwcHJlc3NlZCAoZHVwbGljYXRlIHdpdGhpbiB3aW5kb3cpLlxuICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoaXMgaXMgYSBuZXcgZXZlbnQgdGhhdCBzaG91bGQgYmUgcHJvY2Vzc2VkLlxuICAgKi9cbiAgc2hvdWxkU3VwcHJlc3Moa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBORkMtbm9ybWFsaXplIHRvIGVuc3VyZSBjYW5vbmljYWwgVW5pY29kZSBlcXVpdmFsZW50cyBkZWR1cGxpY2F0ZSBjb3JyZWN0bHlcbiAgICAvLyAoZS5nLiAnQ2Fmw6knIGRlY29tcG9zZWQgdnMgY29tcG9zZWQpLiBVc2VzIFN0cmluZy5ub3JtYWxpemUgZGlyZWN0bHkgdG9cbiAgICAvLyBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggVW5pY29kZVZhbGlkYXRvciDihpIgU2VjdXJpdHlNb25pdG9yIOKGkiB0aGlzLlxuICAgIC8vIEZhbGxzIGJhY2sgdG8gcmF3IGtleSBpZiBub3JtYWxpemUgdGhyb3dzIChlLmcuIG1vY2tlZCBpbiB0ZXN0cykuXG4gICAgdHJ5IHsga2V5ID0ga2V5Lm5vcm1hbGl6ZSgnTkZDJyk7IH0gY2F0Y2ggeyAvKiB1c2UgcmF3IGtleSAqLyB9XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBsYXN0U2VlbiA9IHRoaXMucmVjZW50S2V5cy5nZXQoa2V5KTtcblxuICAgIGlmIChsYXN0U2VlbiAmJiAobm93IC0gbGFzdFNlZW4pIDwgdGhpcy53aW5kb3dNcykge1xuICAgICAgdGhpcy5fc3VwcHJlc3NlZENvdW50Kys7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm9jZXNzZWRDb3VudCsrO1xuICAgIHRoaXMucmVjZW50S2V5cy5zZXQoa2V5LCBub3cpO1xuICAgIHRyeSB7IHRoaXMuY2xlYW51cChub3cpOyB9IGNhdGNoIHsgLyogZXZpY3Rpb24gZmFpbHVyZSBpcyBub24tZmF0YWwgKi8gfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBDbGVhciBhbGwgdHJhY2tlZCBrZXlzIGFuZCBjb3VudGVycyAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnJlY2VudEtleXMuY2xlYXIoKTtcbiAgICB0aGlzLl9zdXBwcmVzc2VkQ291bnQgPSAwO1xuICAgIHRoaXMuX3Byb2Nlc3NlZENvdW50ID0gMDtcbiAgfVxuXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVjZW50S2V5cy5zaXplO1xuICB9XG5cbiAgLyoqIFJldHVybnMgZGVkdXBsaWNhdGlvbiBzdGF0aXN0aWNzIGZvciBtZXRyaWNzIGFuZCBvYnNlcnZhYmlsaXR5ICovXG4gIGdldFN0YXRzKCk6IHsgc3VwcHJlc3NlZENvdW50OiBudW1iZXI7IHByb2Nlc3NlZENvdW50OiBudW1iZXI7IGNhY2hlU2l6ZTogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBzdXBwcmVzc2VkQ291bnQ6IHRoaXMuX3N1cHByZXNzZWRDb3VudCxcbiAgICAgIHByb2Nlc3NlZENvdW50OiB0aGlzLl9wcm9jZXNzZWRDb3VudCxcbiAgICAgIGNhY2hlU2l6ZTogdGhpcy5yZWNlbnRLZXlzLnNpemUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cChub3c6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY2VudEtleXMuc2l6ZSA8PSB0aGlzLm1heFNpemUpIHJldHVybjtcblxuICAgIC8vIEZpcnN0IHBhc3M6IGV2aWN0IGV4cGlyZWQgZW50cmllc1xuICAgIGZvciAoY29uc3QgW2tleSwgdHNdIG9mIHRoaXMucmVjZW50S2V5cykge1xuICAgICAgaWYgKChub3cgLSB0cykgPj0gdGhpcy53aW5kb3dNcykgdGhpcy5yZWNlbnRLZXlzLmRlbGV0ZShrZXkpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBpZiBzdGlsbCBvdmVyIGNhcGFjaXR5IChhbGwgZW50cmllcyB3aXRoaW4gd2luZG93KSwgZXZpY3Qgb2xkZXN0XG4gICAgaWYgKHRoaXMucmVjZW50S2V5cy5zaXplID4gdGhpcy5tYXhTaXplKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gWy4uLnRoaXMucmVjZW50S2V5cy5lbnRyaWVzKCldLnNvcnQoKGEsIGIpID0+IGFbMV0gLSBiWzFdKTtcbiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gZW50cmllcy5sZW5ndGggLSB0aGlzLm1heFNpemU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvUmVtb3ZlOyBpKyspIHtcbiAgICAgICAgdGhpcy5yZWNlbnRLZXlzLmRlbGV0ZShlbnRyaWVzW2ldWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"FileLock.d.ts","sourceRoot":"","sources":["../../src/utils/FileLock.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAK5B;;OAEG;IACI,OAAO,IAAI,IAAI;IAQtB;;OAEG;IACU,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IA2EjE;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCrC;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAY1C;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAczC;;OAEG;IACU,QAAQ,CAAC,CAAC,EACrB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAepB,OAAO,CAAC,KAAK;CAYd"}
1
+ {"version":3,"file":"FileLock.d.ts","sourceRoot":"","sources":["../../src/utils/FileLock.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAK5B;;OAEG;IACI,OAAO,IAAI,IAAI;IAQtB;;OAEG;IACU,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAsEjE;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BrC;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAY1C;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAczC;;OAEG;IACU,QAAQ,CAAC,CAAC,EACrB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAepB,OAAO,CAAC,KAAK;CAYd"}
@@ -45,10 +45,6 @@ export class FileLock {
45
45
  }));
46
46
  await handle.close();
47
47
  this.acquired = true;
48
- logger.debug('File lock acquired', {
49
- lock: this.lockPath,
50
- id: this.lockId
51
- });
52
48
  return true;
53
49
  }
54
50
  catch (error) {
@@ -107,10 +103,6 @@ export class FileLock {
107
103
  if (lock.id === this.lockId) {
108
104
  await fs.unlink(this.lockPath);
109
105
  this.acquired = false;
110
- logger.debug('File lock released', {
111
- lock: this.lockPath,
112
- id: this.lockId
113
- });
114
106
  }
115
107
  else {
116
108
  logger.warn('Lock owned by different process', {
@@ -188,4 +180,4 @@ export class FileLock {
188
180
  });
189
181
  }
190
182
  }
191
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvRmlsZUxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFRckMsTUFBTSxPQUFPLFFBQVE7SUFDWCxRQUFRLENBQVM7SUFDakIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixNQUFNLENBQVM7SUFDZixlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDNUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUV6QixZQUFZLFFBQWdCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxRQUFRLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUYsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTztRQUNaLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzdDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQXVCLEVBQUU7UUFDNUMsTUFBTSxFQUNKLE9BQU8sR0FBRyxJQUFJLEVBQ2QsYUFBYSxHQUFHLEdBQUcsRUFDbkIsS0FBSyxHQUFHLEtB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QixFQUFFO1FBRXpCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDckQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7Z0JBQVMsQ0FBQztZQUNULE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLEVBQVU7UUFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUNELE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDM0IsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZDLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpbGUgbG9ja2luZyB1dGlsaXR5IGZvciBwcmV2ZW50aW5nIHJhY2UgY29uZGl0aW9uc1xuICpcbiAqIFVzZXMgYWR2aXNvcnkgbG9ja3Mgd2l0aCB0aW1lb3V0IGFuZCByZXRyeSBsb2dpY1xuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBMb2NrT3B0aW9ucyB7XG4gIHRpbWVvdXQ/OiBudW1iZXI7ICAgICAgICAvLyBNYXggdGltZSB0byB3YWl0IGZvciBsb2NrIChtcylcbiAgcmV0cnlJbnRlcnZhbD86IG51bWJlcjsgIC8vIFRpbWUgYmV0d2VlbiByZXRyaWVzIChtcylcbiAgc3RhbGU/OiBudW1iZXI7ICAgICAgICAgLy8gQ29uc2lkZXIgbG9jayBzdGFsZSBhZnRlciB0aGlzIHRpbWUgKG1zKVxufVxuXG5leHBvcnQgY2xhc3MgRmlsZUxvY2sge1xuICBwcml2YXRlIGxvY2tQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgYWNxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBsb2NrSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBwZW5kaW5nVGltZW91dHMgPSBuZXcgU2V0PE5vZGVKUy5UaW1lb3V0PigpO1xuICBwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRoaXMubG9ja1BhdGggPSBgJHtmaWxlUGF0aH0ubG9ja2A7XG4gICAgdGhpcy5sb2NrSWQgPSBgJHtwcm9jZXNzLnBpZH0tJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2UgdGhlIGZpbGUgbG9jayBhbmQgY2xlYXIgYW55IHBlbmRpbmcgdGltZXJzLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCB0aW1lb3V0SWQgb2YgdGhpcy5wZW5kaW5nVGltZW91dHMpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdUaW1lb3V0cy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgYSBsb2NrIG9uIHRoZSBmaWxlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWNxdWlyZShvcHRpb25zOiBMb2NrT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qge1xuICAgICAgdGltZW91dCA9IDUwMDAsXG4gICAgICByZXRyeUludGVydmFsID0gMTAwLFxuICAgICAgc3RhbGUgPSAzMDAwMCAgLy8gMzAgc2Vjb25kc1xuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgdGltZW91dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBsb2NrIGZpbGUgZXhjbHVzaXZlbHlcbiAgICAgICAgY29uc3QgaGFuZGxlID0gYXdhaXQgZnMub3Blbih0aGlzLmxvY2tQYXRoLCAnd3gnKTtcblxuICAgICAgICAvLyBXcml0ZSBsb2NrIGluZm9cbiAgICAgICAgYXdhaXQgaGFuZGxlLndyaXRlKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBwaWQ6IHByb2Nlc3MucGlkLFxuICAgICAgICAgIGlkOiB0aGlzLmxvY2tJZCxcbiAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgaG9zdG5hbWU6IHByb2Nlc3MuZW52LkhPU1ROQU1FIHx8ICd1bmtub3duJ1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgYXdhaXQgaGFuZGxlLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuYWNxdWlyZWQgPSB0cnVlO1xuXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRmlsZSBsb2NrIGFjcXVpcmVkJywge1xuICAgICAgICAgIGxvY2s6IHRoaXMubG9ja1BhdGgsXG4gICAgICAgICAgaWQ6IHRoaXMubG9ja0lkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFRVhJU1QnKSB7XG4gICAgICAgICAgLy8gTG9jayBmaWxlIGV4aXN0cywgY2hlY2sgaWYgaXQncyBzdGFsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBsb2NrRGF0YSA9IGF3YWl0IGZzLnJlYWRGaWxlKHRoaXMubG9ja1BhdGgsICd1dGYtOCcpO1xuICAgICAgICAgICAgY29uc3QgbG9jayA9IEpTT04ucGFyc2UobG9ja0RhdGEpO1xuXG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGxvY2sudGltZXN0YW1wID4gc3RhbGUpIHtcbiAgICAgICAgICAgICAgLy8gTG9jayBpcyBzdGFsZSwgcmVtb3ZlIGl0XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdSZW1vdmluZyBzdGFsZSBsb2NrJywge1xuICAgICAgICAgICAgICAgIGxvY2s6IHRoaXMubG9ja1BhdGgsXG4gICAgICAgICAgICAgICAgYWdlOiBEYXRlLm5vdygpIC0gbG9jay50aW1lc3RhbXBcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JjZVJlbGVhc2UoKTtcbiAgICAgICAgICAgICAgLy8gQ29udGludWUgdG8gdHJ5IGFjcXVpcmluZ1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTG9jayBpcyBoZWxkIGJ5IGFub3RoZXIgcHJvY2Vzc1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKHJldHJ5SW50ZXJ2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKHJlYWRFcnJvcikge1xuICAgICAgICAgICAgLy8gQ2FuJ3QgcmVhZCBsb2NrIGZpbGUgLSBjb3VsZCBiZSBwZXJtaXNzaW9ucyBpc3N1ZSBvciBjb25jdXJyZW50IGRlbGV0aW9uXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byByZWFkIGxvY2sgZmlsZSwgcmV0cnlpbmcnLCB7XG4gICAgICAgICAgICAgIGxvY2s6IHRoaXMubG9ja1BhdGgsXG4gICAgICAgICAgICAgIGVycm9yOiByZWFkRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHJlYWRFcnJvci5tZXNzYWdlIDogU3RyaW5nKHJlYWRFcnJvcilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcChyZXRyeUludGVydmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvclxuICAgICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGFjcXVpcmUgbG9jaycsIHsgZXJyb3IgfSk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oJ0xvY2sgYWNxdWlzaXRpb24gdGltZW91dCcsIHtcbiAgICAgIGxvY2s6IHRoaXMubG9ja1BhdGgsXG4gICAgICB0aW1lb3V0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSB0aGUgbG9ja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbGVhc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFjcXVpcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZlcmlmeSB3ZSBzdGlsbCBvd24gdGhlIGxvY2tcbiAgICAgIGNvbnN0IGxvY2tEYXRhID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5sb2NrUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBsb2NrID0gSlNPTi5wYXJzZShsb2NrRGF0YSk7XG5cbiAgICAgIGlmIChsb2NrLmlkID09PSB0aGlzLmxvY2tJZCkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsodGhpcy5sb2NrUGF0aCk7XG4gICAgICAgIHRoaXMuYWNxdWlyZWQgPSBmYWxzZTtcblxuICAgICAgICBsb2dnZXIuZGVidWcoJ0ZpbGUgbG9jayByZWxlYXNlZCcsIHtcbiAgICAgICAgICBsb2NrOiB0aGlzLmxvY2tQYXRoLFxuICAgICAgICAgIGlkOiB0aGlzLmxvY2tJZFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdMb2NrIG93bmVkIGJ5IGRpZmZlcmVudCBwcm9jZXNzJywge1xuICAgICAgICAgIGxvY2s6IHRoaXMubG9ja1BhdGgsXG4gICAgICAgICAgb3VySWQ6IHRoaXMubG9ja0lkLFxuICAgICAgICAgIHRoZWlySWQ6IGxvY2suaWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byByZWxlYXNlIGxvY2snLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5hY3F1aXJlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSByZWxlYXNlICh1c2Ugd2l0aCBjYXV0aW9uKVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZvcmNlUmVsZWFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKHRoaXMubG9ja1BhdGgpO1xuICAgICAgdGhpcy5hY3F1aXJlZCA9IGZhbHNlO1xuICAgICAgbG9nZ2VyLndhcm4oJ0xvY2sgZm9yY2libHkgcmVsZWFzZWQnLCB7IGxvY2s6IHRoaXMubG9ja1BhdGggfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBmb3JjZSByZWxlYXNlIGxvY2snLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBsb2NrIGlzIGhlbGRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc0xvY2tlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKHRoaXMubG9ja1BhdGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvY2sgZmlsZSBkb2Vzbid0IGV4aXN0IG9yIG5vdCBhY2Nlc3NpYmxlXG4gICAgICBsb2dnZXIuZGVidWcoJ0xvY2sgZmlsZSBub3QgYWNjZXNzaWJsZScsIHtcbiAgICAgICAgbG9jazogdGhpcy5sb2NrUGF0aCxcbiAgICAgICAgY29kZTogKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiB3aXRoIGxvY2sgcHJvdGVjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdpdGhMb2NrPFQ+KFxuICAgIGZuOiAoKSA9PiBQcm9taXNlPFQ+LFxuICAgIG9wdGlvbnM6IExvY2tPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIGNvbnN0IGFjcXVpcmVkID0gYXdhaXQgdGhpcy5hY3F1aXJlKG9wdGlvbnMpO1xuXG4gICAgaWYgKCFhY3F1aXJlZCkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gYWNxdWlyZSBsb2NrIGZvciBvcGVyYXRpb24nKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5yZWxlYXNlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ1RpbWVvdXRzLmRlbGV0ZSh0aW1lb3V0SWQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCBtcyk7XG4gICAgICB0aGlzLnBlbmRpbmdUaW1lb3V0cy5hZGQodGltZW91dElkKTtcbiAgICB9KTtcbiAgfVxufSJdfQ==
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvRmlsZUxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFRckMsTUFBTSxPQUFPLFFBQVE7SUFDWCxRQUFRLENBQVM7SUFDakIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixNQUFNLENBQVM7SUFDZixlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDNUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUV6QixZQUFZLFFBQWdCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxRQUFRLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUYsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTztRQUNaLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzdDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQXVCLEVBQUU7UUFDNUMsTUFBTSxFQUNKLE9BQU8sR0FBRyxJQUFJLEVBQ2QsYUFBYSxHQUFHLEdBQUcsRUFDbkIsS0FBSyxHQUFHLEtB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O1lBQ1QsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsRUFBVTtRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMzQixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkMsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDUCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmlsZSBsb2NraW5nIHV0aWxpdHkgZm9yIHByZXZlbnRpbmcgcmFjZSBjb25kaXRpb25zXG4gKlxuICogVXNlcyBhZHZpc29yeSBsb2NrcyB3aXRoIHRpbWVvdXQgYW5kIHJldHJ5IGxvZ2ljXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvY2tPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjsgICAgICAgIC8vIE1heCB0aW1lIHRvIHdhaXQgZm9yIGxvY2sgKG1zKVxuICByZXRyeUludGVydmFsPzogbnVtYmVyOyAgLy8gVGltZSBiZXR3ZWVuIHJldHJpZXMgKG1zKVxuICBzdGFsZT86IG51bWJlcjsgICAgICAgICAvLyBDb25zaWRlciBsb2NrIHN0YWxlIGFmdGVyIHRoaXMgdGltZSAobXMpXG59XG5cbmV4cG9ydCBjbGFzcyBGaWxlTG9jayB7XG4gIHByaXZhdGUgbG9ja1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBhY3F1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGxvY2tJZDogc3RyaW5nO1xuICBwcml2YXRlIHBlbmRpbmdUaW1lb3V0cyA9IG5ldyBTZXQ8Tm9kZUpTLlRpbWVvdXQ+KCk7XG4gIHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2NrUGF0aCA9IGAke2ZpbGVQYXRofS5sb2NrYDtcbiAgICB0aGlzLmxvY2tJZCA9IGAke3Byb2Nlc3MucGlkfS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWA7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSB0aGUgZmlsZSBsb2NrIGFuZCBjbGVhciBhbnkgcGVuZGluZyB0aW1lcnMuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IHRpbWVvdXRJZCBvZiB0aGlzLnBlbmRpbmdUaW1lb3V0cykge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ1RpbWVvdXRzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBhIGxvY2sgb24gdGhlIGZpbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3F1aXJlKG9wdGlvbnM6IExvY2tPcHRpb25zID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7XG4gICAgICB0aW1lb3V0ID0gNTAwMCxcbiAgICAgIHJldHJ5SW50ZXJ2YWwgPSAxMDAsXG4gICAgICBzdGFsZSA9IDMwMDAwICAvLyAzMCBzZWNvbmRzXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPCB0aW1lb3V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIGxvY2sgZmlsZSBleGNsdXNpdmVseVxuICAgICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCBmcy5vcGVuKHRoaXMubG9ja1BhdGgsICd3eCcpO1xuXG4gICAgICAgIC8vIFdyaXRlIGxvY2sgaW5mb1xuICAgICAgICBhd2FpdCBoYW5kbGUud3JpdGUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHBpZDogcHJvY2Vzcy5waWQsXG4gICAgICAgICAgaWQ6IHRoaXMubG9ja0lkLFxuICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICBob3N0bmFtZTogcHJvY2Vzcy5lbnYuSE9TVE5BTUUgfHwgJ3Vua25vd24nXG4gICAgICAgIH0pKTtcblxuICAgICAgICBhd2FpdCBoYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5hY3F1aXJlZCA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VFWElTVCcpIHtcbiAgICAgICAgICAvLyBMb2NrIGZpbGUgZXhpc3RzLCBjaGVjayBpZiBpdCdzIHN0YWxlXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2tEYXRhID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5sb2NrUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICBjb25zdCBsb2NrID0gSlNPTi5wYXJzZShsb2NrRGF0YSk7XG5cbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gbG9jay50aW1lc3RhbXAgPiBzdGFsZSkge1xuICAgICAgICAgICAgICAvLyBMb2NrIGlzIHN0YWxlLCByZW1vdmUgaXRcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1JlbW92aW5nIHN0YWxlIGxvY2snLCB7XG4gICAgICAgICAgICAgICAgbG9jazogdGhpcy5sb2NrUGF0aCxcbiAgICAgICAgICAgICAgICBhZ2U6IERhdGUubm93KCkgLSBsb2NrLnRpbWVzdGFtcFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZvcmNlUmVsZWFzZSgpO1xuICAgICAgICAgICAgICAvLyBDb250aW51ZSB0byB0cnkgYWNxdWlyaW5nXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBMb2NrIGlzIGhlbGQgYnkgYW5vdGhlciBwcm9jZXNzXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAocmV0cnlJbnRlcnZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAocmVhZEVycm9yKSB7XG4gICAgICAgICAgICAvLyBDYW4ndCByZWFkIGxvY2sgZmlsZSAtIGNvdWxkIGJlIHBlcm1pc3Npb25zIGlzc3VlIG9yIGNvbmN1cnJlbnQgZGVsZXRpb25cbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRmFpbGVkIHRvIHJlYWQgbG9jayBmaWxlLCByZXRyeWluZycsIHtcbiAgICAgICAgICAgICAgbG9jazogdGhpcy5sb2NrUGF0aCxcbiAgICAgICAgICAgICAgZXJyb3I6IHJlYWRFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gcmVhZEVycm9yLm1lc3NhZ2UgOiBTdHJpbmcocmVhZEVycm9yKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKHJldHJ5SW50ZXJ2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTb21lIG90aGVyIGVycm9yXG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gYWNxdWlyZSBsb2NrJywgeyBlcnJvciB9KTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIud2FybignTG9jayBhY3F1aXNpdGlvbiB0aW1lb3V0Jywge1xuICAgICAgbG9jazogdGhpcy5sb2NrUGF0aCxcbiAgICAgIHRpbWVvdXRcbiAgICB9KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBsb2NrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVsZWFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWNxdWlyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZ5IHdlIHN0aWxsIG93biB0aGUgbG9ja1xuICAgICAgY29uc3QgbG9ja0RhdGEgPSBhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLmxvY2tQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGxvY2sgPSBKU09OLnBhcnNlKGxvY2tEYXRhKTtcblxuICAgICAgaWYgKGxvY2suaWQgPT09IHRoaXMubG9ja0lkKSB7XG4gICAgICAgIGF3YWl0IGZzLnVubGluayh0aGlzLmxvY2tQYXRoKTtcbiAgICAgICAgdGhpcy5hY3F1aXJlZCA9IGZhbHNlO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybignTG9jayBvd25lZCBieSBkaWZmZXJlbnQgcHJvY2VzcycsIHtcbiAgICAgICAgICBsb2NrOiB0aGlzLmxvY2tQYXRoLFxuICAgICAgICAgIG91cklkOiB0aGlzLmxvY2tJZCxcbiAgICAgICAgICB0aGVpcklkOiBsb2NrLmlkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gcmVsZWFzZSBsb2NrJywgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWNxdWlyZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgcmVsZWFzZSAodXNlIHdpdGggY2F1dGlvbilcbiAgICovXG4gIHB1YmxpYyBhc3luYyBmb3JjZVJlbGVhc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnVubGluayh0aGlzLmxvY2tQYXRoKTtcbiAgICAgIHRoaXMuYWNxdWlyZWQgPSBmYWxzZTtcbiAgICAgIGxvZ2dlci53YXJuKCdMb2NrIGZvcmNpYmx5IHJlbGVhc2VkJywgeyBsb2NrOiB0aGlzLmxvY2tQYXRoIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZm9yY2UgcmVsZWFzZSBsb2NrJywgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgbG9jayBpcyBoZWxkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaXNMb2NrZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aGlzLmxvY2tQYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2NrIGZpbGUgZG9lc24ndCBleGlzdCBvciBub3QgYWNjZXNzaWJsZVxuICAgICAgbG9nZ2VyLmRlYnVnKCdMb2NrIGZpbGUgbm90IGFjY2Vzc2libGUnLCB7XG4gICAgICAgIGxvY2s6IHRoaXMubG9ja1BhdGgsXG4gICAgICAgIGNvZGU6IChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gd2l0aCBsb2NrIHByb3RlY3Rpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyB3aXRoTG9jazxUPihcbiAgICBmbjogKCkgPT4gUHJvbWlzZTxUPixcbiAgICBvcHRpb25zOiBMb2NrT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICBjb25zdCBhY3F1aXJlZCA9IGF3YWl0IHRoaXMuYWNxdWlyZShvcHRpb25zKTtcblxuICAgIGlmICghYWNxdWlyZWQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGFjcXVpcmUgbG9jayBmb3Igb3BlcmF0aW9uJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdUaW1lb3V0cy5kZWxldGUodGltZW91dElkKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwgbXMpO1xuICAgICAgdGhpcy5wZW5kaW5nVGltZW91dHMuYWRkKHRpbWVvdXRJZCk7XG4gICAgfSk7XG4gIH1cbn0iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"PerformanceMonitor.d.ts","sourceRoot":"","sources":["../../src/utils/PerformanceMonitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PerformanceMonitor.d.ts","sourceRoot":"","sources":["../../src/utils/PerformanceMonitor.ts"],"names":[],"mappings":"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"}