@dollhousemcp/mcp-server 2.0.0-rc.6 → 2.0.0
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.
- package/CHANGELOG.md +52 -61
- package/README.github.md +2 -2
- package/README.md +2 -2
- package/README.md.backup +284 -224
- package/README.npm.md +2 -2
- package/dist/cache/LRUCache.d.ts +3 -0
- package/dist/cache/LRUCache.d.ts.map +1 -1
- package/dist/cache/LRUCache.js +36 -26
- package/dist/config/env.d.ts +14 -4
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +20 -6
- package/dist/di/Container.d.ts +21 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +250 -53
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +5 -10
- package/dist/elements/base/BaseElementManager.d.ts +22 -0
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +47 -7
- package/dist/elements/memories/Memory.d.ts +1 -0
- package/dist/elements/memories/Memory.d.ts.map +1 -1
- package/dist/elements/memories/Memory.js +12 -8
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
- package/dist/elements/memories/MemoryManager.js +23 -42
- package/dist/elements/memories/MemorySearchIndex.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/handlers/EnhancedIndexHandler.js +6 -6
- package/dist/handlers/element-crud/listElements.d.ts +2 -0
- package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
- package/dist/handlers/element-crud/listElements.js +3 -1
- package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
- package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
- package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/logging/LogHooks.js +11 -11
- package/dist/logging/LogManager.d.ts +0 -2
- package/dist/logging/LogManager.d.ts.map +1 -1
- package/dist/logging/LogManager.js +1 -3
- package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
- package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
- package/dist/logging/sinks/MemoryLogSink.js +12 -3
- package/dist/logging/types.d.ts +0 -2
- package/dist/logging/types.d.ts.map +1 -1
- package/dist/logging/types.js +1 -1
- package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
- package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
- package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
- package/dist/metrics/MetricsManager.d.ts +47 -0
- package/dist/metrics/MetricsManager.d.ts.map +1 -0
- package/dist/metrics/MetricsManager.js +232 -0
- package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
- package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
- package/dist/metrics/OperationMetricsTracker.js +53 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
- package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
- package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
- package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
- package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
- package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
- package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
- package/dist/metrics/collectors/index.d.ts +11 -0
- package/dist/metrics/collectors/index.d.ts.map +1 -0
- package/dist/metrics/collectors/index.js +11 -0
- package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
- package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
- package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
- package/dist/metrics/types.d.ts +98 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +24 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +1 -7
- package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
- package/dist/portfolio/EnhancedIndexManager.js +18 -18
- package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
- package/dist/portfolio/NLPScoringManager.js +5 -9
- package/dist/portfolio/PortfolioIndexManager.js +2 -2
- package/dist/portfolio/RelationshipManager.js +2 -2
- package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
- package/dist/portfolio/VerbTriggerManager.js +5 -19
- package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
- package/dist/portfolio/config/IndexConfig.js +1 -12
- package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
- package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
- package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
- package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
- package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
- package/dist/portfolio/types/RelationshipTypes.js +3 -17
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +36 -8
- package/dist/security/constants.d.ts.map +1 -1
- package/dist/security/constants.js +10 -6
- package/dist/security/fileLockManager.d.ts.map +1 -1
- package/dist/security/fileLockManager.js +8 -6
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +1 -13
- package/dist/security/securityMonitor.d.ts +2 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +14 -3
- package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
- package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
- package/dist/security/telemetry/SecurityTelemetry.js +30 -2
- package/dist/security/tokenManager.d.ts +3 -0
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +13 -5
- package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
- package/dist/security/validation/BackgroundValidator.js +7 -7
- package/dist/server/startup.d.ts.map +1 -1
- package/dist/server/startup.js +8 -24
- package/dist/server/tools/MCPAQLTools.js +4 -1
- package/dist/services/ActivationStore.d.ts.map +1 -1
- package/dist/services/ActivationStore.js +9 -3
- package/dist/services/FileWatchService.d.ts +1 -0
- package/dist/services/FileWatchService.d.ts.map +1 -1
- package/dist/services/FileWatchService.js +83 -48
- package/dist/services/MetadataService.d.ts.map +1 -1
- package/dist/services/MetadataService.js +7 -2
- package/dist/services/query/ElementQueryService.d.ts.map +1 -1
- package/dist/services/query/ElementQueryService.js +1 -41
- package/dist/services/query/PaginationService.d.ts.map +1 -1
- package/dist/services/query/PaginationService.js +1 -14
- package/dist/services/query/SortService.d.ts.map +1 -1
- package/dist/services/query/SortService.js +1 -6
- package/dist/services/validation/ValidationService.d.ts.map +1 -1
- package/dist/services/validation/ValidationService.js +3 -8
- package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
- package/dist/storage/ElementStorageLayer.js +5 -2
- package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
- package/dist/storage/MemoryStorageLayer.js +5 -2
- package/dist/telemetry/OperationalTelemetry.js +2 -2
- package/dist/utils/EventDeduplicator.d.ts +44 -0
- package/dist/utils/EventDeduplicator.d.ts.map +1 -0
- package/dist/utils/EventDeduplicator.js +93 -0
- package/dist/utils/FileLock.d.ts.map +1 -1
- package/dist/utils/FileLock.js +1 -9
- package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
- package/dist/utils/PerformanceMonitor.js +5 -5
- package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
- package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
- package/dist/utils/SlidingWindowRateLimiter.js +23 -0
- package/dist/web/console/IngestRoutes.d.ts +84 -0
- package/dist/web/console/IngestRoutes.d.ts.map +1 -0
- package/dist/web/console/IngestRoutes.js +252 -0
- package/dist/web/console/LeaderElection.d.ts +89 -0
- package/dist/web/console/LeaderElection.d.ts.map +1 -0
- package/dist/web/console/LeaderElection.js +205 -0
- package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
- package/dist/web/console/LeaderForwardingSink.js +197 -0
- package/dist/web/console/SessionNames.d.ts +46 -0
- package/dist/web/console/SessionNames.d.ts.map +1 -0
- package/dist/web/console/SessionNames.js +257 -0
- package/dist/web/console/UnifiedConsole.d.ts +64 -0
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
- package/dist/web/console/UnifiedConsole.js +119 -0
- package/dist/web/contentPipeline.d.ts +58 -0
- package/dist/web/contentPipeline.d.ts.map +1 -0
- package/dist/web/contentPipeline.js +112 -0
- package/dist/web/portDiscovery.d.ts +58 -0
- package/dist/web/portDiscovery.d.ts.map +1 -0
- package/dist/web/portDiscovery.js +143 -0
- package/dist/web/public/app.js +148 -60
- package/dist/web/public/logs.js +638 -0
- package/dist/web/public/metrics.js +682 -0
- package/dist/web/public/permissions.js +394 -0
- package/dist/web/public/sessions.js +369 -0
- package/dist/web/routes/healthRoutes.d.ts +16 -0
- package/dist/web/routes/healthRoutes.d.ts.map +1 -0
- package/dist/web/routes/healthRoutes.js +29 -0
- package/dist/web/routes/logRoutes.d.ts +18 -0
- package/dist/web/routes/logRoutes.d.ts.map +1 -0
- package/dist/web/routes/logRoutes.js +126 -0
- package/dist/web/routes/metricsRoutes.d.ts +17 -0
- package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
- package/dist/web/routes/metricsRoutes.js +90 -0
- package/dist/web/routes/permissionRoutes.d.ts +16 -0
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
- package/dist/web/routes/permissionRoutes.js +133 -0
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +309 -339
- package/dist/web/server.d.ts +21 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +42 -4
- package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
- package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
- package/dist/web/sinks/WebSSELogSink.js +22 -0
- package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
- package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
- package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
- package/package.json +2 -2
- package/server.json +2 -2
- package/dist/constants/version.d.ts +0 -3
- package/dist/constants/version.d.ts.map +0 -1
- package/dist/constants/version.js +0 -4
- package/dist/logging/sinks/SSELogSink.d.ts +0 -35
- package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
- package/dist/logging/sinks/SSELogSink.js +0 -181
- package/dist/logging/viewer/viewerHtml.d.ts +0 -8
- package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
- package/dist/logging/viewer/viewerHtml.js +0 -204
- package/dist/web/public/public/app.js +0 -1878
|
@@ -46,9 +46,13 @@ export const VALIDATION_PATTERNS = {
|
|
|
46
46
|
// For names: allow letters (including accented Latin), numbers, spaces, and basic punctuation
|
|
47
47
|
// Uses Unicode property escapes for proper international support
|
|
48
48
|
SAFE_NAME: /^[\p{L}\p{N}\s\-_.]+$/u,
|
|
49
|
-
// For descriptions: allow
|
|
50
|
-
// Includes
|
|
51
|
-
|
|
49
|
+
// For descriptions: allow broad punctuation for readability
|
|
50
|
+
// Includes common symbols found in real-world portfolio descriptions:
|
|
51
|
+
// #(C#/hashtags) +(C++) %(percentages) =(key=value) @(email/handles)
|
|
52
|
+
// &(and) ~(approximate) *(emphasis) |(separators) {}(templates)
|
|
53
|
+
// <>(angle brackets) $(currency) ^(caret) `(backtick)
|
|
54
|
+
// →↔←↑↓(arrows) ✓✗(checkmarks) and other Unicode symbols
|
|
55
|
+
SAFE_DESCRIPTION: /^[\p{L}\p{N}\p{P}\p{S}\s@#$%^&*+=~`|\\]+$/u,
|
|
52
56
|
// For content: most permissive - ContentValidator handles security threats
|
|
53
57
|
// This allows essentially anything since content validation is separate
|
|
54
58
|
SAFE_CONTENT: /^[\s\S]*$/,
|
|
@@ -69,8 +73,8 @@ export const PATTERN_DESCRIPTIONS = {
|
|
|
69
73
|
charTest: /^[\p{L}\p{N}\s\-_.]$/u,
|
|
70
74
|
},
|
|
71
75
|
SAFE_DESCRIPTION: {
|
|
72
|
-
allowed: 'letters, numbers,
|
|
73
|
-
charTest: /^[\p{L}\p{N}\
|
|
76
|
+
allowed: 'letters, numbers, symbols, spaces, and common punctuation',
|
|
77
|
+
charTest: /^[\p{L}\p{N}\p{P}\p{S}\s@#$%^&*+=~`|\\]$/u,
|
|
74
78
|
},
|
|
75
79
|
SAFE_CONTENT: {
|
|
76
80
|
allowed: 'any characters',
|
|
@@ -104,4 +108,4 @@ export const PATTERN_DESCRIPTIONS = {
|
|
|
104
108
|
charTest: /^[^\s@]$/,
|
|
105
109
|
},
|
|
106
110
|
};
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGtDQUFrQztBQUNsQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFDN0Isc0JBQXNCLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUcsNEJBQTRCO0lBQ3RFLG1CQUFtQixFQUFFLEdBQUcsRUFBbUIsc0JBQXNCO0lBQ2pFLGNBQWMsRUFBRSxFQUFFLEVBQXdCLGdDQUFnQztJQUMxRSxrQkFBa0IsRUFBRSxNQUFNLEVBQWdCLHdEQUF3RDtJQUNsRyxlQUFlLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBZ0IscUNBQXFDO0lBQy9FLHlCQUF5QixFQUFFLElBQUksRUFBVyw2Q0FBNkM7SUFDdkYsYUFBYSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFXLHNCQUFzQjtJQUMvRCxtQkFBbUIsRUFBRSxHQUFHLEVBQWtCLDBCQUEwQjtJQUNwRSxvQkFBb0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFVLGtCQUFrQjtJQUMzRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQWMscUJBQXFCO0lBQzlELGtCQUFrQixFQUFFLEVBQUUsRUFBb0IsK0JBQStCO0lBQ3pFLG9CQUFvQixFQUFFLEVBQUUsRUFBa0IscURBQXFEO0lBRS9GLCtFQUErRTtJQUMvRSxvRkFBb0Y7SUFDcEYsZUFBZSxFQUFFLEdBQUcsRUFBc0IscUJBQXFCO0lBQy9ELHNCQUFzQixFQUFFLEdBQUcsRUFBZSw0QkFBNEI7SUFDdEUscUJBQXFCLEVBQUUsRUFBRSxFQUFpQixzREFBc0Q7SUFDaEcsY0FBYyxFQUFFLEVBQUUsRUFBd0IsbUNBQW1DO0lBQzdFLHNCQUFzQixFQUFFLElBQUksRUFBYyxrQ0FBa0M7SUFFNUUsc0VBQXNFO0lBQ3RFLHNGQUFzRjtJQUN0Riw4RUFBOEU7SUFDOUUsb0ZBQW9GO0lBQ3BGLHNCQUFzQixFQUFFLEtBQUssRUFBYSwrQ0FBK0M7SUFFekYscURBQXFEO0lBQ3JELHNEQUFzRDtJQUN0RCxpR0FBaUc7SUFDakcsb0ZBQW9GO0lBQ3BGLDRFQUE0RTtJQUM1RSxpQ0FBaUMsRUFBRSxDQUFDO0NBQ3JDLENBQUM7QUFFRiw0QkFBNEI7QUFDNUIsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsYUFBYSxFQUFFLGdEQUFnRDtJQUMvRCxTQUFTLEVBQUUsNkJBQTZCO0lBQ3hDLGFBQWEsRUFBRSwrQ0FBK0M7SUFDOUQsYUFBYSxFQUFFLGdDQUFnQztJQUMvQyxVQUFVLEVBQUUsNENBQTRDLEVBQUcsNEJBQTRCO0lBRXZGLGlFQUFpRTtJQUNqRSxrRkFBa0Y7SUFFbEYsOEZBQThGO0lBQzlGLGlFQUFpRTtJQUNqRSxTQUFTLEVBQUUsd0JBQXdCO0lBRW5DLDJEQUEyRDtJQUMzRCx5R0FBeUc7SUFDekcsZ0JBQWdCLEVBQUUsa0RBQWtEO0lBRXBFLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDeEUsWUFBWSxFQUFFLFdBQVc7SUFFekIsK0dBQStHO0lBQy9HLG9CQUFvQixFQUFFLG9CQUFvQjtDQUMzQyxDQUFDO0FBRUY7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUk1QjtJQUNILFNBQVMsRUFBRTtRQUNULE9BQU8sRUFBRSxzREFBc0Q7UUFDL0QsUUFBUSxFQUFFLHVCQUF1QjtLQUNsQztJQUNELGdCQUFnQixFQUFFO1FBQ2hCLE9BQU8sRUFBRSwrR0FBK0c7UUFDeEgsUUFBUSxFQUFFLGlEQUFpRDtLQUM1RDtJQUNELFlBQVksRUFBRTtRQUNaLE9BQU8sRUFBRSxnQkFBZ0I7UUFDekIsUUFBUSxFQUFFLFVBQVU7S0FDckI7SUFDRCxvQkFBb0IsRUFBRTtRQUNwQixPQUFPLEVBQUUsOENBQThDO1FBQ3ZELFFBQVEsRUFBRSxtQkFBbUI7S0FDOUI7SUFDRCxhQUFhLEVBQUU7UUFDYixPQUFPLEVBQUUsOENBQThDO1FBQ3ZELFFBQVEsRUFBRSxtQkFBbUI7UUFDN0IsVUFBVSxFQUFFLHNEQUFzRDtLQUNuRTtJQUNELFNBQVMsRUFBRTtRQUNULE9BQU8sRUFBRSx1RUFBdUU7UUFDaEYsUUFBUSxFQUFFLHNCQUFzQjtLQUNqQztJQUNELGFBQWEsRUFBRTtRQUNiLE9BQU8sRUFBRSw4Q0FBOEM7UUFDdkQsUUFBUSxFQUFFLG1CQUFtQjtRQUM3QixVQUFVLEVBQUUsbURBQW1EO0tBQ2hFO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsT0FBTyxFQUFFLHdDQUF3QztRQUNqRCxRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFVBQVUsRUFBRSx5Q0FBeUM7S0FDdEQ7SUFDRCxVQUFVLEVBQUU7UUFDVixPQUFPLEVBQUUsaURBQWlEO1FBQzFELFFBQVEsRUFBRSxVQUFVO0tBQ3JCO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VjdXJpdHktcmVsYXRlZCBjb25zdGFudHMgYW5kIGxpbWl0c1xuICovXG5cbi8vIFNlY3VyaXR5IGFuZCBwZXJmb3JtYW5jZSBsaW1pdHNcbmV4cG9ydCBjb25zdCBTRUNVUklUWV9MSU1JVFMgPSB7XG4gIE1BWF9QRVJTT05BX1NJWkVfQllURVM6IDEwMjQgKiAxMDI0ICogMiwgIC8vIDJNQiBtYXggcGVyc29uYSBmaWxlIHNpemVcbiAgTUFYX0ZJTEVOQU1FX0xFTkdUSDogMjU1LCAgICAgICAgICAgICAgICAgIC8vIE1heCBmaWxlbmFtZSBsZW5ndGhcbiAgTUFYX1BBVEhfREVQVEg6IDEwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4IGRpcmVjdG9yeSBkZXB0aCBmb3IgcGF0aHNcbiAgTUFYX0NPTlRFTlRfTEVOR1RIOiA1MDAwMDAsICAgICAgICAgICAgICAgLy8gTWF4IGVsZW1lbnQgY29udGVudCBsZW5ndGggKDUwMEtCLCB+MS01bXMgcmVnZXggc2NhbilcbiAgTUFYX1lBTUxfTEVOR1RIOiA2NCAqIDEwMjQsICAgICAgICAgICAgICAgLy8gTWF4IFlBTUwgZnJvbnRtYXR0ZXIgbGVuZ3RoICg2NEtCKVxuICBNQVhfTUVUQURBVEFfRklFTERfTEVOR1RIOiAxMDI0LCAgICAgICAgICAvLyBNYXggaW5kaXZpZHVhbCBtZXRhZGF0YSBmaWVsZCBsZW5ndGggKDFLQilcbiAgTUFYX0ZJTEVfU0laRTogMTAyNCAqIDEwMjQgKiAyLCAgICAgICAgICAvLyBNYXggZmlsZSBzaXplICgyTUIpXG4gIFJBVEVfTElNSVRfUkVRVUVTVFM6IDEwMCwgICAgICAgICAgICAgICAgIC8vIE1heCByZXF1ZXN0cyBwZXIgd2luZG93XG4gIFJBVEVfTElNSVRfV0lORE9XX01TOiA2MCAqIDEwMDAsICAgICAgICAgLy8gMSBtaW51dGUgd2luZG93XG4gIENBQ0hFX1RUTF9NUzogNSAqIDYwICogMTAwMCwgICAgICAgICAgICAgLy8gNSBtaW51dGUgY2FjaGUgVFRMXG4gIE1BWF9TRUFSQ0hfUkVTVUxUUzogNTAsICAgICAgICAgICAgICAgICAgIC8vIE1heCBzZWFyY2ggcmVzdWx0cyB0byByZXR1cm5cbiAgTUFYX0JBVENIX09QRVJBVElPTlM6IDUwLCAgICAgICAgICAgICAgICAgLy8gTWF4IG9wZXJhdGlvbnMgcGVyIGJhdGNoIHJlcXVlc3QgKElzc3VlICMyMjEvIzU0MylcblxuICAvLyBGaWVsZC1sZXZlbCB2YWxpZGF0aW9uIGxpbWl0cyDigJQgdXNlZCBhY3Jvc3MgZWxlbWVudCBtYW5hZ2VycyBhbmQgdmFsaWRhdG9ycy5cbiAgLy8gQ2VudHJhbGl6ZWQgaGVyZSBzbyBhIHNpbmdsZSBjaGFuZ2UgYXBwbGllcyBldmVyeXdoZXJlIGFuZCBncmVwIGZpbmRzIGFsbCB1c2FnZXMuXG4gIE1BWF9OQU1FX0xFTkdUSDogMTAwLCAgICAgICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgbmFtZSBmaWVsZFxuICBNQVhfREVTQ1JJUFRJT05fTEVOR1RIOiA1MDAsICAgICAgICAgICAgICAvLyBFbGVtZW50IGRlc2NyaXB0aW9uIGZpZWxkXG4gIE1BWF9FTlVNX0ZJRUxEX0xFTkdUSDogMjAsICAgICAgICAgICAgICAgIC8vIFNob3J0IGVudW0tbGlrZSBmaWVsZHMgKHN0cmF0ZWd5LCByb2xlLCBhY3RpdmF0aW9uKVxuICBNQVhfVEFHX0xFTkdUSDogNTAsICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmRpdmlkdWFsIHRhZyAvIGNhdGVnb3J5IHZhbHVlc1xuICBNQVhfQ09NTUFORF9BUkdfTEVOR1RIOiAxMDAwLCAgICAgICAgICAgICAvLyBDTEkgY29tbWFuZCBhcmd1bWVudCB2YWxpZGF0aW9uXG5cbiAgLy8gUmVnZXggdmFsaWRhdGlvbiDigJQgY29udGVudCBsZW5ndGggY2FwcyBwZXIgcGF0dGVybiBjb21wbGV4aXR5IHRpZXIuXG4gIC8vIFRoZXNlIGFyZSB0aGUgZGVmYXVsdHMgdXNlZCBieSBSZWdleFZhbGlkYXRvciB3aGVuIG5vIGV4cGxpY2l0IG1heExlbmd0aCBpcyBwYXNzZWQuXG4gIC8vIExvdy9tZWRpdW0gYXJlIHNhZmUgYXQgTUFYX0NPTlRFTlRfTEVOR1RIIGJlY2F1c2UgdGhleSdyZSBPKG4pIGxpbmVhciB0aW1lLlxuICAvLyBIaWdoLWNvbXBsZXhpdHkgcGF0dGVybnMgKG5lc3RlZCBxdWFudGlmaWVycywgUmVEb1MgcmlzaykgYXJlIGhhcmQtY2FwcGVkIGF0IDFLQi5cbiAgTUFYX1JFR0VYX0lOUFVUX0xFTkdUSDogMTAwMDAsICAgICAgICAgICAgLy8gU2FmZVJlZ2V4IGRlZmF1bHQgZm9yIHVzZXItc3VwcGxpZWQgcGF0dGVybnNcblxuICAvLyBZQU1MIGJvbWIgZGV0ZWN0aW9uIHRocmVzaG9sZCAoU0VDVVJJVFkgRklYICMxMjk4KVxuICAvLyBNYXhpbXVtIGFsbG93ZWQgYWxpYXMtdG8tYW5jaG9yIGFtcGxpZmljYXRpb24gcmF0aW9cbiAgLy8gU2V0IHRvIDU6MSAtIGJhbGFuY2VzIHNlY3VyaXR5IChlYXJseSBEb1MgZGV0ZWN0aW9uKSB3aXRoIHVzYWJpbGl0eSAobGVnaXRpbWF0ZSBZQU1MIHBhdHRlcm5zKVxuICAvLyBSYXRpb25hbGU6IE1vc3QgbGVnaXRpbWF0ZSBZQU1MIHVzZXMg4omkM8OXIGFtcGxpZmljYXRpb247IDXDlyBwcm92aWRlcyBzYWZldHkgbWFyZ2luXG4gIC8vIHdoaWxlIGJsb2NraW5nIGV4cG9uZW50aWFsIGV4cGFuc2lvbiBhdHRhY2tzIHRoYXQgdHlwaWNhbGx5IHN0YXJ0IGF0IDEww5crXG4gIFlBTUxfQk9NQl9BTVBMSUZJQ0FUSU9OX1RIUkVTSE9MRDogNVxufTtcblxuLy8gSW5wdXQgdmFsaWRhdGlvbiBwYXR0ZXJuc1xuZXhwb3J0IGNvbnN0IFZBTElEQVRJT05fUEFUVEVSTlMgPSB7XG4gIFNBRkVfRklMRU5BTUU6IC9eW2EtekEtWjAtOV1bYS16QS1aMC05XFwtXy5dezAsMjUwfVthLXpBLVowLTldJC8sXG4gIFNBRkVfUEFUSDogL15bYS16QS1aMC05Oi9cXC1fLn5dezEsNTAwfSQvLFxuICBTQUZFX1VTRVJOQU1FOiAvXlthLXpBLVowLTldW2EtekEtWjAtOVxcLV8uXXswLDMwfVthLXpBLVowLTldJC8sXG4gIFNBRkVfQ0FURUdPUlk6IC9eW2EtekEtWl1bYS16QS1aMC05XFwtX117MCwyMH0kLyxcbiAgU0FGRV9FTUFJTDogL15bXlxcc0BdezEsNjR9QFteXFxzQF17MSwyNTN9XFwuW15cXHNAXXsxLDYzfSQvLCAgLy8gUkZDIDUzMjEgY29tcGxpYW50IGxpbWl0c1xuXG4gIC8vIEZpZWxkLWFwcHJvcHJpYXRlIHBhdHRlcm5zIGZvciBzYW5pdGl6ZS10aGVuLXZhbGlkYXRlIGFwcHJvYWNoXG4gIC8vIFRoZXNlIHBhdHRlcm5zIHZhbGlkYXRlIEFGVEVSIHNhbml0aXphdGlvbiwgc28gdGhleSBhbGxvdyBsZWdpdGltYXRlIGNoYXJhY3RlcnNcblxuICAvLyBGb3IgbmFtZXM6IGFsbG93IGxldHRlcnMgKGluY2x1ZGluZyBhY2NlbnRlZCBMYXRpbiksIG51bWJlcnMsIHNwYWNlcywgYW5kIGJhc2ljIHB1bmN0dWF0aW9uXG4gIC8vIFVzZXMgVW5pY29kZSBwcm9wZXJ0eSBlc2NhcGVzIGZvciBwcm9wZXIgaW50ZXJuYXRpb25hbCBzdXBwb3J0XG4gIFNBRkVfTkFNRTogL15bXFxwe0x9XFxwe059XFxzXFwtXy5dKyQvdSxcblxuICAvLyBGb3IgZGVzY3JpcHRpb25zOiBhbGxvdyBtb3JlIHB1bmN0dWF0aW9uIGZvciByZWFkYWJpbGl0eVxuICAvLyBJbmNsdWRlcyBlbS1kYXNoICjigJQpLCBlbi1kYXNoICjigJMpLCBhbmQgZm9yd2FyZCBzbGFzaCAoLykgd2hpY2ggYXBwZWFyIGluIHJlYWwtd29ybGQgcG9ydGZvbGlvIGVsZW1lbnRzXG4gIFNBRkVfREVTQ1JJUFRJT046IC9eW1xccHtMfVxccHtOfVxcc1xcLV8uLCE/J1wiOjsoKVxcW1xcXVxcdTIwMTNcXHUyMDE0L10rJC91LFxuXG4gIC8vIEZvciBjb250ZW50OiBtb3N0IHBlcm1pc3NpdmUgLSBDb250ZW50VmFsaWRhdG9yIGhhbmRsZXMgc2VjdXJpdHkgdGhyZWF0c1xuICAvLyBUaGlzIGFsbG93cyBlc3NlbnRpYWxseSBhbnl0aGluZyBzaW5jZSBjb250ZW50IHZhbGlkYXRpb24gaXMgc2VwYXJhdGVcbiAgU0FGRV9DT05URU5UOiAvXltcXHNcXFNdKiQvLFxuXG4gIC8vIEZvciBmaWxlbmFtZXMgaW4gY3JlYXRlIG9wZXJhdGlvbnM6IHN0cmljdCBBU0NJSSBvbmx5IChkaWZmZXJlbnQgZnJvbSBTQUZFX0ZJTEVOQU1FIHdoaWNoIGhhcyBsZW5ndGggbGltaXRzKVxuICBTQUZFX0ZJTEVOQU1FX0NSRUFURTogL15bYS16QS1aMC05XFwtXy5dKyQvXG59O1xuXG4vKipcbiAqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9ucyBmb3IgZWFjaCB2YWxpZGF0aW9uIHBhdHRlcm4uXG4gKiBVc2VkIGJ5IFZhbGlkYXRpb25TZXJ2aWNlIHRvIHByb2R1Y2UgYWN0aW9uYWJsZSBlcnJvciBtZXNzYWdlcy5cbiAqXG4gKiAtIGBhbGxvd2VkYDogc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGNoYXJhY3RlciBzZXRcbiAqIC0gYGNoYXJUZXN0YDogc2luZ2xlLWNoYXJhY3RlciByZWdleCB0byBpZGVudGlmeSB3aGljaCBjaGFycyBhcmUgaW52YWxpZFxuICogLSBgc3RydWN0dXJhbGAgKG9wdGlvbmFsKTogZXh0cmEgY29uc3RyYWludCBub3QgY2FwdHVyZWQgYnkgY2hhclRlc3RcbiAqL1xuZXhwb3J0IGNvbnN0IFBBVFRFUk5fREVTQ1JJUFRJT05TOiBSZWNvcmQ8c3RyaW5nLCB7XG4gIGFsbG93ZWQ6IHN0cmluZztcbiAgY2hhclRlc3Q6IFJlZ0V4cDtcbiAgc3RydWN0dXJhbD86IHN0cmluZztcbn0+ID0ge1xuICBTQUZFX05BTUU6IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgc3BhY2VzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cycsXG4gICAgY2hhclRlc3Q6IC9eW1xccHtMfVxccHtOfVxcc1xcLV8uXSQvdSxcbiAgfSxcbiAgU0FGRV9ERVNDUklQVElPTjoge1xuICAgIGFsbG93ZWQ6ICdsZXR0ZXJzLCBudW1iZXJzLCBzcGFjZXMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzLCBjb21tb24gcHVuY3R1YXRpb24sIGVtLWRhc2gsIGVuLWRhc2gsIGFuZCBmb3J3YXJkIHNsYXNoJyxcbiAgICBjaGFyVGVzdDogL15bXFxwe0x9XFxwe059XFxzXFwtXy4sIT8nXCI6OygpXFxbXFxdXFx1MjAxM1xcdTIwMTQvXSQvdSxcbiAgfSxcbiAgU0FGRV9DT05URU5UOiB7XG4gICAgYWxsb3dlZDogJ2FueSBjaGFyYWN0ZXJzJyxcbiAgICBjaGFyVGVzdDogL15bXFxzXFxTXSQvLFxuICB9LFxuICBTQUZFX0ZJTEVOQU1FX0NSRUFURToge1xuICAgIGFsbG93ZWQ6ICdsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cycsXG4gICAgY2hhclRlc3Q6IC9eW2EtekEtWjAtOVxcLV8uXSQvLFxuICB9LFxuICBTQUZFX0ZJTEVOQU1FOiB7XG4gICAgYWxsb3dlZDogJ2xldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzJyxcbiAgICBjaGFyVGVzdDogL15bYS16QS1aMC05XFwtXy5dJC8sXG4gICAgc3RydWN0dXJhbDogJ211c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIGFscGhhbnVtZXJpYyAobWF4IDI1MiBjaGFycyknLFxuICB9LFxuICBTQUZFX1BBVEg6IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgY29sb25zLCBzbGFzaGVzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cywgdGlsZGVzJyxcbiAgICBjaGFyVGVzdDogL15bYS16QS1aMC05Oi9cXC1fLn5dJC8sXG4gIH0sXG4gIFNBRkVfVVNFUk5BTUU6IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMnLFxuICAgIGNoYXJUZXN0OiAvXlthLXpBLVowLTlcXC1fLl0kLyxcbiAgICBzdHJ1Y3R1cmFsOiAnbXVzdCBzdGFydCBhbmQgZW5kIHdpdGggYWxwaGFudW1lcmljICgzLTMyIGNoYXJzKScsXG4gIH0sXG4gIFNBRkVfQ0FURUdPUlk6IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgdW5kZXJzY29yZXMnLFxuICAgIGNoYXJUZXN0OiAvXlthLXpBLVowLTlcXC1fXSQvLFxuICAgIHN0cnVjdHVyYWw6ICdtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKG1heCAyMSBjaGFycyknLFxuICB9LFxuICBTQUZFX0VNQUlMOiB7XG4gICAgYWxsb3dlZDogJ2xldHRlcnMsIG51bWJlcnMsIGRvdHMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBAJyxcbiAgICBjaGFyVGVzdDogL15bXlxcc0BdJC8sXG4gIH0sXG59O1xuIl19
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGtDQUFrQztBQUNsQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFDN0Isc0JBQXNCLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUcsNEJBQTRCO0lBQ3RFLG1CQUFtQixFQUFFLEdBQUcsRUFBbUIsc0JBQXNCO0lBQ2pFLGNBQWMsRUFBRSxFQUFFLEVBQXdCLGdDQUFnQztJQUMxRSxrQkFBa0IsRUFBRSxNQUFNLEVBQWdCLHdEQUF3RDtJQUNsRyxlQUFlLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBZ0IscUNBQXFDO0lBQy9FLHlCQUF5QixFQUFFLElBQUksRUFBVyw2Q0FBNkM7SUFDdkYsYUFBYSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFXLHNCQUFzQjtJQUMvRCxtQkFBbUIsRUFBRSxHQUFHLEVBQWtCLDBCQUEwQjtJQUNwRSxvQkFBb0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFVLGtCQUFrQjtJQUMzRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQWMscUJBQXFCO0lBQzlELGtCQUFrQixFQUFFLEVBQUUsRUFBb0IsK0JBQStCO0lBQ3pFLG9CQUFvQixFQUFFLEVBQUUsRUFBa0IscURBQXFEO0lBRS9GLCtFQUErRTtJQUMvRSxvRkFBb0Y7SUFDcEYsZUFBZSxFQUFFLEdBQUcsRUFBc0IscUJBQXFCO0lBQy9ELHNCQUFzQixFQUFFLEdBQUcsRUFBZSw0QkFBNEI7SUFDdEUscUJBQXFCLEVBQUUsRUFBRSxFQUFpQixzREFBc0Q7SUFDaEcsY0FBYyxFQUFFLEVBQUUsRUFBd0IsbUNBQW1DO0lBQzdFLHNCQUFzQixFQUFFLElBQUksRUFBYyxrQ0FBa0M7SUFFNUUsc0VBQXNFO0lBQ3RFLHNGQUFzRjtJQUN0Riw4RUFBOEU7SUFDOUUsb0ZBQW9GO0lBQ3BGLHNCQUFzQixFQUFFLEtBQUssRUFBYSwrQ0FBK0M7SUFFekYscURBQXFEO0lBQ3JELHNEQUFzRDtJQUN0RCxpR0FBaUc7SUFDakcsb0ZBQW9GO0lBQ3BGLDRFQUE0RTtJQUM1RSxpQ0FBaUMsRUFBRSxDQUFDO0NBQ3JDLENBQUM7QUFFRiw0QkFBNEI7QUFDNUIsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsYUFBYSxFQUFFLGdEQUFnRDtJQUMvRCxTQUFTLEVBQUUsNkJBQTZCO0lBQ3hDLGFBQWEsRUFBRSwrQ0FBK0M7SUFDOUQsYUFBYSxFQUFFLGdDQUFnQztJQUMvQyxVQUFVLEVBQUUsNENBQTRDLEVBQUcsNEJBQTRCO0lBRXZGLGlFQUFpRTtJQUNqRSxrRkFBa0Y7SUFFbEYsOEZBQThGO0lBQzlGLGlFQUFpRTtJQUNqRSxTQUFTLEVBQUUsd0JBQXdCO0lBRW5DLDREQUE0RDtJQUM1RCxzRUFBc0U7SUFDdEUscUVBQXFFO0lBQ3JFLGdFQUFnRTtJQUNoRSxzREFBc0Q7SUFDdEQseURBQXlEO0lBQ3pELGdCQUFnQixFQUFFLDRDQUE0QztJQUU5RCwyRUFBMkU7SUFDM0Usd0VBQXdFO0lBQ3hFLFlBQVksRUFBRSxXQUFXO0lBRXpCLCtHQUErRztJQUMvRyxvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDM0MsQ0FBQztBQUVGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FJNUI7SUFDSCxTQUFTLEVBQUU7UUFDVCxPQUFPLEVBQUUsc0RBQXNEO1FBQy9ELFFBQVEsRUFBRSx1QkFBdUI7S0FDbEM7SUFDRCxnQkFBZ0IsRUFBRTtRQUNoQixPQUFPLEVBQUUsMkRBQTJEO1FBQ3BFLFFBQVEsRUFBRSwyQ0FBMkM7S0FDdEQ7SUFDRCxZQUFZLEVBQUU7UUFDWixPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLFFBQVEsRUFBRSxVQUFVO0tBQ3JCO0lBQ0Qsb0JBQW9CLEVBQUU7UUFDcEIsT0FBTyxFQUFFLDhDQUE4QztRQUN2RCxRQUFRLEVBQUUsbUJBQW1CO0tBQzlCO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsT0FBTyxFQUFFLDhDQUE4QztRQUN2RCxRQUFRLEVBQUUsbUJBQW1CO1FBQzdCLFVBQVUsRUFBRSxzREFBc0Q7S0FDbkU7SUFDRCxTQUFTLEVBQUU7UUFDVCxPQUFPLEVBQUUsdUVBQXVFO1FBQ2hGLFFBQVEsRUFBRSxzQkFBc0I7S0FDakM7SUFDRCxhQUFhLEVBQUU7UUFDYixPQUFPLEVBQUUsOENBQThDO1FBQ3ZELFFBQVEsRUFBRSxtQkFBbUI7UUFDN0IsVUFBVSxFQUFFLG1EQUFtRDtLQUNoRTtJQUNELGFBQWEsRUFBRTtRQUNiLE9BQU8sRUFBRSx3Q0FBd0M7UUFDakQsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixVQUFVLEVBQUUseUNBQXlDO0tBQ3REO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsT0FBTyxFQUFFLGlEQUFpRDtRQUMxRCxRQUFRLEVBQUUsVUFBVTtLQUNyQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyaXR5LXJlbGF0ZWQgY29uc3RhbnRzIGFuZCBsaW1pdHNcbiAqL1xuXG4vLyBTZWN1cml0eSBhbmQgcGVyZm9ybWFuY2UgbGltaXRzXG5leHBvcnQgY29uc3QgU0VDVVJJVFlfTElNSVRTID0ge1xuICBNQVhfUEVSU09OQV9TSVpFX0JZVEVTOiAxMDI0ICogMTAyNCAqIDIsICAvLyAyTUIgbWF4IHBlcnNvbmEgZmlsZSBzaXplXG4gIE1BWF9GSUxFTkFNRV9MRU5HVEg6IDI1NSwgICAgICAgICAgICAgICAgICAvLyBNYXggZmlsZW5hbWUgbGVuZ3RoXG4gIE1BWF9QQVRIX0RFUFRIOiAxMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heCBkaXJlY3RvcnkgZGVwdGggZm9yIHBhdGhzXG4gIE1BWF9DT05URU5UX0xFTkdUSDogNTAwMDAwLCAgICAgICAgICAgICAgIC8vIE1heCBlbGVtZW50IGNvbnRlbnQgbGVuZ3RoICg1MDBLQiwgfjEtNW1zIHJlZ2V4IHNjYW4pXG4gIE1BWF9ZQU1MX0xFTkdUSDogNjQgKiAxMDI0LCAgICAgICAgICAgICAgIC8vIE1heCBZQU1MIGZyb250bWF0dGVyIGxlbmd0aCAoNjRLQilcbiAgTUFYX01FVEFEQVRBX0ZJRUxEX0xFTkdUSDogMTAyNCwgICAgICAgICAgLy8gTWF4IGluZGl2aWR1YWwgbWV0YWRhdGEgZmllbGQgbGVuZ3RoICgxS0IpXG4gIE1BWF9GSUxFX1NJWkU6IDEwMjQgKiAxMDI0ICogMiwgICAgICAgICAgLy8gTWF4IGZpbGUgc2l6ZSAoMk1CKVxuICBSQVRFX0xJTUlUX1JFUVVFU1RTOiAxMDAsICAgICAgICAgICAgICAgICAvLyBNYXggcmVxdWVzdHMgcGVyIHdpbmRvd1xuICBSQVRFX0xJTUlUX1dJTkRPV19NUzogNjAgKiAxMDAwLCAgICAgICAgIC8vIDEgbWludXRlIHdpbmRvd1xuICBDQUNIRV9UVExfTVM6IDUgKiA2MCAqIDEwMDAsICAgICAgICAgICAgIC8vIDUgbWludXRlIGNhY2hlIFRUTFxuICBNQVhfU0VBUkNIX1JFU1VMVFM6IDUwLCAgICAgICAgICAgICAgICAgICAvLyBNYXggc2VhcmNoIHJlc3VsdHMgdG8gcmV0dXJuXG4gIE1BWF9CQVRDSF9PUEVSQVRJT05TOiA1MCwgICAgICAgICAgICAgICAgIC8vIE1heCBvcGVyYXRpb25zIHBlciBiYXRjaCByZXF1ZXN0IChJc3N1ZSAjMjIxLyM1NDMpXG5cbiAgLy8gRmllbGQtbGV2ZWwgdmFsaWRhdGlvbiBsaW1pdHMg4oCUIHVzZWQgYWNyb3NzIGVsZW1lbnQgbWFuYWdlcnMgYW5kIHZhbGlkYXRvcnMuXG4gIC8vIENlbnRyYWxpemVkIGhlcmUgc28gYSBzaW5nbGUgY2hhbmdlIGFwcGxpZXMgZXZlcnl3aGVyZSBhbmQgZ3JlcCBmaW5kcyBhbGwgdXNhZ2VzLlxuICBNQVhfTkFNRV9MRU5HVEg6IDEwMCwgICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IG5hbWUgZmllbGRcbiAgTUFYX0RFU0NSSVBUSU9OX0xFTkdUSDogNTAwLCAgICAgICAgICAgICAgLy8gRWxlbWVudCBkZXNjcmlwdGlvbiBmaWVsZFxuICBNQVhfRU5VTV9GSUVMRF9MRU5HVEg6IDIwLCAgICAgICAgICAgICAgICAvLyBTaG9ydCBlbnVtLWxpa2UgZmllbGRzIChzdHJhdGVneSwgcm9sZSwgYWN0aXZhdGlvbilcbiAgTUFYX1RBR19MRU5HVEg6IDUwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kaXZpZHVhbCB0YWcgLyBjYXRlZ29yeSB2YWx1ZXNcbiAgTUFYX0NPTU1BTkRfQVJHX0xFTkdUSDogMTAwMCwgICAgICAgICAgICAgLy8gQ0xJIGNvbW1hbmQgYXJndW1lbnQgdmFsaWRhdGlvblxuXG4gIC8vIFJlZ2V4IHZhbGlkYXRpb24g4oCUIGNvbnRlbnQgbGVuZ3RoIGNhcHMgcGVyIHBhdHRlcm4gY29tcGxleGl0eSB0aWVyLlxuICAvLyBUaGVzZSBhcmUgdGhlIGRlZmF1bHRzIHVzZWQgYnkgUmVnZXhWYWxpZGF0b3Igd2hlbiBubyBleHBsaWNpdCBtYXhMZW5ndGggaXMgcGFzc2VkLlxuICAvLyBMb3cvbWVkaXVtIGFyZSBzYWZlIGF0IE1BWF9DT05URU5UX0xFTkdUSCBiZWNhdXNlIHRoZXkncmUgTyhuKSBsaW5lYXIgdGltZS5cbiAgLy8gSGlnaC1jb21wbGV4aXR5IHBhdHRlcm5zIChuZXN0ZWQgcXVhbnRpZmllcnMsIFJlRG9TIHJpc2spIGFyZSBoYXJkLWNhcHBlZCBhdCAxS0IuXG4gIE1BWF9SRUdFWF9JTlBVVF9MRU5HVEg6IDEwMDAwLCAgICAgICAgICAgIC8vIFNhZmVSZWdleCBkZWZhdWx0IGZvciB1c2VyLXN1cHBsaWVkIHBhdHRlcm5zXG5cbiAgLy8gWUFNTCBib21iIGRldGVjdGlvbiB0aHJlc2hvbGQgKFNFQ1VSSVRZIEZJWCAjMTI5OClcbiAgLy8gTWF4aW11bSBhbGxvd2VkIGFsaWFzLXRvLWFuY2hvciBhbXBsaWZpY2F0aW9uIHJhdGlvXG4gIC8vIFNldCB0byA1OjEgLSBiYWxhbmNlcyBzZWN1cml0eSAoZWFybHkgRG9TIGRldGVjdGlvbikgd2l0aCB1c2FiaWxpdHkgKGxlZ2l0aW1hdGUgWUFNTCBwYXR0ZXJucylcbiAgLy8gUmF0aW9uYWxlOiBNb3N0IGxlZ2l0aW1hdGUgWUFNTCB1c2VzIOKJpDPDlyBhbXBsaWZpY2F0aW9uOyA1w5cgcHJvdmlkZXMgc2FmZXR5IG1hcmdpblxuICAvLyB3aGlsZSBibG9ja2luZyBleHBvbmVudGlhbCBleHBhbnNpb24gYXR0YWNrcyB0aGF0IHR5cGljYWxseSBzdGFydCBhdCAxMMOXK1xuICBZQU1MX0JPTUJfQU1QTElGSUNBVElPTl9USFJFU0hPTEQ6IDVcbn07XG5cbi8vIElucHV0IHZhbGlkYXRpb24gcGF0dGVybnNcbmV4cG9ydCBjb25zdCBWQUxJREFUSU9OX1BBVFRFUk5TID0ge1xuICBTQUZFX0ZJTEVOQU1FOiAvXlthLXpBLVowLTldW2EtekEtWjAtOVxcLV8uXXswLDI1MH1bYS16QS1aMC05XSQvLFxuICBTQUZFX1BBVEg6IC9eW2EtekEtWjAtOTovXFwtXy5+XXsxLDUwMH0kLyxcbiAgU0FGRV9VU0VSTkFNRTogL15bYS16QS1aMC05XVthLXpBLVowLTlcXC1fLl17MCwzMH1bYS16QS1aMC05XSQvLFxuICBTQUZFX0NBVEVHT1JZOiAvXlthLXpBLVpdW2EtekEtWjAtOVxcLV9dezAsMjB9JC8sXG4gIFNBRkVfRU1BSUw6IC9eW15cXHNAXXsxLDY0fUBbXlxcc0BdezEsMjUzfVxcLlteXFxzQF17MSw2M30kLywgIC8vIFJGQyA1MzIxIGNvbXBsaWFudCBsaW1pdHNcblxuICAvLyBGaWVsZC1hcHByb3ByaWF0ZSBwYXR0ZXJucyBmb3Igc2FuaXRpemUtdGhlbi12YWxpZGF0ZSBhcHByb2FjaFxuICAvLyBUaGVzZSBwYXR0ZXJucyB2YWxpZGF0ZSBBRlRFUiBzYW5pdGl6YXRpb24sIHNvIHRoZXkgYWxsb3cgbGVnaXRpbWF0ZSBjaGFyYWN0ZXJzXG5cbiAgLy8gRm9yIG5hbWVzOiBhbGxvdyBsZXR0ZXJzIChpbmNsdWRpbmcgYWNjZW50ZWQgTGF0aW4pLCBudW1iZXJzLCBzcGFjZXMsIGFuZCBiYXNpYyBwdW5jdHVhdGlvblxuICAvLyBVc2VzIFVuaWNvZGUgcHJvcGVydHkgZXNjYXBlcyBmb3IgcHJvcGVyIGludGVybmF0aW9uYWwgc3VwcG9ydFxuICBTQUZFX05BTUU6IC9eW1xccHtMfVxccHtOfVxcc1xcLV8uXSskL3UsXG5cbiAgLy8gRm9yIGRlc2NyaXB0aW9uczogYWxsb3cgYnJvYWQgcHVuY3R1YXRpb24gZm9yIHJlYWRhYmlsaXR5XG4gIC8vIEluY2x1ZGVzIGNvbW1vbiBzeW1ib2xzIGZvdW5kIGluIHJlYWwtd29ybGQgcG9ydGZvbGlvIGRlc2NyaXB0aW9uczpcbiAgLy8gIyhDIy9oYXNodGFncykgKyhDKyspICUocGVyY2VudGFnZXMpID0oa2V5PXZhbHVlKSBAKGVtYWlsL2hhbmRsZXMpXG4gIC8vICYoYW5kKSB+KGFwcHJveGltYXRlKSAqKGVtcGhhc2lzKSB8KHNlcGFyYXRvcnMpIHt9KHRlbXBsYXRlcylcbiAgLy8gPD4oYW5nbGUgYnJhY2tldHMpICQoY3VycmVuY3kpIF4oY2FyZXQpIGAoYmFja3RpY2spXG4gIC8vIOKGkuKGlOKGkOKGkeKGkyhhcnJvd3MpIOKck+KclyhjaGVja21hcmtzKSBhbmQgb3RoZXIgVW5pY29kZSBzeW1ib2xzXG4gIFNBRkVfREVTQ1JJUFRJT046IC9eW1xccHtMfVxccHtOfVxccHtQfVxccHtTfVxcc0AjJCVeJiorPX5gfFxcXFxdKyQvdSxcblxuICAvLyBGb3IgY29udGVudDogbW9zdCBwZXJtaXNzaXZlIC0gQ29udGVudFZhbGlkYXRvciBoYW5kbGVzIHNlY3VyaXR5IHRocmVhdHNcbiAgLy8gVGhpcyBhbGxvd3MgZXNzZW50aWFsbHkgYW55dGhpbmcgc2luY2UgY29udGVudCB2YWxpZGF0aW9uIGlzIHNlcGFyYXRlXG4gIFNBRkVfQ09OVEVOVDogL15bXFxzXFxTXSokLyxcblxuICAvLyBGb3IgZmlsZW5hbWVzIGluIGNyZWF0ZSBvcGVyYXRpb25zOiBzdHJpY3QgQVNDSUkgb25seSAoZGlmZmVyZW50IGZyb20gU0FGRV9GSUxFTkFNRSB3aGljaCBoYXMgbGVuZ3RoIGxpbWl0cylcbiAgU0FGRV9GSUxFTkFNRV9DUkVBVEU6IC9eW2EtekEtWjAtOVxcLV8uXSskL1xufTtcblxuLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbnMgZm9yIGVhY2ggdmFsaWRhdGlvbiBwYXR0ZXJuLlxuICogVXNlZCBieSBWYWxpZGF0aW9uU2VydmljZSB0byBwcm9kdWNlIGFjdGlvbmFibGUgZXJyb3IgbWVzc2FnZXMuXG4gKlxuICogLSBgYWxsb3dlZGA6IHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgc2V0XG4gKiAtIGBjaGFyVGVzdGA6IHNpbmdsZS1jaGFyYWN0ZXIgcmVnZXggdG8gaWRlbnRpZnkgd2hpY2ggY2hhcnMgYXJlIGludmFsaWRcbiAqIC0gYHN0cnVjdHVyYWxgIChvcHRpb25hbCk6IGV4dHJhIGNvbnN0cmFpbnQgbm90IGNhcHR1cmVkIGJ5IGNoYXJUZXN0XG4gKi9cbmV4cG9ydCBjb25zdCBQQVRURVJOX0RFU0NSSVBUSU9OUzogUmVjb3JkPHN0cmluZywge1xuICBhbGxvd2VkOiBzdHJpbmc7XG4gIGNoYXJUZXN0OiBSZWdFeHA7XG4gIHN0cnVjdHVyYWw/OiBzdHJpbmc7XG59PiA9IHtcbiAgU0FGRV9OQU1FOiB7XG4gICAgYWxsb3dlZDogJ2xldHRlcnMsIG51bWJlcnMsIHNwYWNlcywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMnLFxuICAgIGNoYXJUZXN0OiAvXltcXHB7TH1cXHB7Tn1cXHNcXC1fLl0kL3UsXG4gIH0sXG4gIFNBRkVfREVTQ1JJUFRJT046IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgc3ltYm9scywgc3BhY2VzLCBhbmQgY29tbW9uIHB1bmN0dWF0aW9uJyxcbiAgICBjaGFyVGVzdDogL15bXFxwe0x9XFxwe059XFxwe1B9XFxwe1N9XFxzQCMkJV4mKis9fmB8XFxcXF0kL3UsXG4gIH0sXG4gIFNBRkVfQ09OVEVOVDoge1xuICAgIGFsbG93ZWQ6ICdhbnkgY2hhcmFjdGVycycsXG4gICAgY2hhclRlc3Q6IC9eW1xcc1xcU10kLyxcbiAgfSxcbiAgU0FGRV9GSUxFTkFNRV9DUkVBVEU6IHtcbiAgICBhbGxvd2VkOiAnbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMnLFxuICAgIGNoYXJUZXN0OiAvXlthLXpBLVowLTlcXC1fLl0kLyxcbiAgfSxcbiAgU0FGRV9GSUxFTkFNRToge1xuICAgIGFsbG93ZWQ6ICdsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cycsXG4gICAgY2hhclRlc3Q6IC9eW2EtekEtWjAtOVxcLV8uXSQvLFxuICAgIHN0cnVjdHVyYWw6ICdtdXN0IHN0YXJ0IGFuZCBlbmQgd2l0aCBhbHBoYW51bWVyaWMgKG1heCAyNTIgY2hhcnMpJyxcbiAgfSxcbiAgU0FGRV9QQVRIOiB7XG4gICAgYWxsb3dlZDogJ2xldHRlcnMsIG51bWJlcnMsIGNvbG9ucywgc2xhc2hlcywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMsIHRpbGRlcycsXG4gICAgY2hhclRlc3Q6IC9eW2EtekEtWjAtOTovXFwtXy5+XSQvLFxuICB9LFxuICBTQUZFX1VTRVJOQU1FOiB7XG4gICAgYWxsb3dlZDogJ2xldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzJyxcbiAgICBjaGFyVGVzdDogL15bYS16QS1aMC05XFwtXy5dJC8sXG4gICAgc3RydWN0dXJhbDogJ211c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIGFscGhhbnVtZXJpYyAoMy0zMiBjaGFycyknLFxuICB9LFxuICBTQUZFX0NBVEVHT1JZOiB7XG4gICAgYWxsb3dlZDogJ2xldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzJyxcbiAgICBjaGFyVGVzdDogL15bYS16QS1aMC05XFwtX10kLyxcbiAgICBzdHJ1Y3R1cmFsOiAnbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIChtYXggMjEgY2hhcnMpJyxcbiAgfSxcbiAgU0FGRV9FTUFJTDoge1xuICAgIGFsbG93ZWQ6ICdsZXR0ZXJzLCBudW1iZXJzLCBkb3RzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgQCcsXG4gICAgY2hhclRlc3Q6IC9eW15cXHNAXSQvLFxuICB9LFxufTtcbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileLockManager.d.ts","sourceRoot":"","sources":["../../src/security/fileLockManager.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,KAAK,CAAmC;IAGhD,OAAO,CAAC,OAAO,CAKb;IAEF,OAAO,CAAC,WAAW,CAAC,CAAwG;IAE5H,cAAc,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAMrI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6B;IAGhE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAEnC;;;;;;OAMG;IACG,QAAQ,CAAC,CAAC,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACjC,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"fileLockManager.d.ts","sourceRoot":"","sources":["../../src/security/fileLockManager.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,KAAK,CAAmC;IAGhD,OAAO,CAAC,OAAO,CAKb;IAEF,OAAO,CAAC,WAAW,CAAC,CAAwG;IAE5H,cAAc,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAMrI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6B;IAGhE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAEnC;;;;;;OAMG;IACG,QAAQ,CAAC,CAAC,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACjC,OAAO,CAAC,CAAC,CAAC;IAgDb;;OAEG;YACW,kBAAkB;IAyBhC;;;OAGG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;KAAE,GACtC,OAAO,CAAC,IAAI,CAAC;IA2BhB;;OAEG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;KAAE,GACtC,OAAO,CAAC,MAAM,CAAC;IAOlB;;OAEG;YACW,eAAe;IAO7B;;OAEG;IACH,UAAU;;;;;;;;;;IAmBV;;OAEG;IACH,aAAa,IAAI,IAAI;IAKrB;;OAEG;IACH,YAAY,IAAI,IAAI;CAQrB"}
|
|
@@ -43,12 +43,12 @@ export class FileLockManager {
|
|
|
43
43
|
async withLock(resource, operation, options = {}) {
|
|
44
44
|
const startTime = Date.now();
|
|
45
45
|
this.metrics.totalLockRequests++;
|
|
46
|
-
logger.debug(`Lock requested for resource: ${resource}`);
|
|
47
46
|
// Wait for any existing operation on this resource
|
|
48
47
|
const existingLock = this.locks.get(resource);
|
|
49
48
|
if (existingLock) {
|
|
50
49
|
this.metrics.concurrentWaits++;
|
|
51
|
-
|
|
50
|
+
const shortResource = path.basename(resource);
|
|
51
|
+
logger.debug(`Lock contention on: ${shortResource}`, { resource });
|
|
52
52
|
this.logListener?.('debug', 'Detect lock contention', { resource });
|
|
53
53
|
try {
|
|
54
54
|
await existingLock;
|
|
@@ -70,14 +70,17 @@ export class FileLockManager {
|
|
|
70
70
|
this.metrics.lockWaitTime.set(resource, []);
|
|
71
71
|
}
|
|
72
72
|
this.metrics.lockWaitTime.get(resource).push(waitTime);
|
|
73
|
-
|
|
73
|
+
// Only log locks that actually waited (>5ms indicates real contention)
|
|
74
|
+
if (waitTime > 5) {
|
|
75
|
+
const shortResource = path.basename(resource);
|
|
76
|
+
logger.debug(`Slow lock: ${shortResource} (${waitTime}ms)`);
|
|
77
|
+
}
|
|
74
78
|
return result;
|
|
75
79
|
}
|
|
76
80
|
finally {
|
|
77
81
|
// Clean up lock - unconditional delete is safe and race-free
|
|
78
82
|
// This operation completed, so remove its lock from the map
|
|
79
83
|
this.locks.delete(resource);
|
|
80
|
-
logger.debug(`Lock queue cleaned up for resource: ${resource}`);
|
|
81
84
|
}
|
|
82
85
|
}
|
|
83
86
|
/**
|
|
@@ -118,7 +121,6 @@ export class FileLockManager {
|
|
|
118
121
|
await fs.writeFile(tempPath, content, options);
|
|
119
122
|
// Atomic rename (on same filesystem)
|
|
120
123
|
await fs.rename(tempPath, filePath);
|
|
121
|
-
logger.debug(`Atomic write completed: ${filePath}`);
|
|
122
124
|
}
|
|
123
125
|
catch (error) {
|
|
124
126
|
// Clean up temp file on error
|
|
@@ -190,4 +192,4 @@ export class FileLockManager {
|
|
|
190
192
|
};
|
|
191
193
|
}
|
|
192
194
|
}
|
|
193
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZUxvY2tNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUU3RTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIscURBQXFEO0lBQzdDLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUVoRCwwQ0FBMEM7SUFDbEMsT0FBTyxHQUFHO1FBQ2hCLGlCQUFpQixFQUFFLENBQUM7UUFDcEIsWUFBWSxFQUFFLElBQUksR0FBRyxFQUFvQjtRQUN6QyxZQUFZLEVBQUUsQ0FBQztRQUNmLGVBQWUsRUFBRSxDQUFDO0tBQ25CLENBQUM7SUFFTSxXQUFXLENBQXlHO0lBRTVILGNBQWMsQ0FBQyxFQUF5RztRQUN0SCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixPQUFPLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCx3RUFBd0U7SUFDdkQsa0JBQWtCLEdBQUcsdUJBQXVCLEVBQUUsQ0FBQztJQUVoRSwyQkFBMkI7SUFDVixRQUFRLEdBQUcsTUFBTSxDQUFDO0lBRW5DOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQ1osUUFBZ0IsRUFDaEIsU0FBMkIsRUFDM0IsVUFBZ0MsRUFBRTtRQUVsQyxNQUFNLFNBQVMsR0FBRyxJQUFJ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RSxDQUFDO1lBQ2YsZUFBZSxFQUFFLENBQUM7U0FDbkIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdGVkTG9ja1RpbWVvdXQgfSBmcm9tICcuLi9jb25maWcvcGVyZm9ybWFuY2UtY29uc3RhbnRzLmpzJztcblxuLyoqXG4gKiBGaWxlTG9ja01hbmFnZXIgLSBQcmV2ZW50cyByYWNlIGNvbmRpdGlvbnMgaW4gY29uY3VycmVudCBmaWxlIG9wZXJhdGlvbnNcbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIFJlc291cmNlLWJhc2VkIGxvY2tpbmcgd2l0aCBhdXRvbWF0aWMgY2xlYW51cFxuICogLSBDb25maWd1cmFibGUgdGltZW91dHMgdG8gcHJldmVudCBkZWFkbG9ja3NcbiAqIC0gQXRvbWljIGZpbGUgb3BlcmF0aW9ucyB3aXRoIHdyaXRlLXJlbmFtZSBwYXR0ZXJuXG4gKiAtIExvY2sgcXVldWVpbmcgZm9yIGNvbmN1cnJlbnQgcmVxdWVzdHNcbiAqIC0gQ29tcHJlaGVuc2l2ZSBlcnJvciBoYW5kbGluZyBhbmQgbG9nZ2luZ1xuICogLSBQZXJmb3JtYW5jZSBtZXRyaWNzIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlTG9ja01hbmFnZXIge1xuICAvLyBNYXAgb2YgcmVzb3VyY2UgaWRlbnRpZmllcnMgdG8gdGhlaXIgbG9jayBwcm9taXNlc1xuICBwcml2YXRlIGxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8YW55Pj4oKTtcblxuICAvLyBMb2NrIGFjcXVpc2l0aW9uIG1ldHJpY3MgZm9yIG1vbml0b3JpbmdcbiAgcHJpdmF0ZSBtZXRyaWNzID0ge1xuICAgIHRvdGFsTG9ja1JlcXVlc3RzOiAwLFxuICAgIGxvY2tXYWl0VGltZTogbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpLFxuICAgIGxvY2tUaW1lb3V0czogMCxcbiAgICBjb25jdXJyZW50V2FpdHM6IDBcbiAgfTtcblxuICBwcml2YXRlIGxvZ0xpc3RlbmVyPzogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG5cbiAgYWRkTG9nTGlzdGVuZXIoZm46IChsZXZlbDogJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5sb2dMaXN0ZW5lciA9IGZuO1xuICAgIHJldHVybiAoKSA9PiB7IHRoaXMubG9nTGlzdGVuZXIgPSB1bmRlZmluZWQ7IH07XG4gIH1cblxuICAvLyBEZWZhdWx0IHRpbWVvdXQgZm9yIGxvY2sgb3BlcmF0aW9ucyAtIHVzaW5nIGNlbnRyYWxpemVkIGNvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX1RJTUVPVVRfTVMgPSBnZXRWYWxpZGF0ZWRMb2NrVGltZW91dCgpO1xuXG4gIC8vIFRlbXBvcmFyeSBmaWxlIGRpcmVjdG9yeVxuICBwcml2YXRlIHJlYWRvbmx5IFRFTVBfRElSID0gJy50bXAnO1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIG9wZXJhdGlvbiB3aXRoIGV4Y2x1c2l2ZSBsb2NrIG9uIGEgcmVzb3VyY2VcbiAgICogQHBhcmFtIHJlc291cmNlIC0gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZSAoZS5nLiwgJ3BlcnNvbmE6bmFtZScpXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBBc3luYyBmdW5jdGlvbiB0byBleGVjdXRlIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2tcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBMb2NrIG9wdGlvbnMgaW5jbHVkaW5nIHRpbWVvdXRcbiAgICogQHJldHVybnMgUmVzdWx0IG9mIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIGFzeW5jIHdpdGhMb2NrPFQ+KFxuICAgIHJlc291cmNlOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiAoKSA9PiBQcm9taXNlPFQ+LFxuICAgIG9wdGlvbnM6IHsgdGltZW91dD86IG51bWJlciB9ID0ge31cbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLm1ldHJpY3MudG90YWxMb2NrUmVxdWVzdHMrKztcbiAgICBcbiAgICBsb2dnZXIuZGVidWcoYExvY2sgcmVxdWVzdGVkIGZvciByZXNvdXJjZTogJHtyZXNvdXJjZX1gKTtcbiAgICBcbiAgICAvLyBXYWl0IGZvciBhbnkgZXhpc3Rpbmcgb3BlcmF0aW9uIG9uIHRoaXMgcmVzb3VyY2VcbiAgICBjb25zdCBleGlzdGluZ0xvY2sgPSB0aGlzLmxvY2tzLmdldChyZXNvdXJjZSk7XG4gICAgaWYgKGV4aXN0aW5nTG9jaykge1xuICAgICAgdGhpcy5tZXRyaWNzLmNvbmN1cnJlbnRXYWl0cysrO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBXYWl0aW5nIGZvciBleGlzdGluZyBsb2NrIG9uOiAke3Jlc291cmNlfWApO1xuICAgICAgdGhpcy5sb2dMaXN0ZW5lcj8uKCdkZWJ1ZycsICdEZXRlY3QgbG9jayBjb250ZW50aW9uJywgeyByZXNvdXJjZSB9KTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZXhpc3RpbmdMb2NrO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFByZXZpb3VzIG9wZXJhdGlvbiBmYWlsZWQsIGJ1dCB3ZSBjYW4gcHJvY2VlZFxuICAgICAgICBsb2dnZXIuZGVidWcoYFByZXZpb3VzIG9wZXJhdGlvbiBvbiAke3Jlc291cmNlfSBmYWlsZWQsIHByb2NlZWRpbmdgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG5ldyBsb2NrIGZvciB0aGlzIG9wZXJhdGlvblxuICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgfHwgdGhpcy5ERUZBVUxUX1RJTUVPVVRfTVM7XG4gICAgY29uc3QgbG9ja1Byb21pc2UgPSB0aGlzLmV4ZWN1dGVXaXRoVGltZW91dChvcGVyYXRpb24sIHRpbWVvdXQsIHJlc291cmNlKTtcbiAgICB0aGlzLmxvY2tzLnNldChyZXNvdXJjZSwgbG9ja1Byb21pc2UpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsb2NrUHJvbWlzZTtcbiAgICAgIFxuICAgICAgLy8gUmVjb3JkIG1ldHJpY3NcbiAgICAgIGNvbnN0IHdhaXRUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGlmICghdGhpcy5tZXRyaWNzLmxvY2tXYWl0VGltZS5oYXMocmVzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMubWV0cmljcy5sb2NrV2FpdFRpbWUuc2V0KHJlc291cmNlLCBbXSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1ldHJpY3MubG9ja1dhaXRUaW1lLmdldChyZXNvdXJjZSkhLnB1c2god2FpdFRpbWUpO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoYExvY2sgcmVsZWFzZWQgZm9yIHJlc291cmNlOiAke3Jlc291cmNlfSAoJHt3YWl0VGltZX1tcylgKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIENsZWFuIHVwIGxvY2sgLSB1bmNvbmRpdGlvbmFsIGRlbGV0ZSBpcyBzYWZlIGFuZCByYWNlLWZyZWVcbiAgICAgIC8vIFRoaXMgb3BlcmF0aW9uIGNvbXBsZXRlZCwgc28gcmVtb3ZlIGl0cyBsb2NrIGZyb20gdGhlIG1hcFxuICAgICAgdGhpcy5sb2Nrcy5kZWxldGUocmVzb3VyY2UpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBMb2NrIHF1ZXVlIGNsZWFuZWQgdXAgZm9yIHJlc291cmNlOiAke3Jlc291cmNlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIG9wZXJhdGlvbiB3aXRoIHRpbWVvdXQgcHJvdGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlV2l0aFRpbWVvdXQ8VD4oXG4gICAgb3BlcmF0aW9uOiAoKSA9PiBQcm9taXNlPFQ+LFxuICAgIHRpbWVvdXRNczogbnVtYmVyLFxuICAgIHJlc291cmNlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IHRpbWVvdXRIYW5kbGU6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuICAgIFxuICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICAgIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5tZXRyaWNzLmxvY2tUaW1lb3V0cysrO1xuICAgICAgICB0aGlzLmxvZ0xpc3RlbmVyPy4oJ3dhcm4nLCAnTG9jayBhY3F1aXNpdGlvbiB0aW1lcyBvdXQnLCB7IHJlc291cmNlLCB0aW1lb3V0TXMgfSk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYExvY2sgb3BlcmF0aW9uIHRpbWVvdXQgZm9yIHJlc291cmNlOiAke3Jlc291cmNlfWApKTtcbiAgICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgfSk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbb3BlcmF0aW9uKCksIHRpbWVvdXRQcm9taXNlXSk7XG4gICAgICBpZiAodGltZW91dEhhbmRsZSkgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHRpbWVvdXRIYW5kbGUpIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGF0b21pYyBmaWxlIHdyaXRlIG9wZXJhdGlvblxuICAgKiBXcml0ZXMgdG8gdGVtcG9yYXJ5IGZpbGUgdGhlbiByZW5hbWVzIHRvIGVuc3VyZSBhdG9taWNpdHlcbiAgICovXG4gIGFzeW5jIGF0b21pY1dyaXRlRmlsZShcbiAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBlbmNvZGluZz86IEJ1ZmZlckVuY29kaW5nIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGVtcFBhdGggPSBhd2FpdCB0aGlzLmdldFRlbXBGaWxlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKHRlbXBQYXRoKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIHRlbXAgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgZnMubWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgLy8gV3JpdGUgdG8gdGVtcG9yYXJ5IGZpbGVcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wUGF0aCwgY29udGVudCwgb3B0aW9ucyk7XG4gICAgICBcbiAgICAgIC8vIEF0b21pYyByZW5hbWUgKG9uIHNhbWUgZmlsZXN5c3RlbSlcbiAgICAgIGF3YWl0IGZzLnJlbmFtZSh0ZW1wUGF0aCwgZmlsZVBhdGgpO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoYEF0b21pYyB3cml0ZSBjb21wbGV0ZWQ6ICR7ZmlsZVBhdGh9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIENsZWFuIHVwIHRlbXAgZmlsZSBvbiBlcnJvclxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKHRlbXBQYXRoKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDbGVhbmVkIHVwIHRlbXAgZmlsZSBhZnRlciBlcnJvcjogJHt0ZW1wUGF0aH1gKTtcbiAgICAgIH0gY2F0Y2ggKHVubGlua0Vycm9yKSB7XG4gICAgICAgIC8vIExvZyBjbGVhbnVwIGZhaWx1cmUgYnV0IGRvbid0IHRocm93IC0gb3JpZ2luYWwgZXJyb3IgaXMgbW9yZSBpbXBvcnRhbnRcbiAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBjbGVhbiB1cCB0ZW1wIGZpbGUgJHt0ZW1wUGF0aH06ICR7dW5saW5rRXJyb3J9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhdG9taWMgZmlsZSByZWFkIHdpdGggbG9ja1xuICAgKi9cbiAgYXN5bmMgYXRvbWljUmVhZEZpbGUoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBlbmNvZGluZz86IEJ1ZmZlckVuY29kaW5nIH1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoTG9jayhgZmlsZToke2ZpbGVQYXRofWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gY29udGVudC50b1N0cmluZygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRlbXBvcmFyeSBmaWxlIHBhdGggZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFRlbXBGaWxlUGF0aChvcmlnaW5hbFBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKG9yaWdpbmFsUGF0aCk7XG4gICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKG9yaWdpbmFsUGF0aCk7XG4gICAgY29uc3QgcmFuZG9tID0gcmFuZG9tQnl0ZXMoOCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIHJldHVybiBwYXRoLmpvaW4oZGlyLCB0aGlzLlRFTVBfRElSLCBgJHtiYXNlbmFtZX0uJHtyYW5kb219LnRtcGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsb2NrIG1ldHJpY3MgZm9yIG1vbml0b3JpbmdcbiAgICovXG4gIGdldE1ldHJpY3MoKSB7XG4gICAgY29uc3QgYXZnV2FpdFRpbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZSwgdGltZXNdIG9mIHRoaXMubWV0cmljcy5sb2NrV2FpdFRpbWUuZW50cmllcygpKSB7XG4gICAgICBpZiAodGltZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhdmcgPSB0aW1lcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHRpbWVzLmxlbmd0aDtcbiAgICAgICAgYXZnV2FpdFRpbWVzLnNldChyZXNvdXJjZSwgTWF0aC5yb3VuZChhdmcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsUmVxdWVzdHM6IHRoaXMubWV0cmljcy50b3RhbExvY2tSZXF1ZXN0cyxcbiAgICAgIGFjdGl2ZUxvY2tzQ291bnQ6IHRoaXMubG9ja3Muc2l6ZSxcbiAgICAgIHRpbWVvdXRzOiB0aGlzLm1ldHJpY3MubG9ja1RpbWVvdXRzLFxuICAgICAgY29uY3VycmVudFdhaXRzOiB0aGlzLm1ldHJpY3MuY29uY3VycmVudFdhaXRzLFxuICAgICAgYXZnV2FpdFRpbWVCeVJlc291cmNlOiBPYmplY3QuZnJvbUVudHJpZXMoYXZnV2FpdFRpbWVzKSxcbiAgICAgIGFjdGl2ZUxvY2tzOiBBcnJheS5mcm9tKHRoaXMubG9ja3Mua2V5cygpKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGxvY2tzICh1c2Ugd2l0aCBjYXV0aW9uIC0gbWFpbmx5IGZvciB0ZXN0aW5nKVxuICAgKi9cbiAgY2xlYXJBbGxMb2NrcygpOiB2b2lkIHtcbiAgICB0aGlzLmxvY2tzLmNsZWFyKCk7XG4gICAgbG9nZ2VyLndhcm4oJ0FsbCBmaWxlIGxvY2tzIGNsZWFyZWQgLSB1c2Ugb25seSBmb3IgdGVzdGluZy9yZWNvdmVyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IG1ldHJpY3NcbiAgICovXG4gIHJlc2V0TWV0cmljcygpOiB2b2lkIHtcbiAgICB0aGlzLm1ldHJpY3MgPSB7XG4gICAgICB0b3RhbExvY2tSZXF1ZXN0czogMCxcbiAgICAgIGxvY2tXYWl0VGltZTogbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpLFxuICAgICAgbG9ja1RpbWVvdXRzOiAwLFxuICAgICAgY29uY3VycmVudFdhaXRzOiAwXG4gICAgfTtcbiAgfVxufSJdfQ==
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZUxvY2tNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUU3RTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIscURBQXFEO0lBQzdDLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUVoRCwwQ0FBMEM7SUFDbEMsT0FBTyxHQUFHO1FBQ2hCLGlCQUFpQixFQUFFLENBQUM7UUFDcEIsWUFBWSxFQUFFLElBQUksR0FBRyxFQUFvQjtRQUN6QyxZQUFZLEVBQUUsQ0FBQztRQUNmLGVBQWUsRUFBRSxDQUFDO0tBQ25CLENBQUM7SUFFTSxXQUFXLENBQXlHO0lBRTVILGNBQWMsQ0FBQyxFQUF5RztRQUN0SCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixPQUFPLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCx3RUFBd0U7SUFDdkQsa0JBQWtCLEdBQUcsdUJBQXVCLEVBQUUsQ0FBQztJQUVoRSwyQkFBMkI7SUFDVixRQUFRLEdBQUcsTUFBTSxDQUFDO0lBRW5DOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQ1osUUFBZ0IsRUFDaEIsU0FBMkIsRUFDM0IsVUFBZ0MsRUFBRTtRQUVsQyxNQUFNLFNBQVMsR0FBRyxJQUFJ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RSxJQUFJLEdBQUcsRUFBb0I7WUFDekMsWUFBWSxFQUFFLENBQUM7WUFDZixlQUFlLEVBQUUsQ0FBQztTQUNuQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBnZXRWYWxpZGF0ZWRMb2NrVGltZW91dCB9IGZyb20gJy4uL2NvbmZpZy9wZXJmb3JtYW5jZS1jb25zdGFudHMuanMnO1xuXG4vKipcbiAqIEZpbGVMb2NrTWFuYWdlciAtIFByZXZlbnRzIHJhY2UgY29uZGl0aW9ucyBpbiBjb25jdXJyZW50IGZpbGUgb3BlcmF0aW9uc1xuICogXG4gKiBGZWF0dXJlczpcbiAqIC0gUmVzb3VyY2UtYmFzZWQgbG9ja2luZyB3aXRoIGF1dG9tYXRpYyBjbGVhbnVwXG4gKiAtIENvbmZpZ3VyYWJsZSB0aW1lb3V0cyB0byBwcmV2ZW50IGRlYWRsb2Nrc1xuICogLSBBdG9taWMgZmlsZSBvcGVyYXRpb25zIHdpdGggd3JpdGUtcmVuYW1lIHBhdHRlcm5cbiAqIC0gTG9jayBxdWV1ZWluZyBmb3IgY29uY3VycmVudCByZXF1ZXN0c1xuICogLSBDb21wcmVoZW5zaXZlIGVycm9yIGhhbmRsaW5nIGFuZCBsb2dnaW5nXG4gKiAtIFBlcmZvcm1hbmNlIG1ldHJpY3MgdHJhY2tpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVMb2NrTWFuYWdlciB7XG4gIC8vIE1hcCBvZiByZXNvdXJjZSBpZGVudGlmaWVycyB0byB0aGVpciBsb2NrIHByb21pc2VzXG4gIHByaXZhdGUgbG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxhbnk+PigpO1xuXG4gIC8vIExvY2sgYWNxdWlzaXRpb24gbWV0cmljcyBmb3IgbW9uaXRvcmluZ1xuICBwcml2YXRlIG1ldHJpY3MgPSB7XG4gICAgdG90YWxMb2NrUmVxdWVzdHM6IDAsXG4gICAgbG9ja1dhaXRUaW1lOiBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCksXG4gICAgbG9ja1RpbWVvdXRzOiAwLFxuICAgIGNvbmN1cnJlbnRXYWl0czogMFxuICB9O1xuXG4gIHByaXZhdGUgbG9nTGlzdGVuZXI/OiAobGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcblxuICBhZGRMb2dMaXN0ZW5lcihmbjogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmxvZ0xpc3RlbmVyID0gZm47XG4gICAgcmV0dXJuICgpID0+IHsgdGhpcy5sb2dMaXN0ZW5lciA9IHVuZGVmaW5lZDsgfTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgdGltZW91dCBmb3IgbG9jayBvcGVyYXRpb25zIC0gdXNpbmcgY2VudHJhbGl6ZWQgY29uZmlndXJhdGlvblxuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfVElNRU9VVF9NUyA9IGdldFZhbGlkYXRlZExvY2tUaW1lb3V0KCk7XG5cbiAgLy8gVGVtcG9yYXJ5IGZpbGUgZGlyZWN0b3J5XG4gIHByaXZhdGUgcmVhZG9ubHkgVEVNUF9ESVIgPSAnLnRtcCc7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYW4gb3BlcmF0aW9uIHdpdGggZXhjbHVzaXZlIGxvY2sgb24gYSByZXNvdXJjZVxuICAgKiBAcGFyYW0gcmVzb3VyY2UgLSBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlIChlLmcuLCAncGVyc29uYTpuYW1lJylcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIEFzeW5jIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hpbGUgaG9sZGluZyB0aGUgbG9ja1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIExvY2sgb3B0aW9ucyBpbmNsdWRpbmcgdGltZW91dFxuICAgKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIG9wZXJhdGlvblxuICAgKi9cbiAgYXN5bmMgd2l0aExvY2s8VD4oXG4gICAgcmVzb3VyY2U6IHN0cmluZyxcbiAgICBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD4sXG4gICAgb3B0aW9uczogeyB0aW1lb3V0PzogbnVtYmVyIH0gPSB7fVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMubWV0cmljcy50b3RhbExvY2tSZXF1ZXN0cysrO1xuICAgIFxuICAgIC8vIFdhaXQgZm9yIGFueSBleGlzdGluZyBvcGVyYXRpb24gb24gdGhpcyByZXNvdXJjZVxuICAgIGNvbnN0IGV4aXN0aW5nTG9jayA9IHRoaXMubG9ja3MuZ2V0KHJlc291cmNlKTtcbiAgICBpZiAoZXhpc3RpbmdMb2NrKSB7XG4gICAgICB0aGlzLm1ldHJpY3MuY29uY3VycmVudFdhaXRzKys7XG4gICAgICBjb25zdCBzaG9ydFJlc291cmNlID0gcGF0aC5iYXNlbmFtZShyZXNvdXJjZSk7XG4gICAgICBsb2dnZXIuZGVidWcoYExvY2sgY29udGVudGlvbiBvbjogJHtzaG9ydFJlc291cmNlfWAsIHsgcmVzb3VyY2UgfSk7XG4gICAgICB0aGlzLmxvZ0xpc3RlbmVyPy4oJ2RlYnVnJywgJ0RldGVjdCBsb2NrIGNvbnRlbnRpb24nLCB7IHJlc291cmNlIH0pO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGlzdGluZ0xvY2s7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gUHJldmlvdXMgb3BlcmF0aW9uIGZhaWxlZCwgYnV0IHdlIGNhbiBwcm9jZWVkXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgUHJldmlvdXMgb3BlcmF0aW9uIG9uICR7cmVzb3VyY2V9IGZhaWxlZCwgcHJvY2VlZGluZ2ApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDcmVhdGUgbmV3IGxvY2sgZm9yIHRoaXMgb3BlcmF0aW9uXG4gICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCB8fCB0aGlzLkRFRkFVTFRfVElNRU9VVF9NUztcbiAgICBjb25zdCBsb2NrUHJvbWlzZSA9IHRoaXMuZXhlY3V0ZVdpdGhUaW1lb3V0KG9wZXJhdGlvbiwgdGltZW91dCwgcmVzb3VyY2UpO1xuICAgIHRoaXMubG9ja3Muc2V0KHJlc291cmNlLCBsb2NrUHJvbWlzZSk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGxvY2tQcm9taXNlO1xuICAgICAgXG4gICAgICAvLyBSZWNvcmQgbWV0cmljc1xuICAgICAgY29uc3Qgd2FpdFRpbWUgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgaWYgKCF0aGlzLm1ldHJpY3MubG9ja1dhaXRUaW1lLmhhcyhyZXNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5tZXRyaWNzLmxvY2tXYWl0VGltZS5zZXQocmVzb3VyY2UsIFtdKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWV0cmljcy5sb2NrV2FpdFRpbWUuZ2V0KHJlc291cmNlKSEucHVzaCh3YWl0VGltZSk7XG4gICAgICBcbiAgICAgIC8vIE9ubHkgbG9nIGxvY2tzIHRoYXQgYWN0dWFsbHkgd2FpdGVkICg+NW1zIGluZGljYXRlcyByZWFsIGNvbnRlbnRpb24pXG4gICAgICBpZiAod2FpdFRpbWUgPiA1KSB7XG4gICAgICAgIGNvbnN0IHNob3J0UmVzb3VyY2UgPSBwYXRoLmJhc2VuYW1lKHJlc291cmNlKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBTbG93IGxvY2s6ICR7c2hvcnRSZXNvdXJjZX0gKCR7d2FpdFRpbWV9bXMpYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhbiB1cCBsb2NrIC0gdW5jb25kaXRpb25hbCBkZWxldGUgaXMgc2FmZSBhbmQgcmFjZS1mcmVlXG4gICAgICAvLyBUaGlzIG9wZXJhdGlvbiBjb21wbGV0ZWQsIHNvIHJlbW92ZSBpdHMgbG9jayBmcm9tIHRoZSBtYXBcbiAgICAgIHRoaXMubG9ja3MuZGVsZXRlKHJlc291cmNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBvcGVyYXRpb24gd2l0aCB0aW1lb3V0IHByb3RlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVdpdGhUaW1lb3V0PFQ+KFxuICAgIG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTxUPixcbiAgICB0aW1lb3V0TXM6IG51bWJlcixcbiAgICByZXNvdXJjZTogc3RyaW5nXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGxldCB0aW1lb3V0SGFuZGxlOiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZDtcbiAgICBcbiAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPG5ldmVyPigoXywgcmVqZWN0KSA9PiB7XG4gICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMubWV0cmljcy5sb2NrVGltZW91dHMrKztcbiAgICAgICAgdGhpcy5sb2dMaXN0ZW5lcj8uKCd3YXJuJywgJ0xvY2sgYWNxdWlzaXRpb24gdGltZXMgb3V0JywgeyByZXNvdXJjZSwgdGltZW91dE1zIH0pO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBMb2NrIG9wZXJhdGlvbiB0aW1lb3V0IGZvciByZXNvdXJjZTogJHtyZXNvdXJjZX1gKSk7XG4gICAgICB9LCB0aW1lb3V0TXMpO1xuICAgIH0pO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW29wZXJhdGlvbigpLCB0aW1lb3V0UHJvbWlzZV0pO1xuICAgICAgaWYgKHRpbWVvdXRIYW5kbGUpIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aW1lb3V0SGFuZGxlKSBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhdG9taWMgZmlsZSB3cml0ZSBvcGVyYXRpb25cbiAgICogV3JpdGVzIHRvIHRlbXBvcmFyeSBmaWxlIHRoZW4gcmVuYW1lcyB0byBlbnN1cmUgYXRvbWljaXR5XG4gICAqL1xuICBhc3luYyBhdG9taWNXcml0ZUZpbGUoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZW5jb2Rpbmc/OiBCdWZmZXJFbmNvZGluZyB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRlbXBQYXRoID0gYXdhaXQgdGhpcy5nZXRUZW1wRmlsZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZSh0ZW1wUGF0aCk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSB0ZW1wIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IGZzLm1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIFdyaXRlIHRvIHRlbXBvcmFyeSBmaWxlXG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGNvbnRlbnQsIG9wdGlvbnMpO1xuICAgICAgXG4gICAgICAvLyBBdG9taWMgcmVuYW1lIChvbiBzYW1lIGZpbGVzeXN0ZW0pXG4gICAgICBhd2FpdCBmcy5yZW5hbWUodGVtcFBhdGgsIGZpbGVQYXRoKTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBDbGVhbiB1cCB0ZW1wIGZpbGUgb24gZXJyb3JcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnVubGluayh0ZW1wUGF0aCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xlYW5lZCB1cCB0ZW1wIGZpbGUgYWZ0ZXIgZXJyb3I6ICR7dGVtcFBhdGh9YCk7XG4gICAgICB9IGNhdGNoICh1bmxpbmtFcnJvcikge1xuICAgICAgICAvLyBMb2cgY2xlYW51cCBmYWlsdXJlIGJ1dCBkb24ndCB0aHJvdyAtIG9yaWdpbmFsIGVycm9yIGlzIG1vcmUgaW1wb3J0YW50XG4gICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gY2xlYW4gdXAgdGVtcCBmaWxlICR7dGVtcFBhdGh9OiAke3VubGlua0Vycm9yfWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYXRvbWljIGZpbGUgcmVhZCB3aXRoIGxvY2tcbiAgICovXG4gIGFzeW5jIGF0b21pY1JlYWRGaWxlKFxuICAgIGZpbGVQYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZW5jb2Rpbmc/OiBCdWZmZXJFbmNvZGluZyB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aExvY2soYGZpbGU6JHtmaWxlUGF0aH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQudG9TdHJpbmcoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0ZW1wb3JhcnkgZmlsZSBwYXRoIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRUZW1wRmlsZVBhdGgob3JpZ2luYWxQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShvcmlnaW5hbFBhdGgpO1xuICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShvcmlnaW5hbFBhdGgpO1xuICAgIGNvbnN0IHJhbmRvbSA9IHJhbmRvbUJ5dGVzKDgpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKGRpciwgdGhpcy5URU1QX0RJUiwgYCR7YmFzZW5hbWV9LiR7cmFuZG9tfS50bXBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbG9jayBtZXRyaWNzIGZvciBtb25pdG9yaW5nXG4gICAqL1xuICBnZXRNZXRyaWNzKCkge1xuICAgIGNvbnN0IGF2Z1dhaXRUaW1lcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2UsIHRpbWVzXSBvZiB0aGlzLm1ldHJpY3MubG9ja1dhaXRUaW1lLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHRpbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYXZnID0gdGltZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyB0aW1lcy5sZW5ndGg7XG4gICAgICAgIGF2Z1dhaXRUaW1lcy5zZXQocmVzb3VyY2UsIE1hdGgucm91bmQoYXZnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbFJlcXVlc3RzOiB0aGlzLm1ldHJpY3MudG90YWxMb2NrUmVxdWVzdHMsXG4gICAgICBhY3RpdmVMb2Nrc0NvdW50OiB0aGlzLmxvY2tzLnNpemUsXG4gICAgICB0aW1lb3V0czogdGhpcy5tZXRyaWNzLmxvY2tUaW1lb3V0cyxcbiAgICAgIGNvbmN1cnJlbnRXYWl0czogdGhpcy5tZXRyaWNzLmNvbmN1cnJlbnRXYWl0cyxcbiAgICAgIGF2Z1dhaXRUaW1lQnlSZXNvdXJjZTogT2JqZWN0LmZyb21FbnRyaWVzKGF2Z1dhaXRUaW1lcyksXG4gICAgICBhY3RpdmVMb2NrczogQXJyYXkuZnJvbSh0aGlzLmxvY2tzLmtleXMoKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBsb2NrcyAodXNlIHdpdGggY2F1dGlvbiAtIG1haW5seSBmb3IgdGVzdGluZylcbiAgICovXG4gIGNsZWFyQWxsTG9ja3MoKTogdm9pZCB7XG4gICAgdGhpcy5sb2Nrcy5jbGVhcigpO1xuICAgIGxvZ2dlci53YXJuKCdBbGwgZmlsZSBsb2NrcyBjbGVhcmVkIC0gdXNlIG9ubHkgZm9yIHRlc3RpbmcvcmVjb3ZlcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBtZXRyaWNzXG4gICAqL1xuICByZXNldE1ldHJpY3MoKTogdm9pZCB7XG4gICAgdGhpcy5tZXRyaWNzID0ge1xuICAgICAgdG90YWxMb2NrUmVxdWVzdHM6IDAsXG4gICAgICBsb2NrV2FpdFRpbWU6IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKSxcbiAgICAgIGxvY2tUaW1lb3V0czogMCxcbiAgICAgIGNvbmN1cnJlbnRXYWl0czogMFxuICAgIH07XG4gIH1cbn0iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secureYamlParser.d.ts","sourceRoot":"","sources":["../../src/security/secureYamlParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,MAAM,MAAM,aAAa,CAAC;AAKjC,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uGAAuG;IACvG,cAAc,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;CACxE;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAKrC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAGvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAoCtC;IAEF;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,aAAa;
|
|
1
|
+
{"version":3,"file":"secureYamlParser.d.ts","sourceRoot":"","sources":["../../src/security/secureYamlParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,MAAM,MAAM,aAAa,CAAC;AAKjC,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uGAAuG;IACvG,cAAc,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;CACxE;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAKrC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAGvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAoCtC;IAEF;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,aAAa;IAgH5E;;OAEG;IACH,MAAM,CAAC,wBAAwB;uBAEZ,MAAM;;;;;;6BASA,MAAM,QAAQ,GAAG;;IAoB1C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;IAiCnJ;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,MAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CA+B/F"}
|
|
@@ -197,12 +197,6 @@ export class SecureYamlParser {
|
|
|
197
197
|
}
|
|
198
198
|
finalContent = contentValidation.sanitizedContent || markdownContent;
|
|
199
199
|
}
|
|
200
|
-
SecurityMonitor.logSecurityEvent({
|
|
201
|
-
type: 'YAML_PARSE_SUCCESS',
|
|
202
|
-
severity: 'LOW',
|
|
203
|
-
source: 'SecureYamlParser',
|
|
204
|
-
details: `Successfully parsed YAML with ${Object.keys(data).length} fields`
|
|
205
|
-
});
|
|
206
200
|
return {
|
|
207
201
|
data,
|
|
208
202
|
content: finalContent
|
|
@@ -316,13 +310,7 @@ export class SecureYamlParser {
|
|
|
316
310
|
if (typeof parsed !== 'object' || parsed === null) {
|
|
317
311
|
throw new SecurityError('YAML content must parse to an object', 'medium');
|
|
318
312
|
}
|
|
319
|
-
SecurityMonitor.logSecurityEvent({
|
|
320
|
-
type: 'YAML_PARSE_SUCCESS',
|
|
321
|
-
severity: 'LOW',
|
|
322
|
-
source: 'SecureYamlParser',
|
|
323
|
-
details: `Parsed raw YAML with ${Object.keys(parsed).length} keys`
|
|
324
|
-
});
|
|
325
313
|
return parsed;
|
|
326
314
|
}
|
|
327
315
|
}
|
|
328
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlWWFtbFBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ0c7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWtCdkQsTUFBTSxPQUFPLGdCQUFnQjtJQUNuQixNQUFNLENBQVUsZUFBZSxHQUF1QjtRQUM1RCxXQUFXLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBTyxnQkFBZ0I7UUFDN0MsY0FBYyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUcsa0JBQWtCO1FBQ2hELGVBQWUsRUFBRSxJQUFJO1FBQ3JCLGNBQWMsRUFBRSxJQUFJLENBQVMscUNBQXFDO0tBQ25FLENBQUM7SUFFRixtR0FBbUc7SUFDM0YsTUFBTSxDQUFVLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBRXZELG9EQUFvRDtJQUM1QyxNQUFNLENBQVUsZ0JBQWdCLEdBQTRDO1FBQ2xGLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRztRQUNyRCxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUc7UUFDNUQsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxP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QUFDO1lBQ3ZELGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHdCQUF3QjtnQkFDOUIsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLE1BQU0sRUFBRSwrQkFBK0I7Z0JBQ3ZDLE9BQU8sRUFBRSxxREFBcUQ7YUFDL0QsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLGFBQWEsQ0FBQyxpQ0FBaUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFHLHNDQUFzQztZQUNqRSxJQUFJLEVBQUUsS0FBSztTQUNaLENBQUMsQ0FBQztRQUVILDZCQUE2QjtRQUM3QixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLGFBQWEsQ0FBQyxzQ0FBc0MsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQy9CLElBQUksRUFBRSxvQkFBb0I7WUFDMUIsUUFBUSxFQUFFLEtBQUs7WUFDZixNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE9BQU8sRUFBRSx3QkFBd0IsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLE9BQU87U0FDbkUsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFpQyxDQUFDO0lBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyZSBZQU1MIFBhcnNlciBmb3IgRG9sbGhvdXNlTUNQIC0gRm9yIE1hcmtkb3duIEZpbGVzIHdpdGggWUFNTCBGcm9udG1hdHRlclxuICogXG4gKiBJTVBPUlRBTlQ6IFRoaXMgcGFyc2VyIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IgTWFya2Rvd24gZmlsZXMgd2l0aCBZQU1MIGZyb250bWF0dGVyXG4gKiAodGhlIGZvcm1hdCB1c2VkIGJ5IHBlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgYW5kIG90aGVyIGVsZW1lbnRzKS5cbiAqIFxuICogVVNFIFRISVMgRk9SOlxuICogLSBQZXJzb25hIGZpbGVzIChlLmcuLCBjcmVhdGl2ZS13cml0ZXIubWQpXG4gKiAtIFNraWxsIGZpbGVzIChlLmcuLCBjb2RlLXJldmlldy5tZClcbiAqIC0gVGVtcGxhdGUgZmlsZXMgKGUuZy4sIG1lZXRpbmctbm90ZXMubWQpXG4gKiAtIEFueSBNYXJrZG93biBmaWxlIHdpdGggWUFNTCBmcm9udG1hdHRlciBiZXR3ZWVuIC0tLSBtYXJrZXJzXG4gKiBcbiAqIERPIE5PVCBVU0UgVEhJUyBGT1I6XG4gKiAtIFB1cmUgWUFNTCBjb25maWd1cmF0aW9uIGZpbGVzICh1c2UganMteWFtbCBkaXJlY3RseSB3aXRoIEZBSUxTQUZFX1NDSEVNQSlcbiAqIC0gSlNPTiBmaWxlc1xuICogLSBQbGFpbiB0ZXh0IGZpbGVzIHdpdGhvdXQgZnJvbnRtYXR0ZXJcbiAqIFxuICogRklMRSBGT1JNQVQgRVhQRUNURUQ6XG4gKiBgYGBcbiAqIC0tLVxuICogbmFtZTogRWxlbWVudCBOYW1lXG4gKiBkZXNjcmlwdGlvbjogRWxlbWVudCBkZXNjcmlwdGlvblxuICogdmVyc2lvbjogMS4wLjBcbiAqIC0tLVxuICogXG4gKiAjIE1hcmtkb3duIGNvbnRlbnQgaGVyZVxuICogVGhlIGFjdHVhbCBjb250ZW50L2luc3RydWN0aW9ucyBnbyBoZXJlLi4uXG4gKiBgYGBcbiAqIFxuICogUHJvdmlkZXMgc2FmZSBZQU1MIHBhcnNpbmcgdGhhdCBwcmV2ZW50cyBkZXNlcmlhbGl6YXRpb24gYXR0YWNrc1xuICogYnkgdXNpbmcgYSByZXN0cmljdGVkIHNjaGVtYSBhbmQgcHJlLXZhbGlkYXRpb24uXG4gKiBcbiAqIFNlY3VyaXR5OiBTRUMtMDAzIC0gWUFNTCBwYXJzaW5nIHZ1bG5lcmFiaWxpdHkgcHJvdGVjdGlvblxuICovXG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgbWF0dGVyIGZyb20gJ2dyYXktbWF0dGVyJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvU2VjdXJpdHlFcnJvci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4vc2VjdXJpdHlNb25pdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWN1cmVQYXJzZU9wdGlvbnMge1xuICBtYXhZYW1sU2l6ZT86IG51bWJlcjtcbiAgbWF4Q29udGVudFNpemU/OiBudW1iZXI7XG4gIGFsbG93ZWRLZXlzPzogc3RyaW5nW107XG4gIHZhbGlkYXRlQ29udGVudD86IGJvb2xlYW47XG4gIHZhbGlkYXRlRmllbGRzPzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBhcHBseSBmaWVsZC1zcGVjaWZpYyB2YWxpZGF0b3JzIChmb3IgcGVyc29uYSBtZXRhZGF0YSlcbiAgLyoqIENvbnRlbnQgY29udGV4dCBmb3IgQ29udGVudFZhbGlkYXRvciDigJQgZXhlbXB0cyBsZWdpdGltYXRlIHBhdHRlcm5zIChlLmcuLCA8c2NyaXB0PiBpbiB0ZW1wbGF0ZXMpICovXG4gIGNvbnRlbnRDb250ZXh0PzogJ3BlcnNvbmEnIHwgJ3NraWxsJyB8ICd0ZW1wbGF0ZScgfCAnYWdlbnQnIHwgJ21lbW9yeSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkQ29udGVudCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgZXhjZXJwdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNlY3VyZVlhbWxQYXJzZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX09QVElPTlM6IFNlY3VyZVBhcnNlT3B0aW9ucyA9IHtcbiAgICBtYXhZYW1sU2l6ZTogNjQgKiAxMDI0LCAgICAgIC8vIDY0S0IgZm9yIFlBTUxcbiAgICBtYXhDb250ZW50U2l6ZTogMTAyNCAqIDEwMjQsICAvLyAxTUIgZm9yIGNvbnRlbnRcbiAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgdmFsaWRhdGVGaWVsZHM6IHRydWUgICAgICAgICAvLyBCeSBkZWZhdWx0LCBhcHBseSBmaWVsZCB2YWxpZGF0b3JzXG4gIH07XG5cbiAgLy8gQWxsb3dlZCBZQU1MIHR5cGVzIC0gdXNpbmcgQ09SRV9TQ0hFTUEgKHNhZmUgc3Vic2V0IHdpdGggYmFzaWMgdHlwZXMgbGlrZSBib29sZWFucyBhbmQgaW50ZWdlcnMpXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNBRkVfU0NIRU1BID0geWFtbC5DT1JFX1NDSEVNQTtcblxuICAvLyBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZm9yIHNwZWNpZmljIHBlcnNvbmEgZmllbGRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZJRUxEX1ZBTElEQVRPUlM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBib29sZWFuPiA9IHtcbiAgICBuYW1lOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoIDw9IDEwMCxcbiAgICBkZXNjcmlwdGlvbjogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA8PSA1MDAsXG4gICAgYXV0aG9yOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoIDw9IDEwMCxcbiAgICB2ZXJzaW9uOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIC9eXFxkK1xcLlxcZCsoXFwuXFxkKyk/KC1bYS16QS1aMC05Li1dKyk/JC8udGVzdCh2KSxcbiAgICBjYXRlZ29yeTogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA8PSA1MCxcbiAgICBhZ2VfcmF0aW5nOiAodikgPT4gWydhbGwnLCAnMTMrJywgJzE4KyddLmluY2x1ZGVzKHYpLFxuICAgIHByaWNlOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmICh2ID09PSAnZnJlZScgfHwgL15cXCRcXGQrXFwuXFxkezJ9JC8udGVzdCh2KSksXG4gICAgYWlfZ2VuZXJhdGVkOiAodikgPT4gdHlwZW9mIHYgPT09ICdib29sZWFuJyB8fCB2ID09PSAndHJ1ZScgfHwgdiA9PT0gJ2ZhbHNlJyxcbiAgICBnZW5lcmF0aW9uX21ldGhvZDogKHYpID0+IFsnaHVtYW4nLCAnQ2hhdEdQVCcsICdDbGF1ZGUnLCAnaHlicmlkJ10uaW5jbHVkZXModiksXG4gICAgY3JlYXRlZF9kYXRlOiAodikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgICAgXG4gICAgICAvLyBNb3JlIGZsZXhpYmxlIGRhdGUgdmFsaWRhdGlvbiAtIGFjY2VwdCBjb21tb24gZm9ybWF0c1xuICAgICAgLy8gSVNPODYwMSwgVVMgZm9ybWF0LCBFdXJvcGVhbiBmb3JtYXQsIHNpbXBsZSBkYXRlc1xuICAgICAgY29uc3QgZGF0ZVBhdHRlcm5zID0gW1xuICAgICAgICAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8sIC8vIFlZWVktTU0tRERcbiAgICAgICAgL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfS8sIC8vIElTTzg2MDEgd2l0aCB0aW1lXG4gICAgICAgIC9eXFxkezEsMn1cXC9cXGR7MSwyfVxcL1xcZHs0fSQvLCAvLyBNTS9ERC9ZWVlZIG9yIE0vRC9ZWVlZXG4gICAgICAgIC9eXFxkezEsMn0tXFxkezEsMn0tXFxkezR9JC8sIC8vIE1NLURELVlZWVkgb3IgTS1ELVlZWVlcbiAgICAgICAgL15cXGR7MSwyfVxcLlxcZHsxLDJ9XFwuXFxkezR9JC8sIC8vIERELk1NLllZWVkgKEV1cm9wZWFuKVxuICAgICAgICAvXihKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMrXFxkezEsMn0sP1xccytcXGR7NH0kL2kgLy8gTW9udGggREQsIFlZWVlcbiAgICAgIF07XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGl0IG1hdGNoZXMgY29tbW9uIHBhdHRlcm5zIGZpcnN0XG4gICAgICBjb25zdCBtYXRjaGVzUGF0dGVybiA9IGRhdGVQYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gcGF0dGVybi50ZXN0KHYudHJpbSgpKSk7XG4gICAgICBpZiAoIW1hdGNoZXNQYXR0ZXJuKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBEYXRlLnBhcnNlIGZvciBvdGhlciBmb3JtYXRzLCBidXQgYmUgbW9yZSBsZW5pZW50XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IERhdGUucGFyc2Uodik7XG4gICAgICAgIHJldHVybiAhTnVtYmVyLmlzTmFOKHBhcnNlZCkgJiYgcGFyc2VkID4gMDsgLy8gRW5zdXJlIGl0J3MgYSB2YWxpZCBwb3NpdGl2ZSB0aW1lc3RhbXBcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICB0cmlnZ2VyczogKHYpID0+IEFycmF5LmlzQXJyYXkodikgJiYgdi5ldmVyeSh0ID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyAmJiB0Lmxlbmd0aCA8PSA1MCksXG4gICAgY29udGVudF9mbGFnczogKHYpID0+IEFycmF5LmlzQXJyYXkodikgJiYgdi5ldmVyeShmID0+IHR5cGVvZiBmID09PSAnc3RyaW5nJyAmJiBmLmxlbmd0aCA8PSA1MClcbiAgfTtcblxuICAvKipcbiAgICogUGFyc2UgYSBNYXJrZG93biBmaWxlIHdpdGggWUFNTCBmcm9udG1hdHRlciAoU2VjdXJlbHkpXG4gICAqIFxuICAgKiBAcGFyYW0gaW5wdXQgLSBUaGUgZnVsbCBjb250ZW50IG9mIGEgTWFya2Rvd24gZmlsZSB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQYXJzaW5nIG9wdGlvbnMgZm9yIHNlY3VyaXR5IGFuZCB2YWxpZGF0aW9uXG4gICAqIEByZXR1cm5zIFBhcnNlZENvbnRlbnQgd2l0aCBzZXBhcmF0ZWQgWUFNTCBkYXRhIGFuZCBNYXJrZG93biBjb250ZW50XG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEZvciBhIHBlcnNvbmEgZmlsZTpcbiAgICogY29uc3QgcGVyc29uYUZpbGUgPSBgLS0tXG4gICAqIG5hbWU6IENyZWF0aXZlIFdyaXRlclxuICAgKiBkZXNjcmlwdGlvbjogQSBjcmVhdGl2ZSB3cml0aW5nIGFzc2lzdGFudFxuICAgKiAtLS1cbiAgICogWW91IGFyZSBhIGNyZWF0aXZlIHdyaXRlci4uLmA7XG4gICAqIFxuICAgKiBjb25zdCByZXN1bHQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKHBlcnNvbmFGaWxlKTtcbiAgICogLy8gcmVzdWx0LmRhdGEgPSB7IG5hbWU6ICdDcmVhdGl2ZSBXcml0ZXInLCBkZXNjcmlwdGlvbjogJy4uLicgfVxuICAgKiAvLyByZXN1bHQuY29udGVudCA9ICdZb3UgYXJlIGEgY3JlYXRpdmUgd3JpdGVyLi4uJ1xuICAgKiBgYGBcbiAgICovXG4gIHN0YXRpYyBwYXJzZShpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBTZWN1cmVQYXJzZU9wdGlvbnMgPSB7fSk6IFBhcnNlZENvbnRlbnQge1xuICAgIGNvbnN0IG9wdHMgPSB7IC4uLnRoaXMuREVGQVVMVF9PUFRJT05TLCAuLi5vcHRpb25zIH07XG5cbiAgICAvLyAxLiBTaXplIHZhbGlkYXRpb25cbiAgICBpZiAoaW5wdXQubGVuZ3RoID4gKG9wdHMubWF4Q29udGVudFNpemUgfHwgdGhpcy5ERUZBVUxUX09QVElPTlMubWF4Q29udGVudFNpemUhKSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoJ0NvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgc2l6ZScsICdtZWRpdW0nKTtcbiAgICB9XG5cbiAgICAvLyAyLiBFeHRyYWN0IGZyb250bWF0dGVyIGJvdW5kYXJpZXNcbiAgICAvLyBGSVg6IFN1cHBvcnQgYm90aCBVbml4IChcXG4pIGFuZCBXaW5kb3dzIChcXHJcXG4pIGxpbmUgZW5kaW5nc1xuICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBpbnB1dC5tYXRjaCgvXi0tLVxccj9cXG4oW1xcc1xcU10qPylcXHI/XFxuLS0tLyk7XG4gICAgaWYgKCFmcm9udG1hdHRlck1hdGNoKSB7XG4gICAgICAvLyBObyBmcm9udG1hdHRlciwgcmV0dXJuIGVtcHR5IGRhdGFcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHt9LFxuICAgICAgICBjb250ZW50OiBpbnB1dFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IGZyb250bWF0dGVyTWF0Y2hbMV07XG4gICAgY29uc3QgbWFya2Rvd25Db250ZW50ID0gaW5wdXQuc3Vic3RyaW5nKGZyb250bWF0dGVyTWF0Y2hbMF0ubGVuZ3RoKTtcblxuICAgIC8vIDMuIFZhbGlkYXRlIFlBTUwgc2l6ZVxuICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPiAob3B0cy5tYXhZYW1sU2l6ZSB8fCB0aGlzLkRFRkFVTFRfT1BUSU9OUy5tYXhZYW1sU2l6ZSEpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignWUFNTCBmcm9udG1hdHRlciBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzaXplJywgJ21lZGl1bScpO1xuICAgIH1cblxuICAgIC8vIDQuIFByZS1wYXJzZSBzZWN1cml0eSB2YWxpZGF0aW9uXG4gICAgLy8gRklYIChJc3N1ZSAjMTIxMSk6IE9ubHkgdmFsaWRhdGUgY29udGVudCBpZiB2YWxpZGF0ZUNvbnRlbnQgb3B0aW9uIGlzIHRydWVcbiAgICBpZiAob3B0cy52YWxpZGF0ZUNvbnRlbnQgJiYgIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnU2VjdXJlWWFtbFBhcnNlcicsXG4gICAgICAgIGRldGFpbHM6ICdNYWxpY2lvdXMgWUFNTCBwYXR0ZXJuIGRldGVjdGVkIGR1cmluZyBwYXJzaW5nJ1xuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignTWFsaWNpb3VzIFlBTUwgY29udGVudCBkZXRlY3RlZCcsICdjcml0aWNhbCcpO1xuICAgIH1cblxuICAgIC8vIDUuIFBhcnNlIHdpdGggc2FmZSBzY2hlbWFcbiAgICBsZXQgZGF0YTogYW55O1xuICAgIHRyeSB7XG4gICAgICBkYXRhID0geWFtbC5sb2FkKHlhbWxDb250ZW50LCB7XG4gICAgICAgIHNjaGVtYTogdGhpcy5TQUZFX1NDSEVNQSxcbiAgICAgICAganNvbjogZmFsc2UsICAvLyBEb24ndCBhbGxvdyBKU09OLXNwZWNpZmljIHR5cGVzXG4gICAgICAgIG9uV2FybmluZzogKHdhcm5pbmcpID0+IHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9QQVJTSU5HX1dBUk5JTkcnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnU2VjdXJlWWFtbFBhcnNlcicsXG4gICAgICAgICAgICBkZXRhaWxzOiBgWUFNTCB3YXJuaW5nOiAke3dhcm5pbmcubWVzc2FnZX1gXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgWUFNTCBwYXJzaW5nIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gLCAnaGlnaCcpO1xuICAgIH1cblxuICAgIC8vIDYuIEVuc3VyZSBkYXRhIGlzIGFuIG9iamVjdFxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgZGF0YSA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignWUFNTCBtdXN0IGNvbnRhaW4gYW4gb2JqZWN0IGF0IHJvb3QgbGV2ZWwnLCAnbWVkaXVtJyk7XG4gICAgfVxuXG4gICAgLy8gNy4gVmFsaWRhdGUgYWxsb3dlZCBrZXlzIGlmIHNwZWNpZmllZFxuICAgIGlmIChvcHRzLmFsbG93ZWRLZXlzKSB7XG4gICAgICBjb25zdCBpbnZhbGlkS2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpLmZpbHRlcihrZXkgPT4gIW9wdHMuYWxsb3dlZEtleXMhLmluY2x1ZGVzKGtleSkpO1xuICAgICAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoYEludmFsaWQgWUFNTCBrZXlzIGRldGVjdGVkOiAke2ludmFsaWRLZXlzLmpvaW4oJywgJyl9YCwgJ21lZGl1bScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDguIFZhbGlkYXRlIGZpZWxkIHR5cGVzIGFuZCBjb250ZW50XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgIGNvbnN0IGhhc0ZpZWxkVmFsaWRhdG9yID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuRklFTERfVkFMSURBVE9SUywga2V5KTtcbiAgICAgIGNvbnN0IGZpZWxkVmFsaWRhdG9yID0gaGFzRmllbGRWYWxpZGF0b3IgPyB0aGlzLkZJRUxEX1ZBTElEQVRPUlNba2V5XSA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8gQ2hlY2sgZmllbGQtc3BlY2lmaWMgdmFsaWRhdG9ycyBvbmx5IGlmIGZpZWxkIHZhbGlkYXRpb24gaXMgZW5hYmxlZFxuICAgICAgaWYgKG9wdHMudmFsaWRhdGVGaWVsZHMgJiYgdHlwZW9mIGZpZWxkVmFsaWRhdG9yID09PSAnZnVuY3Rpb24nICYmICFmaWVsZFZhbGlkYXRvcih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoYEludmFsaWQgdmFsdWUgZm9yIGZpZWxkICcke2tleX0nYCwgJ21lZGl1bScpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBzdHJpbmcgZmllbGRzIGZvciBpbmplY3Rpb24gcGF0dGVybnNcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIG9wdHMudmFsaWRhdGVDb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUodmFsdWUsIHtcbiAgICAgICAgICBjb250ZW50Q29udGV4dDogb3B0cy5jb250ZW50Q29udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdmFsaWRhdGlvbi5pc1ZhbGlkICYmIHZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgU2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIGZpZWxkICcke2tleX0nYCwgJ2NyaXRpY2FsJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVwbGFjZSB3aXRoIHNhbml0aXplZCBjb250ZW50XG4gICAgICAgIGRhdGFba2V5XSA9IHZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA5LiBWYWxpZGF0ZSBtYXJrZG93biBjb250ZW50IGlmIHJlcXVlc3RlZFxuICAgIGxldCBmaW5hbENvbnRlbnQgPSBtYXJrZG93bkNvbnRlbnQ7XG4gICAgaWYgKG9wdHMudmFsaWRhdGVDb250ZW50KSB7XG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShtYXJrZG93bkNvbnRlbnQsIHtcbiAgICAgICAgY29udGVudENvbnRleHQ6IG9wdHMuY29udGVudENvbnRleHQsXG4gICAgICB9KTtcbiAgICAgIGlmICghY29udGVudFZhbGlkYXRpb24uaXNWYWxpZCAmJiBjb250ZW50VmFsaWRhdGlvbi5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignU2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIGNvbnRlbnQnLCAnY3JpdGljYWwnKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsQ29udGVudCA9IGNvbnRlbnRWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgbWFya2Rvd25Db250ZW50O1xuICAgIH1cblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdZQU1MX1BBUlNFX1NVQ0NFU1MnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnU2VjdXJlWWFtbFBhcnNlcicsXG4gICAgICBkZXRhaWxzOiBgU3VjY2Vzc2Z1bGx5IHBhcnNlZCBZQU1MIHdpdGggJHtPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGh9IGZpZWxkc2BcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgY29udGVudDogZmluYWxDb250ZW50XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzZWN1cmUgZ3JheS1tYXR0ZXIgY29tcGF0aWJsZSBwYXJzZXJcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVTZWN1cmVNYXR0ZXJQYXJzZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcnNlOiAoaW5wdXQ6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlKGlucHV0KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YSxcbiAgICAgICAgICBjb250ZW50OiByZXN1bHQuY29udGVudCxcbiAgICAgICAgICBleGNlcnB0OiByZXN1bHQuZXhjZXJwdCxcbiAgICAgICAgICBvcmlnOiBpbnB1dFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHN0cmluZ2lmeTogKGNvbnRlbnQ6IHN0cmluZywgZGF0YTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGRhdGEgYmVmb3JlIHN0cmluZ2lmeWluZ1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZU1ldGFkYXRhKGRhdGEpO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdDYW5ub3Qgc3RyaW5naWZ5IGNvbnRlbnQgd2l0aCBzZWN1cml0eSB0aHJlYXRzJywgJ2hpZ2gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBzYWZlIFlBTUwgZHVtcFxuICAgICAgICBjb25zdCB5YW1sU3RyID0geWFtbC5kdW1wKGRhdGEsIHtcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuU0FGRV9TQ0hFTUEsXG4gICAgICAgICAgc2tpcEludmFsaWQ6IHRydWUsXG4gICAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYC0tLVxcbiR7eWFtbFN0cn0tLS1cXG4ke2NvbnRlbnR9YDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhZmUgd3JhcHBlciBmb3IgZ3JheS1tYXR0ZXIgd2l0aCBzZWN1cml0eSB2YWxpZGF0aW9uc1xuICAgKi9cbiAgc3RhdGljIHNhZmVNYXR0ZXIoaW5wdXQ6IHN0cmluZywgb3B0aW9ucz86IG1hdHRlci5HcmF5TWF0dGVyT3B0aW9uPHN0cmluZywgYW55Piwgc2VjdXJlT3B0aW9ucz86IFNlY3VyZVBhcnNlT3B0aW9ucyk6IG1hdHRlci5HcmF5TWF0dGVyRmlsZTxzdHJpbmc+IHtcbiAgICAvLyBGaXJzdCwgdXNlIG91ciBzZWN1cmUgcGFyc2VyIChmb3IgdmFsaWRhdGlvbilcbiAgICB0aGlzLnBhcnNlKGlucHV0LCBzZWN1cmVPcHRpb25zKTtcblxuICAgIC8vIFRoZW4gdXNlIGdyYXktbWF0dGVyIHdpdGggY3VzdG9tIGVuZ2luZXNcbiAgICByZXR1cm4gbWF0dGVyKGlucHV0LCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZW5naW5lczoge1xuICAgICAgICB5YW1sOiB7XG4gICAgICAgICAgcGFyc2U6IChzdHI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gVXNlIG91ciBzZWN1cmUgWUFNTCBwYXJzaW5nXG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoc3RyLCB7XG4gICAgICAgICAgICAgIHNjaGVtYTogdGhpcy5TQUZFX1NDSEVNQSxcbiAgICAgICAgICAgICAganNvbjogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gRW5zdXJlIGl0J3MgYW4gb2JqZWN0XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgcGFyc2VkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJzZWQgYXMgb2JqZWN0O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RyaW5naWZ5OiAob2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB5YW1sLmR1bXAob2JqLCB7XG4gICAgICAgICAgICAgIHNjaGVtYTogdGhpcy5TQUZFX1NDSEVNQSxcbiAgICAgICAgICAgICAgc2tpcEludmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgIG5vUmVmczogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcmF3IFlBTUwgY29udGVudCBzYWZlbHkgKG5vdCBmcm9udG1hdHRlciwganVzdCBwbGFpbiBZQU1MKVxuICAgKlxuICAgKiBVU0UgVEhJUyBGT1I6XG4gICAqIC0gRXhwb3J0IHBhY2thZ2UgZGF0YSBmaWVsZHNcbiAgICogLSBDb25maWd1cmF0aW9uIHNuaXBwZXRzXG4gICAqIC0gQW55IHB1cmUgWUFNTCBzdHJpbmcgdGhhdCBuZWVkcyBwYXJzaW5nXG4gICAqXG4gICAqIFRoaXMgdXNlcyBDT1JFX1NDSEVNQSB3aGljaCBvbmx5IGFsbG93cyBzYWZlIGJhc2ljIHR5cGVzOlxuICAgKiAtIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zLCBudWxsXG4gICAqIC0gYXJyYXlzIGFuZCBvYmplY3RzXG4gICAqIC0gTk8gY3VzdG9tIHR5cGVzLCBmdW5jdGlvbnMsIG9yIGNvZGUgZXhlY3V0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB5YW1sQ29udGVudCAtIFJhdyBZQU1MIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0gbWF4U2l6ZSAtIE1heGltdW0gYWxsb3dlZCBzaXplIChkZWZhdWx0IDY0S0IpXG4gICAqIEByZXR1cm5zIFBhcnNlZCBvYmplY3RcbiAgICogQHRocm93cyBTZWN1cml0eUVycm9yIGlmIGNvbnRlbnQgaXMgdG9vIGxhcmdlIG9yIGNvbnRhaW5zIHRocmVhdHNcbiAgICovXG4gIHN0YXRpYyBwYXJzZVJhd1lhbWwoeWFtbENvbnRlbnQ6IHN0cmluZywgbWF4U2l6ZTogbnVtYmVyID0gNjQgKiAxMDI0KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIC8vIFNpemUgdmFsaWRhdGlvblxuICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPiBtYXhTaXplKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignWUFNTCBjb250ZW50IGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIHNpemUnLCAnbWVkaXVtJyk7XG4gICAgfVxuXG4gICAgLy8gRml4ICM5MDg6IFlBTUwgYm9tYiBkZXRlY3Rpb24g4oCUIHByZXZpb3VzbHkgc2tpcHBlZCwgYWxsb3dpbmcgYm9tYiBwYXlsb2Fkc1xuICAgIC8vIHRocm91Z2ggTUNQLUFRTCBjcmVhdGUgZGlzcGF0Y2hlciBhbmQgd2ViIHJvdXRlcyB0aGF0IHVzZSBwYXJzZVJhd1lhbWwoKS5cbiAgICBpZiAoIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwnLFxuICAgICAgICBkZXRhaWxzOiAnTWFsaWNpb3VzIFlBTUwgcGF0dGVybiBkZXRlY3RlZCBpbiByYXcgWUFNTCBjb250ZW50J1xuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignTWFsaWNpb3VzIFlBTUwgY29udGVudCBkZXRlY3RlZCcsICdjcml0aWNhbCcpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIHdpdGggc2FmZSBzY2hlbWFcbiAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQsIHtcbiAgICAgIHNjaGVtYTogdGhpcy5TQUZFX1NDSEVNQSwgIC8vIENPUkVfU0NIRU1BIC0gc2FmZSBiYXNpYyB0eXBlcyBvbmx5XG4gICAgICBqc29uOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIHJlc3VsdCBpcyBhbiBvYmplY3RcbiAgICBpZiAodHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgcGFyc2VkID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignWUFNTCBjb250ZW50IG11c3QgcGFyc2UgdG8gYW4gb2JqZWN0JywgJ21lZGl1bScpO1xuICAgIH1cblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdZQU1MX1BBUlNFX1NVQ0NFU1MnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnU2VjdXJlWWFtbFBhcnNlcicsXG4gICAgICBkZXRhaWxzOiBgUGFyc2VkIHJhdyBZQU1MIHdpdGggJHtPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aH0ga2V5c2BcbiAgICB9KTtcblxuICAgIHJldHVybiBwYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cbn1cbiJdfQ==
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlWWFtbFBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ0c7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWtCdkQsTUFBTSxPQUFPLGdCQUFnQjtJQUNuQixNQUFNLENBQVUsZUFBZSxHQUF1QjtRQUM1RCxXQUFXLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBTyxnQkFBZ0I7UUFDN0MsY0FBYyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUcsa0JBQWtCO1FBQ2hELGVBQWUsRUFBRSxJQUFJO1FBQ3JCLGNBQWMsRUFBRSxJQUFJLENBQVMscUNBQXFDO0tBQ25FLENBQUM7SUFFRixtR0FBbUc7SUFDM0YsTUFBTSxDQUFVLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBRXZELG9EQUFvRDtJQUM1QyxNQUFNLENBQVUsZ0JBQWdCLEdBQTRDO1FBQ2xGLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRztRQUNyRCxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUc7UUFDNUQsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxP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RSxVQUFVLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFHLHNDQUFzQztZQUNqRSxJQUFJLEVBQUUsS0FBSztTQUNaLENBQUMsQ0FBQztRQUVILDZCQUE2QjtRQUM3QixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLGFBQWEsQ0FBQyxzQ0FBc0MsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsT0FBTyxNQUFpQyxDQUFDO0lBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyZSBZQU1MIFBhcnNlciBmb3IgRG9sbGhvdXNlTUNQIC0gRm9yIE1hcmtkb3duIEZpbGVzIHdpdGggWUFNTCBGcm9udG1hdHRlclxuICogXG4gKiBJTVBPUlRBTlQ6IFRoaXMgcGFyc2VyIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IgTWFya2Rvd24gZmlsZXMgd2l0aCBZQU1MIGZyb250bWF0dGVyXG4gKiAodGhlIGZvcm1hdCB1c2VkIGJ5IHBlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgYW5kIG90aGVyIGVsZW1lbnRzKS5cbiAqIFxuICogVVNFIFRISVMgRk9SOlxuICogLSBQZXJzb25hIGZpbGVzIChlLmcuLCBjcmVhdGl2ZS13cml0ZXIubWQpXG4gKiAtIFNraWxsIGZpbGVzIChlLmcuLCBjb2RlLXJldmlldy5tZClcbiAqIC0gVGVtcGxhdGUgZmlsZXMgKGUuZy4sIG1lZXRpbmctbm90ZXMubWQpXG4gKiAtIEFueSBNYXJrZG93biBmaWxlIHdpdGggWUFNTCBmcm9udG1hdHRlciBiZXR3ZWVuIC0tLSBtYXJrZXJzXG4gKiBcbiAqIERPIE5PVCBVU0UgVEhJUyBGT1I6XG4gKiAtIFB1cmUgWUFNTCBjb25maWd1cmF0aW9uIGZpbGVzICh1c2UganMteWFtbCBkaXJlY3RseSB3aXRoIEZBSUxTQUZFX1NDSEVNQSlcbiAqIC0gSlNPTiBmaWxlc1xuICogLSBQbGFpbiB0ZXh0IGZpbGVzIHdpdGhvdXQgZnJvbnRtYXR0ZXJcbiAqIFxuICogRklMRSBGT1JNQVQgRVhQRUNURUQ6XG4gKiBgYGBcbiAqIC0tLVxuICogbmFtZTogRWxlbWVudCBOYW1lXG4gKiBkZXNjcmlwdGlvbjogRWxlbWVudCBkZXNjcmlwdGlvblxuICogdmVyc2lvbjogMS4wLjBcbiAqIC0tLVxuICogXG4gKiAjIE1hcmtkb3duIGNvbnRlbnQgaGVyZVxuICogVGhlIGFjdHVhbCBjb250ZW50L2luc3RydWN0aW9ucyBnbyBoZXJlLi4uXG4gKiBgYGBcbiAqIFxuICogUHJvdmlkZXMgc2FmZSBZQU1MIHBhcnNpbmcgdGhhdCBwcmV2ZW50cyBkZXNlcmlhbGl6YXRpb24gYXR0YWNrc1xuICogYnkgdXNpbmcgYSByZXN0cmljdGVkIHNjaGVtYSBhbmQgcHJlLXZhbGlkYXRpb24uXG4gKiBcbiAqIFNlY3VyaXR5OiBTRUMtMDAzIC0gWUFNTCBwYXJzaW5nIHZ1bG5lcmFiaWxpdHkgcHJvdGVjdGlvblxuICovXG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgbWF0dGVyIGZyb20gJ2dyYXktbWF0dGVyJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvU2VjdXJpdHlFcnJvci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4vc2VjdXJpdHlNb25pdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWN1cmVQYXJzZU9wdGlvbnMge1xuICBtYXhZYW1sU2l6ZT86IG51bWJlcjtcbiAgbWF4Q29udGVudFNpemU/OiBudW1iZXI7XG4gIGFsbG93ZWRLZXlzPzogc3RyaW5nW107XG4gIHZhbGlkYXRlQ29udGVudD86IGJvb2xlYW47XG4gIHZhbGlkYXRlRmllbGRzPzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBhcHBseSBmaWVsZC1zcGVjaWZpYyB2YWxpZGF0b3JzIChmb3IgcGVyc29uYSBtZXRhZGF0YSlcbiAgLyoqIENvbnRlbnQgY29udGV4dCBmb3IgQ29udGVudFZhbGlkYXRvciDigJQgZXhlbXB0cyBsZWdpdGltYXRlIHBhdHRlcm5zIChlLmcuLCA8c2NyaXB0PiBpbiB0ZW1wbGF0ZXMpICovXG4gIGNvbnRlbnRDb250ZXh0PzogJ3BlcnNvbmEnIHwgJ3NraWxsJyB8ICd0ZW1wbGF0ZScgfCAnYWdlbnQnIHwgJ21lbW9yeSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkQ29udGVudCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgZXhjZXJwdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNlY3VyZVlhbWxQYXJzZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX09QVElPTlM6IFNlY3VyZVBhcnNlT3B0aW9ucyA9IHtcbiAgICBtYXhZYW1sU2l6ZTogNjQgKiAxMDI0LCAgICAgIC8vIDY0S0IgZm9yIFlBTUxcbiAgICBtYXhDb250ZW50U2l6ZTogMTAyNCAqIDEwMjQsICAvLyAxTUIgZm9yIGNvbnRlbnRcbiAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgdmFsaWRhdGVGaWVsZHM6IHRydWUgICAgICAgICAvLyBCeSBkZWZhdWx0LCBhcHBseSBmaWVsZCB2YWxpZGF0b3JzXG4gIH07XG5cbiAgLy8gQWxsb3dlZCBZQU1MIHR5cGVzIC0gdXNpbmcgQ09SRV9TQ0hFTUEgKHNhZmUgc3Vic2V0IHdpdGggYmFzaWMgdHlwZXMgbGlrZSBib29sZWFucyBhbmQgaW50ZWdlcnMpXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNBRkVfU0NIRU1BID0geWFtbC5DT1JFX1NDSEVNQTtcblxuICAvLyBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZm9yIHNwZWNpZmljIHBlcnNvbmEgZmllbGRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZJRUxEX1ZBTElEQVRPUlM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBib29sZWFuPiA9IHtcbiAgICBuYW1lOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoIDw9IDEwMCxcbiAgICBkZXNjcmlwdGlvbjogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA8PSA1MDAsXG4gICAgYXV0aG9yOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoIDw9IDEwMCxcbiAgICB2ZXJzaW9uOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIC9eXFxkK1xcLlxcZCsoXFwuXFxkKyk/KC1bYS16QS1aMC05Li1dKyk/JC8udGVzdCh2KSxcbiAgICBjYXRlZ29yeTogKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA8PSA1MCxcbiAgICBhZ2VfcmF0aW5nOiAodikgPT4gWydhbGwnLCAnMTMrJywgJzE4KyddLmluY2x1ZGVzKHYpLFxuICAgIHByaWNlOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmICh2ID09PSAnZnJlZScgfHwgL15cXCRcXGQrXFwuXFxkezJ9JC8udGVzdCh2KSksXG4gICAgYWlfZ2VuZXJhdGVkOiAodikgPT4gdHlwZW9mIHYgPT09ICdib29sZWFuJyB8fCB2ID09PSAndHJ1ZScgfHwgdiA9PT0gJ2ZhbHNlJyxcbiAgICBnZW5lcmF0aW9uX21ldGhvZDogKHYpID0+IFsnaHVtYW4nLCAnQ2hhdEdQVCcsICdDbGF1ZGUnLCAnaHlicmlkJ10uaW5jbHVkZXModiksXG4gICAgY3JlYXRlZF9kYXRlOiAodikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgICAgXG4gICAgICAvLyBNb3JlIGZsZXhpYmxlIGRhdGUgdmFsaWRhdGlvbiAtIGFjY2VwdCBjb21tb24gZm9ybWF0c1xuICAgICAgLy8gSVNPODYwMSwgVVMgZm9ybWF0LCBFdXJvcGVhbiBmb3JtYXQsIHNpbXBsZSBkYXRlc1xuICAgICAgY29uc3QgZGF0ZVBhdHRlcm5zID0gW1xuICAgICAgICAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8sIC8vIFlZWVktTU0tRERcbiAgICAgICAgL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfS8sIC8vIElTTzg2MDEgd2l0aCB0aW1lXG4gICAgICAgIC9eXFxkezEsMn1cXC9cXGR7MSwyfVxcL1xcZHs0fSQvLCAvLyBNTS9ERC9ZWVlZIG9yIE0vRC9ZWVlZXG4gICAgICAgIC9eXFxkezEsMn0tXFxkezEsMn0tXFxkezR9JC8sIC8vIE1NLURELVlZWVkgb3IgTS1ELVlZWVlcbiAgICAgICAgL15cXGR7MSwyfVxcLlxcZHsxLDJ9XFwuXFxkezR9JC8sIC8vIERELk1NLllZWVkgKEV1cm9wZWFuKVxuICAgICAgICAvXihKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMrXFxkezEsMn0sP1xccytcXGR7NH0kL2kgLy8gTW9udGggREQsIFlZWVlcbiAgICAgIF07XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGl0IG1hdGNoZXMgY29tbW9uIHBhdHRlcm5zIGZpcnN0XG4gICAgICBjb25zdCBtYXRjaGVzUGF0dGVybiA9IGRhdGVQYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gcGF0dGVybi50ZXN0KHYudHJpbSgpKSk7XG4gICAgICBpZiAoIW1hdGNoZXNQYXR0ZXJuKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBEYXRlLnBhcnNlIGZvciBvdGhlciBmb3JtYXRzLCBidXQgYmUgbW9yZSBsZW5pZW50XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IERhdGUucGFyc2Uodik7XG4gICAgICAgIHJldHVybiAhTnVtYmVyLmlzTmFOKHBhcnNlZCkgJiYgcGFyc2VkID4gMDsgLy8gRW5zdXJlIGl0J3MgYSB2YWxpZCBwb3NpdGl2ZSB0aW1lc3RhbXBcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICB0cmlnZ2VyczogKHYpID0+IEFycmF5LmlzQXJyYXkodikgJiYgdi5ldmVyeSh0ID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyAmJiB0Lmxlbmd0aCA8PSA1MCksXG4gICAgY29udGVudF9mbGFnczogKHYpID0+IEFycmF5LmlzQXJyYXkodikgJiYgdi5ldmVyeShmID0+IHR5cGVvZiBmID09PSAnc3RyaW5nJyAmJiBmLmxlbmd0aCA8PSA1MClcbiAgfTtcblxuICAvKipcbiAgICogUGFyc2UgYSBNYXJrZG93biBmaWxlIHdpdGggWUFNTCBmcm9udG1hdHRlciAoU2VjdXJlbHkpXG4gICAqIFxuICAgKiBAcGFyYW0gaW5wdXQgLSBUaGUgZnVsbCBjb250ZW50IG9mIGEgTWFya2Rvd24gZmlsZSB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQYXJzaW5nIG9wdGlvbnMgZm9yIHNlY3VyaXR5IGFuZCB2YWxpZGF0aW9uXG4gICAqIEByZXR1cm5zIFBhcnNlZENvbnRlbnQgd2l0aCBzZXBhcmF0ZWQgWUFNTCBkYXRhIGFuZCBNYXJrZG93biBjb250ZW50XG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEZvciBhIHBlcnNvbmEgZmlsZTpcbiAgICogY29uc3QgcGVyc29uYUZpbGUgPSBgLS0tXG4gICAqIG5hbWU6IENyZWF0aXZlIFdyaXRlclxuICAgKiBkZXNjcmlwdGlvbjogQSBjcmVhdGl2ZSB3cml0aW5nIGFzc2lzdGFudFxuICAgKiAtLS1cbiAgICogWW91IGFyZSBhIGNyZWF0aXZlIHdyaXRlci4uLmA7XG4gICAqIFxuICAgKiBjb25zdCByZXN1bHQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKHBlcnNvbmFGaWxlKTtcbiAgICogLy8gcmVzdWx0LmRhdGEgPSB7IG5hbWU6ICdDcmVhdGl2ZSBXcml0ZXInLCBkZXNjcmlwdGlvbjogJy4uLicgfVxuICAgKiAvLyByZXN1bHQuY29udGVudCA9ICdZb3UgYXJlIGEgY3JlYXRpdmUgd3JpdGVyLi4uJ1xuICAgKiBgYGBcbiAgICovXG4gIHN0YXRpYyBwYXJzZShpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBTZWN1cmVQYXJzZU9wdGlvbnMgPSB7fSk6IFBhcnNlZENvbnRlbnQge1xuICAgIGNvbnN0IG9wdHMgPSB7IC4uLnRoaXMuREVGQVVMVF9PUFRJT05TLCAuLi5vcHRpb25zIH07XG5cbiAgICAvLyAxLiBTaXplIHZhbGlkYXRpb25cbiAgICBpZiAoaW5wdXQubGVuZ3RoID4gKG9wdHMubWF4Q29udGVudFNpemUgfHwgdGhpcy5ERUZBVUxUX09QVElPTlMubWF4Q29udGVudFNpemUhKSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoJ0NvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgc2l6ZScsICdtZWRpdW0nKTtcbiAgICB9XG5cbiAgICAvLyAyLiBFeHRyYWN0IGZyb250bWF0dGVyIGJvdW5kYXJpZXNcbiAgICAvLyBGSVg6IFN1cHBvcnQgYm90aCBVbml4IChcXG4pIGFuZCBXaW5kb3dzIChcXHJcXG4pIGxpbmUgZW5kaW5nc1xuICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBpbnB1dC5tYXRjaCgvXi0tLVxccj9cXG4oW1xcc1xcU10qPylcXHI/XFxuLS0tLyk7XG4gICAgaWYgKCFmcm9udG1hdHRlck1hdGNoKSB7XG4gICAgICAvLyBObyBmcm9udG1hdHRlciwgcmV0dXJuIGVtcHR5IGRhdGFcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHt9LFxuICAgICAgICBjb250ZW50OiBpbnB1dFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IGZyb250bWF0dGVyTWF0Y2hbMV07XG4gICAgY29uc3QgbWFya2Rvd25Db250ZW50ID0gaW5wdXQuc3Vic3RyaW5nKGZyb250bWF0dGVyTWF0Y2hbMF0ubGVuZ3RoKTtcblxuICAgIC8vIDMuIFZhbGlkYXRlIFlBTUwgc2l6ZVxuICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPiAob3B0cy5tYXhZYW1sU2l6ZSB8fCB0aGlzLkRFRkFVTFRfT1BUSU9OUy5tYXhZYW1sU2l6ZSEpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignWUFNTCBmcm9udG1hdHRlciBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzaXplJywgJ21lZGl1bScpO1xuICAgIH1cblxuICAgIC8vIDQuIFByZS1wYXJzZSBzZWN1cml0eSB2YWxpZGF0aW9uXG4gICAgLy8gRklYIChJc3N1ZSAjMTIxMSk6IE9ubHkgdmFsaWRhdGUgY29udGVudCBpZiB2YWxpZGF0ZUNvbnRlbnQgb3B0aW9uIGlzIHRydWVcbiAgICBpZiAob3B0cy52YWxpZGF0ZUNvbnRlbnQgJiYgIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnU2VjdXJlWWFtbFBhcnNlcicsXG4gICAgICAgIGRldGFpbHM6ICdNYWxpY2lvdXMgWUFNTCBwYXR0ZXJuIGRldGVjdGVkIGR1cmluZyBwYXJzaW5nJ1xuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignTWFsaWNpb3VzIFlBTUwgY29udGVudCBkZXRlY3RlZCcsICdjcml0aWNhbCcpO1xuICAgIH1cblxuICAgIC8vIDUuIFBhcnNlIHdpdGggc2FmZSBzY2hlbWFcbiAgICBsZXQgZGF0YTogYW55O1xuICAgIHRyeSB7XG4gICAgICBkYXRhID0geWFtbC5sb2FkKHlhbWxDb250ZW50LCB7XG4gICAgICAgIHNjaGVtYTogdGhpcy5TQUZFX1NDSEVNQSxcbiAgICAgICAganNvbjogZmFsc2UsICAvLyBEb24ndCBhbGxvdyBKU09OLXNwZWNpZmljIHR5cGVzXG4gICAgICAgIG9uV2FybmluZzogKHdhcm5pbmcpID0+IHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9QQVJTSU5HX1dBUk5JTkcnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnU2VjdXJlWWFtbFBhcnNlcicsXG4gICAgICAgICAgICBkZXRhaWxzOiBgWUFNTCB3YXJuaW5nOiAke3dhcm5pbmcubWVzc2FnZX1gXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgWUFNTCBwYXJzaW5nIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gLCAnaGlnaCcpO1xuICAgIH1cblxuICAgIC8vIDYuIEVuc3VyZSBkYXRhIGlzIGFuIG9iamVjdFxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgZGF0YSA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignWUFNTCBtdXN0IGNvbnRhaW4gYW4gb2JqZWN0IGF0IHJvb3QgbGV2ZWwnLCAnbWVkaXVtJyk7XG4gICAgfVxuXG4gICAgLy8gNy4gVmFsaWRhdGUgYWxsb3dlZCBrZXlzIGlmIHNwZWNpZmllZFxuICAgIGlmIChvcHRzLmFsbG93ZWRLZXlzKSB7XG4gICAgICBjb25zdCBpbnZhbGlkS2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpLmZpbHRlcihrZXkgPT4gIW9wdHMuYWxsb3dlZEtleXMhLmluY2x1ZGVzKGtleSkpO1xuICAgICAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoYEludmFsaWQgWUFNTCBrZXlzIGRldGVjdGVkOiAke2ludmFsaWRLZXlzLmpvaW4oJywgJyl9YCwgJ21lZGl1bScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDguIFZhbGlkYXRlIGZpZWxkIHR5cGVzIGFuZCBjb250ZW50XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgIGNvbnN0IGhhc0ZpZWxkVmFsaWRhdG9yID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuRklFTERfVkFMSURBVE9SUywga2V5KTtcbiAgICAgIGNvbnN0IGZpZWxkVmFsaWRhdG9yID0gaGFzRmllbGRWYWxpZGF0b3IgPyB0aGlzLkZJRUxEX1ZBTElEQVRPUlNba2V5XSA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8gQ2hlY2sgZmllbGQtc3BlY2lmaWMgdmFsaWRhdG9ycyBvbmx5IGlmIGZpZWxkIHZhbGlkYXRpb24gaXMgZW5hYmxlZFxuICAgICAgaWYgKG9wdHMudmFsaWRhdGVGaWVsZHMgJiYgdHlwZW9mIGZpZWxkVmFsaWRhdG9yID09PSAnZnVuY3Rpb24nICYmICFmaWVsZFZhbGlkYXRvcih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoYEludmFsaWQgdmFsdWUgZm9yIGZpZWxkICcke2tleX0nYCwgJ21lZGl1bScpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBzdHJpbmcgZmllbGRzIGZvciBpbmplY3Rpb24gcGF0dGVybnNcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIG9wdHMudmFsaWRhdGVDb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUodmFsdWUsIHtcbiAgICAgICAgICBjb250ZW50Q29udGV4dDogb3B0cy5jb250ZW50Q29udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdmFsaWRhdGlvbi5pc1ZhbGlkICYmIHZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgU2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIGZpZWxkICcke2tleX0nYCwgJ2NyaXRpY2FsJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVwbGFjZSB3aXRoIHNhbml0aXplZCBjb250ZW50XG4gICAgICAgIGRhdGFba2V5XSA9IHZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA5LiBWYWxpZGF0ZSBtYXJrZG93biBjb250ZW50IGlmIHJlcXVlc3RlZFxuICAgIGxldCBmaW5hbENvbnRlbnQgPSBtYXJrZG93bkNvbnRlbnQ7XG4gICAgaWYgKG9wdHMudmFsaWRhdGVDb250ZW50KSB7XG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShtYXJrZG93bkNvbnRlbnQsIHtcbiAgICAgICAgY29udGVudENvbnRleHQ6IG9wdHMuY29udGVudENvbnRleHQsXG4gICAgICB9KTtcbiAgICAgIGlmICghY29udGVudFZhbGlkYXRpb24uaXNWYWxpZCAmJiBjb250ZW50VmFsaWRhdGlvbi5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignU2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIGNvbnRlbnQnLCAnY3JpdGljYWwnKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsQ29udGVudCA9IGNvbnRlbnRWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgbWFya2Rvd25Db250ZW50O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgY29udGVudDogZmluYWxDb250ZW50XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzZWN1cmUgZ3JheS1tYXR0ZXIgY29tcGF0aWJsZSBwYXJzZXJcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVTZWN1cmVNYXR0ZXJQYXJzZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcnNlOiAoaW5wdXQ6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlKGlucHV0KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YSxcbiAgICAgICAgICBjb250ZW50OiByZXN1bHQuY29udGVudCxcbiAgICAgICAgICBleGNlcnB0OiByZXN1bHQuZXhjZXJwdCxcbiAgICAgICAgICBvcmlnOiBpbnB1dFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHN0cmluZ2lmeTogKGNvbnRlbnQ6IHN0cmluZywgZGF0YTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGRhdGEgYmVmb3JlIHN0cmluZ2lmeWluZ1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZU1ldGFkYXRhKGRhdGEpO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdDYW5ub3Qgc3RyaW5naWZ5IGNvbnRlbnQgd2l0aCBzZWN1cml0eSB0aHJlYXRzJywgJ2hpZ2gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBzYWZlIFlBTUwgZHVtcFxuICAgICAgICBjb25zdCB5YW1sU3RyID0geWFtbC5kdW1wKGRhdGEsIHtcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuU0FGRV9TQ0hFTUEsXG4gICAgICAgICAgc2tpcEludmFsaWQ6IHRydWUsXG4gICAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYC0tLVxcbiR7eWFtbFN0cn0tLS1cXG4ke2NvbnRlbnR9YDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhZmUgd3JhcHBlciBmb3IgZ3JheS1tYXR0ZXIgd2l0aCBzZWN1cml0eSB2YWxpZGF0aW9uc1xuICAgKi9cbiAgc3RhdGljIHNhZmVNYXR0ZXIoaW5wdXQ6IHN0cmluZywgb3B0aW9ucz86IG1hdHRlci5HcmF5TWF0dGVyT3B0aW9uPHN0cmluZywgYW55Piwgc2VjdXJlT3B0aW9ucz86IFNlY3VyZVBhcnNlT3B0aW9ucyk6IG1hdHRlci5HcmF5TWF0dGVyRmlsZTxzdHJpbmc+IHtcbiAgICAvLyBGaXJzdCwgdXNlIG91ciBzZWN1cmUgcGFyc2VyIChmb3IgdmFsaWRhdGlvbilcbiAgICB0aGlzLnBhcnNlKGlucHV0LCBzZWN1cmVPcHRpb25zKTtcblxuICAgIC8vIFRoZW4gdXNlIGdyYXktbWF0dGVyIHdpdGggY3VzdG9tIGVuZ2luZXNcbiAgICByZXR1cm4gbWF0dGVyKGlucHV0LCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZW5naW5lczoge1xuICAgICAgICB5YW1sOiB7XG4gICAgICAgICAgcGFyc2U6IChzdHI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gVXNlIG91ciBzZWN1cmUgWUFNTCBwYXJzaW5nXG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoc3RyLCB7XG4gICAgICAgICAgICAgIHNjaGVtYTogdGhpcy5TQUZFX1NDSEVNQSxcbiAgICAgICAgICAgICAganNvbjogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gRW5zdXJlIGl0J3MgYW4gb2JqZWN0XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgcGFyc2VkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJzZWQgYXMgb2JqZWN0O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RyaW5naWZ5OiAob2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB5YW1sLmR1bXAob2JqLCB7XG4gICAgICAgICAgICAgIHNjaGVtYTogdGhpcy5TQUZFX1NDSEVNQSxcbiAgICAgICAgICAgICAgc2tpcEludmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgIG5vUmVmczogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcmF3IFlBTUwgY29udGVudCBzYWZlbHkgKG5vdCBmcm9udG1hdHRlciwganVzdCBwbGFpbiBZQU1MKVxuICAgKlxuICAgKiBVU0UgVEhJUyBGT1I6XG4gICAqIC0gRXhwb3J0IHBhY2thZ2UgZGF0YSBmaWVsZHNcbiAgICogLSBDb25maWd1cmF0aW9uIHNuaXBwZXRzXG4gICAqIC0gQW55IHB1cmUgWUFNTCBzdHJpbmcgdGhhdCBuZWVkcyBwYXJzaW5nXG4gICAqXG4gICAqIFRoaXMgdXNlcyBDT1JFX1NDSEVNQSB3aGljaCBvbmx5IGFsbG93cyBzYWZlIGJhc2ljIHR5cGVzOlxuICAgKiAtIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zLCBudWxsXG4gICAqIC0gYXJyYXlzIGFuZCBvYmplY3RzXG4gICAqIC0gTk8gY3VzdG9tIHR5cGVzLCBmdW5jdGlvbnMsIG9yIGNvZGUgZXhlY3V0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB5YW1sQ29udGVudCAtIFJhdyBZQU1MIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0gbWF4U2l6ZSAtIE1heGltdW0gYWxsb3dlZCBzaXplIChkZWZhdWx0IDY0S0IpXG4gICAqIEByZXR1cm5zIFBhcnNlZCBvYmplY3RcbiAgICogQHRocm93cyBTZWN1cml0eUVycm9yIGlmIGNvbnRlbnQgaXMgdG9vIGxhcmdlIG9yIGNvbnRhaW5zIHRocmVhdHNcbiAgICovXG4gIHN0YXRpYyBwYXJzZVJhd1lhbWwoeWFtbENvbnRlbnQ6IHN0cmluZywgbWF4U2l6ZTogbnVtYmVyID0gNjQgKiAxMDI0KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIC8vIFNpemUgdmFsaWRhdGlvblxuICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPiBtYXhTaXplKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignWUFNTCBjb250ZW50IGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIHNpemUnLCAnbWVkaXVtJyk7XG4gICAgfVxuXG4gICAgLy8gRml4ICM5MDg6IFlBTUwgYm9tYiBkZXRlY3Rpb24g4oCUIHByZXZpb3VzbHkgc2tpcHBlZCwgYWxsb3dpbmcgYm9tYiBwYXlsb2Fkc1xuICAgIC8vIHRocm91Z2ggTUNQLUFRTCBjcmVhdGUgZGlzcGF0Y2hlciBhbmQgd2ViIHJvdXRlcyB0aGF0IHVzZSBwYXJzZVJhd1lhbWwoKS5cbiAgICBpZiAoIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwnLFxuICAgICAgICBkZXRhaWxzOiAnTWFsaWNpb3VzIFlBTUwgcGF0dGVybiBkZXRlY3RlZCBpbiByYXcgWUFNTCBjb250ZW50J1xuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignTWFsaWNpb3VzIFlBTUwgY29udGVudCBkZXRlY3RlZCcsICdjcml0aWNhbCcpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIHdpdGggc2FmZSBzY2hlbWFcbiAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQsIHtcbiAgICAgIHNjaGVtYTogdGhpcy5TQUZFX1NDSEVNQSwgIC8vIENPUkVfU0NIRU1BIC0gc2FmZSBiYXNpYyB0eXBlcyBvbmx5XG4gICAgICBqc29uOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIHJlc3VsdCBpcyBhbiBvYmplY3RcbiAgICBpZiAodHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgcGFyc2VkID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignWUFNTCBjb250ZW50IG11c3QgcGFyc2UgdG8gYW4gb2JqZWN0JywgJ21lZGl1bScpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cbn1cbiJdfQ==
|
|
@@ -22,9 +22,10 @@ export declare class SecurityMonitor {
|
|
|
22
22
|
private static eventCount;
|
|
23
23
|
private static events;
|
|
24
24
|
private static logListener?;
|
|
25
|
+
private static readonly dedup;
|
|
25
26
|
static addLogListener(fn: (entry: SecurityLogEntry) => void): () => void;
|
|
26
27
|
/**
|
|
27
|
-
* Logs a security event
|
|
28
|
+
* Logs a security event, suppressing repeated identical events within the dedup window.
|
|
28
29
|
*/
|
|
29
30
|
static logSecurityEvent(event: SecurityEvent): void;
|
|
30
31
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityMonitor.d.ts","sourceRoot":"","sources":["../../src/security/securityMonitor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"securityMonitor.d.ts","sourceRoot":"","sources":["../../src/security/securityMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,18 +6,28 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { logger } from '../utils/logger.js';
|
|
8
8
|
import { EvictingQueue } from '../utils/EvictingQueue.js';
|
|
9
|
+
import { EventDeduplicator } from '../utils/EventDeduplicator.js';
|
|
10
|
+
/** Deduplication window: suppress identical events within this period */
|
|
11
|
+
const DEDUP_WINDOW_MS = 60_000;
|
|
12
|
+
/** Maximum dedup cache entries before LRU eviction */
|
|
13
|
+
const DEDUP_MAX_SIZE = 500;
|
|
9
14
|
export class SecurityMonitor {
|
|
10
15
|
static eventCount = 0;
|
|
11
16
|
static events = new EvictingQueue(1000);
|
|
12
17
|
static logListener;
|
|
18
|
+
static dedup = new EventDeduplicator(DEDUP_WINDOW_MS, DEDUP_MAX_SIZE);
|
|
13
19
|
static addLogListener(fn) {
|
|
14
20
|
this.logListener = fn;
|
|
15
21
|
return () => { this.logListener = undefined; };
|
|
16
22
|
}
|
|
17
23
|
/**
|
|
18
|
-
* Logs a security event
|
|
24
|
+
* Logs a security event, suppressing repeated identical events within the dedup window.
|
|
19
25
|
*/
|
|
20
26
|
static logSecurityEvent(event) {
|
|
27
|
+
// Deduplicate: same type + source + details within 60s window = suppress
|
|
28
|
+
if (this.dedup.shouldSuppress(`${event.type}\0${event.source}\0${event.details}`)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
21
31
|
const logEntry = {
|
|
22
32
|
...event,
|
|
23
33
|
timestamp: new Date().toISOString(),
|
|
@@ -44,7 +54,7 @@ export class SecurityMonitor {
|
|
|
44
54
|
// - Security Information and Event Management (SIEM) systems
|
|
45
55
|
// Log critical security alerts with structured data
|
|
46
56
|
// DO NOT use console.error in MCP servers as it breaks the JSON-RPC protocol
|
|
47
|
-
logger.error('
|
|
57
|
+
logger.error('[CRITICAL SECURITY ALERT]', {
|
|
48
58
|
type: event.type,
|
|
49
59
|
details: event.details,
|
|
50
60
|
timestamp: event.timestamp,
|
|
@@ -113,6 +123,7 @@ export class SecurityMonitor {
|
|
|
113
123
|
static clearAllEventsForTesting() {
|
|
114
124
|
this.events.clear();
|
|
115
125
|
this.eventCount = 0;
|
|
126
|
+
this.dedup.clear();
|
|
116
127
|
}
|
|
117
128
|
}
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHlNb25pdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUEyRDFELE1BQU0sT0FBTyxlQUFlO0lBQ2xCLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQW1CLElBQUksQ0FBQyxDQUFDO0lBQzFELE1BQU0sQ0FBQyxXQUFXLENBQXFDO0lBRS9ELE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBcUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsT0FBTyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBb0I7UUFDMUMsTUFBTSxRQUFRLEdBQXFCO1lBQ2pDLEdBQUcsS0FBSztZQUNSLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNuQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1NBQzdDLENBQUM7UUFFRix5REFBeUQ7UUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdCLHNGQUFzRjtRQUN0RixvRUFBb0U7UUFDcEUsbURBQW1EO1FBRW5ELElBQUksS0FBSyxDQUFD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RSxDQUFDLE1BQU0sQ0FDNUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLGVBQWUsQ0FDNUMsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLHdCQUF3QjtRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyaXR5IE1vbml0b3IgZm9yIERvbGxob3VzZU1DUFxuICogXG4gKiBDZW50cmFsaXplZCBzZWN1cml0eSBldmVudCBsb2dnaW5nIGFuZCBtb25pdG9yaW5nIHN5c3RlbVxuICogZm9yIHRyYWNraW5nIGFuZCBhbGVydGluZyBvbiBzZWN1cml0eS1yZWxhdGVkIGV2ZW50cy5cbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRXZpY3RpbmdRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0V2aWN0aW5nUXVldWUuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5RXZlbnQge1xuICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcgfCAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcgfCAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcgfFxuICAgICAgICAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyB8ICdVUERBVEVfU0VDVVJJVFlfVklPTEFUSU9OJyB8ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyB8XG4gICAgICAgICdZQU1MX1BBUlNJTkdfV0FSTklORycgfCAnWUFNTF9QQVJTRV9TVUNDRVNTJyB8ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnIHxcbiAgICAgICAgJ1BBVEhfVkFMSURBVElPTl9TVUNDRVNTJyB8ICdSQVRFX0xJTUlUX1dBUk5JTkcnIHwgJ1RPS0VOX0NBQ0hFX0NMRUFSRUQnIHxcbiAgICAgICAgJ1lBTUxfVU5JQ09ERV9BVFRBQ0snIHwgJ1VOSUNPREVfRElSRUNUSU9OX09WRVJSSURFJyB8ICdVTklDT0RFX01JWEVEX1NDUklQVCcgfFxuICAgICAgICAnVU5JQ09ERV9WQUxJREFUSU9OX0VSUk9SJyB8ICdDT05URU5UX1NJWkVfRVhDRUVERUQnIHwgJ0lOQ0xVREVfREVQVEhfRVhDRUVERUQnIHxcbiAgICAgICAgJ1RFTVBMQVRFX1JFTkRFUkVEJyB8ICdURU1QTEFURV9JTkNMVURFJyB8ICdURU1QTEFURV9MT0FERUQnIHwgJ1RFTVBMQVRFX1NBVkVEJyB8XG4gICAgICAgICdURU1QTEFURV9ERUxFVEVEJyB8ICdNRU1PUllfQ1JFQVRFRCcgfCAnTUVNT1JZX0FEREVEJyB8ICdNRU1PUllfU0VBUkNIRUQnIHxcbiAgICAgICAgJ1NFTlNJVElWRV9NRU1PUllfREVMRVRFRCcgfCAnUkVURU5USU9OX1BPTElDWV9FTkZPUkNFRCcgfCAnTUVNT1JZX0NMRUFSRUQnIHxcbiAgICAgICAgJ01FTU9SWV9MT0FERUQnIHwgJ01FTU9SWV9TQVZFRCcgfCAnTUVNT1JZX0RFTEVURUQnIHwgJ01FTU9SWV9MT0FEX0ZBSUxFRCcgfFxuICAgICAgICAnTUVNT1JZX1NBVkVfRkFJTEVEJyB8ICdNRU1PUllfTElTVF9JVEVNX0ZBSUxFRCcgfCAnTUVNT1JZX0lNUE9SVF9GQUlMRUQnIHxcbiAgICAgICAgJ01FTU9SWV9ERVNFUklBTElaRV9GQUlMRUQnIHwgJ01FTU9SWV9JTlRFR1JJVFlfVklPTEFUSU9OJyB8ICdNRU1PUllfVU5JQ09ERV9WQUxJREFUSU9OX0ZBSUxFRCcgfFxuICAgICAgICAnTUVNT1JZX0RVUExJQ0FURV9ERVRFQ1RFRCcgfCAnU0VFRF9NRU1PUllfSU5TVEFMTEVEJyB8ICdTRUVEX01FTU9SWV9JTlNUQUxMQVRJT05fRkFJTEVEJyB8XG4gICAgICAgICdFTEVNRU5UX0NSRUFURUQnIHwgJ0VMRU1FTlRfTE9BREVEJyB8ICdFTEVNRU5UX0VESVRFRCcgfCAnRUxFTUVOVF9BQ1RJVkFURUQnIHwgJ0VMRU1FTlRfREVBQ1RJVkFURUQnIHxcbiAgICAgICAgJ0VMRU1FTlRfVkFMSURBVEVEJyB8ICdFTEVNRU5UX0RFTEVURUQnIHxcbiAgICAgICAgJ0FHRU5UX0FDVElWQVRFRCcgfCAnQUdFTlRfQUNUSVZBVElPTl9GQUlMRUQnIHwgJ0FHRU5UX0FDVElWQVRJT05fUk9MTEJBQ0snIHxcbiAgICAgICAgJ0FHRU5UX0RFQUNUSVZBVEVEJyB8ICdBR0VOVF9FWEVDVVRFRCcgfFxuICAgICAgICAnQ09ORklHX1VQREFURUQnIHwgJ0lERU5USVRZX0NIQU5HRUQnIHxcbiAgICAgICAgJ09QRVJBVElPTl9DT01QTEVURUQnIHwgJ09QRVJBVElPTl9GQUlMRUQnIHwgJ0JBVENIX0NPTVBMRVRFRCcgfCAnQkFUQ0hfUkVKRUNURUQnIHxcbiAgICAgICAgJ0NPTkZJUk1BVElPTl9SRUNPUkRFRCcgfCAnR0FURUtFRVBFUl9ERUNJU0lPTicgfFxuICAgICAgICAnQVVUSF9GTE9XX0lOSVRJQVRFRCcgfFxuICAgICAgICAnQUdFTlRfREVDSVNJT04nIHxcbiAgICAgICAgJ1JVTEVfRU5HSU5FX0NPTkZJR19VUERBVEUnIHwgJ1JVTEVfRU5HSU5FX0NPTkZJR19WQUxJREFUSU9OX0VSUk9SJyB8XG4gICAgICAgICdHT0FMX1RFTVBMQVRFX0FQUExJRUQnIHwgJ0dPQUxfVEVNUExBVEVfVkFMSURBVElPTicgfFxuICAgICAgICAnRU5TRU1CTEVfQ0lSQ1VMQVJfREVQRU5ERU5DWScgfCAnRU5TRU1CTEVfUkVTT1VSQ0VfTElNSVRfRVhDRUVERUQnIHxcbiAgICAgICAgJ0VOU0VNQkxFX0FDVElWQVRJT05fVElNRU9VVCcgfCAnRU5TRU1CTEVfQUNUSVZBVElPTl9GQUlMRUQnIHwgJ0VOU0VNQkxFX1NVU1BJQ0lPVVNfQ09ORElUSU9OJyB8XG4gICAgICAgICdFTlNFTUJMRV9DT05ESVRJT05fRVZBTFVBVElPTl9GQUlMRUQnIHxcbiAgICAgICAgJ0VOU0VNQkxFX05FU1RFRF9ERVBUSF9FWENFRURFRCcgfCAnRU5TRU1CTEVfQ09OVEVYVF9TSVpFX0VYQ0VFREVEJyB8XG4gICAgICAgICdFTlNFTUJMRV9DT05URVhUX1ZBTFVFX1RPT19MQVJHRScgfCAnRU5TRU1CTEVfU0FWRUQnIHwgJ0VOU0VNQkxFX0lNUE9SVEVEJyB8ICdFTlNFTUJMRV9ERUxFVEVEJyB8XG4gICAgICAgICdQT1JURk9MSU9fSU5JVElBTElaQVRJT04nIHwgJ1BPUlRGT0xJT19QT1BVTEFURUQnIHwgJ0ZJTEVfQ09QSUVEJyB8ICdESVJFQ1RPUllfTUlHUkFUSU9OJyB8XG4gICAgICAgICdQT1JURk9MSU9fQ0FDSEVfSU5WQUxJREFUSU9OJyB8ICdQT1JURk9MSU9fRkVUQ0hfU1VDQ0VTUycgfCAnVEVTVF9EQVRBX0JMT0NLRUQnIHxcbiAgICAgICAgJ1RFU1RfUEFUSF9TRUNVUklUWV9SSVNLJyB8ICdURVNUX1BST0RVQ1RJT05fQUNDRVNTX0JMT0NLRUQnIHwgJ1RFU1RfUEFUSF9JTlZBTElEJyB8XG4gICAgICAgICdURVNUX0VOVklST05NRU5UX1BST0RVQ1RJT05fUEFUSCcgfCAnVEVTVF9FTlZJUk9OTUVOVF9ERVBSRUNBVEVEX1ZBUicgfCAnVE9PTF9DQUNIRV9JTlZBTElEQVRFRCcgfFxuICAgICAgICAnRklMRV9SRUFEJyB8ICdGSUxFX1dSSVRURU4nIHwgJ0ZJTEVfREVMRVRFRCcgfFxuICAgICAgICAnREFOR0VSX1pPTkVfVFJJR0dFUkVEJyB8ICdEQU5HRVJfWk9ORV9PUEVSQVRJT04nIHxcbiAgICAgICAgJ0FVVE9OT01ZX0RFTklFRCcgfCAnQVVUT05PTVlfUEFVU0VEJyB8ICdTQUZFVFlfRVZBTFVBVElPTl9GQUlMVVJFJyB8XG4gICAgICAgICdWRVJJRklDQVRJT05fQVRURU1QVEVEJyB8ICdWRVJJRklDQVRJT05fU1VDQ0VFREVEJyB8XG4gICAgICAgICdWRVJJRklDQVRJT05fRkFJTEVEJyB8ICdWRVJJRklDQVRJT05fRVhQSVJFRCcgfFxuICAgICAgICAnQUdFTlRfQVVUT19DT05USU5VRUQnIHwgJ0FHRU5UX1NURVBfUkVUUklFRCcgfFxuICAgICAgICAnQUdFTlRfQVVUT19SRVNUQVJURUQnIHwgJ0FHRU5UX1JFU0lMSUVOQ0VfTElNSVRfUkVBQ0hFRCcgfFxuICAgICAgICAnUEVSTUlTU0lPTl9QUk9NUFRfREVOSUVEJyB8XG4gICAgICAgICdDTElfQVBQUk9WQUxfUkVRVUVTVEVEJyB8ICdDTElfQVBQUk9WQUxfR1JBTlRFRCcgfCAnQ0xJX0FQUFJPVkFMX0NPTlNVTUVEJztcbiAgc2V2ZXJpdHk6ICdMT1cnIHwgJ01FRElVTScgfCAnSElHSCcgfCAnQ1JJVElDQUwnO1xuICBzb3VyY2U6IHN0cmluZztcbiAgZGV0YWlsczogc3RyaW5nO1xuICB1c2VyQWdlbnQ/OiBzdHJpbmc7XG4gIGlwPzogc3RyaW5nO1xuICBhZGRpdGlvbmFsRGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eUxvZ0VudHJ5IGV4dGVuZHMgU2VjdXJpdHlFdmVudCB7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlNb25pdG9yIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZXZlbnRDb3VudCA9IDA7XG4gIHByaXZhdGUgc3RhdGljIGV2ZW50cyA9IG5ldyBFdmljdGluZ1F1ZXVlPFNlY3VyaXR5TG9nRW50cnk+KDEwMDApO1xuICBwcml2YXRlIHN0YXRpYyBsb2dMaXN0ZW5lcj86IChlbnRyeTogU2VjdXJpdHlMb2dFbnRyeSkgPT4gdm9pZDtcblxuICBzdGF0aWMgYWRkTG9nTGlzdGVuZXIoZm46IChlbnRyeTogU2VjdXJpdHlMb2dFbnRyeSkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubG9nTGlzdGVuZXIgPSBmbjtcbiAgICByZXR1cm4gKCkgPT4geyB0aGlzLmxvZ0xpc3RlbmVyID0gdW5kZWZpbmVkOyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgYSBzZWN1cml0eSBldmVudFxuICAgKi9cbiAgc3RhdGljIGxvZ1NlY3VyaXR5RXZlbnQoZXZlbnQ6IFNlY3VyaXR5RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBsb2dFbnRyeTogU2VjdXJpdHlMb2dFbnRyeSA9IHtcbiAgICAgIC4uLmV2ZW50LFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBpZDogYFNFQy0ke0RhdGUubm93KCl9LSR7Kyt0aGlzLmV2ZW50Q291bnR9YCxcbiAgICB9O1xuXG4gICAgLy8gQm91bmRlZCBGSUZPIGV2aWN0aW9uIOKAlCBFdmljdGluZ1F1ZXVlIGhhbmRsZXMgY2FwYWNpdHlcbiAgICB0aGlzLmV2ZW50cy5wdXNoKGxvZ0VudHJ5KTtcbiAgICB0aGlzLmxvZ0xpc3RlbmVyPy4obG9nRW50cnkpO1xuXG4gICAgLy8gSW4gTUNQIHNlcnZlcnMsIHdlIGNhbm5vdCB3cml0ZSB0byBzdGRlcnIvc3Rkb3V0IGFzIGl0IGJyZWFrcyB0aGUgSlNPTi1SUEMgcHJvdG9jb2xcbiAgICAvLyBTZWN1cml0eSBldmVudHMgYXJlIHN0b3JlZCBpbiBtZW1vcnkgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdmlhIEFQSVxuICAgIC8vIE9ubHkgc2VuZCBjcml0aWNhbCBhbGVydHMgdmlhIHRoZSBwcm9wZXIgY2hhbm5lbFxuICAgIFxuICAgIGlmIChldmVudC5zZXZlcml0eSA9PT0gJ0NSSVRJQ0FMJykge1xuICAgICAgdGhpcy5zZW5kU2VjdXJpdHlBbGVydChsb2dFbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIHNlY3VyaXR5IGFsZXJ0cyBmb3IgY3JpdGljYWwgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBzZW5kU2VjdXJpdHlBbGVydChldmVudDogU2VjdXJpdHlMb2dFbnRyeSk6IHZvaWQge1xuICAgIC8vIEluIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudCwgdGhpcyB3b3VsZCBpbnRlZ3JhdGUgd2l0aDpcbiAgICAvLyAtIFNsYWNrIHdlYmhvb2tzXG4gICAgLy8gLSBFbWFpbCBhbGVydHNcbiAgICAvLyAtIFBhZ2VyRHV0eVxuICAgIC8vIC0gU2VjdXJpdHkgSW5mb3JtYXRpb24gYW5kIEV2ZW50IE1hbmFnZW1lbnQgKFNJRU0pIHN5c3RlbXNcbiAgICBcbiAgICAvLyBMb2cgY3JpdGljYWwgc2VjdXJpdHkgYWxlcnRzIHdpdGggc3RydWN0dXJlZCBkYXRhXG4gICAgLy8gRE8gTk9UIHVzZSBjb25zb2xlLmVycm9yIGluIE1DUCBzZXJ2ZXJzIGFzIGl0IGJyZWFrcyB0aGUgSlNPTi1SUEMgcHJvdG9jb2xcbiAgICBsb2dnZXIuZXJyb3IoJ/CfmqggQ1JJVElDQUwgU0VDVVJJVFkgQUxFUlQg8J+aqCcsIHtcbiAgICAgIHR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICBkZXRhaWxzOiBldmVudC5kZXRhaWxzLFxuICAgICAgdGltZXN0YW1wOiBldmVudC50aW1lc3RhbXAsXG4gICAgICBpZDogZXZlbnQuaWRcbiAgICB9KTtcbiAgICBcbiAgICAvLyBJZiBpbiBwcm9kdWN0aW9uIG1vZGUgd2l0aCBwcm9wZXIgY29uZmlnLCBzZW5kIGFjdHVhbCBhbGVydHNcbiAgICBpZiAocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1NFQ1VSSVRZX0FMRVJUUyA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgYWN0dWFsIGFsZXJ0IG1lY2hhbmlzbXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyByZWNlbnQgc2VjdXJpdHkgZXZlbnRzIGZvciBhbmFseXNpc1xuICAgKi9cbiAgc3RhdGljIGdldFJlY2VudEV2ZW50cyhjb3VudDogbnVtYmVyID0gMTAwKTogU2VjdXJpdHlMb2dFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMudG9BcnJheSgpLnNsaWNlKC1jb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBldmVudHMgYnkgc2V2ZXJpdHlcbiAgICovXG4gIHN0YXRpYyBnZXRFdmVudHNCeVNldmVyaXR5KHNldmVyaXR5OiBTZWN1cml0eUV2ZW50WydzZXZlcml0eSddKTogU2VjdXJpdHlMb2dFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMudG9BcnJheSgpLmZpbHRlcihldmVudCA9PiBldmVudC5zZXZlcml0eSA9PT0gc2V2ZXJpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZXZlbnRzIGJ5IHR5cGVcbiAgICovXG4gIHN0YXRpYyBnZXRFdmVudHNCeVR5cGUodHlwZTogU2VjdXJpdHlFdmVudFsndHlwZSddKTogU2VjdXJpdHlMb2dFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMudG9BcnJheSgpLmZpbHRlcihldmVudCA9PiBldmVudC50eXBlID09PSB0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBzZWN1cml0eSByZXBvcnRcbiAgICovXG4gIHN0YXRpYyBnZW5lcmF0ZVNlY3VyaXR5UmVwb3J0KCk6IHtcbiAgICB0b3RhbEV2ZW50czogbnVtYmVyO1xuICAgIGV2ZW50c0J5U2V2ZXJpdHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgZXZlbnRzQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgIHJlY2VudENyaXRpY2FsRXZlbnRzOiBTZWN1cml0eUxvZ0VudHJ5W107XG4gIH0ge1xuICAgIGNvbnN0IGV2ZW50c0J5U2V2ZXJpdHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICAgICBDUklUSUNBTDogMCxcbiAgICAgIEhJR0g6IDAsXG4gICAgICBNRURJVU06IDAsXG4gICAgICBMT1c6IDAsXG4gICAgfTtcblxuICAgIGNvbnN0IGV2ZW50c0J5VHlwZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmV2ZW50cy50b0FycmF5KCkpIHtcbiAgICAgIGV2ZW50c0J5U2V2ZXJpdHlbZXZlbnQuc2V2ZXJpdHldKys7XG4gICAgICBldmVudHNCeVR5cGVbZXZlbnQudHlwZV0gPSAoZXZlbnRzQnlUeXBlW2V2ZW50LnR5cGVdIHx8IDApICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxFdmVudHM6IHRoaXMuZXZlbnRzLnNpemUsXG4gICAgICBldmVudHNCeVNldmVyaXR5LFxuICAgICAgZXZlbnRzQnlUeXBlLFxuICAgICAgcmVjZW50Q3JpdGljYWxFdmVudHM6IHRoaXMuZ2V0RXZlbnRzQnlTZXZlcml0eSgnQ1JJVElDQUwnKS5zbGljZSgtMTApLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIG9sZCBldmVudHMgKGZvciBtZW1vcnkgbWFuYWdlbWVudClcbiAgICovXG4gIHN0YXRpYyBjbGVhck9sZEV2ZW50cyhkYXlzVG9LZWVwOiBudW1iZXIgPSA3KTogdm9pZCB7XG4gICAgY29uc3QgY3V0b2ZmRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY3V0b2ZmRGF0ZS5zZXREYXRlKGN1dG9mZkRhdGUuZ2V0RGF0ZSgpIC0gZGF5c1RvS2VlcCk7XG4gICAgY29uc3QgY3V0b2ZmVGltZXN0YW1wID0gY3V0b2ZmRGF0ZS50b0lTT1N0cmluZygpO1xuXG4gICAgY29uc3QgcmVtYWluaW5nID0gdGhpcy5ldmVudHMudG9BcnJheSgpLmZpbHRlcihcbiAgICAgIGV2ZW50ID0+IGV2ZW50LnRpbWVzdGFtcCA+PSBjdXRvZmZUaW1lc3RhbXBcbiAgICApO1xuICAgIHRoaXMuZXZlbnRzLnJlc2V0KFsuLi5yZW1haW5pbmddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBURVNUSU5HIE9OTFk6IENsZWFycyBhbGwgZXZlbnRzIGFuZCByZXNldHMgY291bnRlclxuICAgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGVzdCBjbGVhbnVwIChhZnRlckVhY2gvYWZ0ZXJBbGwpXG4gICAqIHRvIHByZXZlbnQgdGVzdCBwb2xsdXRpb24gZnJvbSBhY2N1bXVsYXRlZCBzZWN1cml0eSBldmVudHNcbiAgICovXG4gIHN0YXRpYyBjbGVhckFsbEV2ZW50c0ZvclRlc3RpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudHMuY2xlYXIoKTtcbiAgICB0aGlzLmV2ZW50Q291bnQgPSAwO1xuICB9XG59XG4iXX0=
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHlNb25pdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUEyRGxFLHlFQUF5RTtBQUN6RSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUM7QUFFL0Isc0RBQXNEO0FBQ3RELE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUUzQixNQUFNLE9BQU8sZUFBZTtJQUNsQixNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUN0QixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksYUFBYSxDQUFtQixJQUFJLENBQUMsQ0FBQztJQUMxRCxNQUFNLENBQUMsV0FBVyxDQUFxQztJQUN2RCxNQUFNLENBQVUsS0FBSyxHQUFHLElBQUksaUJBQWlCLENBQUMsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRXZGLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBcUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsT0FBTyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBb0I7UUFDMUMseUVBQXlFO1FBQ3pFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNsRixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFxQjtZQUNqQyxHQUFHLEtBQUs7WUFDUixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDbkMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtTQUM3QyxDQUFDO1FBRUYseURBQXlEO1FBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU3QixzRkFBc0Y7UUFDdEYsb0VBQW9FO1FBQ3BFLG1EQUFtRDtRQUVuRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBdUI7UUFDdEQsMERBQTBEO1FBQzFELG1CQUFtQjtRQUNuQixpQkFBaUI7UUFDakIsY0FBYztRQUNkLDZEQUE2RDtRQUU3RCxvREFBb0Q7UUFDcEQsNkVBQTZFO1FBQzdFLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUU7WUFDeEMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7WUFDMUIsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO1NBQ2IsQ0FBQyxDQUFDO1FBRUgsK0RBQStEO1FBQy9ELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNyRCwwQ0FBMEM7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBZ0IsR0FBRztRQUN4QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQW1DO1FBQzVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBMkI7UUFDaEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQjtRQU0zQixNQUFNLGdCQUFnQixHQUEyQjtZQUMvQyxRQUFRLEVBQUUsQ0FBQztZQUNYLElBQUksRUFBRSxDQUFDO1lBQ1AsTUFBTSxFQUFFLENBQUM7WUFDVCxHQUFHLEVBQUUsQ0FBQztTQUNQLENBQUM7UUFFRixNQUFNLFlBQVksR0FBMkIsRUFBRSxDQUFDO1FBRWhELEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ25DLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsT0FBTztZQUNMLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7WUFDN0IsZ0JBQWdCO1lBQ2hCLFlBQVk7WUFDWixvQkFBb0IsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3RFLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLGFBQXFCLENBQUM7UUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUM5QixVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUN0RCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQzVDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxlQUFlLENBQzVDLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyx3QkFBd0I7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlY3VyaXR5IE1vbml0b3IgZm9yIERvbGxob3VzZU1DUFxuICogXG4gKiBDZW50cmFsaXplZCBzZWN1cml0eSBldmVudCBsb2dnaW5nIGFuZCBtb25pdG9yaW5nIHN5c3RlbVxuICogZm9yIHRyYWNraW5nIGFuZCBhbGVydGluZyBvbiBzZWN1cml0eS1yZWxhdGVkIGV2ZW50cy5cbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRXZpY3RpbmdRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0V2aWN0aW5nUXVldWUuanMnO1xuaW1wb3J0IHsgRXZlbnREZWR1cGxpY2F0b3IgfSBmcm9tICcuLi91dGlscy9FdmVudERlZHVwbGljYXRvci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlFdmVudCB7XG4gIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyB8ICdZQU1MX0lOSkVDVElPTl9BVFRFTVBUJyB8ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyB8XG4gICAgICAgICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnIHwgJ1VQREFURV9TRUNVUklUWV9WSU9MQVRJT04nIHwgJ1JBVEVfTElNSVRfRVhDRUVERUQnIHxcbiAgICAgICAgJ1lBTUxfUEFSU0lOR19XQVJOSU5HJyB8ICdZQU1MX1BBUlNFX1NVQ0NFU1MnIHwgJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycgfFxuICAgICAgICAnUEFUSF9WQUxJREFUSU9OX1NVQ0NFU1MnIHwgJ1JBVEVfTElNSVRfV0FSTklORycgfCAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcgfFxuICAgICAgICAnWUFNTF9VTklDT0RFX0FUVEFDSycgfCAnVU5JQ09ERV9ESVJFQ1RJT05fT1ZFUlJJREUnIHwgJ1VOSUNPREVfTUlYRURfU0NSSVBUJyB8XG4gICAgICAgICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InIHwgJ0NPTlRFTlRfU0laRV9FWENFRURFRCcgfCAnSU5DTFVERV9ERVBUSF9FWENFRURFRCcgfFxuICAgICAgICAnVEVNUExBVEVfUkVOREVSRUQnIHwgJ1RFTVBMQVRFX0lOQ0xVREUnIHwgJ1RFTVBMQVRFX0xPQURFRCcgfCAnVEVNUExBVEVfU0FWRUQnIHxcbiAgICAgICAgJ1RFTVBMQVRFX0RFTEVURUQnIHwgJ01FTU9SWV9DUkVBVEVEJyB8ICdNRU1PUllfQURERUQnIHwgJ01FTU9SWV9TRUFSQ0hFRCcgfFxuICAgICAgICAnU0VOU0lUSVZFX01FTU9SWV9ERUxFVEVEJyB8ICdSRVRFTlRJT05fUE9MSUNZX0VORk9SQ0VEJyB8ICdNRU1PUllfQ0xFQVJFRCcgfFxuICAgICAgICAnTUVNT1JZX0xPQURFRCcgfCAnTUVNT1JZX1NBVkVEJyB8ICdNRU1PUllfREVMRVRFRCcgfCAnTUVNT1JZX0xPQURfRkFJTEVEJyB8XG4gICAgICAgICdNRU1PUllfU0FWRV9GQUlMRUQnIHwgJ01FTU9SWV9MSVNUX0lURU1fRkFJTEVEJyB8ICdNRU1PUllfSU1QT1JUX0ZBSUxFRCcgfFxuICAgICAgICAnTUVNT1JZX0RFU0VSSUFMSVpFX0ZBSUxFRCcgfCAnTUVNT1JZX0lOVEVHUklUWV9WSU9MQVRJT04nIHwgJ01FTU9SWV9VTklDT0RFX1ZBTElEQVRJT05fRkFJTEVEJyB8XG4gICAgICAgICdNRU1PUllfRFVQTElDQVRFX0RFVEVDVEVEJyB8ICdTRUVEX01FTU9SWV9JTlNUQUxMRUQnIHwgJ1NFRURfTUVNT1JZX0lOU1RBTExBVElPTl9GQUlMRUQnIHxcbiAgICAgICAgJ0VMRU1FTlRfQ1JFQVRFRCcgfCAnRUxFTUVOVF9MT0FERUQnIHwgJ0VMRU1FTlRfRURJVEVEJyB8ICdFTEVNRU5UX0FDVElWQVRFRCcgfCAnRUxFTUVOVF9ERUFDVElWQVRFRCcgfFxuICAgICAgICAnRUxFTUVOVF9WQUxJREFURUQnIHwgJ0VMRU1FTlRfREVMRVRFRCcgfFxuICAgICAgICAnQUdFTlRfQUNUSVZBVEVEJyB8ICdBR0VOVF9BQ1RJVkFUSU9OX0ZBSUxFRCcgfCAnQUdFTlRfQUNUSVZBVElPTl9ST0xMQkFDSycgfFxuICAgICAgICAnQUdFTlRfREVBQ1RJVkFURUQnIHwgJ0FHRU5UX0VYRUNVVEVEJyB8XG4gICAgICAgICdDT05GSUdfVVBEQVRFRCcgfCAnSURFTlRJVFlfQ0hBTkdFRCcgfFxuICAgICAgICAnT1BFUkFUSU9OX0NPTVBMRVRFRCcgfCAnT1BFUkFUSU9OX0ZBSUxFRCcgfCAnQkFUQ0hfQ09NUExFVEVEJyB8ICdCQVRDSF9SRUpFQ1RFRCcgfFxuICAgICAgICAnQ09ORklSTUFUSU9OX1JFQ09SREVEJyB8ICdHQVRFS0VFUEVSX0RFQ0lTSU9OJyB8XG4gICAgICAgICdBVVRIX0ZMT1dfSU5JVElBVEVEJyB8XG4gICAgICAgICdBR0VOVF9ERUNJU0lPTicgfFxuICAgICAgICAnUlVMRV9FTkdJTkVfQ09ORklHX1VQREFURScgfCAnUlVMRV9FTkdJTkVfQ09ORklHX1ZBTElEQVRJT05fRVJST1InIHxcbiAgICAgICAgJ0dPQUxfVEVNUExBVEVfQVBQTElFRCcgfCAnR09BTF9URU1QTEFURV9WQUxJREFUSU9OJyB8XG4gICAgICAgICdFTlNFTUJMRV9DSVJDVUxBUl9ERVBFTkRFTkNZJyB8ICdFTlNFTUJMRV9SRVNPVVJDRV9MSU1JVF9FWENFRURFRCcgfFxuICAgICAgICAnRU5TRU1CTEVfQUNUSVZBVElPTl9USU1FT1VUJyB8ICdFTlNFTUJMRV9BQ1RJVkFUSU9OX0ZBSUxFRCcgfCAnRU5TRU1CTEVfU1VTUElDSU9VU19DT05ESVRJT04nIHxcbiAgICAgICAgJ0VOU0VNQkxFX0NPTkRJVElPTl9FVkFMVUFUSU9OX0ZBSUxFRCcgfFxuICAgICAgICAnRU5TRU1CTEVfTkVTVEVEX0RFUFRIX0VYQ0VFREVEJyB8ICdFTlNFTUJMRV9DT05URVhUX1NJWkVfRVhDRUVERUQnIHxcbiAgICAgICAgJ0VOU0VNQkxFX0NPTlRFWFRfVkFMVUVfVE9PX0xBUkdFJyB8ICdFTlNFTUJMRV9TQVZFRCcgfCAnRU5TRU1CTEVfSU1QT1JURUQnIHwgJ0VOU0VNQkxFX0RFTEVURUQnIHxcbiAgICAgICAgJ1BPUlRGT0xJT19JTklUSUFMSVpBVElPTicgfCAnUE9SVEZPTElPX1BPUFVMQVRFRCcgfCAnRklMRV9DT1BJRUQnIHwgJ0RJUkVDVE9SWV9NSUdSQVRJT04nIHxcbiAgICAgICAgJ1BPUlRGT0xJT19DQUNIRV9JTlZBTElEQVRJT04nIHwgJ1BPUlRGT0xJT19GRVRDSF9TVUNDRVNTJyB8ICdURVNUX0RBVEFfQkxPQ0tFRCcgfFxuICAgICAgICAnVEVTVF9QQVRIX1NFQ1VSSVRZX1JJU0snIHwgJ1RFU1RfUFJPRFVDVElPTl9BQ0NFU1NfQkxPQ0tFRCcgfCAnVEVTVF9QQVRIX0lOVkFMSUQnIHxcbiAgICAgICAgJ1RFU1RfRU5WSVJPTk1FTlRfUFJPRFVDVElPTl9QQVRIJyB8ICdURVNUX0VOVklST05NRU5UX0RFUFJFQ0FURURfVkFSJyB8ICdUT09MX0NBQ0hFX0lOVkFMSURBVEVEJyB8XG4gICAgICAgICdGSUxFX1JFQUQnIHwgJ0ZJTEVfV1JJVFRFTicgfCAnRklMRV9ERUxFVEVEJyB8XG4gICAgICAgICdEQU5HRVJfWk9ORV9UUklHR0VSRUQnIHwgJ0RBTkdFUl9aT05FX09QRVJBVElPTicgfFxuICAgICAgICAnQVVUT05PTVlfREVOSUVEJyB8ICdBVVRPTk9NWV9QQVVTRUQnIHwgJ1NBRkVUWV9FVkFMVUFUSU9OX0ZBSUxVUkUnIHxcbiAgICAgICAgJ1ZFUklGSUNBVElPTl9BVFRFTVBURUQnIHwgJ1ZFUklGSUNBVElPTl9TVUNDRUVERUQnIHxcbiAgICAgICAgJ1ZFUklGSUNBVElPTl9GQUlMRUQnIHwgJ1ZFUklGSUNBVElPTl9FWFBJUkVEJyB8XG4gICAgICAgICdBR0VOVF9BVVRPX0NPTlRJTlVFRCcgfCAnQUdFTlRfU1RFUF9SRVRSSUVEJyB8XG4gICAgICAgICdBR0VOVF9BVVRPX1JFU1RBUlRFRCcgfCAnQUdFTlRfUkVTSUxJRU5DRV9MSU1JVF9SRUFDSEVEJyB8XG4gICAgICAgICdQRVJNSVNTSU9OX1BST01QVF9ERU5JRUQnIHxcbiAgICAgICAgJ0NMSV9BUFBST1ZBTF9SRVFVRVNURUQnIHwgJ0NMSV9BUFBST1ZBTF9HUkFOVEVEJyB8ICdDTElfQVBQUk9WQUxfQ09OU1VNRUQnO1xuICBzZXZlcml0eTogJ0xPVycgfCAnTUVESVVNJyB8ICdISUdIJyB8ICdDUklUSUNBTCc7XG4gIHNvdXJjZTogc3RyaW5nO1xuICBkZXRhaWxzOiBzdHJpbmc7XG4gIHVzZXJBZ2VudD86IHN0cmluZztcbiAgaXA/OiBzdHJpbmc7XG4gIGFkZGl0aW9uYWxEYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5TG9nRW50cnkgZXh0ZW5kcyBTZWN1cml0eUV2ZW50IHtcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG59XG5cbi8qKiBEZWR1cGxpY2F0aW9uIHdpbmRvdzogc3VwcHJlc3MgaWRlbnRpY2FsIGV2ZW50cyB3aXRoaW4gdGhpcyBwZXJpb2QgKi9cbmNvbnN0IERFRFVQX1dJTkRPV19NUyA9IDYwXzAwMDtcblxuLyoqIE1heGltdW0gZGVkdXAgY2FjaGUgZW50cmllcyBiZWZvcmUgTFJVIGV2aWN0aW9uICovXG5jb25zdCBERURVUF9NQVhfU0laRSA9IDUwMDtcblxuZXhwb3J0IGNsYXNzIFNlY3VyaXR5TW9uaXRvciB7XG4gIHByaXZhdGUgc3RhdGljIGV2ZW50Q291bnQgPSAwO1xuICBwcml2YXRlIHN0YXRpYyBldmVudHMgPSBuZXcgRXZpY3RpbmdRdWV1ZTxTZWN1cml0eUxvZ0VudHJ5PigxMDAwKTtcbiAgcHJpdmF0ZSBzdGF0aWMgbG9nTGlzdGVuZXI/OiAoZW50cnk6IFNlY3VyaXR5TG9nRW50cnkpID0+IHZvaWQ7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGRlZHVwID0gbmV3IEV2ZW50RGVkdXBsaWNhdG9yKERFRFVQX1dJTkRPV19NUywgREVEVVBfTUFYX1NJWkUpO1xuXG4gIHN0YXRpYyBhZGRMb2dMaXN0ZW5lcihmbjogKGVudHJ5OiBTZWN1cml0eUxvZ0VudHJ5KSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5sb2dMaXN0ZW5lciA9IGZuO1xuICAgIHJldHVybiAoKSA9PiB7IHRoaXMubG9nTGlzdGVuZXIgPSB1bmRlZmluZWQ7IH07XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBhIHNlY3VyaXR5IGV2ZW50LCBzdXBwcmVzc2luZyByZXBlYXRlZCBpZGVudGljYWwgZXZlbnRzIHdpdGhpbiB0aGUgZGVkdXAgd2luZG93LlxuICAgKi9cbiAgc3RhdGljIGxvZ1NlY3VyaXR5RXZlbnQoZXZlbnQ6IFNlY3VyaXR5RXZlbnQpOiB2b2lkIHtcbiAgICAvLyBEZWR1cGxpY2F0ZTogc2FtZSB0eXBlICsgc291cmNlICsgZGV0YWlscyB3aXRoaW4gNjBzIHdpbmRvdyA9IHN1cHByZXNzXG4gICAgaWYgKHRoaXMuZGVkdXAuc2hvdWxkU3VwcHJlc3MoYCR7ZXZlbnQudHlwZX1cXDAke2V2ZW50LnNvdXJjZX1cXDAke2V2ZW50LmRldGFpbHN9YCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dFbnRyeTogU2VjdXJpdHlMb2dFbnRyeSA9IHtcbiAgICAgIC4uLmV2ZW50LFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBpZDogYFNFQy0ke0RhdGUubm93KCl9LSR7Kyt0aGlzLmV2ZW50Q291bnR9YCxcbiAgICB9O1xuXG4gICAgLy8gQm91bmRlZCBGSUZPIGV2aWN0aW9uIOKAlCBFdmljdGluZ1F1ZXVlIGhhbmRsZXMgY2FwYWNpdHlcbiAgICB0aGlzLmV2ZW50cy5wdXNoKGxvZ0VudHJ5KTtcbiAgICB0aGlzLmxvZ0xpc3RlbmVyPy4obG9nRW50cnkpO1xuXG4gICAgLy8gSW4gTUNQIHNlcnZlcnMsIHdlIGNhbm5vdCB3cml0ZSB0byBzdGRlcnIvc3Rkb3V0IGFzIGl0IGJyZWFrcyB0aGUgSlNPTi1SUEMgcHJvdG9jb2xcbiAgICAvLyBTZWN1cml0eSBldmVudHMgYXJlIHN0b3JlZCBpbiBtZW1vcnkgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdmlhIEFQSVxuICAgIC8vIE9ubHkgc2VuZCBjcml0aWNhbCBhbGVydHMgdmlhIHRoZSBwcm9wZXIgY2hhbm5lbFxuXG4gICAgaWYgKGV2ZW50LnNldmVyaXR5ID09PSAnQ1JJVElDQUwnKSB7XG4gICAgICB0aGlzLnNlbmRTZWN1cml0eUFsZXJ0KGxvZ0VudHJ5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgc2VjdXJpdHkgYWxlcnRzIGZvciBjcml0aWNhbCBldmVudHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNlbmRTZWN1cml0eUFsZXJ0KGV2ZW50OiBTZWN1cml0eUxvZ0VudHJ5KTogdm9pZCB7XG4gICAgLy8gSW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50LCB0aGlzIHdvdWxkIGludGVncmF0ZSB3aXRoOlxuICAgIC8vIC0gU2xhY2sgd2ViaG9va3NcbiAgICAvLyAtIEVtYWlsIGFsZXJ0c1xuICAgIC8vIC0gUGFnZXJEdXR5XG4gICAgLy8gLSBTZWN1cml0eSBJbmZvcm1hdGlvbiBhbmQgRXZlbnQgTWFuYWdlbWVudCAoU0lFTSkgc3lzdGVtc1xuICAgIFxuICAgIC8vIExvZyBjcml0aWNhbCBzZWN1cml0eSBhbGVydHMgd2l0aCBzdHJ1Y3R1cmVkIGRhdGFcbiAgICAvLyBETyBOT1QgdXNlIGNvbnNvbGUuZXJyb3IgaW4gTUNQIHNlcnZlcnMgYXMgaXQgYnJlYWtzIHRoZSBKU09OLVJQQyBwcm90b2NvbFxuICAgIGxvZ2dlci5lcnJvcignW0NSSVRJQ0FMIFNFQ1VSSVRZIEFMRVJUXScsIHtcbiAgICAgIHR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICBkZXRhaWxzOiBldmVudC5kZXRhaWxzLFxuICAgICAgdGltZXN0YW1wOiBldmVudC50aW1lc3RhbXAsXG4gICAgICBpZDogZXZlbnQuaWRcbiAgICB9KTtcbiAgICBcbiAgICAvLyBJZiBpbiBwcm9kdWN0aW9uIG1vZGUgd2l0aCBwcm9wZXIgY29uZmlnLCBzZW5kIGFjdHVhbCBhbGVydHNcbiAgICBpZiAocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1NFQ1VSSVRZX0FMRVJUUyA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgYWN0dWFsIGFsZXJ0IG1lY2hhbmlzbXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyByZWNlbnQgc2VjdXJpdHkgZXZlbnRzIGZvciBhbmFseXNpc1xuICAgKi9cbiAgc3RhdGljIGdldFJlY2VudEV2ZW50cyhjb3VudDogbnVtYmVyID0gMTAwKTogU2VjdXJpdHlMb2dFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMudG9BcnJheSgpLnNsaWNlKC1jb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBldmVudHMgYnkgc2V2ZXJpdHlcbiAgICovXG4gIHN0YXRpYyBnZXRFdmVudHNCeVNldmVyaXR5KHNldmVyaXR5OiBTZWN1cml0eUV2ZW50WydzZXZlcml0eSddKTogU2VjdXJpdHlMb2dFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMudG9BcnJheSgpLmZpbHRlcihldmVudCA9PiBldmVudC5zZXZlcml0eSA9PT0gc2V2ZXJpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZXZlbnRzIGJ5IHR5cGVcbiAgICovXG4gIHN0YXRpYyBnZXRFdmVudHNCeVR5cGUodHlwZTogU2VjdXJpdHlFdmVudFsndHlwZSddKTogU2VjdXJpdHlMb2dFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMudG9BcnJheSgpLmZpbHRlcihldmVudCA9PiBldmVudC50eXBlID09PSB0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBzZWN1cml0eSByZXBvcnRcbiAgICovXG4gIHN0YXRpYyBnZW5lcmF0ZVNlY3VyaXR5UmVwb3J0KCk6IHtcbiAgICB0b3RhbEV2ZW50czogbnVtYmVyO1xuICAgIGV2ZW50c0J5U2V2ZXJpdHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgZXZlbnRzQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgIHJlY2VudENyaXRpY2FsRXZlbnRzOiBTZWN1cml0eUxvZ0VudHJ5W107XG4gIH0ge1xuICAgIGNvbnN0IGV2ZW50c0J5U2V2ZXJpdHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICAgICBDUklUSUNBTDogMCxcbiAgICAgIEhJR0g6IDAsXG4gICAgICBNRURJVU06IDAsXG4gICAgICBMT1c6IDAsXG4gICAgfTtcblxuICAgIGNvbnN0IGV2ZW50c0J5VHlwZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmV2ZW50cy50b0FycmF5KCkpIHtcbiAgICAgIGV2ZW50c0J5U2V2ZXJpdHlbZXZlbnQuc2V2ZXJpdHldKys7XG4gICAgICBldmVudHNCeVR5cGVbZXZlbnQudHlwZV0gPSAoZXZlbnRzQnlUeXBlW2V2ZW50LnR5cGVdIHx8IDApICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxFdmVudHM6IHRoaXMuZXZlbnRzLnNpemUsXG4gICAgICBldmVudHNCeVNldmVyaXR5LFxuICAgICAgZXZlbnRzQnlUeXBlLFxuICAgICAgcmVjZW50Q3JpdGljYWxFdmVudHM6IHRoaXMuZ2V0RXZlbnRzQnlTZXZlcml0eSgnQ1JJVElDQUwnKS5zbGljZSgtMTApLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIG9sZCBldmVudHMgKGZvciBtZW1vcnkgbWFuYWdlbWVudClcbiAgICovXG4gIHN0YXRpYyBjbGVhck9sZEV2ZW50cyhkYXlzVG9LZWVwOiBudW1iZXIgPSA3KTogdm9pZCB7XG4gICAgY29uc3QgY3V0b2ZmRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY3V0b2ZmRGF0ZS5zZXREYXRlKGN1dG9mZkRhdGUuZ2V0RGF0ZSgpIC0gZGF5c1RvS2VlcCk7XG4gICAgY29uc3QgY3V0b2ZmVGltZXN0YW1wID0gY3V0b2ZmRGF0ZS50b0lTT1N0cmluZygpO1xuXG4gICAgY29uc3QgcmVtYWluaW5nID0gdGhpcy5ldmVudHMudG9BcnJheSgpLmZpbHRlcihcbiAgICAgIGV2ZW50ID0+IGV2ZW50LnRpbWVzdGFtcCA+PSBjdXRvZmZUaW1lc3RhbXBcbiAgICApO1xuICAgIHRoaXMuZXZlbnRzLnJlc2V0KFsuLi5yZW1haW5pbmddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBURVNUSU5HIE9OTFk6IENsZWFycyBhbGwgZXZlbnRzIGFuZCByZXNldHMgY291bnRlclxuICAgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGVzdCBjbGVhbnVwIChhZnRlckVhY2gvYWZ0ZXJBbGwpXG4gICAqIHRvIHByZXZlbnQgdGVzdCBwb2xsdXRpb24gZnJvbSBhY2N1bXVsYXRlZCBzZWN1cml0eSBldmVudHNcbiAgICovXG4gIHN0YXRpYyBjbGVhckFsbEV2ZW50c0ZvclRlc3RpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudHMuY2xlYXIoKTtcbiAgICB0aGlzLmV2ZW50Q291bnQgPSAwO1xuICAgIHRoaXMuZGVkdXAuY2xlYXIoKTtcbiAgfVxufVxuIl19
|
|
@@ -18,6 +18,14 @@ export interface AttackVector {
|
|
|
18
18
|
severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
|
|
19
19
|
blockedPatterns: string[];
|
|
20
20
|
}
|
|
21
|
+
export interface DeduplicationStats {
|
|
22
|
+
/** Number of repeated events that were suppressed */
|
|
23
|
+
suppressedEvents: number;
|
|
24
|
+
/** Number of unique events that passed through */
|
|
25
|
+
uniqueEvents: number;
|
|
26
|
+
/** Current number of keys in the dedup cache */
|
|
27
|
+
cacheSize: number;
|
|
28
|
+
}
|
|
21
29
|
export interface SecurityMetrics {
|
|
22
30
|
totalBlockedAttempts: number;
|
|
23
31
|
uniqueAttackVectors: number;
|
|
@@ -27,6 +35,7 @@ export interface SecurityMetrics {
|
|
|
27
35
|
lowSeverityBlocked: number;
|
|
28
36
|
topAttackVectors: AttackVector[];
|
|
29
37
|
attacksPerHour: number[];
|
|
38
|
+
deduplication: DeduplicationStats;
|
|
30
39
|
lastUpdated: string;
|
|
31
40
|
}
|
|
32
41
|
export interface AttackTelemetryEntry {
|
|
@@ -49,6 +58,7 @@ export declare class SecurityTelemetry {
|
|
|
49
58
|
private readonly METRIC_WINDOW_HOURS;
|
|
50
59
|
private readonly attackVectorMap;
|
|
51
60
|
private logListener?;
|
|
61
|
+
private readonly logDedup;
|
|
52
62
|
addLogListener(fn: (entry: AttackTelemetryEntry) => void): () => void;
|
|
53
63
|
/**
|
|
54
64
|
* Create a new SecurityTelemetry instance
|
|
@@ -63,6 +73,12 @@ export declare class SecurityTelemetry {
|
|
|
63
73
|
* Get aggregated security metrics
|
|
64
74
|
*/
|
|
65
75
|
getMetrics(): SecurityMetrics;
|
|
76
|
+
/**
|
|
77
|
+
* Returns deduplication statistics for observability.
|
|
78
|
+
* Tracks how many repeated log listener calls were suppressed
|
|
79
|
+
* vs. how many unique events passed through.
|
|
80
|
+
*/
|
|
81
|
+
getDeduplicationStats(): DeduplicationStats;
|
|
66
82
|
/**
|
|
67
83
|
* Get attack patterns by type
|
|
68
84
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecurityTelemetry.d.ts","sourceRoot":"","sources":["../../../src/security/telemetry/SecurityTelemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"SecurityTelemetry.d.ts","sourceRoot":"","sources":["../../../src/security/telemetry/SecurityTelemetry.ts"],"names":[],"mappings":"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"}
|