@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.
Files changed (238) hide show
  1. package/CHANGELOG.md +52 -61
  2. package/README.github.md +2 -2
  3. package/README.md +2 -2
  4. package/README.md.backup +284 -224
  5. package/README.npm.md +2 -2
  6. package/dist/cache/LRUCache.d.ts +3 -0
  7. package/dist/cache/LRUCache.d.ts.map +1 -1
  8. package/dist/cache/LRUCache.js +36 -26
  9. package/dist/config/env.d.ts +14 -4
  10. package/dist/config/env.d.ts.map +1 -1
  11. package/dist/config/env.js +20 -6
  12. package/dist/di/Container.d.ts +21 -0
  13. package/dist/di/Container.d.ts.map +1 -1
  14. package/dist/di/Container.js +250 -53
  15. package/dist/elements/BaseElement.d.ts.map +1 -1
  16. package/dist/elements/BaseElement.js +5 -10
  17. package/dist/elements/base/BaseElementManager.d.ts +22 -0
  18. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  19. package/dist/elements/base/BaseElementManager.js +47 -7
  20. package/dist/elements/memories/Memory.d.ts +1 -0
  21. package/dist/elements/memories/Memory.d.ts.map +1 -1
  22. package/dist/elements/memories/Memory.js +12 -8
  23. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  24. package/dist/elements/memories/MemoryManager.js +23 -42
  25. package/dist/elements/memories/MemorySearchIndex.js +2 -2
  26. package/dist/generated/version.d.ts +2 -2
  27. package/dist/generated/version.d.ts.map +1 -1
  28. package/dist/generated/version.js +3 -3
  29. package/dist/handlers/EnhancedIndexHandler.js +6 -6
  30. package/dist/handlers/element-crud/listElements.d.ts +2 -0
  31. package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
  32. package/dist/handlers/element-crud/listElements.js +3 -1
  33. package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
  35. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
  36. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  37. package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
  38. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  39. package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
  40. package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
  41. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  42. package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
  43. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
  44. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
  45. package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
  46. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  47. package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -3
  50. package/dist/logging/LogHooks.js +11 -11
  51. package/dist/logging/LogManager.d.ts +0 -2
  52. package/dist/logging/LogManager.d.ts.map +1 -1
  53. package/dist/logging/LogManager.js +1 -3
  54. package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
  55. package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
  56. package/dist/logging/sinks/MemoryLogSink.js +12 -3
  57. package/dist/logging/types.d.ts +0 -2
  58. package/dist/logging/types.d.ts.map +1 -1
  59. package/dist/logging/types.js +1 -1
  60. package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
  61. package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
  62. package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
  63. package/dist/metrics/MetricsManager.d.ts +47 -0
  64. package/dist/metrics/MetricsManager.d.ts.map +1 -0
  65. package/dist/metrics/MetricsManager.js +232 -0
  66. package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
  67. package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
  68. package/dist/metrics/OperationMetricsTracker.js +53 -0
  69. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
  70. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
  71. package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
  72. package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
  73. package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
  74. package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
  75. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
  76. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
  77. package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
  78. package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
  79. package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
  80. package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
  81. package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
  82. package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
  83. package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
  84. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
  85. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
  86. package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
  87. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
  88. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
  89. package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
  90. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
  91. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
  92. package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
  93. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
  94. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
  95. package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
  96. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
  97. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
  98. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
  99. package/dist/metrics/collectors/index.d.ts +11 -0
  100. package/dist/metrics/collectors/index.d.ts.map +1 -0
  101. package/dist/metrics/collectors/index.js +11 -0
  102. package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
  103. package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
  104. package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
  105. package/dist/metrics/types.d.ts +98 -0
  106. package/dist/metrics/types.d.ts.map +1 -0
  107. package/dist/metrics/types.js +24 -0
  108. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  109. package/dist/portfolio/DefaultElementProvider.js +1 -7
  110. package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
  111. package/dist/portfolio/EnhancedIndexManager.js +18 -18
  112. package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
  113. package/dist/portfolio/NLPScoringManager.js +5 -9
  114. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  115. package/dist/portfolio/RelationshipManager.js +2 -2
  116. package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
  117. package/dist/portfolio/VerbTriggerManager.js +5 -19
  118. package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
  119. package/dist/portfolio/config/IndexConfig.js +1 -12
  120. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
  121. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
  122. package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
  123. package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
  124. package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
  125. package/dist/portfolio/types/RelationshipTypes.js +3 -17
  126. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  127. package/dist/security/audit/config/suppressions.js +36 -8
  128. package/dist/security/constants.d.ts.map +1 -1
  129. package/dist/security/constants.js +10 -6
  130. package/dist/security/fileLockManager.d.ts.map +1 -1
  131. package/dist/security/fileLockManager.js +8 -6
  132. package/dist/security/secureYamlParser.d.ts.map +1 -1
  133. package/dist/security/secureYamlParser.js +1 -13
  134. package/dist/security/securityMonitor.d.ts +2 -1
  135. package/dist/security/securityMonitor.d.ts.map +1 -1
  136. package/dist/security/securityMonitor.js +14 -3
  137. package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
  138. package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
  139. package/dist/security/telemetry/SecurityTelemetry.js +30 -2
  140. package/dist/security/tokenManager.d.ts +3 -0
  141. package/dist/security/tokenManager.d.ts.map +1 -1
  142. package/dist/security/tokenManager.js +13 -5
  143. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  144. package/dist/security/validation/BackgroundValidator.js +7 -7
  145. package/dist/server/startup.d.ts.map +1 -1
  146. package/dist/server/startup.js +8 -24
  147. package/dist/server/tools/MCPAQLTools.js +4 -1
  148. package/dist/services/ActivationStore.d.ts.map +1 -1
  149. package/dist/services/ActivationStore.js +9 -3
  150. package/dist/services/FileWatchService.d.ts +1 -0
  151. package/dist/services/FileWatchService.d.ts.map +1 -1
  152. package/dist/services/FileWatchService.js +83 -48
  153. package/dist/services/MetadataService.d.ts.map +1 -1
  154. package/dist/services/MetadataService.js +7 -2
  155. package/dist/services/query/ElementQueryService.d.ts.map +1 -1
  156. package/dist/services/query/ElementQueryService.js +1 -41
  157. package/dist/services/query/PaginationService.d.ts.map +1 -1
  158. package/dist/services/query/PaginationService.js +1 -14
  159. package/dist/services/query/SortService.d.ts.map +1 -1
  160. package/dist/services/query/SortService.js +1 -6
  161. package/dist/services/validation/ValidationService.d.ts.map +1 -1
  162. package/dist/services/validation/ValidationService.js +3 -8
  163. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  164. package/dist/storage/ElementStorageLayer.js +5 -2
  165. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  166. package/dist/storage/MemoryStorageLayer.js +5 -2
  167. package/dist/telemetry/OperationalTelemetry.js +2 -2
  168. package/dist/utils/EventDeduplicator.d.ts +44 -0
  169. package/dist/utils/EventDeduplicator.d.ts.map +1 -0
  170. package/dist/utils/EventDeduplicator.js +93 -0
  171. package/dist/utils/FileLock.d.ts.map +1 -1
  172. package/dist/utils/FileLock.js +1 -9
  173. package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
  174. package/dist/utils/PerformanceMonitor.js +5 -5
  175. package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
  176. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  177. package/dist/utils/SlidingWindowRateLimiter.js +23 -0
  178. package/dist/web/console/IngestRoutes.d.ts +84 -0
  179. package/dist/web/console/IngestRoutes.d.ts.map +1 -0
  180. package/dist/web/console/IngestRoutes.js +252 -0
  181. package/dist/web/console/LeaderElection.d.ts +89 -0
  182. package/dist/web/console/LeaderElection.d.ts.map +1 -0
  183. package/dist/web/console/LeaderElection.js +205 -0
  184. package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
  185. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
  186. package/dist/web/console/LeaderForwardingSink.js +197 -0
  187. package/dist/web/console/SessionNames.d.ts +46 -0
  188. package/dist/web/console/SessionNames.d.ts.map +1 -0
  189. package/dist/web/console/SessionNames.js +257 -0
  190. package/dist/web/console/UnifiedConsole.d.ts +64 -0
  191. package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
  192. package/dist/web/console/UnifiedConsole.js +119 -0
  193. package/dist/web/contentPipeline.d.ts +58 -0
  194. package/dist/web/contentPipeline.d.ts.map +1 -0
  195. package/dist/web/contentPipeline.js +112 -0
  196. package/dist/web/portDiscovery.d.ts +58 -0
  197. package/dist/web/portDiscovery.d.ts.map +1 -0
  198. package/dist/web/portDiscovery.js +143 -0
  199. package/dist/web/public/app.js +148 -60
  200. package/dist/web/public/logs.js +638 -0
  201. package/dist/web/public/metrics.js +682 -0
  202. package/dist/web/public/permissions.js +394 -0
  203. package/dist/web/public/sessions.js +369 -0
  204. package/dist/web/routes/healthRoutes.d.ts +16 -0
  205. package/dist/web/routes/healthRoutes.d.ts.map +1 -0
  206. package/dist/web/routes/healthRoutes.js +29 -0
  207. package/dist/web/routes/logRoutes.d.ts +18 -0
  208. package/dist/web/routes/logRoutes.d.ts.map +1 -0
  209. package/dist/web/routes/logRoutes.js +126 -0
  210. package/dist/web/routes/metricsRoutes.d.ts +17 -0
  211. package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
  212. package/dist/web/routes/metricsRoutes.js +90 -0
  213. package/dist/web/routes/permissionRoutes.d.ts +16 -0
  214. package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
  215. package/dist/web/routes/permissionRoutes.js +133 -0
  216. package/dist/web/routes.d.ts.map +1 -1
  217. package/dist/web/routes.js +309 -339
  218. package/dist/web/server.d.ts +21 -1
  219. package/dist/web/server.d.ts.map +1 -1
  220. package/dist/web/server.js +42 -4
  221. package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
  222. package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
  223. package/dist/web/sinks/WebSSELogSink.js +22 -0
  224. package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
  225. package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
  226. package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
  227. package/package.json +2 -2
  228. package/server.json +2 -2
  229. package/dist/constants/version.d.ts +0 -3
  230. package/dist/constants/version.d.ts.map +0 -1
  231. package/dist/constants/version.js +0 -4
  232. package/dist/logging/sinks/SSELogSink.d.ts +0 -35
  233. package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
  234. package/dist/logging/sinks/SSELogSink.js +0 -181
  235. package/dist/logging/viewer/viewerHtml.d.ts +0 -8
  236. package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
  237. package/dist/logging/viewer/viewerHtml.js +0 -204
  238. package/dist/web/public/public/app.js +0 -1878
@@ -52,7 +52,6 @@ import { sanitizeInput, validateCategory, validateUsername } from '../../securit
52
52
  import { UnicodeValidator } from '../../security/validators/unicodeValidator.js';
53
53
  import { ContentValidator } from '../../security/contentValidator.js';
54
54
  import { SecurityMonitor } from '../../security/securityMonitor.js';
55
- import { logger } from '../../utils/logger.js';
56
55
  import { VALIDATION_PATTERNS, PATTERN_DESCRIPTIONS } from '../../security/constants.js';
57
56
  /**
58
57
  * Service for validating and sanitizing input across all element types
@@ -138,12 +137,8 @@ export class ValidationService {
138
137
  errors.push(`Input contains invalid characters${charDetail}${allowedDetail}${structDetail}`);
139
138
  return { isValid: false, errors, warnings };
140
139
  }
141
- // Step 6: Log successful validation
142
- logger.debug('[ValidationService] Input validated and sanitized successfully', {
143
- originalLength: input.length,
144
- sanitizedLength: cleaned.length,
145
- hadUnicodeIssues: warnings.length > 0,
146
- });
140
+ // Validation success is the normal path — only failures need logging.
141
+ // Failures throw errors with full context upstream.
147
142
  return {
148
143
  isValid: true,
149
144
  sanitizedValue: cleaned,
@@ -532,4 +527,4 @@ export class ValidationService {
532
527
  * ```
533
528
  */
534
529
  export const validationService = new ValidationService();
535
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmFsaWRhdGlvblNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBeUV4Rjs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0ErQkc7SUFDSCx3QkFBd0IsQ0FDdEIsS0FBYSxFQUNiLFVBQWtDLEVBQUU7UUFFcEMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM5QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQztRQUU1QyxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7WUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFFRCwwREFBMEQ7UUFDMUQsb0VBQW9FO1FBQ3BFLElBQUksT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFOUMsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELE9BQU8sR0FBRyxhQUFhLENBQUMsaUJBQWlCLENBQUM7WUFFMUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMzRCxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFakYsbUNBQW1DO2dCQUNuQyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEtBQUssTUFBTSxJQUFJLGFBQWEsQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQy9FLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQzt3QkFDL0IsSUFBSSxFQUFFLDBCQUEwQjt3QkFDaEMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUF5Qjt3QkFDckUsTUFBTSxFQUFFLG9CQUFvQjt3QkFDNUIsT0FBTyxFQUFFLGdDQUFnQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtxQkFDbkYsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELDRDQUE0QztRQUM1QyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUM5QyxDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEYsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0YsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sWUFBWSxHQUFHLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckUsTUFBTSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsVUFBVSxHQUFHLGFBQWEsR0FBRyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQzdGLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUM5QyxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sQ0FBQyxLQUFLLENBQ1YsZ0VBQWdFLEVBQ2hFO1lBQ0UsY0FBYyxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQzVCLGVBQWUsRUFBRSxPQUFPLENBQUMsTUFBTTtZQUMvQixnQkFBZ0IsRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7U0FDdEMsQ0FDRixDQUFDO1FBRUYsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsY0FBYyxFQUFFLE9BQU87WUFDdkIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDckQsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGtCQUFrQixDQUFDLE9BQStCO1FBQ3hELHFDQUFxQztRQUNyQyxJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQixPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDL0IsQ0FBQztRQUVELDhCQUE4QjtRQUM5QixJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QixRQUFRLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDMUIsS0FBSyxNQUFNO29CQUNULE9BQU8sbUJBQW1CLENBQUMsU0FBUyxDQUFDO2dCQUN2QyxLQUFLLGFBQWE7b0JBQ2hCLE9BQU8sbUJBQW1CLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzlDLEtBQUssU0FBUztvQkFDWixPQUFPLG1CQUFtQixDQUFDLFlBQVksQ0FBQztnQkFDMUMsS0FBSyxVQUFVO29CQUNiLE9BQU8sbUJBQW1CLENBQUMsb0JBQW9CLENBQUM7WUFDcEQsQ0FBQztRQUNILENBQUM7UUFFRCxvRUFBb0U7UUFDcEUsT0FBTyxPQUFPLENBQUMsV0FBVztZQUN4QixDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFFLDhDQUE4QztZQUMvRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsQ0FBRSx3Q0FBd0M7SUFDekYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILHFCQUFxQixDQUNuQixTQUFpQixFQUNqQixLQUFjLEVBQ2QsVUFBa0MsRUFBRTtRQUVwQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDO1FBRTNDLDJCQUEyQjtRQUMzQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsMkJBQTJCLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUN6RCxDQUFDO1lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN0RCxDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1FBQzNDLElBQUksUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLGtDQUFrQyxDQUFDLENBQUM7WUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDbkUsQ0FBQztRQUVELElBQUksUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQ2hELENBQUM7UUFFRCxlQUFlO1FBQ2YsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLCtCQUErQixTQUFTLGFBQWEsQ0FBQyxDQUFDO1lBQy9FLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDekQsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWxELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsNEJBQTRCLENBQUMsQ0FBQztZQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3pELENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsNEVBQTRFO1FBQzVFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksbUJBQW1CLENBQUMsU0FBUyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0RixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsZ0NBQWdDLFVBQVUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3RGLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDekQsQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLGNBQWMsRUFBRSxTQUFTO1lBQ3pCLFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3BELFNBQVM7WUFDVCxRQUFRO1NBQ1QsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHO0lBQ0gsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDL0IsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUM7WUFDSCwrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNwQyxDQUFDO1lBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxJQUFJLEdBQUcsb0JBQW9CLENBQUMsYUFBYSxDQUFDO2dCQUNoRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekUsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BFLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLFVBQVUsY0FBYyxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksRUFBRSxDQUFDLENBQUM7Z0JBQzFHLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLENBQUM7WUFFRCxrRUFBa0U7WUFDbEUsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFN0MsZ0RBQWdEO1lBQ2hELDBFQUEwRTtZQUUxRSxPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJO2dCQUNiLGNBQWMsRUFBRSxTQUFTO2FBQzFCLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sWUFBWSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRTFCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLDJCQUEyQjtnQkFDakMsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSxvQkFBb0I7Z0JBQzVCLE9BQU8sRUFBRSwrQkFBK0IsWUFBWSxFQUFFO2FBQ3ZELENBQUMsQ0FBQztZQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUMvQixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQztZQUNILCtCQUErQjtZQUMvQixJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7Z0JBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLENBQUM7WUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLENBQUM7Z0JBQ2hELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6RSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDcEUsTUFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsVUFBVSxjQUFjLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDMUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDcEMsQ0FBQztZQUVELDJEQUEyRDtZQUMzRCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU3QyxPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJO2dCQUNiLGNBQWMsRUFBRSxTQUFTO2FBQzFCLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sWUFBWSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRTFCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLDJCQUEyQjtnQkFDakMsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSxvQkFBb0I7Z0JBQzVCLE9BQU8sRUFBRSwrQkFBK0IsWUFBWSxFQUFFO2FBQ3ZELENBQUMsQ0FBQztZQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxhQUFhLENBQUMsS0FBYTtRQUN6QixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQztZQUNILGtCQUFrQjtZQUNsQixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQ2hELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLENBQUM7WUFFRCwrREFBK0Q7WUFDL0QsTUFBTSxZQUFZLEdBQUcsaURBQWlELENBQUM7WUFFdkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNwQyxDQUFDO1lBRUQsZ0NBQWdDO1lBQ2hDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUU3QyxpQ0FBaUM7WUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO2dCQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNwQyxDQUFDO1lBRUQsT0FBTztnQkFDTCxPQUFPLEVBQUUsSUFBSTtnQkFDYixjQUFjLEVBQUUsU0FBUzthQUMxQixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxQixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILGdCQUFnQixDQUFDLElBQVk7UUFDM0IsT0FBTyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW9CRztJQUNILGVBQWUsQ0FDYixPQUFlLEVBQ2YsT0FBaUM7UUFFakMsT0FBTyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHFCQUFxQixDQUFDLEtBQWEsRUFBRSxRQUFnQjtRQUMzRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUM1QixLQUFLLE1BQU0sRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssY0FBYyxDQUFDLEtBQWU7UUFDcEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNuRCxJQUFJLEVBQUUsS0FBSyxHQUFHO2dCQUFFLE9BQU8sYUFBYSxDQUFDO1lBQ3JDLElBQUksRUFBRSxLQUFLLElBQUk7Z0JBQUUsT0FBTyxhQUFhLENBQUM7WUFDdEMsSUFBSSxFQUFFLEtBQUssSUFBSTtnQkFBRSxPQUFPLGlCQUFpQixDQUFDO1lBQzFDLElBQUksRUFBRSxLQUFLLElBQUk7Z0JBQUUsT0FBTyx5QkFBeUIsQ0FBQztZQUNsRCx3Q0FBd0M7WUFDeEMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUN0RCxPQUFPLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdFLENBQUM7WUFDRCxPQUFPLElBQUksRUFBRSxHQUFHLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVyxPQUFPLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxxQkFBcUIsQ0FBQyxPQUErQjtRQUMzRCxJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLFFBQVEsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMxQixLQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sb0JBQW9CLENBQUMsU0FBUyxDQUFDO2dCQUNuRCxLQUFLLGFBQWEsQ0FBQyxDQUFDLE9BQU8sb0JBQW9CLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ2pFLEtBQUssU0FBUyxDQUFDLENBQUMsT0FBTyxvQkFBb0IsQ0FBQyxZQUFZLENBQUM7Z0JBQ3pELEtBQUssVUFBVSxDQUFDLENBQUMsT0FBTyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQztZQUNwRSxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLFdBQVc7WUFDeEIsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFNBQVM7WUFDaEMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDO0lBQ2hELENBQUM7SUFFRDs7O09BR0c7SUFDSyx3QkFBd0IsQ0FBQyxPQUFlO1FBQzlDLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQzdELElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUM7WUFDakQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZhbGlkYXRpb25TZXJ2aWNlIC0gQ2VudHJhbGl6ZWQgdmFsaWRhdGlvbiBhbmQgc2FuaXRpemF0aW9uIGZvciBEb2xsaG91c2VNQ1BcbiAqXG4gKiBFbGltaW5hdGVzIGR1cGxpY2F0ZSB2YWxpZGF0aW9uIGNvZGUgYWNyb3NzIGVsZW1lbnQgbWFuYWdlcnMgYnkgcHJvdmlkaW5nXG4gKiBhIHVuaWZpZWQgc2VjdXJpdHktZmlyc3QgdmFsaWRhdGlvbiBhcHByb2FjaC5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIFNlY3VyaXR5LWZpcnN0IHBhdHRlcm46IHZhbGlkYXRlIOKGkiBzYW5pdGl6ZSDihpIgcmUtdmFsaWRhdGVcbiAqIC0gV3JhcHMgZXhpc3RpbmcgdmFsaWRhdG9ycyAoVW5pY29kZVZhbGlkYXRvciwgQ29udGVudFZhbGlkYXRvciwgc2FuaXRpemVJbnB1dClcbiAqIC0gQ29uc2lzdGVudCB2YWxpZGF0aW9uIGFsZ29yaXRobSBhY3Jvc3MgYWxsIGVsZW1lbnQgdHlwZXNcbiAqIC0gQ29tcHJlaGVuc2l2ZSBlcnJvciByZXBvcnRpbmcgYW5kIGxvZ2dpbmdcbiAqIC0gRnVsbCBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKlxuICogU2VjdXJpdHkgUGF0dGVybjpcbiAqIFRoZSBzZXJ2aWNlIGVuZm9yY2VzIHRoZSBjb3JyZWN0IHZhbGlkYXRpb24gc2VxdWVuY2UgdG8gcHJldmVudCBzZWN1cml0eSBieXBhc3NlczpcbiAqIDEuIFZBTElEQVRFIGlucHV0IGFnYWluc3QgcGF0dGVybi9ydWxlcyAocmVqZWN0IG1hbGljaW91cyBpbnB1dClcbiAqIDIuIFNBTklUSVpFIGlmIHZhbGlkYXRpb24gcGFzc2VzIChjbGVhbiB1cCBpbnB1dClcbiAqIDMuIFJFLVZBTElEQVRFIHNhbml0aXplZCBvdXRwdXQgKGVuc3VyZSBzYW5pdGl6YXRpb24gZGlkbid0IGJyZWFrIGNvbnN0cmFpbnRzKVxuICpcbiAqIFdST05HIChjb21tb24gYnVnKTpcbiAqICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVJbnB1dChjYXRlZ29yeSk7XG4gKiAgIG1ldGFkYXRhLmNhdGVnb3J5ID0gc2FuaXRpemVkLnRvTG93ZXJDYXNlKCk7IC8vIE5vIHZhbGlkYXRpb24hXG4gKlxuICogQ09SUkVDVCAod2hhdCB0aGlzIHNlcnZpY2UgZW5mb3JjZXMpOlxuICogICBpZiAoIWlzVmFsaWRDYXRlZ29yeShjYXRlZ29yeSkpIHRocm93IGVycm9yOyAgLy8gVmFsaWRhdGUgRklSU1RcbiAqICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVJbnB1dChjYXRlZ29yeSk7ICAgICAvLyBUaGVuIHNhbml0aXplXG4gKiAgIGlmICghaXNWYWxpZENhdGVnb3J5KHNhbml0aXplZCkpIHRocm93IGVycm9yOyAgLy8gUmUtdmFsaWRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgdmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL1ZhbGlkYXRpb25TZXJ2aWNlJztcbiAqXG4gKiAvLyBIaWdoLWxldmVsIGNvb3JkaW5hdGVkIHZhbGlkYXRpb25cbiAqIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dCh1c2VySW5wdXQsIHtcbiAqICAgbWF4TGVuZ3RoOiAyMDAsXG4gKiAgIGFsbG93U3BhY2VzOiB0cnVlXG4gKiB9KTtcbiAqXG4gKiBpZiAoIXJlc3VsdC5pc1ZhbGlkKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IocmVzdWx0LmVycm9ycyk7XG4gKiB9IGVsc2Uge1xuICogICB1c2UocmVzdWx0LnNhbml0aXplZFZhbHVlKTtcbiAqIH1cbiAqXG4gKiAvLyBNZXRhZGF0YSBmaWVsZCB2YWxpZGF0aW9uXG4gKiBjb25zdCBjYXRlZ29yeVJlc3VsdCA9IHZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQ2F0ZWdvcnkoJ2NyZWF0aXZlJyk7XG4gKiBjb25zdCB1c2VybmFtZVJlc3VsdCA9IHZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVXNlcm5hbWUoJ2pvaG4tZG9lJyk7XG4gKiBjb25zdCBlbWFpbFJlc3VsdCA9IHZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlRW1haWwoJ3VzZXJAZXhhbXBsZS5jb20nKTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IHNhbml0aXplSW5wdXQsIHZhbGlkYXRlQ2F0ZWdvcnksIHZhbGlkYXRlVXNlcm5hbWUgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgQ29udGVudFZhbGlkYXRvck9wdGlvbnMsIENvbnRlbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFZBTElEQVRJT05fUEFUVEVSTlMsIFBBVFRFUk5fREVTQ1JJUFRJT05TIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcblxuLyoqXG4gKiBGaWVsZCB0eXBlcyBmb3IgdmFsaWRhdGlvbiB3aXRoIGFwcHJvcHJpYXRlIHN0cmljdG5lc3MgbGV2ZWxzXG4gKi9cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25GaWVsZFR5cGUgPSAnbmFtZScgfCAnZGVzY3JpcHRpb24nIHwgJ2NvbnRlbnQnIHwgJ2ZpbGVuYW1lJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBpbnB1dCB2YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXRWYWxpZGF0aW9uT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIGxlbmd0aCBvZiBpbnB1dCAoZGVmYXVsdDogMTAwMCkgKi9cbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAvKiogQWxsb3cgc3BhY2VzIGluIGlucHV0IChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgYWxsb3dTcGFjZXM/OiBib29sZWFuO1xuICAvKiogQ3VzdG9tIHZhbGlkYXRpb24gcGF0dGVybiAob3ZlcnJpZGVzIGRlZmF1bHQpICovXG4gIGN1c3RvbVBhdHRlcm4/OiBSZWdFeHA7XG4gIC8qKiBTa2lwIFVuaWNvZGUgbm9ybWFsaXphdGlvbiAoZGVmYXVsdDogZmFsc2UpICovXG4gIHNraXBVbmljb2RlPzogYm9vbGVhbjtcbiAgLyoqIEZpZWxkIHR5cGUgZm9yIGFwcHJvcHJpYXRlIHZhbGlkYXRpb24gc3RyaWN0bmVzcyAoZGVmYXVsdDogdmFsaWRhdGVzIGJhc2VkIG9uIGFsbG93U3BhY2VzKSAqL1xuICBmaWVsZFR5cGU/OiBWYWxpZGF0aW9uRmllbGRUeXBlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG1ldGFkYXRhIGZpZWxkIHZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWVsZFZhbGlkYXRpb25PcHRpb25zIHtcbiAgLyoqIFdoZXRoZXIgZmllbGQgaXMgcmVxdWlyZWQgKGRlZmF1bHQ6IHRydWUpICovXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgLyoqIE1heGltdW0gZmllbGQgbGVuZ3RoIChkZWZhdWx0OiA1MDApICovXG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgLyoqIEN1c3RvbSB2YWxpZGF0aW9uIHBhdHRlcm4gKi9cbiAgcGF0dGVybj86IFJlZ0V4cDtcbn1cblxuLyoqXG4gKiBHZW5lcmljIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XG4gIC8qKiBXaGV0aGVyIHRoZSBpbnB1dCBwYXNzZWQgYWxsIHZhbGlkYXRpb24gY2hlY2tzICovXG4gIGlzVmFsaWQ6IGJvb2xlYW47XG4gIC8qKiBTYW5pdGl6ZWQgYW5kIHZhbGlkYXRlZCB2YWx1ZSAob25seSBwcmVzZW50IGlmIGlzVmFsaWQgaXMgdHJ1ZSkgKi9cbiAgc2FuaXRpemVkVmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBMaXN0IG9mIHZhbGlkYXRpb24gZXJyb3JzIChvbmx5IHByZXNlbnQgaWYgaXNWYWxpZCBpcyBmYWxzZSkgKi9cbiAgZXJyb3JzPzogc3RyaW5nW107XG4gIC8qKiBMaXN0IG9mIHZhbGlkYXRpb24gd2FybmluZ3MgKG5vbi1mYXRhbCBpc3N1ZXMpICovXG4gIHdhcm5pbmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRmllbGQtc3BlY2lmaWMgdmFsaWRhdGlvbiByZXN1bHQgd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRWYWxpZGF0aW9uUmVzdWx0IGV4dGVuZHMgVmFsaWRhdGlvblJlc3VsdCB7XG4gIC8qKiBPcmlnaW5hbCBmaWVsZCBuYW1lIHRoYXQgd2FzIHZhbGlkYXRlZCAqL1xuICBmaWVsZE5hbWU/OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCB3YXMgZW1wdHkgYmVmb3JlIHZhbGlkYXRpb24gKi9cbiAgd2FzRW1wdHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlc3VsdCBmcm9tIFVuaWNvZGUgdmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaWNvZGVWYWxpZGF0aW9uUmVzdWx0IHtcbiAgLyoqIFdoZXRoZXIgdGhlIFVuaWNvZGUgY29udGVudCBpcyB2YWxpZCAqL1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICAvKiogTm9ybWFsaXplZCBVbmljb2RlIGNvbnRlbnQgKi9cbiAgbm9ybWFsaXplZENvbnRlbnQ6IHN0cmluZztcbiAgLyoqIERldGVjdGVkIFVuaWNvZGUgaXNzdWVzICovXG4gIGRldGVjdGVkSXNzdWVzPzogc3RyaW5nW107XG4gIC8qKiBTZXZlcml0eSBvZiBkZXRlY3RlZCBpc3N1ZXMgKi9cbiAgc2V2ZXJpdHk/OiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ2NyaXRpY2FsJztcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGZvciB2YWxpZGF0aW5nIGFuZCBzYW5pdGl6aW5nIGlucHV0IGFjcm9zcyBhbGwgZWxlbWVudCB0eXBlc1xuICpcbiAqIFRoaXMgc2VydmljZSBwcm92aWRlcyBjZW50cmFsaXplZCB2YWxpZGF0aW9uIHRvIGVsaW1pbmF0ZSBjb2RlIGR1cGxpY2F0aW9uXG4gKiBhbmQgZW5mb3JjZSB0aGUgc2VjdXJpdHktZmlyc3QgdmFsaWRhdGlvbiBwYXR0ZXJuIGFjcm9zcyB0aGUgY29kZWJhc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uU2VydmljZSB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgZ2VuZXJhbCBpbnB1dCB3aXRoIHNhbml0aXplLXRoZW4tdmFsaWRhdGUgYXBwcm9hY2hcbiAgICpcbiAgICogVmFsaWRhdGlvbiBwcm9jZXNzOlxuICAgKiAxLiBDaGVjayBmb3IgZW1wdHkvbnVsbCBpbnB1dFxuICAgKiAyLiBTQU5JVElaRSBpbnB1dCBmaXJzdCAocmVtb3ZlIGNvbnRyb2wgY2hhcnMsIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLCBkYW5nZXJvdXMgcGF0dGVybnMpXG4gICAqIDMuIE5vcm1hbGl6ZSBVbmljb2RlIGlmIGVuYWJsZWQgKGNvbnZlcnQgY29uZnVzYWJsZXMsIHJlbW92ZSB6ZXJvLXdpZHRoKVxuICAgKiA0LiBWQUxJREFURSB0aGUgY2xlYW5lZCByZXN1bHQgYWdhaW5zdCBmaWVsZC1hcHByb3ByaWF0ZSBwYXR0ZXJuXG4gICAqIDUuIExvZyBhbnkgc2VjdXJpdHkgaXNzdWVzIGRldGVjdGVkXG4gICAqXG4gICAqIFRoaXMgYXBwcm9hY2ggYWxsb3dzIGxlZ2l0aW1hdGUgVW5pY29kZSBjb250ZW50IChsaWtlIFwiQ2FmZSBBc3Npc3RhbnRcIikgdG8gcGFzc1xuICAgKiB3aGlsZSBzdGlsbCBibG9ja2luZyBzZWN1cml0eSB0aHJlYXRzIGFmdGVyIHRoZXkndmUgYmVlbiBub3JtYWxpemVkL3Nhbml0aXplZC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gUmF3IGlucHV0IHN0cmluZyB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFZhbGlkYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHNhbml0aXplZCB2YWx1ZSBvciBlcnJvcnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBzZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dCgndXNlci1pbnB1dCcsIHtcbiAgICogICBtYXhMZW5ndGg6IDEwMCxcbiAgICogICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICogICBmaWVsZFR5cGU6ICduYW1lJ1xuICAgKiB9KTtcbiAgICpcbiAgICogaWYgKHJlc3VsdC5pc1ZhbGlkKSB7XG4gICAqICAgY29uc29sZS5sb2coJ0NsZWFuIGlucHV0OicsIHJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSk7XG4gICAqIH0gZWxzZSB7XG4gICAqICAgY29uc29sZS5lcnJvcignVmFsaWRhdGlvbiBmYWlsZWQ6JywgcmVzdWx0LmVycm9ycyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICB2YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgaW5wdXQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBJbnB1dFZhbGlkYXRpb25PcHRpb25zID0ge31cbiAgKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG1heExlbmd0aCA9IG9wdGlvbnMubWF4TGVuZ3RoID8/IDEwMDA7XG5cbiAgICAvLyBTdGVwIDE6IENoZWNrIGZvciBlbXB0eS9udWxsIGlucHV0XG4gICAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcnMucHVzaCgnSW5wdXQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnMsIHdhcm5pbmdzIH07XG4gICAgfVxuXG4gICAgLy8gU3RlcCAyOiBTQU5JVElaRSB0aGUgaW5wdXQgZmlyc3QgKHJlbW92ZSBrbm93biB0aHJlYXRzKVxuICAgIC8vIFRoaXMgcmVtb3ZlcyBjb250cm9sIGNoYXJzLCBzaGVsbCBtZXRhY2hhcmFjdGVycywgSFRNTCB0YWdzLCBldGMuXG4gICAgbGV0IGNsZWFuZWQgPSBzYW5pdGl6ZUlucHV0KGlucHV0LCBtYXhMZW5ndGgpO1xuXG4gICAgLy8gU3RlcCAzOiBVbmljb2RlIG5vcm1hbGl6YXRpb24gKGlmIG5vdCBza2lwcGVkKVxuICAgIGlmICghb3B0aW9ucy5za2lwVW5pY29kZSkge1xuICAgICAgY29uc3QgdW5pY29kZVJlc3VsdCA9IHRoaXMubm9ybWFsaXplVW5pY29kZShjbGVhbmVkKTtcbiAgICAgIGNsZWFuZWQgPSB1bmljb2RlUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuXG4gICAgICBpZiAoIXVuaWNvZGVSZXN1bHQuaXNWYWxpZCAmJiB1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzKSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goLi4udW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcy5tYXAoaXNzdWUgPT4gYFVuaWNvZGU6ICR7aXNzdWV9YCkpO1xuXG4gICAgICAgIC8vIExvZyBoaWdoL2NyaXRpY2FsIFVuaWNvZGUgaXNzdWVzXG4gICAgICAgIGlmICh1bmljb2RlUmVzdWx0LnNldmVyaXR5ID09PSAnaGlnaCcgfHwgdW5pY29kZVJlc3VsdC5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICAgICAgc2V2ZXJpdHk6IHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHkudG9VcHBlckNhc2UoKSBhcyAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICAgICAgc291cmNlOiAndmFsaWRhdGlvbl9zZXJ2aWNlJyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBVbmljb2RlIHZhbGlkYXRpb24gZGV0ZWN0ZWQ6ICR7dW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGVwIDQ6IENoZWNrIGlmIGVtcHR5IGFmdGVyIHNhbml0aXphdGlvblxuICAgIGlmICghY2xlYW5lZCB8fCBjbGVhbmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXJyb3JzLnB1c2goJ0lucHV0IGlzIGVtcHR5IGFmdGVyIHNhbml0aXphdGlvbicpO1xuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycywgd2FybmluZ3MgfTtcbiAgICB9XG5cbiAgICAvLyBTdGVwIDU6IFZBTElEQVRFIHRoZSBjbGVhbmVkIHJlc3VsdCBhZ2FpbnN0IGZpZWxkLWFwcHJvcHJpYXRlIHBhdHRlcm5cbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5nZXRQYXR0ZXJuRm9yRmllbGQob3B0aW9ucyk7XG5cbiAgICBpZiAoIXBhdHRlcm4udGVzdChjbGVhbmVkKSkge1xuICAgICAgY29uc3QgZGVzYyA9IHRoaXMuZ2V0UGF0dGVybkRlc2NyaXB0aW9uKG9wdGlvbnMpO1xuICAgICAgY29uc3QgaW52YWxpZENoYXJzID0gZGVzYyA/IHRoaXMuZmluZEludmFsaWRDaGFyYWN0ZXJzKGNsZWFuZWQsIGRlc2MuY2hhclRlc3QpIDogW107XG4gICAgICBjb25zdCBjaGFyRGV0YWlsID0gaW52YWxpZENoYXJzLmxlbmd0aCA+IDAgPyBgOiAke3RoaXMuZm9ybWF0Q2hhckxpc3QoaW52YWxpZENoYXJzKX1gIDogJyc7XG4gICAgICBjb25zdCBhbGxvd2VkRGV0YWlsID0gZGVzYyA/IGAuIEFsbG93ZWQ6ICR7ZGVzYy5hbGxvd2VkfWAgOiAnJztcbiAgICAgIGNvbnN0IHN0cnVjdERldGFpbCA9IGRlc2M/LnN0cnVjdHVyYWwgPyBgICgke2Rlc2Muc3RydWN0dXJhbH0pYCA6ICcnO1xuICAgICAgZXJyb3JzLnB1c2goYElucHV0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyR7Y2hhckRldGFpbH0ke2FsbG93ZWREZXRhaWx9JHtzdHJ1Y3REZXRhaWx9YCk7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzLCB3YXJuaW5ncyB9O1xuICAgIH1cblxuICAgIC8vIFN0ZXAgNjogTG9nIHN1Y2Nlc3NmdWwgdmFsaWRhdGlvblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICdbVmFsaWRhdGlvblNlcnZpY2VdIElucHV0IHZhbGlkYXRlZCBhbmQgc2FuaXRpemVkIHN1Y2Nlc3NmdWxseScsXG4gICAgICB7XG4gICAgICAgIG9yaWdpbmFsTGVuZ3RoOiBpbnB1dC5sZW5ndGgsXG4gICAgICAgIHNhbml0aXplZExlbmd0aDogY2xlYW5lZC5sZW5ndGgsXG4gICAgICAgIGhhZFVuaWNvZGVJc3N1ZXM6IHdhcm5pbmdzLmxlbmd0aCA+IDAsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgc2FuaXRpemVkVmFsdWU6IGNsZWFuZWQsXG4gICAgICB3YXJuaW5nczogd2FybmluZ3MubGVuZ3RoID4gMCA/IHdhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcHByb3ByaWF0ZSB2YWxpZGF0aW9uIHBhdHRlcm4gZm9yIGEgZmllbGQgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIElucHV0IHZhbGlkYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBSZWdFeHAgcGF0dGVybiBhcHByb3ByaWF0ZSBmb3IgdGhlIGZpZWxkIHR5cGVcbiAgICovXG4gIHByaXZhdGUgZ2V0UGF0dGVybkZvckZpZWxkKG9wdGlvbnM6IElucHV0VmFsaWRhdGlvbk9wdGlvbnMpOiBSZWdFeHAge1xuICAgIC8vIElmIGN1c3RvbSBwYXR0ZXJuIHByb3ZpZGVkLCB1c2UgaXRcbiAgICBpZiAob3B0aW9ucy5jdXN0b21QYXR0ZXJuKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5jdXN0b21QYXR0ZXJuO1xuICAgIH1cblxuICAgIC8vIFVzZSBmaWVsZCB0eXBlIGlmIHNwZWNpZmllZFxuICAgIGlmIChvcHRpb25zLmZpZWxkVHlwZSkge1xuICAgICAgc3dpdGNoIChvcHRpb25zLmZpZWxkVHlwZSkge1xuICAgICAgICBjYXNlICduYW1lJzpcbiAgICAgICAgICByZXR1cm4gVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX05BTUU7XG4gICAgICAgIGNhc2UgJ2Rlc2NyaXB0aW9uJzpcbiAgICAgICAgICByZXR1cm4gVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0RFU0NSSVBUSU9OO1xuICAgICAgICBjYXNlICdjb250ZW50JzpcbiAgICAgICAgICByZXR1cm4gVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0NPTlRFTlQ7XG4gICAgICAgIGNhc2UgJ2ZpbGVuYW1lJzpcbiAgICAgICAgICByZXR1cm4gVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0ZJTEVOQU1FX0NSRUFURTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gYWxsb3dTcGFjZXMtYmFzZWQgcGF0dGVybiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIHJldHVybiBvcHRpb25zLmFsbG93U3BhY2VzXG4gICAgICA/IFZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9OQU1FICAvLyBOYW1lcy9kZXNjcmlwdGlvbnMgYWxsb3cgc3BhY2VzIGFuZCBVbmljb2RlXG4gICAgICA6IFZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9GSUxFTkFNRV9DUkVBVEU7ICAvLyBObyBzcGFjZXMgPSBzdHJpY3RlciBmaWxlbmFtZSBwYXR0ZXJuXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBtZXRhZGF0YSBmaWVsZCB3aXRoIHNhbml0aXplLXRoZW4tdmFsaWRhdGUgYXBwcm9hY2hcbiAgICpcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIE5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHZhbGlkYXRlZFxuICAgKiBAcGFyYW0gdmFsdWUgLSBGaWVsZCB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEZpZWxkIHZhbGlkYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBGaWVsZCB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IHNlcnZpY2UudmFsaWRhdGVNZXRhZGF0YUZpZWxkKCdjYXRlZ29yeScsICdjcmVhdGl2ZScsIHtcbiAgICogICByZXF1aXJlZDogdHJ1ZSxcbiAgICogICBtYXhMZW5ndGg6IDUwXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHZhbGlkYXRlTWV0YWRhdGFGaWVsZChcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBvcHRpb25zOiBGaWVsZFZhbGlkYXRpb25PcHRpb25zID0ge31cbiAgKTogRmllbGRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVxdWlyZWQgPSBvcHRpb25zLnJlcXVpcmVkID8/IHRydWU7XG4gICAgY29uc3QgbWF4TGVuZ3RoID0gb3B0aW9ucy5tYXhMZW5ndGggPz8gNTAwO1xuXG4gICAgLy8gQ2hlY2sgaWYgdmFsdWUgaXMgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICBlcnJvcnMucHVzaChgJHtmaWVsZE5hbWV9OiBNdXN0IGJlIGEgc3RyaW5nIChnb3QgJHt0eXBlb2YgdmFsdWV9KWApO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzLCB3YXJuaW5ncywgZmllbGROYW1lIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlLCBmaWVsZE5hbWUsIHdhc0VtcHR5OiB0cnVlIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZW1wdHlcbiAgICBjb25zdCB3YXNFbXB0eSA9IHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgaWYgKHdhc0VtcHR5ICYmIHJlcXVpcmVkKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHtmaWVsZE5hbWV9OiBSZXF1aXJlZCBmaWVsZCBjYW5ub3QgYmUgZW1wdHlgKTtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnMsIHdhcm5pbmdzLCBmaWVsZE5hbWUsIHdhc0VtcHR5IH07XG4gICAgfVxuXG4gICAgaWYgKHdhc0VtcHR5ICYmICFyZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSwgZmllbGROYW1lLCB3YXNFbXB0eSB9O1xuICAgIH1cblxuICAgIC8vIExlbmd0aCBjaGVja1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgIGVycm9ycy5wdXNoKGAke2ZpZWxkTmFtZX06IEV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHttYXhMZW5ndGh9IGNoYXJhY3RlcnNgKTtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnMsIHdhcm5pbmdzLCBmaWVsZE5hbWUgfTtcbiAgICB9XG5cbiAgICAvLyBTQU5JVElaRSBmaXJzdCAocmVtb3ZlIGtub3duIHRocmVhdHMpXG4gICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVJbnB1dCh2YWx1ZSwgbWF4TGVuZ3RoKTtcblxuICAgIC8vIENoZWNrIGlmIGVtcHR5IGFmdGVyIHNhbml0aXphdGlvblxuICAgIGlmICghc2FuaXRpemVkIHx8IHNhbml0aXplZC5sZW5ndGggPT09IDApIHtcbiAgICAgIGVycm9ycy5wdXNoKGAke2ZpZWxkTmFtZX06IEVtcHR5IGFmdGVyIHNhbml0aXphdGlvbmApO1xuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycywgd2FybmluZ3MsIGZpZWxkTmFtZSB9O1xuICAgIH1cblxuICAgIC8vIFZBTElEQVRFIHRoZSBzYW5pdGl6ZWQgcmVzdWx0XG4gICAgLy8gVXNlIHByb3ZpZGVkIHBhdHRlcm4gb3IgZGVmYXVsdCB0byBTQUZFX05BTUUgd2hpY2ggYWxsb3dzIFVuaWNvZGUgbGV0dGVyc1xuICAgIGNvbnN0IHBhdHRlcm4gPSBvcHRpb25zLnBhdHRlcm4gPz8gVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX05BTUU7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3Qoc2FuaXRpemVkKSkge1xuICAgICAgY29uc3QgZGVzYyA9IHRoaXMuZ2V0RGVzY3JpcHRpb25Gb3JQYXR0ZXJuKHBhdHRlcm4pO1xuICAgICAgY29uc3QgaW52YWxpZENoYXJzID0gZGVzYyA/IHRoaXMuZmluZEludmFsaWRDaGFyYWN0ZXJzKHNhbml0aXplZCwgZGVzYy5jaGFyVGVzdCkgOiBbXTtcbiAgICAgIGNvbnN0IGNoYXJEZXRhaWwgPSBpbnZhbGlkQ2hhcnMubGVuZ3RoID4gMCA/IGA6ICR7dGhpcy5mb3JtYXRDaGFyTGlzdChpbnZhbGlkQ2hhcnMpfWAgOiAnJztcbiAgICAgIGNvbnN0IGFsbG93ZWREZXRhaWwgPSBkZXNjID8gYC4gQWxsb3dlZDogJHtkZXNjLmFsbG93ZWR9YCA6ICcnO1xuICAgICAgZXJyb3JzLnB1c2goYCR7ZmllbGROYW1lfTogQ29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzJHtjaGFyRGV0YWlsfSR7YWxsb3dlZERldGFpbH1gKTtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnMsIHdhcm5pbmdzLCBmaWVsZE5hbWUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgIHNhbml0aXplZFZhbHVlOiBzYW5pdGl6ZWQsXG4gICAgICB3YXJuaW5nczogd2FybmluZ3MubGVuZ3RoID4gMCA/IHdhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgICAgZmllbGROYW1lLFxuICAgICAgd2FzRW1wdHksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGNhdGVnb3J5IGZpZWxkXG4gICAqXG4gICAqIEVuZm9yY2VzIHNlY3VyaXR5LWZpcnN0IHBhdHRlcm46XG4gICAqIDEuIFZhbGlkYXRlIGZvcm1hdCAobG93ZXJjYXNlIGxldHRlcnMgYW5kIGh5cGhlbnMgb25seSlcbiAgICogMi4gU2FuaXRpemUgaW5wdXRcbiAgICogMy4gUmUtdmFsaWRhdGUgc2FuaXRpemVkIG91dHB1dFxuICAgKlxuICAgKiBAcGFyYW0gY2F0ZWdvcnkgLSBDYXRlZ29yeSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBzYW5pdGl6ZWQgY2F0ZWdvcnlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBzZXJ2aWNlLnZhbGlkYXRlQ2F0ZWdvcnkoJ2NyZWF0aXZlJyk7XG4gICAqIGlmIChyZXN1bHQuaXNWYWxpZCkge1xuICAgKiAgIG1ldGFkYXRhLmNhdGVnb3J5ID0gcmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgdmFsaWRhdGVDYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZBTElEQVRFIGJlZm9yZSBzYW5pdGl6YXRpb25cbiAgICAgIGlmICghY2F0ZWdvcnkgfHwgdHlwZW9mIGNhdGVnb3J5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBlcnJvcnMucHVzaCgnQ2F0ZWdvcnkgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIVZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9DQVRFR09SWS50ZXN0KGNhdGVnb3J5KSkge1xuICAgICAgICBjb25zdCBkZXNjID0gUEFUVEVSTl9ERVNDUklQVElPTlMuU0FGRV9DQVRFR09SWTtcbiAgICAgICAgY29uc3QgaW52YWxpZENoYXJzID0gdGhpcy5maW5kSW52YWxpZENoYXJhY3RlcnMoY2F0ZWdvcnksIGRlc2MuY2hhclRlc3QpO1xuICAgICAgICBjb25zdCBjaGFyRGV0YWlsID0gaW52YWxpZENoYXJzLmxlbmd0aCA+IDAgPyBgOiAke3RoaXMuZm9ybWF0Q2hhckxpc3QoaW52YWxpZENoYXJzKX1gIDogJyc7XG4gICAgICAgIGNvbnN0IHN0cnVjdERldGFpbCA9IGRlc2Muc3RydWN0dXJhbCA/IGAgKCR7ZGVzYy5zdHJ1Y3R1cmFsfSlgIDogJyc7XG4gICAgICAgIGVycm9ycy5wdXNoKGBDYXRlZ29yeSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMke2NoYXJEZXRhaWx9LiBBbGxvd2VkOiAke2Rlc2MuYWxsb3dlZH0ke3N0cnVjdERldGFpbH1gKTtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBTQU5JVElaRSB1c2luZyBleGlzdGluZyB2YWxpZGF0b3IgKHdoaWNoIGFsc28gdmFsaWRhdGVzIGZvcm1hdClcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IHZhbGlkYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpO1xuXG4gICAgICAvLyBSRS1WQUxJREFURSBpcyBkb25lIGluc2lkZSB2YWxpZGF0ZUNhdGVnb3J5KClcbiAgICAgIC8vIFRoZSBmdW5jdGlvbiB0aHJvd3MgaWYgZm9ybWF0IGlzIGludmFsaWQsIHNvIGlmIHdlIGdldCBoZXJlLCBpdCdzIHZhbGlkXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIHNhbml0aXplZFZhbHVlOiBzYW5pdGl6ZWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBlcnJvcnMucHVzaChlcnJvck1lc3NhZ2UpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICd2YWxpZGF0aW9uX3NlcnZpY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQ2F0ZWdvcnkgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycywgd2FybmluZ3MgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSB1c2VybmFtZSBmaWVsZFxuICAgKlxuICAgKiBAcGFyYW0gdXNlcm5hbWUgLSBVc2VybmFtZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBzYW5pdGl6ZWQgdXNlcm5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBzZXJ2aWNlLnZhbGlkYXRlVXNlcm5hbWUoJ2pvaG4tZG9lJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgdmFsaWRhdGVVc2VybmFtZSh1c2VybmFtZTogc3RyaW5nKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZBTElEQVRFIGJlZm9yZSBzYW5pdGl6YXRpb25cbiAgICAgIGlmICghdXNlcm5hbWUgfHwgdHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICBlcnJvcnMucHVzaCgnVXNlcm5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIVZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9VU0VSTkFNRS50ZXN0KHVzZXJuYW1lKSkge1xuICAgICAgICBjb25zdCBkZXNjID0gUEFUVEVSTl9ERVNDUklQVElPTlMuU0FGRV9VU0VSTkFNRTtcbiAgICAgICAgY29uc3QgaW52YWxpZENoYXJzID0gdGhpcy5maW5kSW52YWxpZENoYXJhY3RlcnModXNlcm5hbWUsIGRlc2MuY2hhclRlc3QpO1xuICAgICAgICBjb25zdCBjaGFyRGV0YWlsID0gaW52YWxpZENoYXJzLmxlbmd0aCA+IDAgPyBgOiAke3RoaXMuZm9ybWF0Q2hhckxpc3QoaW52YWxpZENoYXJzKX1gIDogJyc7XG4gICAgICAgIGNvbnN0IHN0cnVjdERldGFpbCA9IGRlc2Muc3RydWN0dXJhbCA/IGAgKCR7ZGVzYy5zdHJ1Y3R1cmFsfSlgIDogJyc7XG4gICAgICAgIGVycm9ycy5wdXNoKGBVc2VybmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMke2NoYXJEZXRhaWx9LiBBbGxvd2VkOiAke2Rlc2MuYWxsb3dlZH0ke3N0cnVjdERldGFpbH1gKTtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBTQU5JVElaRSB1c2luZyBleGlzdGluZyB2YWxpZGF0b3IgKHdoaWNoIGFsc28gdmFsaWRhdGVzKVxuICAgICAgY29uc3Qgc2FuaXRpemVkID0gdmFsaWRhdGVVc2VybmFtZSh1c2VybmFtZSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIHNhbml0aXplZFZhbHVlOiBzYW5pdGl6ZWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBlcnJvcnMucHVzaChlcnJvck1lc3NhZ2UpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICd2YWxpZGF0aW9uX3NlcnZpY2UnLFxuICAgICAgICBkZXRhaWxzOiBgVXNlcm5hbWUgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycywgd2FybmluZ3MgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gZW1haWwgYWRkcmVzc1xuICAgKlxuICAgKiBAcGFyYW0gZW1haWwgLSBFbWFpbCBhZGRyZXNzIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggc2FuaXRpemVkIGVtYWlsXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gc2VydmljZS52YWxpZGF0ZUVtYWlsKCd1c2VyQGV4YW1wbGUuY29tJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgdmFsaWRhdGVFbWFpbChlbWFpbDogc3RyaW5nKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZBTElEQVRFIGZvcm1hdFxuICAgICAgaWYgKCFlbWFpbCB8fCB0eXBlb2YgZW1haWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdFbWFpbCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2ljIGVtYWlsIHBhdHRlcm4gKG1vcmUgbGVuaWVudCBmb3IgaW50ZXJuYXRpb25hbCBkb21haW5zKVxuICAgICAgY29uc3QgZW1haWxQYXR0ZXJuID0gL15bYS16QS1aMC05Ll8rLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Mix9JC87XG5cbiAgICAgIGlmICghZW1haWxQYXR0ZXJuLnRlc3QoZW1haWwpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdJbnZhbGlkIGVtYWlsIGZvcm1hdCcpO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFNBTklUSVpFICh0cmltIGFuZCBsb3dlcmNhc2UpXG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgLy8gUkUtVkFMSURBVEUgYWZ0ZXIgc2FuaXRpemF0aW9uXG4gICAgICBpZiAoIWVtYWlsUGF0dGVybi50ZXN0KHNhbml0aXplZCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ0VtYWlsIGludmFsaWQgYWZ0ZXIgc2FuaXRpemF0aW9uJyk7XG4gICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnMgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgc2FuaXRpemVkVmFsdWU6IHNhbml0aXplZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGVycm9ycy5wdXNoKGVycm9yTWVzc2FnZSk7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzLCB3YXJuaW5ncyB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgVW5pY29kZSBjb250ZW50IHVzaW5nIFVuaWNvZGVWYWxpZGF0b3JcbiAgICpcbiAgICogRGVsZWdhdGVzIHRvIGV4aXN0aW5nIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKCkgdG8gcHJldmVudFxuICAgKiBob21vZ3JhcGggYXR0YWNrcywgZGlyZWN0aW9uIG92ZXJyaWRlIGF0dGFja3MsIGFuZCBvdGhlciBVbmljb2RlLWJhc2VkIGJ5cGFzc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gdGV4dCAtIFRleHQgdG8gbm9ybWFsaXplXG4gICAqIEByZXR1cm5zIFVuaWNvZGUgdmFsaWRhdGlvbiByZXN1bHQgd2l0aCBub3JtYWxpemVkIGNvbnRlbnRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBzZXJ2aWNlLm5vcm1hbGl6ZVVuaWNvZGUoJ3RleHQgd2l0aCB1bmljb2RlJyk7XG4gICAqIGNvbnNvbGUubG9nKHJlc3VsdC5ub3JtYWxpemVkQ29udGVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgbm9ybWFsaXplVW5pY29kZSh0ZXh0OiBzdHJpbmcpOiBVbmljb2RlVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGNvbnRlbnQgZm9yIHNlY3VyaXR5IHRocmVhdHMgdXNpbmcgQ29udGVudFZhbGlkYXRvclxuICAgKlxuICAgKiBEZWxlZ2F0ZXMgdG8gZXhpc3RpbmcgQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKCkgdG8gZGV0ZWN0XG4gICAqIHByb21wdCBpbmplY3Rpb24sIFlBTUwgYm9tYnMsIGNvbW1hbmQgaW5qZWN0aW9uLCBhbmQgb3RoZXIgY29udGVudC1iYXNlZCBhdHRhY2tzLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGVudCAtIENvbnRlbnQgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb250ZW50IHZhbGlkYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBDb250ZW50IHZhbGlkYXRpb24gcmVzdWx0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gc2VydmljZS52YWxpZGF0ZUNvbnRlbnQocGVyc29uYUNvbnRlbnQsIHtcbiAgICogICBza2lwU2l6ZUNoZWNrOiBmYWxzZVxuICAgKiB9KTtcbiAgICpcbiAgICogaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICAgKiAgIGNvbnNvbGUuZXJyb3IoJ1NlY3VyaXR5IHRocmVhdCBkZXRlY3RlZDonLCByZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICB2YWxpZGF0ZUNvbnRlbnQoXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb250ZW50VmFsaWRhdG9yT3B0aW9uc1xuICApOiBDb250ZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGNoYXJhY3RlcnMgaW4gYGlucHV0YCB0aGF0IGRvIG5vdCBtYXRjaCBgY2hhclRlc3RgLlxuICAgKiBSZXR1cm5zIGRlZHVwbGljYXRlZCBsaXN0IG9mIGludmFsaWQgY2hhcmFjdGVycy5cbiAgICovXG4gIHByaXZhdGUgZmluZEludmFsaWRDaGFyYWN0ZXJzKGlucHV0OiBzdHJpbmcsIGNoYXJUZXN0OiBSZWdFeHApOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNoIG9mIGlucHV0KSB7XG4gICAgICBpZiAoIWNoYXJUZXN0LnRlc3QoY2gpICYmICFzZWVuLmhhcyhjaCkpIHtcbiAgICAgICAgc2Vlbi5hZGQoY2gpO1xuICAgICAgICByZXN1bHQucHVzaChjaCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGEgbGlzdCBvZiBjaGFyYWN0ZXJzIGZvciBkaXNwbGF5IGluIGVycm9yIG1lc3NhZ2VzLlxuICAgKiBMYWJlbHMgc3BhY2VzIGFuZCBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnM7IGNhcHMgb3V0cHV0IGF0IDUgdW5pcXVlIGNoYXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRDaGFyTGlzdChjaGFyczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IE1BWF9ESVNQTEFZID0gNTtcbiAgICBjb25zdCBkaXNwbGF5ID0gY2hhcnMuc2xpY2UoMCwgTUFYX0RJU1BMQVkpLm1hcChjaCA9PiB7XG4gICAgICBpZiAoY2ggPT09ICcgJykgcmV0dXJuIFwiJyAnIChzcGFjZSlcIjtcbiAgICAgIGlmIChjaCA9PT0gJ1xcdCcpIHJldHVybiBcIidcXFxcdCcgKHRhYilcIjtcbiAgICAgIGlmIChjaCA9PT0gJ1xcbicpIHJldHVybiBcIidcXFxcbicgKG5ld2xpbmUpXCI7XG4gICAgICBpZiAoY2ggPT09ICdcXHInKSByZXR1cm4gXCInXFxcXHInIChjYXJyaWFnZSByZXR1cm4pXCI7XG4gICAgICAvLyBOb24tcHJpbnRhYmxlOiBzaG93IHVuaWNvZGUgY29kZXBvaW50XG4gICAgICBpZiAoY2guY2hhckNvZGVBdCgwKSA8IDMyIHx8IGNoLmNoYXJDb2RlQXQoMCkgPT09IDEyNykge1xuICAgICAgICByZXR1cm4gYFUrJHtjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnBhZFN0YXJ0KDQsICcwJyl9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJyR7Y2h9J2A7XG4gICAgfSk7XG4gICAgaWYgKGNoYXJzLmxlbmd0aCA+IE1BWF9ESVNQTEFZKSB7XG4gICAgICBkaXNwbGF5LnB1c2goYGFuZCAke2NoYXJzLmxlbmd0aCAtIE1BWF9ESVNQTEFZfSBtb3JlYCk7XG4gICAgfVxuICAgIHJldHVybiBkaXNwbGF5LmpvaW4oJywgJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB3aGljaCBQQVRURVJOX0RFU0NSSVBUSU9OUyBlbnRyeSBhcHBsaWVzIGZvciBJbnB1dFZhbGlkYXRpb25PcHRpb25zLlxuICAgKiBNaXJyb3JzIHRoZSBsb2dpYyBvZiBgZ2V0UGF0dGVybkZvckZpZWxkYC5cbiAgICovXG4gIHByaXZhdGUgZ2V0UGF0dGVybkRlc2NyaXB0aW9uKG9wdGlvbnM6IElucHV0VmFsaWRhdGlvbk9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5jdXN0b21QYXR0ZXJuKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdGlvbkZvclBhdHRlcm4ob3B0aW9ucy5jdXN0b21QYXR0ZXJuKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZmllbGRUeXBlKSB7XG4gICAgICBzd2l0Y2ggKG9wdGlvbnMuZmllbGRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ25hbWUnOiByZXR1cm4gUEFUVEVSTl9ERVNDUklQVElPTlMuU0FGRV9OQU1FO1xuICAgICAgICBjYXNlICdkZXNjcmlwdGlvbic6IHJldHVybiBQQVRURVJOX0RFU0NSSVBUSU9OUy5TQUZFX0RFU0NSSVBUSU9OO1xuICAgICAgICBjYXNlICdjb250ZW50JzogcmV0dXJuIFBBVFRFUk5fREVTQ1JJUFRJT05TLlNBRkVfQ09OVEVOVDtcbiAgICAgICAgY2FzZSAnZmlsZW5hbWUnOiByZXR1cm4gUEFUVEVSTl9ERVNDUklQVElPTlMuU0FGRV9GSUxFTkFNRV9DUkVBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmFsbG93U3BhY2VzXG4gICAgICA/IFBBVFRFUk5fREVTQ1JJUFRJT05TLlNBRkVfTkFNRVxuICAgICAgOiBQQVRURVJOX0RFU0NSSVBUSU9OUy5TQUZFX0ZJTEVOQU1FX0NSRUFURTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnNlLWxvb2t1cCBmcm9tIGEgUmVnRXhwIGluc3RhbmNlIHRvIGl0cyBQQVRURVJOX0RFU0NSSVBUSU9OUyBlbnRyeS5cbiAgICogQ29tcGFyZXMgYnkgc291cmNlK2ZsYWdzLiBSZXR1cm5zIHVuZGVmaW5lZCBmb3IgdW5rbm93biBwYXR0ZXJucy5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGVzY3JpcHRpb25Gb3JQYXR0ZXJuKHBhdHRlcm46IFJlZ0V4cCkge1xuICAgIGNvbnN0IGtleSA9IGAke3BhdHRlcm4uc291cmNlfXwke3BhdHRlcm4uZmxhZ3N9YDtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2cF0gb2YgT2JqZWN0LmVudHJpZXMoVkFMSURBVElPTl9QQVRURVJOUykpIHtcbiAgICAgIGlmIChgJHt2cC5zb3VyY2V9fCR7dnAuZmxhZ3N9YCA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOX0RFU0NSSVBUSU9OU1tuYW1lXSA/PyB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgVmFsaWRhdGlvblNlcnZpY2VcbiAqXG4gKiBVc2UgdGhpcyBpbnN0YW5jZSB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbiB0byBlbnN1cmUgY29uc2lzdGVudFxuICogdmFsaWRhdGlvbiBiZWhhdmlvciBhY3Jvc3MgYWxsIGVsZW1lbnQgbWFuYWdlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9WYWxpZGF0aW9uU2VydmljZSc7XG4gKlxuICogLy8gSW4gYW55IGVsZW1lbnQgbWFuYWdlcjpcbiAqIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQ2F0ZWdvcnkobWV0YWRhdGEuY2F0ZWdvcnkpO1xuICogaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICogICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9ycy5qb2luKCcsICcpKTtcbiAqIH1cbiAqIG1ldGFkYXRhLmNhdGVnb3J5ID0gcmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0aW9uU2VydmljZSA9IG5ldyBWYWxpZGF0aW9uU2VydmljZSgpO1xuIl19
530
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmFsaWRhdGlvblNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUF5RXhGOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQStCRztJQUNILHdCQUF3QixDQUN0QixLQUFhLEVBQ2IsVUFBa0MsRUFBRTtRQUVwQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDO1FBRTVDLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDOUMsQ0FBQztRQUVELDBEQUEwRDtRQUMxRCxv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QixDQUFDLEVBQUUsQ0FBQztZQUM3RCxJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3ZDLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDO1lBQ2pELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWYWxpZGF0aW9uU2VydmljZSAtIENlbnRyYWxpemVkIHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiBmb3IgRG9sbGhvdXNlTUNQXG4gKlxuICogRWxpbWluYXRlcyBkdXBsaWNhdGUgdmFsaWRhdGlvbiBjb2RlIGFjcm9zcyBlbGVtZW50IG1hbmFnZXJzIGJ5IHByb3ZpZGluZ1xuICogYSB1bmlmaWVkIHNlY3VyaXR5LWZpcnN0IHZhbGlkYXRpb24gYXBwcm9hY2guXG4gKlxuICogS2V5IEZlYXR1cmVzOlxuICogLSBTZWN1cml0eS1maXJzdCBwYXR0ZXJuOiB2YWxpZGF0ZSDihpIgc2FuaXRpemUg4oaSIHJlLXZhbGlkYXRlXG4gKiAtIFdyYXBzIGV4aXN0aW5nIHZhbGlkYXRvcnMgKFVuaWNvZGVWYWxpZGF0b3IsIENvbnRlbnRWYWxpZGF0b3IsIHNhbml0aXplSW5wdXQpXG4gKiAtIENvbnNpc3RlbnQgdmFsaWRhdGlvbiBhbGdvcml0aG0gYWNyb3NzIGFsbCBlbGVtZW50IHR5cGVzXG4gKiAtIENvbXByZWhlbnNpdmUgZXJyb3IgcmVwb3J0aW5nIGFuZCBsb2dnaW5nXG4gKiAtIEZ1bGwgVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICpcbiAqIFNlY3VyaXR5IFBhdHRlcm46XG4gKiBUaGUgc2VydmljZSBlbmZvcmNlcyB0aGUgY29ycmVjdCB2YWxpZGF0aW9uIHNlcXVlbmNlIHRvIHByZXZlbnQgc2VjdXJpdHkgYnlwYXNzZXM6XG4gKiAxLiBWQUxJREFURSBpbnB1dCBhZ2FpbnN0IHBhdHRlcm4vcnVsZXMgKHJlamVjdCBtYWxpY2lvdXMgaW5wdXQpXG4gKiAyLiBTQU5JVElaRSBpZiB2YWxpZGF0aW9uIHBhc3NlcyAoY2xlYW4gdXAgaW5wdXQpXG4gKiAzLiBSRS1WQUxJREFURSBzYW5pdGl6ZWQgb3V0cHV0IChlbnN1cmUgc2FuaXRpemF0aW9uIGRpZG4ndCBicmVhayBjb25zdHJhaW50cylcbiAqXG4gKiBXUk9ORyAoY29tbW9uIGJ1Zyk6XG4gKiAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplSW5wdXQoY2F0ZWdvcnkpO1xuICogICBtZXRhZGF0YS5jYXRlZ29yeSA9IHNhbml0aXplZC50b0xvd2VyQ2FzZSgpOyAvLyBObyB2YWxpZGF0aW9uIVxuICpcbiAqIENPUlJFQ1QgKHdoYXQgdGhpcyBzZXJ2aWNlIGVuZm9yY2VzKTpcbiAqICAgaWYgKCFpc1ZhbGlkQ2F0ZWdvcnkoY2F0ZWdvcnkpKSB0aHJvdyBlcnJvcjsgIC8vIFZhbGlkYXRlIEZJUlNUXG4gKiAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplSW5wdXQoY2F0ZWdvcnkpOyAgICAgLy8gVGhlbiBzYW5pdGl6ZVxuICogICBpZiAoIWlzVmFsaWRDYXRlZ29yeShzYW5pdGl6ZWQpKSB0aHJvdyBlcnJvcjsgIC8vIFJlLXZhbGlkYXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9WYWxpZGF0aW9uU2VydmljZSc7XG4gKlxuICogLy8gSGlnaC1sZXZlbCBjb29yZGluYXRlZCB2YWxpZGF0aW9uXG4gKiBjb25zdCByZXN1bHQgPSB2YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQodXNlcklucHV0LCB7XG4gKiAgIG1heExlbmd0aDogMjAwLFxuICogICBhbGxvd1NwYWNlczogdHJ1ZVxuICogfSk7XG4gKlxuICogaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICogICBjb25zb2xlLmVycm9yKHJlc3VsdC5lcnJvcnMpO1xuICogfSBlbHNlIHtcbiAqICAgdXNlKHJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSk7XG4gKiB9XG4gKlxuICogLy8gTWV0YWRhdGEgZmllbGQgdmFsaWRhdGlvblxuICogY29uc3QgY2F0ZWdvcnlSZXN1bHQgPSB2YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUNhdGVnb3J5KCdjcmVhdGl2ZScpO1xuICogY29uc3QgdXNlcm5hbWVSZXN1bHQgPSB2YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZVVzZXJuYW1lKCdqb2huLWRvZScpO1xuICogY29uc3QgZW1haWxSZXN1bHQgPSB2YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUVtYWlsKCd1c2VyQGV4YW1wbGUuY29tJyk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBzYW5pdGl6ZUlucHV0LCB2YWxpZGF0ZUNhdGVnb3J5LCB2YWxpZGF0ZVVzZXJuYW1lIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbnRlbnRWYWxpZGF0b3JPcHRpb25zLCBDb250ZW50VmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFZBTElEQVRJT05fUEFUVEVSTlMsIFBBVFRFUk5fREVTQ1JJUFRJT05TIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcblxuLyoqXG4gKiBGaWVsZCB0eXBlcyBmb3IgdmFsaWRhdGlvbiB3aXRoIGFwcHJvcHJpYXRlIHN0cmljdG5lc3MgbGV2ZWxzXG4gKi9cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25GaWVsZFR5cGUgPSAnbmFtZScgfCAnZGVzY3JpcHRpb24nIHwgJ2NvbnRlbnQnIHwgJ2ZpbGVuYW1lJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBpbnB1dCB2YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXRWYWxpZGF0aW9uT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIGxlbmd0aCBvZiBpbnB1dCAoZGVmYXVsdDogMTAwMCkgKi9cbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAvKiogQWxsb3cgc3BhY2VzIGluIGlucHV0IChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgYWxsb3dTcGFjZXM/OiBib29sZWFuO1xuICAvKiogQ3VzdG9tIHZhbGlkYXRpb24gcGF0dGVybiAob3ZlcnJpZGVzIGRlZmF1bHQpICovXG4gIGN1c3RvbVBhdHRlcm4/OiBSZWdFeHA7XG4gIC8qKiBTa2lwIFVuaWNvZGUgbm9ybWFsaXphdGlvbiAoZGVmYXVsdDogZmFsc2UpICovXG4gIHNraXBVbmljb2RlPzogYm9vbGVhbjtcbiAgLyoqIEZpZWxkIHR5cGUgZm9yIGFwcHJvcHJpYXRlIHZhbGlkYXRpb24gc3RyaWN0bmVzcyAoZGVmYXVsdDogdmFsaWRhdGVzIGJhc2VkIG9uIGFsbG93U3BhY2VzKSAqL1xuICBmaWVsZFR5cGU/OiBWYWxpZGF0aW9uRmllbGRUeXBlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG1ldGFkYXRhIGZpZWxkIHZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWVsZFZhbGlkYXRpb25PcHRpb25zIHtcbiAgLyoqIFdoZXRoZXIgZmllbGQgaXMgcmVxdWlyZWQgKGRlZmF1bHQ6IHRydWUpICovXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgLyoqIE1heGltdW0gZmllbGQgbGVuZ3RoIChkZWZhdWx0OiA1MDApICovXG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgLyoqIEN1c3RvbSB2YWxpZGF0aW9uIHBhdHRlcm4gKi9cbiAgcGF0dGVybj86IFJlZ0V4cDtcbn1cblxuLyoqXG4gKiBHZW5lcmljIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XG4gIC8qKiBXaGV0aGVyIHRoZSBpbnB1dCBwYXNzZWQgYWxsIHZhbGlkYXRpb24gY2hlY2tzICovXG4gIGlzVmFsaWQ6IGJvb2xlYW47XG4gIC8qKiBTYW5pdGl6ZWQgYW5kIHZhbGlkYXRlZCB2YWx1ZSAob25seSBwcmVzZW50IGlmIGlzVmFsaWQgaXMgdHJ1ZSkgKi9cbiAgc2FuaXRpemVkVmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBMaXN0IG9mIHZhbGlkYXRpb24gZXJyb3JzIChvbmx5IHByZXNlbnQgaWYgaXNWYWxpZCBpcyBmYWxzZSkgKi9cbiAgZXJyb3JzPzogc3RyaW5nW107XG4gIC8qKiBMaXN0IG9mIHZhbGlkYXRpb24gd2FybmluZ3MgKG5vbi1mYXRhbCBpc3N1ZXMpICovXG4gIHdhcm5pbmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRmllbGQtc3BlY2lmaWMgdmFsaWRhdGlvbiByZXN1bHQgd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRWYWxpZGF0aW9uUmVzdWx0IGV4dGVuZHMgVmFsaWRhdGlvblJlc3VsdCB7XG4gIC8qKiBPcmlnaW5hbCBmaWVsZCBuYW1lIHRoYXQgd2FzIHZhbGlkYXRlZCAqL1xuICBmaWVsZE5hbWU/OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCB3YXMgZW1wdHkgYmVmb3JlIHZhbGlkYXRpb24gKi9cbiAgd2FzRW1wdHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlc3VsdCBmcm9tIFVuaWNvZGUgdmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaWNvZGVWYWxpZGF0aW9uUmVzdWx0IHtcbiAgLyoqIFdoZXRoZXIgdGhlIFVuaWNvZGUgY29udGVudCBpcyB2YWxpZCAqL1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICAvKiogTm9ybWFsaXplZCBVbmljb2RlIGNvbnRlbnQgKi9cbiAgbm9ybWFsaXplZENvbnRlbnQ6IHN0cmluZztcbiAgLyoqIERldGVjdGVkIFVuaWNvZGUgaXNzdWVzICovXG4gIGRldGVjdGVkSXNzdWVzPzogc3RyaW5nW107XG4gIC8qKiBTZXZlcml0eSBvZiBkZXRlY3RlZCBpc3N1ZXMgKi9cbiAgc2V2ZXJpdHk/OiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ2NyaXRpY2FsJztcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGZvciB2YWxpZGF0aW5nIGFuZCBzYW5pdGl6aW5nIGlucHV0IGFjcm9zcyBhbGwgZWxlbWVudCB0eXBlc1xuICpcbiAqIFRoaXMgc2VydmljZSBwcm92aWRlcyBjZW50cmFsaXplZCB2YWxpZGF0aW9uIHRvIGVsaW1pbmF0ZSBjb2RlIGR1cGxpY2F0aW9uXG4gKiBhbmQgZW5mb3JjZSB0aGUgc2VjdXJpdHktZmlyc3QgdmFsaWRhdGlvbiBwYXR0ZXJuIGFjcm9zcyB0aGUgY29kZWJhc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uU2VydmljZSB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgZ2VuZXJhbCBpbnB1dCB3aXRoIHNhbml0aXplLXRoZW4tdmFsaWRhdGUgYXBwcm9hY2hcbiAgICpcbiAgICogVmFsaWRhdGlvbiBwcm9jZXNzOlxuICAgKiAxLiBDaGVjayBmb3IgZW1wdHkvbnVsbCBpbnB1dFxuICAgKiAyLiBTQU5JVElaRSBpbnB1dCBmaXJzdCAocmVtb3ZlIGNvbnRyb2wgY2hhcnMsIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLCBkYW5nZXJvdXMgcGF0dGVybnMpXG4gICAqIDMuIE5vcm1hbGl6ZSBVbmljb2RlIGlmIGVuYWJsZWQgKGNvbnZlcnQgY29uZnVzYWJsZXMsIHJlbW92ZSB6ZXJvLXdpZHRoKVxuICAgKiA0LiBWQUxJREFURSB0aGUgY2xlYW5lZCByZXN1bHQgYWdhaW5zdCBmaWVsZC1hcHByb3ByaWF0ZSBwYXR0ZXJuXG4gICAqIDUuIExvZyBhbnkgc2VjdXJpdHkgaXNzdWVzIGRldGVjdGVkXG4gICAqXG4gICAqIFRoaXMgYXBwcm9hY2ggYWxsb3dzIGxlZ2l0aW1hdGUgVW5pY29kZSBjb250ZW50IChsaWtlIFwiQ2FmZSBBc3Npc3RhbnRcIikgdG8gcGFzc1xuICAgKiB3aGlsZSBzdGlsbCBibG9ja2luZyBzZWN1cml0eSB0aHJlYXRzIGFmdGVyIHRoZXkndmUgYmVlbiBub3JtYWxpemVkL3Nhbml0aXplZC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gUmF3IGlucHV0IHN0cmluZyB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFZhbGlkYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHNhbml0aXplZCB2YWx1ZSBvciBlcnJvcnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBzZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dCgndXNlci1pbnB1dCcsIHtcbiAgICogICBtYXhMZW5ndGg6IDEwMCxcbiAgICogICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICogICBmaWVsZFR5cGU6ICduYW1lJ1xuICAgKiB9KTtcbiAgICpcbiAgICogaWYgKHJlc3VsdC5pc1ZhbGlkKSB7XG4gICAqICAgY29uc29sZS5sb2coJ0NsZWFuIGlucHV0OicsIHJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSk7XG4gICAqIH0gZWxzZSB7XG4gICAqICAgY29uc29sZS5lcnJvcignVmFsaWRhdGlvbiBmYWlsZWQ6JywgcmVzdWx0LmVycm9ycyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICB2YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgaW5wdXQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBJbnB1dFZhbGlkYXRpb25PcHRpb25zID0ge31cbiAgKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG1heExlbmd0aCA9IG9wdGlvbnMubWF4TGVuZ3RoID8/IDEwMDA7XG5cbiAgICAvLyBTdGVwIDE6IENoZWNrIGZvciBlbXB0eS9udWxsIGlucHV0XG4gICAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcnMucHVzaCgnSW5wdXQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnMsIHdhcm5pbmdzIH07XG4gICAgfVxuXG4gICAgLy8gU3RlcCAyOiBTQU5JVElaRSB0aGUgaW5wdXQgZmlyc3QgKHJlbW92ZSBrbm93biB0aHJlYXRzKVxuICAgIC8vIFRoaXMgcmVtb3ZlcyBjb250cm9sIGNoYXJzLCBzaGVsbCBtZXRhY2hhcmFjdGVycywgSFRNTCB0YWdzLCBldGMuXG4gICAgbGV0IGNsZWFuZWQgPSBzYW5pdGl6ZUlucHV0KGlucHV0LCBtYXhMZW5ndGgpO1xuXG4gICAgLy8gU3RlcCAzOiBVbmljb2RlIG5vcm1hbGl6YXRpb24gKGlmIG5vdCBza2lwcGVkKVxuICAgIGlmICghb3B0aW9ucy5za2lwVW5pY29kZSkge1xuICAgICAgY29uc3QgdW5pY29kZVJlc3VsdCA9IHRoaXMubm9ybWFsaXplVW5pY29kZShjbGVhbmVkKTtcbiAgICAgIGNsZWFuZWQgPSB1bmljb2RlUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuXG4gICAgICBpZiAoIXVuaWNvZGVSZXN1bHQuaXNWYWxpZCAmJiB1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzKSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goLi4udW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcy5tYXAoaXNzdWUgPT4gYFVuaWNvZGU6ICR7aXNzdWV9YCkpO1xuXG4gICAgICAgIC8vIExvZyBoaWdoL2NyaXRpY2FsIFVuaWNvZGUgaXNzdWVzXG4gICAgICAgIGlmICh1bmljb2RlUmVzdWx0LnNldmVyaXR5ID09PSAnaGlnaCcgfHwgdW5pY29kZVJlc3VsdC5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICAgICAgc2V2ZXJpdHk6IHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHkudG9VcHBlckNhc2UoKSBhcyAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICAgICAgc291cmNlOiAndmFsaWRhdGlvbl9zZXJ2aWNlJyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBVbmljb2RlIHZhbGlkYXRpb24gZGV0ZWN0ZWQ6ICR7dW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGVwIDQ6IENoZWNrIGlmIGVtcHR5IGFmdGVyIHNhbml0aXphdGlvblxuICAgIGlmICghY2xlYW5lZCB8fCBjbGVhbmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXJyb3JzLnB1c2goJ0lucHV0IGlzIGVtcHR5IGFmdGVyIHNhbml0aXphdGlvbicpO1xuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycywgd2FybmluZ3MgfTtcbiAgICB9XG5cbiAgICAvLyBTdGVwIDU6IFZBTElEQVRFIHRoZSBjbGVhbmVkIHJlc3VsdCBhZ2FpbnN0IGZpZWxkLWFwcHJvcHJpYXRlIHBhdHRlcm5cbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5nZXRQYXR0ZXJuRm9yRmllbGQob3B0aW9ucyk7XG5cbiAgICBpZiAoIXBhdHRlcm4udGVzdChjbGVhbmVkKSkge1xuICAgICAgY29uc3QgZGVzYyA9IHRoaXMuZ2V0UGF0dGVybkRlc2NyaXB0aW9uKG9wdGlvbnMpO1xuICAgICAgY29uc3QgaW52YWxpZENoYXJzID0gZGVzYyA/IHRoaXMuZmluZEludmFsaWRDaGFyYWN0ZXJzKGNsZWFuZWQsIGRlc2MuY2hhclRlc3QpIDogW107XG4gICAgICBjb25zdCBjaGFyRGV0YWlsID0gaW52YWxpZENoYXJzLmxlbmd0aCA+IDAgPyBgOiAke3RoaXMuZm9ybWF0Q2hhckxpc3QoaW52YWxpZENoYXJzKX1gIDogJyc7XG4gICAgICBjb25zdCBhbGxvd2VkRGV0YWlsID0gZGVzYyA/IGAuIEFsbG93ZWQ6ICR7ZGVzYy5hbGxvd2VkfWAgOiAnJztcbiAgICAgIGNvbnN0IHN0cnVjdERldGFpbCA9IGRlc2M/LnN0cnVjdHVyYWwgPyBgICgke2Rlc2Muc3RydWN0dXJhbH0pYCA6ICcnO1xuICAgICAgZXJyb3JzLnB1c2goYElucHV0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyR7Y2hhckRldGFpbH0ke2FsbG93ZWREZXRhaWx9JHtzdHJ1Y3REZXRhaWx9YCk7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzLCB3YXJuaW5ncyB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRpb24gc3VjY2VzcyBpcyB0aGUgbm9ybWFsIHBhdGgg4oCUIG9ubHkgZmFpbHVyZXMgbmVlZCBsb2dnaW5nLlxuICAgIC8vIEZhaWx1cmVzIHRocm93IGVycm9ycyB3aXRoIGZ1bGwgY29udGV4dCB1cHN0cmVhbS5cblxuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgc2FuaXRpemVkVmFsdWU6IGNsZWFuZWQsXG4gICAgICB3YXJuaW5nczogd2FybmluZ3MubGVuZ3RoID4gMCA/IHdhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcHByb3ByaWF0ZSB2YWxpZGF0aW9uIHBhdHRlcm4gZm9yIGEgZmllbGQgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIElucHV0IHZhbGlkYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBSZWdFeHAgcGF0dGVybiBhcHByb3ByaWF0ZSBmb3IgdGhlIGZpZWxkIHR5cGVcbiAgICovXG4gIHByaXZhdGUgZ2V0UGF0dGVybkZvckZpZWxkKG9wdGlvbnM6IElucHV0VmFsaWRhdGlvbk9wdGlvbnMpOiBSZWdFeHAge1xuICAgIC8vIElmIGN1c3RvbSBwYXR0ZXJuIHByb3ZpZGVkLCB1c2UgaXRcbiAgICBpZiAob3B0aW9ucy5jdXN0b21QYXR0ZXJuKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5jdXN0b21QYXR0ZXJuO1xuICAgIH1cblxuICAgIC8vIFVzZSBmaWVsZCB0eXBlIGlmIHNwZWNpZmllZFxuICAgIGlmIChvcHRpb25zLmZpZWxkVHlwZSkge1xuICAgICAgc3dpdGNoIChvcHRpb25zLmZpZWxkVHlwZSkge1xuICAgICAgICBjYXNlICduYW1lJzpcbiAgICAgICAgICByZXR1cm4gVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX05BTUU7XG4gICAgICAgIGNhc2UgJ2Rlc2NyaXB0aW9uJzpcbiAgICAgICAgICByZXR1cm4gVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0RFU0NSSVBUSU9OO1xuICAgICAgICBjYXNlICdjb250ZW50JzpcbiAgICAgICAgICByZXR1cm4gVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0NPTlRFTlQ7XG4gICAgICAgIGNhc2UgJ2ZpbGVuYW1lJzpcbiAgICAgICAgICByZXR1cm4gVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0ZJTEVOQU1FX0NSRUFURTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gYWxsb3dTcGFjZXMtYmFzZWQgcGF0dGVybiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIHJldHVybiBvcHRpb25zLmFsbG93U3BhY2VzXG4gICAgICA/IFZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9OQU1FICAvLyBOYW1lcy9kZXNjcmlwdGlvbnMgYWxsb3cgc3BhY2VzIGFuZCBVbmljb2RlXG4gICAgICA6IFZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9GSUxFTkFNRV9DUkVBVEU7ICAvLyBObyBzcGFjZXMgPSBzdHJpY3RlciBmaWxlbmFtZSBwYXR0ZXJuXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBtZXRhZGF0YSBmaWVsZCB3aXRoIHNhbml0aXplLXRoZW4tdmFsaWRhdGUgYXBwcm9hY2hcbiAgICpcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIE5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHZhbGlkYXRlZFxuICAgKiBAcGFyYW0gdmFsdWUgLSBGaWVsZCB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEZpZWxkIHZhbGlkYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBGaWVsZCB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IHNlcnZpY2UudmFsaWRhdGVNZXRhZGF0YUZpZWxkKCdjYXRlZ29yeScsICdjcmVhdGl2ZScsIHtcbiAgICogICByZXF1aXJlZDogdHJ1ZSxcbiAgICogICBtYXhMZW5ndGg6IDUwXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHZhbGlkYXRlTWV0YWRhdGFGaWVsZChcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBvcHRpb25zOiBGaWVsZFZhbGlkYXRpb25PcHRpb25zID0ge31cbiAgKTogRmllbGRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVxdWlyZWQgPSBvcHRpb25zLnJlcXVpcmVkID8/IHRydWU7XG4gICAgY29uc3QgbWF4TGVuZ3RoID0gb3B0aW9ucy5tYXhMZW5ndGggPz8gNTAwO1xuXG4gICAgLy8gQ2hlY2sgaWYgdmFsdWUgaXMgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICBlcnJvcnMucHVzaChgJHtmaWVsZE5hbWV9OiBNdXN0IGJlIGEgc3RyaW5nIChnb3QgJHt0eXBlb2YgdmFsdWV9KWApO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzLCB3YXJuaW5ncywgZmllbGROYW1lIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlLCBmaWVsZE5hbWUsIHdhc0VtcHR5OiB0cnVlIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZW1wdHlcbiAgICBjb25zdCB3YXNFbXB0eSA9IHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgaWYgKHdhc0VtcHR5ICYmIHJlcXVpcmVkKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHtmaWVsZE5hbWV9OiBSZXF1aXJlZCBmaWVsZCBjYW5ub3QgYmUgZW1wdHlgKTtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnMsIHdhcm5pbmdzLCBmaWVsZE5hbWUsIHdhc0VtcHR5IH07XG4gICAgfVxuXG4gICAgaWYgKHdhc0VtcHR5ICYmICFyZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSwgZmllbGROYW1lLCB3YXNFbXB0eSB9O1xuICAgIH1cblxuICAgIC8vIExlbmd0aCBjaGVja1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgIGVycm9ycy5wdXNoKGAke2ZpZWxkTmFtZX06IEV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHttYXhMZW5ndGh9IGNoYXJhY3RlcnNgKTtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnMsIHdhcm5pbmdzLCBmaWVsZE5hbWUgfTtcbiAgICB9XG5cbiAgICAvLyBTQU5JVElaRSBmaXJzdCAocmVtb3ZlIGtub3duIHRocmVhdHMpXG4gICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVJbnB1dCh2YWx1ZSwgbWF4TGVuZ3RoKTtcblxuICAgIC8vIENoZWNrIGlmIGVtcHR5IGFmdGVyIHNhbml0aXphdGlvblxuICAgIGlmICghc2FuaXRpemVkIHx8IHNhbml0aXplZC5sZW5ndGggPT09IDApIHtcbiAgICAgIGVycm9ycy5wdXNoKGAke2ZpZWxkTmFtZX06IEVtcHR5IGFmdGVyIHNhbml0aXphdGlvbmApO1xuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycywgd2FybmluZ3MsIGZpZWxkTmFtZSB9O1xuICAgIH1cblxuICAgIC8vIFZBTElEQVRFIHRoZSBzYW5pdGl6ZWQgcmVzdWx0XG4gICAgLy8gVXNlIHByb3ZpZGVkIHBhdHRlcm4gb3IgZGVmYXVsdCB0byBTQUZFX05BTUUgd2hpY2ggYWxsb3dzIFVuaWNvZGUgbGV0dGVyc1xuICAgIGNvbnN0IHBhdHRlcm4gPSBvcHRpb25zLnBhdHRlcm4gPz8gVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX05BTUU7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3Qoc2FuaXRpemVkKSkge1xuICAgICAgY29uc3QgZGVzYyA9IHRoaXMuZ2V0RGVzY3JpcHRpb25Gb3JQYXR0ZXJuKHBhdHRlcm4pO1xuICAgICAgY29uc3QgaW52YWxpZENoYXJzID0gZGVzYyA/IHRoaXMuZmluZEludmFsaWRDaGFyYWN0ZXJzKHNhbml0aXplZCwgZGVzYy5jaGFyVGVzdCkgOiBbXTtcbiAgICAgIGNvbnN0IGNoYXJEZXRhaWwgPSBpbnZhbGlkQ2hhcnMubGVuZ3RoID4gMCA/IGA6ICR7dGhpcy5mb3JtYXRDaGFyTGlzdChpbnZhbGlkQ2hhcnMpfWAgOiAnJztcbiAgICAgIGNvbnN0IGFsbG93ZWREZXRhaWwgPSBkZXNjID8gYC4gQWxsb3dlZDogJHtkZXNjLmFsbG93ZWR9YCA6ICcnO1xuICAgICAgZXJyb3JzLnB1c2goYCR7ZmllbGROYW1lfTogQ29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzJHtjaGFyRGV0YWlsfSR7YWxsb3dlZERldGFpbH1gKTtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnMsIHdhcm5pbmdzLCBmaWVsZE5hbWUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgIHNhbml0aXplZFZhbHVlOiBzYW5pdGl6ZWQsXG4gICAgICB3YXJuaW5nczogd2FybmluZ3MubGVuZ3RoID4gMCA/IHdhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgICAgZmllbGROYW1lLFxuICAgICAgd2FzRW1wdHksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGNhdGVnb3J5IGZpZWxkXG4gICAqXG4gICAqIEVuZm9yY2VzIHNlY3VyaXR5LWZpcnN0IHBhdHRlcm46XG4gICAqIDEuIFZhbGlkYXRlIGZvcm1hdCAobG93ZXJjYXNlIGxldHRlcnMgYW5kIGh5cGhlbnMgb25seSlcbiAgICogMi4gU2FuaXRpemUgaW5wdXRcbiAgICogMy4gUmUtdmFsaWRhdGUgc2FuaXRpemVkIG91dHB1dFxuICAgKlxuICAgKiBAcGFyYW0gY2F0ZWdvcnkgLSBDYXRlZ29yeSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBzYW5pdGl6ZWQgY2F0ZWdvcnlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBzZXJ2aWNlLnZhbGlkYXRlQ2F0ZWdvcnkoJ2NyZWF0aXZlJyk7XG4gICAqIGlmIChyZXN1bHQuaXNWYWxpZCkge1xuICAgKiAgIG1ldGFkYXRhLmNhdGVnb3J5ID0gcmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgdmFsaWRhdGVDYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZBTElEQVRFIGJlZm9yZSBzYW5pdGl6YXRpb25cbiAgICAgIGlmICghY2F0ZWdvcnkgfHwgdHlwZW9mIGNhdGVnb3J5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBlcnJvcnMucHVzaCgnQ2F0ZWdvcnkgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIVZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9DQVRFR09SWS50ZXN0KGNhdGVnb3J5KSkge1xuICAgICAgICBjb25zdCBkZXNjID0gUEFUVEVSTl9ERVNDUklQVElPTlMuU0FGRV9DQVRFR09SWTtcbiAgICAgICAgY29uc3QgaW52YWxpZENoYXJzID0gdGhpcy5maW5kSW52YWxpZENoYXJhY3RlcnMoY2F0ZWdvcnksIGRlc2MuY2hhclRlc3QpO1xuICAgICAgICBjb25zdCBjaGFyRGV0YWlsID0gaW52YWxpZENoYXJzLmxlbmd0aCA+IDAgPyBgOiAke3RoaXMuZm9ybWF0Q2hhckxpc3QoaW52YWxpZENoYXJzKX1gIDogJyc7XG4gICAgICAgIGNvbnN0IHN0cnVjdERldGFpbCA9IGRlc2Muc3RydWN0dXJhbCA/IGAgKCR7ZGVzYy5zdHJ1Y3R1cmFsfSlgIDogJyc7XG4gICAgICAgIGVycm9ycy5wdXNoKGBDYXRlZ29yeSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMke2NoYXJEZXRhaWx9LiBBbGxvd2VkOiAke2Rlc2MuYWxsb3dlZH0ke3N0cnVjdERldGFpbH1gKTtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBTQU5JVElaRSB1c2luZyBleGlzdGluZyB2YWxpZGF0b3IgKHdoaWNoIGFsc28gdmFsaWRhdGVzIGZvcm1hdClcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IHZhbGlkYXRlQ2F0ZWdvcnkoY2F0ZWdvcnkpO1xuXG4gICAgICAvLyBSRS1WQUxJREFURSBpcyBkb25lIGluc2lkZSB2YWxpZGF0ZUNhdGVnb3J5KClcbiAgICAgIC8vIFRoZSBmdW5jdGlvbiB0aHJvd3MgaWYgZm9ybWF0IGlzIGludmFsaWQsIHNvIGlmIHdlIGdldCBoZXJlLCBpdCdzIHZhbGlkXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIHNhbml0aXplZFZhbHVlOiBzYW5pdGl6ZWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBlcnJvcnMucHVzaChlcnJvck1lc3NhZ2UpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICd2YWxpZGF0aW9uX3NlcnZpY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQ2F0ZWdvcnkgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycywgd2FybmluZ3MgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSB1c2VybmFtZSBmaWVsZFxuICAgKlxuICAgKiBAcGFyYW0gdXNlcm5hbWUgLSBVc2VybmFtZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBzYW5pdGl6ZWQgdXNlcm5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBzZXJ2aWNlLnZhbGlkYXRlVXNlcm5hbWUoJ2pvaG4tZG9lJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgdmFsaWRhdGVVc2VybmFtZSh1c2VybmFtZTogc3RyaW5nKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZBTElEQVRFIGJlZm9yZSBzYW5pdGl6YXRpb25cbiAgICAgIGlmICghdXNlcm5hbWUgfHwgdHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICBlcnJvcnMucHVzaCgnVXNlcm5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIVZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9VU0VSTkFNRS50ZXN0KHVzZXJuYW1lKSkge1xuICAgICAgICBjb25zdCBkZXNjID0gUEFUVEVSTl9ERVNDUklQVElPTlMuU0FGRV9VU0VSTkFNRTtcbiAgICAgICAgY29uc3QgaW52YWxpZENoYXJzID0gdGhpcy5maW5kSW52YWxpZENoYXJhY3RlcnModXNlcm5hbWUsIGRlc2MuY2hhclRlc3QpO1xuICAgICAgICBjb25zdCBjaGFyRGV0YWlsID0gaW52YWxpZENoYXJzLmxlbmd0aCA+IDAgPyBgOiAke3RoaXMuZm9ybWF0Q2hhckxpc3QoaW52YWxpZENoYXJzKX1gIDogJyc7XG4gICAgICAgIGNvbnN0IHN0cnVjdERldGFpbCA9IGRlc2Muc3RydWN0dXJhbCA/IGAgKCR7ZGVzYy5zdHJ1Y3R1cmFsfSlgIDogJyc7XG4gICAgICAgIGVycm9ycy5wdXNoKGBVc2VybmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMke2NoYXJEZXRhaWx9LiBBbGxvd2VkOiAke2Rlc2MuYWxsb3dlZH0ke3N0cnVjdERldGFpbH1gKTtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBTQU5JVElaRSB1c2luZyBleGlzdGluZyB2YWxpZGF0b3IgKHdoaWNoIGFsc28gdmFsaWRhdGVzKVxuICAgICAgY29uc3Qgc2FuaXRpemVkID0gdmFsaWRhdGVVc2VybmFtZSh1c2VybmFtZSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIHNhbml0aXplZFZhbHVlOiBzYW5pdGl6ZWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBlcnJvcnMucHVzaChlcnJvck1lc3NhZ2UpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICd2YWxpZGF0aW9uX3NlcnZpY2UnLFxuICAgICAgICBkZXRhaWxzOiBgVXNlcm5hbWUgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9ycywgd2FybmluZ3MgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gZW1haWwgYWRkcmVzc1xuICAgKlxuICAgKiBAcGFyYW0gZW1haWwgLSBFbWFpbCBhZGRyZXNzIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggc2FuaXRpemVkIGVtYWlsXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gc2VydmljZS52YWxpZGF0ZUVtYWlsKCd1c2VyQGV4YW1wbGUuY29tJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgdmFsaWRhdGVFbWFpbChlbWFpbDogc3RyaW5nKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZBTElEQVRFIGZvcm1hdFxuICAgICAgaWYgKCFlbWFpbCB8fCB0eXBlb2YgZW1haWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdFbWFpbCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2ljIGVtYWlsIHBhdHRlcm4gKG1vcmUgbGVuaWVudCBmb3IgaW50ZXJuYXRpb25hbCBkb21haW5zKVxuICAgICAgY29uc3QgZW1haWxQYXR0ZXJuID0gL15bYS16QS1aMC05Ll8rLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Mix9JC87XG5cbiAgICAgIGlmICghZW1haWxQYXR0ZXJuLnRlc3QoZW1haWwpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdJbnZhbGlkIGVtYWlsIGZvcm1hdCcpO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFNBTklUSVpFICh0cmltIGFuZCBsb3dlcmNhc2UpXG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBlbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgLy8gUkUtVkFMSURBVEUgYWZ0ZXIgc2FuaXRpemF0aW9uXG4gICAgICBpZiAoIWVtYWlsUGF0dGVybi50ZXN0KHNhbml0aXplZCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ0VtYWlsIGludmFsaWQgYWZ0ZXIgc2FuaXRpemF0aW9uJyk7XG4gICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcnMgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgc2FuaXRpemVkVmFsdWU6IHNhbml0aXplZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGVycm9ycy5wdXNoKGVycm9yTWVzc2FnZSk7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzLCB3YXJuaW5ncyB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgVW5pY29kZSBjb250ZW50IHVzaW5nIFVuaWNvZGVWYWxpZGF0b3JcbiAgICpcbiAgICogRGVsZWdhdGVzIHRvIGV4aXN0aW5nIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKCkgdG8gcHJldmVudFxuICAgKiBob21vZ3JhcGggYXR0YWNrcywgZGlyZWN0aW9uIG92ZXJyaWRlIGF0dGFja3MsIGFuZCBvdGhlciBVbmljb2RlLWJhc2VkIGJ5cGFzc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gdGV4dCAtIFRleHQgdG8gbm9ybWFsaXplXG4gICAqIEByZXR1cm5zIFVuaWNvZGUgdmFsaWRhdGlvbiByZXN1bHQgd2l0aCBub3JtYWxpemVkIGNvbnRlbnRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBzZXJ2aWNlLm5vcm1hbGl6ZVVuaWNvZGUoJ3RleHQgd2l0aCB1bmljb2RlJyk7XG4gICAqIGNvbnNvbGUubG9nKHJlc3VsdC5ub3JtYWxpemVkQ29udGVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgbm9ybWFsaXplVW5pY29kZSh0ZXh0OiBzdHJpbmcpOiBVbmljb2RlVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGNvbnRlbnQgZm9yIHNlY3VyaXR5IHRocmVhdHMgdXNpbmcgQ29udGVudFZhbGlkYXRvclxuICAgKlxuICAgKiBEZWxlZ2F0ZXMgdG8gZXhpc3RpbmcgQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKCkgdG8gZGV0ZWN0XG4gICAqIHByb21wdCBpbmplY3Rpb24sIFlBTUwgYm9tYnMsIGNvbW1hbmQgaW5qZWN0aW9uLCBhbmQgb3RoZXIgY29udGVudC1iYXNlZCBhdHRhY2tzLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGVudCAtIENvbnRlbnQgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb250ZW50IHZhbGlkYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBDb250ZW50IHZhbGlkYXRpb24gcmVzdWx0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gc2VydmljZS52YWxpZGF0ZUNvbnRlbnQocGVyc29uYUNvbnRlbnQsIHtcbiAgICogICBza2lwU2l6ZUNoZWNrOiBmYWxzZVxuICAgKiB9KTtcbiAgICpcbiAgICogaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICAgKiAgIGNvbnNvbGUuZXJyb3IoJ1NlY3VyaXR5IHRocmVhdCBkZXRlY3RlZDonLCByZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICB2YWxpZGF0ZUNvbnRlbnQoXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb250ZW50VmFsaWRhdG9yT3B0aW9uc1xuICApOiBDb250ZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGNoYXJhY3RlcnMgaW4gYGlucHV0YCB0aGF0IGRvIG5vdCBtYXRjaCBgY2hhclRlc3RgLlxuICAgKiBSZXR1cm5zIGRlZHVwbGljYXRlZCBsaXN0IG9mIGludmFsaWQgY2hhcmFjdGVycy5cbiAgICovXG4gIHByaXZhdGUgZmluZEludmFsaWRDaGFyYWN0ZXJzKGlucHV0OiBzdHJpbmcsIGNoYXJUZXN0OiBSZWdFeHApOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNoIG9mIGlucHV0KSB7XG4gICAgICBpZiAoIWNoYXJUZXN0LnRlc3QoY2gpICYmICFzZWVuLmhhcyhjaCkpIHtcbiAgICAgICAgc2Vlbi5hZGQoY2gpO1xuICAgICAgICByZXN1bHQucHVzaChjaCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGEgbGlzdCBvZiBjaGFyYWN0ZXJzIGZvciBkaXNwbGF5IGluIGVycm9yIG1lc3NhZ2VzLlxuICAgKiBMYWJlbHMgc3BhY2VzIGFuZCBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnM7IGNhcHMgb3V0cHV0IGF0IDUgdW5pcXVlIGNoYXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRDaGFyTGlzdChjaGFyczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IE1BWF9ESVNQTEFZID0gNTtcbiAgICBjb25zdCBkaXNwbGF5ID0gY2hhcnMuc2xpY2UoMCwgTUFYX0RJU1BMQVkpLm1hcChjaCA9PiB7XG4gICAgICBpZiAoY2ggPT09ICcgJykgcmV0dXJuIFwiJyAnIChzcGFjZSlcIjtcbiAgICAgIGlmIChjaCA9PT0gJ1xcdCcpIHJldHVybiBcIidcXFxcdCcgKHRhYilcIjtcbiAgICAgIGlmIChjaCA9PT0gJ1xcbicpIHJldHVybiBcIidcXFxcbicgKG5ld2xpbmUpXCI7XG4gICAgICBpZiAoY2ggPT09ICdcXHInKSByZXR1cm4gXCInXFxcXHInIChjYXJyaWFnZSByZXR1cm4pXCI7XG4gICAgICAvLyBOb24tcHJpbnRhYmxlOiBzaG93IHVuaWNvZGUgY29kZXBvaW50XG4gICAgICBpZiAoY2guY2hhckNvZGVBdCgwKSA8IDMyIHx8IGNoLmNoYXJDb2RlQXQoMCkgPT09IDEyNykge1xuICAgICAgICByZXR1cm4gYFUrJHtjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnBhZFN0YXJ0KDQsICcwJyl9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJyR7Y2h9J2A7XG4gICAgfSk7XG4gICAgaWYgKGNoYXJzLmxlbmd0aCA+IE1BWF9ESVNQTEFZKSB7XG4gICAgICBkaXNwbGF5LnB1c2goYGFuZCAke2NoYXJzLmxlbmd0aCAtIE1BWF9ESVNQTEFZfSBtb3JlYCk7XG4gICAgfVxuICAgIHJldHVybiBkaXNwbGF5LmpvaW4oJywgJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB3aGljaCBQQVRURVJOX0RFU0NSSVBUSU9OUyBlbnRyeSBhcHBsaWVzIGZvciBJbnB1dFZhbGlkYXRpb25PcHRpb25zLlxuICAgKiBNaXJyb3JzIHRoZSBsb2dpYyBvZiBgZ2V0UGF0dGVybkZvckZpZWxkYC5cbiAgICovXG4gIHByaXZhdGUgZ2V0UGF0dGVybkRlc2NyaXB0aW9uKG9wdGlvbnM6IElucHV0VmFsaWRhdGlvbk9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5jdXN0b21QYXR0ZXJuKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdGlvbkZvclBhdHRlcm4ob3B0aW9ucy5jdXN0b21QYXR0ZXJuKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZmllbGRUeXBlKSB7XG4gICAgICBzd2l0Y2ggKG9wdGlvbnMuZmllbGRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ25hbWUnOiByZXR1cm4gUEFUVEVSTl9ERVNDUklQVElPTlMuU0FGRV9OQU1FO1xuICAgICAgICBjYXNlICdkZXNjcmlwdGlvbic6IHJldHVybiBQQVRURVJOX0RFU0NSSVBUSU9OUy5TQUZFX0RFU0NSSVBUSU9OO1xuICAgICAgICBjYXNlICdjb250ZW50JzogcmV0dXJuIFBBVFRFUk5fREVTQ1JJUFRJT05TLlNBRkVfQ09OVEVOVDtcbiAgICAgICAgY2FzZSAnZmlsZW5hbWUnOiByZXR1cm4gUEFUVEVSTl9ERVNDUklQVElPTlMuU0FGRV9GSUxFTkFNRV9DUkVBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmFsbG93U3BhY2VzXG4gICAgICA/IFBBVFRFUk5fREVTQ1JJUFRJT05TLlNBRkVfTkFNRVxuICAgICAgOiBQQVRURVJOX0RFU0NSSVBUSU9OUy5TQUZFX0ZJTEVOQU1FX0NSRUFURTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnNlLWxvb2t1cCBmcm9tIGEgUmVnRXhwIGluc3RhbmNlIHRvIGl0cyBQQVRURVJOX0RFU0NSSVBUSU9OUyBlbnRyeS5cbiAgICogQ29tcGFyZXMgYnkgc291cmNlK2ZsYWdzLiBSZXR1cm5zIHVuZGVmaW5lZCBmb3IgdW5rbm93biBwYXR0ZXJucy5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGVzY3JpcHRpb25Gb3JQYXR0ZXJuKHBhdHRlcm46IFJlZ0V4cCkge1xuICAgIGNvbnN0IGtleSA9IGAke3BhdHRlcm4uc291cmNlfXwke3BhdHRlcm4uZmxhZ3N9YDtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2cF0gb2YgT2JqZWN0LmVudHJpZXMoVkFMSURBVElPTl9QQVRURVJOUykpIHtcbiAgICAgIGlmIChgJHt2cC5zb3VyY2V9fCR7dnAuZmxhZ3N9YCA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOX0RFU0NSSVBUSU9OU1tuYW1lXSA/PyB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgVmFsaWRhdGlvblNlcnZpY2VcbiAqXG4gKiBVc2UgdGhpcyBpbnN0YW5jZSB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbiB0byBlbnN1cmUgY29uc2lzdGVudFxuICogdmFsaWRhdGlvbiBiZWhhdmlvciBhY3Jvc3MgYWxsIGVsZW1lbnQgbWFuYWdlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9WYWxpZGF0aW9uU2VydmljZSc7XG4gKlxuICogLy8gSW4gYW55IGVsZW1lbnQgbWFuYWdlcjpcbiAqIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQ2F0ZWdvcnkobWV0YWRhdGEuY2F0ZWdvcnkpO1xuICogaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICogICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9ycy5qb2luKCcsICcpKTtcbiAqIH1cbiAqIG1ldGFkYXRhLmNhdGVnb3J5ID0gcmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0aW9uU2VydmljZSA9IG5ldyBWYWxpZGF0aW9uU2VydmljZSgpO1xuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"ElementStorageLayer.d.ts","sourceRoot":"","sources":["../../src/storage/ElementStorageLayer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAGlF,MAAM,WAAW,0BAA0B;IACzC,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,cAAc,CAAC,EAAE,eAAe,CAAC;CAClC;AAID,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA4C;gBAGhE,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,0BAA0B;IAarC;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAoBzC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKnD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK1C;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK/C;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;;OAGG;IACG,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B5E;;;OAGG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAKzC;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,KAAK,IAAI,IAAI;YAQC,WAAW;CAuE1B"}
1
+ {"version":3,"file":"ElementStorageLayer.d.ts","sourceRoot":"","sources":["../../src/storage/ElementStorageLayer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAGlF,MAAM,WAAW,0BAA0B;IACzC,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,cAAc,CAAC,EAAE,eAAe,CAAC;CAClC;AAID,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA4C;gBAGhE,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,0BAA0B;IAarC;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAoBzC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKnD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK1C;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK/C;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;;OAGG;IACG,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B5E;;;OAGG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAKzC;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,KAAK,IAAI,IAAI;YAQC,WAAW;CA0E1B"}
@@ -156,7 +156,10 @@ export class ElementStorageLayer {
156
156
  const stats = await this.backend.statMany(this.elementDir, files);
157
157
  // 2. Diff against manifest
158
158
  const diff = this.manifest.diff(stats);
159
- logger.debug(`ElementStorageLayer.scan: DISK SCAN for ${path.basename(this.elementDir)} — ${files.length} files, ${diff.added.length} added, ${diff.modified.length} modified, ${diff.removed.length} removed, ${diff.unchanged.length} unchanged`);
159
+ const hasChanges = diff.added.length > 0 || diff.modified.length > 0 || diff.removed.length > 0;
160
+ if (hasChanges) {
161
+ logger.debug(`ElementStorageLayer.scan: DISK SCAN for ${path.basename(this.elementDir)} — ${files.length} files, ${diff.added.length} added, ${diff.modified.length} modified, ${diff.removed.length} removed`);
162
+ }
160
163
  // 3. For added/modified: read frontmatter, update index
161
164
  const toIndex = [...diff.added, ...diff.modified];
162
165
  await Promise.all(toIndex.map(async (relPath) => {
@@ -199,4 +202,4 @@ export class ElementStorageLayer {
199
202
  }
200
203
  }
201
204
  }
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudFN0b3JhZ2VMYXllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL0VsZW1lbnRTdG9yYWdlTGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWE5RSxNQUFNLFVBQVUsR0FBdUIsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFFL0YsTUFBTSxPQUFPLG1CQUFtQjtJQUNiLE9BQU8sQ0FBa0I7SUFDekIsUUFBUSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDakMsS0FBSyxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDNUIsVUFBVSxDQUFTO0lBQ25CLGFBQWEsQ0FBUztJQUN0QixjQUFjLENBQVM7SUFFaEMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLGNBQWMsR0FBdUMsSUFBSSxDQUFDO0lBRWxFLFlBQ0UscUJBQTRDLEVBQzVDLE9BQW1DO1FBRW5DLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7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QUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7cUJBQzlELENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUVGLG9DQUFvQztZQUNwQyxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0IsQ0FBQztZQUVELG1DQUFtQztZQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBRXBDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyx1QkFBdUI7WUFDNUQsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWxlbWVudFN0b3JhZ2VMYXllciAtIENvb3JkaW5hdGVzIGluZGV4LCBtYW5pZmVzdCwgYW5kIGJhY2tlbmQgZm9yIGNhY2hlLWF3YXJlIGxpc3RpbmcuXG4gKlxuICogT3ducyB0aGUgc2NhbiBsaWZlY3ljbGU6IGNvb2xkb3duIGVuZm9yY2VtZW50LCBjb25jdXJyZW50IGNhbGwgZGVkdXBsaWNhdGlvbixcbiAqIGRpZmYtYmFzZWQgaW5jcmVtZW50YWwgaW5kZXggdXBkYXRlcywgYW5kIG5vdGlmaWNhdGlvbnMgZnJvbSBzYXZlL2RlbGV0ZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VCYWNrZW5kIH0gZnJvbSAnLi9JU3RvcmFnZUJhY2tlbmQuanMnO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZUxheWVyIH0gZnJvbSAnLi9JU3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgRWxlbWVudEluZGV4RW50cnksIE1hbmlmZXN0RGlmZlJlc3VsdCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgU3RvcmFnZU1hbmlmZXN0IH0gZnJvbSAnLi9TdG9yYWdlTWFuaWZlc3QuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFJbmRleCB9IGZyb20gJy4vTWV0YWRhdGFJbmRleC5qcyc7XG5pbXBvcnQgeyBGcm9udG1hdHRlclBhcnNlciB9IGZyb20gJy4vRnJvbnRtYXR0ZXJQYXJzZXIuanMnO1xuaW1wb3J0IHsgRmlsZVN0b3JhZ2VCYWNrZW5kIH0gZnJvbSAnLi9GaWxlU3RvcmFnZUJhY2tlbmQuanMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFN0b3JhZ2VMYXllck9wdGlvbnMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgZWxlbWVudCBkaXJlY3RvcnkgKi9cbiAgZWxlbWVudERpcjogc3RyaW5nO1xuICAvKiogRmlsZSBleHRlbnNpb24gdG8gZmlsdGVyIChlLmcuICcubWQnKSAqL1xuICBmaWxlRXh0ZW5zaW9uOiBzdHJpbmc7XG4gIC8qKiBNaW5pbXVtIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGZ1bGwgc2NhbnMgKGRlZmF1bHQ6IDEwMDApICovXG4gIHNjYW5Db29sZG93bk1zPzogbnVtYmVyO1xuICAvKiogT3ZlcnJpZGUgdGhlIHN0b3JhZ2UgYmFja2VuZCAodXNlZnVsIGZvciB0ZXN0aW5nKSAqL1xuICBzdG9yYWdlQmFja2VuZD86IElTdG9yYWdlQmFja2VuZDtcbn1cblxuY29uc3QgRU1QVFlfRElGRjogTWFuaWZlc3REaWZmUmVzdWx0ID0geyBhZGRlZDogW10sIG1vZGlmaWVkOiBbXSwgcmVtb3ZlZDogW10sIHVuY2hhbmdlZDogW10gfTtcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRTdG9yYWdlTGF5ZXIgaW1wbGVtZW50cyBJU3RvcmFnZUxheWVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYWNrZW5kOiBJU3RvcmFnZUJhY2tlbmQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFuaWZlc3QgPSBuZXcgU3RvcmFnZU1hbmlmZXN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kZXggPSBuZXcgTWV0YWRhdGFJbmRleCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnREaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlRXh0ZW5zaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NhbkNvb2xkb3duTXM6IG51bWJlcjtcblxuICBwcml2YXRlIGxhc3RTY2FuVGltZXN0YW1wID0gMDtcbiAgcHJpdmF0ZSBzY2FuSW5Qcm9ncmVzczogUHJvbWlzZTxNYW5pZmVzdERpZmZSZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgb3B0aW9uczogRWxlbWVudFN0b3JhZ2VMYXllck9wdGlvbnNcbiAgKSB7XG4gICAgdGhpcy5lbGVtZW50RGlyID0gb3B0aW9ucy5lbGVtZW50RGlyO1xuICAgIHRoaXMuZmlsZUV4dGVuc2lvbiA9IG9wdGlvbnMuZmlsZUV4dGVuc2lvbjtcbiAgICB0aGlzLnNjYW5Db29sZG93bk1zID0gb3B0aW9ucy5zY2FuQ29vbGRvd25NcyA/PyAxMDAwO1xuXG4gICAgaWYgKG9wdGlvbnMuc3RvcmFnZUJhY2tlbmQpIHtcbiAgICAgIHRoaXMuYmFja2VuZCA9IG9wdGlvbnMuc3RvcmFnZUJhY2tlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmFja2VuZCA9IG5ldyBGaWxlU3RvcmFnZUJhY2tlbmQoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2NhbiB0aGUgZWxlbWVudCBkaXJlY3RvcnkgZm9yIGNoYW5nZXMuXG4gICAqIC0gTm8tb3AgaWYgd2l0aGluIGNvb2xkb3duIHBlcmlvZCAocmV0dXJucyBlbXB0eSBkaWZmKVxuICAgKiAtIERlZHVwbGljYXRlcyBjb25jdXJyZW50IGNhbGxzIChyZXR1cm5zIHNhbWUgcHJvbWlzZSlcbiAgICogLSBVcGRhdGVzIGluZGV4IGFuZCBtYW5pZmVzdCBiYXNlZCBvbiBkaWZmXG4gICAqL1xuICBhc3luYyBzY2FuKCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA8IHRoaXMuc2NhbkNvb2xkb3duTXMpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRWxlbWVudFN0b3JhZ2VMYXllci5zY2FuOiBDT09MRE9XTiBBQ1RJVkUgZm9yICR7cGF0aC5iYXNlbmFtZSh0aGlzLmVsZW1lbnREaXIpfSDigJQgc2tpcHBpbmcgZGlzayBJL08gKCR7dGhpcy5zY2FuQ29vbGRvd25NcyAtIChub3cgLSB0aGlzLmxhc3RTY2FuVGltZXN0YW1wKX1tcyByZW1haW5pbmcpYCk7XG4gICAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGxpY2F0ZSBjb25jdXJyZW50IHNjYW5zXG4gICAgaWYgKHRoaXMuc2NhbkluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH1cblxuICAgIHRoaXMuc2NhbkluUHJvZ3Jlc3MgPSB0aGlzLnBlcmZvcm1TY2FuKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNjYW5JblByb2dyZXNzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBzY2FuIGFuZCByZXR1cm4gYWxsIGluZGV4IGVudHJpZXMuXG4gICAqL1xuICBhc3luYyBsaXN0U3VtbWFyaWVzKCk6IFByb21pc2U8RWxlbWVudEluZGV4RW50cnlbXT4ge1xuICAgIGF3YWl0IHRoaXMuc2NhbigpO1xuICAgIHJldHVybiB0aGlzLmluZGV4LmdldEFsbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgc2NhbiBhbmQgcmV0dXJuIGFsbCBpbmRleGVkIGZpbGUgcGF0aHMuXG4gICAqL1xuICBhc3luYyBnZXRJbmRleGVkUGF0aHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGF3YWl0IHRoaXMuc2NhbigpO1xuICAgIHJldHVybiB0aGlzLmluZGV4LmdldFBhdGhzKCk7XG4gIH1cblxuICAvKipcbiAgICogTygxKSBuYW1lLXRvLXBhdGggbG9va3VwIGZyb20gdGhlIGluZGV4LiBEb2VzIG5vdCB0cmlnZ2VyIGEgc2Nhbi5cbiAgICovXG4gIGdldFBhdGhCeU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIHJldHVybiB0aGlzLmluZGV4LmdldFBhdGhCeU5hbWUobm9ybWFsaXplZE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2NhbiBoYXMgY29tcGxldGVkIChpbmRleCBpcyBhdXRob3JpdGF0aXZlKS5cbiAgICovXG4gIGhhc0NvbXBsZXRlZFNjYW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmeSB0aGUgc3RvcmFnZSBsYXllciB0aGF0IGEgZmlsZSB3YXMgc2F2ZWQuXG4gICAqIFJlLXN0YXRzIGFuZCByZS1wYXJzZXMgdGhlIGZpbGUgdG8gdXBkYXRlIGluZGV4L21hbmlmZXN0LlxuICAgKi9cbiAgYXN5bmMgbm90aWZ5U2F2ZWQocmVsYXRpdmVQYXRoOiBzdHJpbmcsIGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCB0aGlzLmJhY2tlbmQuc3RhdChhYnNvbHV0ZVBhdGgpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuYmFja2VuZC5yZWFkRmlsZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgY29uc3QgZm0gPSBGcm9udG1hdHRlclBhcnNlci5leHRyYWN0TWV0YWRhdGEoY29udGVudCk7XG5cbiAgICAgIHRoaXMuaW5kZXguc2V0KHtcbiAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgbmFtZTogZm0ubmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGZtLmRlc2NyaXB0aW9uLFxuICAgICAgICB2ZXJzaW9uOiBmbS52ZXJzaW9uLFxuICAgICAgICBhdXRob3I6IGZtLmF1dGhvcixcbiAgICAgICAgdGFnczogZm0udGFncyxcbiAgICAgICAgbXRpbWVNczogbWV0YS5tdGltZU1zLFxuICAgICAgICBzaXplQnl0ZXM6IG1ldGEuc2l6ZUJ5dGVzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm1hbmlmZXN0LnNldChyZWxhdGl2ZVBhdGgsIG1ldGEubXRpbWVNcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRWxlbWVudFN0b3JhZ2VMYXllci5ub3RpZnlTYXZlZCBmYWlsZWQsIGludmFsaWRhdGluZycsIHtcbiAgICAgICAgcmVsYXRpdmVQYXRoLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZ5IHRoZSBzdG9yYWdlIGxheWVyIHRoYXQgYSBmaWxlIHdhcyBkZWxldGVkLlxuICAgKiBSZW1vdmVzIHRoZSBlbnRyeSBmcm9tIGluZGV4IGFuZCBtYW5pZmVzdC5cbiAgICovXG4gIG5vdGlmeURlbGV0ZWQocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4LnJlbW92ZShyZWxhdGl2ZVBhdGgpO1xuICAgIHRoaXMubWFuaWZlc3QucmVtb3ZlKHJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgdGhlIG5leHQgc2NhbigpIHRvIGhpdCBkaXNrIGJ5IHJlc2V0dGluZyB0aGUgY29vbGRvd24gdGltZXIuXG4gICAqL1xuICBpbnZhbGlkYXRlKCk6IHZvaWQge1xuICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCBzdGF0ZSAoaW5kZXgsIG1hbmlmZXN0LCBjb29sZG93bikuXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4LmNsZWFyKCk7XG4gICAgdGhpcy5tYW5pZmVzdC5jbGVhcigpO1xuICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSAwO1xuICB9XG5cbiAgLy8gLS0tLSBwcml2YXRlIC0tLS1cblxuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1TY2FuKCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuYmFja2VuZC5kaXJlY3RvcnlFeGlzdHModGhpcy5lbGVtZW50RGlyKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIC8vIERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IOKAlCBjbGVhciBldmVyeXRoaW5nIGFuZCByZXR1cm5cbiAgICAgICAgY29uc3QgcmVtb3ZlZFBhdGhzID0gdGhpcy5pbmRleC5nZXRQYXRocygpO1xuICAgICAgICB0aGlzLmluZGV4LmNsZWFyKCk7XG4gICAgICAgIHRoaXMubWFuaWZlc3QuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWRkZWQ6IFtdLFxuICAgICAgICAgIG1vZGlmaWVkOiBbXSxcbiAgICAgICAgICByZW1vdmVkOiByZW1vdmVkUGF0aHMsXG4gICAgICAgICAgdW5jaGFuZ2VkOiBbXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gMS4gTGlzdCArIHN0YXRcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5iYWNrZW5kLmxpc3RGaWxlcyh0aGlzLmVsZW1lbnREaXIsIHRoaXMuZmlsZUV4dGVuc2lvbik7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuYmFja2VuZC5zdGF0TWFueSh0aGlzLmVsZW1lbnREaXIsIGZpbGVzKTtcblxuICAgICAgLy8gMi4gRGlmZiBhZ2FpbnN0IG1hbmlmZXN0XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5tYW5pZmVzdC5kaWZmKHN0YXRzKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKGBFbGVtZW50U3RvcmFnZUxheWVyLnNjYW46IERJU0sgU0NBTiBmb3IgJHtwYXRoLmJhc2VuYW1lKHRoaXMuZWxlbWVudERpcil9IOKAlCAke2ZpbGVzLmxlbmd0aH0gZmlsZXMsICR7ZGlmZi5hZGRlZC5sZW5ndGh9IGFkZGVkLCAke2RpZmYubW9kaWZpZWQubGVuZ3RofSBtb2RpZmllZCwgJHtkaWZmLnJlbW92ZWQubGVuZ3RofSByZW1vdmVkLCAke2RpZmYudW5jaGFuZ2VkLmxlbmd0aH0gdW5jaGFuZ2VkYCk7XG5cbiAgICAgIC8vIDMuIEZvciBhZGRlZC9tb2RpZmllZDogcmVhZCBmcm9udG1hdHRlciwgdXBkYXRlIGluZGV4XG4gICAgICBjb25zdCB0b0luZGV4ID0gWy4uLmRpZmYuYWRkZWQsIC4uLmRpZmYubW9kaWZpZWRdO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHRvSW5kZXgubWFwKGFzeW5jIChyZWxQYXRoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCByZWxQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmJhY2tlbmQucmVhZEZpbGUoYWJzUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBmbSA9IEZyb250bWF0dGVyUGFyc2VyLmV4dHJhY3RNZXRhZGF0YShjb250ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBzdGF0cy5nZXQocmVsUGF0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuaW5kZXguc2V0KHtcbiAgICAgICAgICAgICAgZmlsZVBhdGg6IHJlbFBhdGgsXG4gICAgICAgICAgICAgIG5hbWU6IGZtLm5hbWUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBmbS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgdmVyc2lvbjogZm0udmVyc2lvbixcbiAgICAgICAgICAgICAgYXV0aG9yOiBmbS5hdXRob3IsXG4gICAgICAgICAgICAgIHRhZ3M6IGZtLnRhZ3MsXG4gICAgICAgICAgICAgIG10aW1lTXM6IG1ldGE/Lm10aW1lTXMgPz8gMCxcbiAgICAgICAgICAgICAgc2l6ZUJ5dGVzOiBtZXRhPy5zaXplQnl0ZXMgPz8gMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBQYXJzZSBmYWlsdXJlIGlzIG5vbi1mYXRhbCDigJQgc2tpcCB0aGlzIGVudHJ5XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEVsZW1lbnRTdG9yYWdlTGF5ZXI6IGZhaWxlZCB0byBpbmRleCAke3JlbFBhdGh9YCwge1xuICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gNC4gRm9yIHJlbW92ZWQ6IHJlbW92ZSBmcm9tIGluZGV4XG4gICAgICBmb3IgKGNvbnN0IHJlbFBhdGggb2YgZGlmZi5yZW1vdmVkKSB7XG4gICAgICAgIHRoaXMuaW5kZXgucmVtb3ZlKHJlbFBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiBVcGRhdGUgbWFuaWZlc3QgYW5kIHRpbWVzdGFtcFxuICAgICAgdGhpcy5tYW5pZmVzdC51cGRhdGUoc3RhdHMpO1xuICAgICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgIHJldHVybiBkaWZmO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0VsZW1lbnRTdG9yYWdlTGF5ZXIucGVyZm9ybVNjYW4gZmFpbGVkJywgZXJyb3IpO1xuICAgICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IERhdGUubm93KCk7IC8vIFByZXZlbnQgcmV0cnkgc3Rvcm1zXG4gICAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudFN0b3JhZ2VMYXllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL0VsZW1lbnRTdG9yYWdlTGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWE5RSxNQUFNLFVBQVUsR0FBdUIsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFFL0YsTUFBTSxPQUFPLG1CQUFtQjtJQUNiLE9BQU8sQ0FBa0I7SUFDekIsUUFBUSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDakMsS0FBSyxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDNUIsVUFBVSxDQUFTO0lBQ25CLGFBQWEsQ0FBUztJQUN0QixjQUFjLENBQVM7SUFFaEMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLGNBQWMsR0FBdUMsSUFBSSxDQUFDO0lBRWxFLFlBQ0UscUJBQTRDLEVBQzVDLE9BQW1DO1FBRW5DLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7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O2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsK0NBQStDO29CQUMvQyxNQUFNLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxPQUFPLEVBQUUsRUFBRTt3QkFDOUQsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7cUJBQzlELENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUVGLG9DQUFvQztZQUNwQyxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0IsQ0FBQztZQUVELG1DQUFtQztZQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBRXBDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyx1QkFBdUI7WUFDNUQsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWxlbWVudFN0b3JhZ2VMYXllciAtIENvb3JkaW5hdGVzIGluZGV4LCBtYW5pZmVzdCwgYW5kIGJhY2tlbmQgZm9yIGNhY2hlLWF3YXJlIGxpc3RpbmcuXG4gKlxuICogT3ducyB0aGUgc2NhbiBsaWZlY3ljbGU6IGNvb2xkb3duIGVuZm9yY2VtZW50LCBjb25jdXJyZW50IGNhbGwgZGVkdXBsaWNhdGlvbixcbiAqIGRpZmYtYmFzZWQgaW5jcmVtZW50YWwgaW5kZXggdXBkYXRlcywgYW5kIG5vdGlmaWNhdGlvbnMgZnJvbSBzYXZlL2RlbGV0ZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VCYWNrZW5kIH0gZnJvbSAnLi9JU3RvcmFnZUJhY2tlbmQuanMnO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZUxheWVyIH0gZnJvbSAnLi9JU3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgRWxlbWVudEluZGV4RW50cnksIE1hbmlmZXN0RGlmZlJlc3VsdCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgU3RvcmFnZU1hbmlmZXN0IH0gZnJvbSAnLi9TdG9yYWdlTWFuaWZlc3QuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFJbmRleCB9IGZyb20gJy4vTWV0YWRhdGFJbmRleC5qcyc7XG5pbXBvcnQgeyBGcm9udG1hdHRlclBhcnNlciB9IGZyb20gJy4vRnJvbnRtYXR0ZXJQYXJzZXIuanMnO1xuaW1wb3J0IHsgRmlsZVN0b3JhZ2VCYWNrZW5kIH0gZnJvbSAnLi9GaWxlU3RvcmFnZUJhY2tlbmQuanMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFN0b3JhZ2VMYXllck9wdGlvbnMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgZWxlbWVudCBkaXJlY3RvcnkgKi9cbiAgZWxlbWVudERpcjogc3RyaW5nO1xuICAvKiogRmlsZSBleHRlbnNpb24gdG8gZmlsdGVyIChlLmcuICcubWQnKSAqL1xuICBmaWxlRXh0ZW5zaW9uOiBzdHJpbmc7XG4gIC8qKiBNaW5pbXVtIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGZ1bGwgc2NhbnMgKGRlZmF1bHQ6IDEwMDApICovXG4gIHNjYW5Db29sZG93bk1zPzogbnVtYmVyO1xuICAvKiogT3ZlcnJpZGUgdGhlIHN0b3JhZ2UgYmFja2VuZCAodXNlZnVsIGZvciB0ZXN0aW5nKSAqL1xuICBzdG9yYWdlQmFja2VuZD86IElTdG9yYWdlQmFja2VuZDtcbn1cblxuY29uc3QgRU1QVFlfRElGRjogTWFuaWZlc3REaWZmUmVzdWx0ID0geyBhZGRlZDogW10sIG1vZGlmaWVkOiBbXSwgcmVtb3ZlZDogW10sIHVuY2hhbmdlZDogW10gfTtcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRTdG9yYWdlTGF5ZXIgaW1wbGVtZW50cyBJU3RvcmFnZUxheWVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYWNrZW5kOiBJU3RvcmFnZUJhY2tlbmQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFuaWZlc3QgPSBuZXcgU3RvcmFnZU1hbmlmZXN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kZXggPSBuZXcgTWV0YWRhdGFJbmRleCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnREaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlRXh0ZW5zaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NhbkNvb2xkb3duTXM6IG51bWJlcjtcblxuICBwcml2YXRlIGxhc3RTY2FuVGltZXN0YW1wID0gMDtcbiAgcHJpdmF0ZSBzY2FuSW5Qcm9ncmVzczogUHJvbWlzZTxNYW5pZmVzdERpZmZSZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgb3B0aW9uczogRWxlbWVudFN0b3JhZ2VMYXllck9wdGlvbnNcbiAgKSB7XG4gICAgdGhpcy5lbGVtZW50RGlyID0gb3B0aW9ucy5lbGVtZW50RGlyO1xuICAgIHRoaXMuZmlsZUV4dGVuc2lvbiA9IG9wdGlvbnMuZmlsZUV4dGVuc2lvbjtcbiAgICB0aGlzLnNjYW5Db29sZG93bk1zID0gb3B0aW9ucy5zY2FuQ29vbGRvd25NcyA/PyAxMDAwO1xuXG4gICAgaWYgKG9wdGlvbnMuc3RvcmFnZUJhY2tlbmQpIHtcbiAgICAgIHRoaXMuYmFja2VuZCA9IG9wdGlvbnMuc3RvcmFnZUJhY2tlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmFja2VuZCA9IG5ldyBGaWxlU3RvcmFnZUJhY2tlbmQoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2NhbiB0aGUgZWxlbWVudCBkaXJlY3RvcnkgZm9yIGNoYW5nZXMuXG4gICAqIC0gTm8tb3AgaWYgd2l0aGluIGNvb2xkb3duIHBlcmlvZCAocmV0dXJucyBlbXB0eSBkaWZmKVxuICAgKiAtIERlZHVwbGljYXRlcyBjb25jdXJyZW50IGNhbGxzIChyZXR1cm5zIHNhbWUgcHJvbWlzZSlcbiAgICogLSBVcGRhdGVzIGluZGV4IGFuZCBtYW5pZmVzdCBiYXNlZCBvbiBkaWZmXG4gICAqL1xuICBhc3luYyBzY2FuKCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA8IHRoaXMuc2NhbkNvb2xkb3duTXMpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRWxlbWVudFN0b3JhZ2VMYXllci5zY2FuOiBDT09MRE9XTiBBQ1RJVkUgZm9yICR7cGF0aC5iYXNlbmFtZSh0aGlzLmVsZW1lbnREaXIpfSDigJQgc2tpcHBpbmcgZGlzayBJL08gKCR7dGhpcy5zY2FuQ29vbGRvd25NcyAtIChub3cgLSB0aGlzLmxhc3RTY2FuVGltZXN0YW1wKX1tcyByZW1haW5pbmcpYCk7XG4gICAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGxpY2F0ZSBjb25jdXJyZW50IHNjYW5zXG4gICAgaWYgKHRoaXMuc2NhbkluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH1cblxuICAgIHRoaXMuc2NhbkluUHJvZ3Jlc3MgPSB0aGlzLnBlcmZvcm1TY2FuKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNjYW5JblByb2dyZXNzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBzY2FuIGFuZCByZXR1cm4gYWxsIGluZGV4IGVudHJpZXMuXG4gICAqL1xuICBhc3luYyBsaXN0U3VtbWFyaWVzKCk6IFByb21pc2U8RWxlbWVudEluZGV4RW50cnlbXT4ge1xuICAgIGF3YWl0IHRoaXMuc2NhbigpO1xuICAgIHJldHVybiB0aGlzLmluZGV4LmdldEFsbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgc2NhbiBhbmQgcmV0dXJuIGFsbCBpbmRleGVkIGZpbGUgcGF0aHMuXG4gICAqL1xuICBhc3luYyBnZXRJbmRleGVkUGF0aHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGF3YWl0IHRoaXMuc2NhbigpO1xuICAgIHJldHVybiB0aGlzLmluZGV4LmdldFBhdGhzKCk7XG4gIH1cblxuICAvKipcbiAgICogTygxKSBuYW1lLXRvLXBhdGggbG9va3VwIGZyb20gdGhlIGluZGV4LiBEb2VzIG5vdCB0cmlnZ2VyIGEgc2Nhbi5cbiAgICovXG4gIGdldFBhdGhCeU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIHJldHVybiB0aGlzLmluZGV4LmdldFBhdGhCeU5hbWUobm9ybWFsaXplZE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2NhbiBoYXMgY29tcGxldGVkIChpbmRleCBpcyBhdXRob3JpdGF0aXZlKS5cbiAgICovXG4gIGhhc0NvbXBsZXRlZFNjYW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmeSB0aGUgc3RvcmFnZSBsYXllciB0aGF0IGEgZmlsZSB3YXMgc2F2ZWQuXG4gICAqIFJlLXN0YXRzIGFuZCByZS1wYXJzZXMgdGhlIGZpbGUgdG8gdXBkYXRlIGluZGV4L21hbmlmZXN0LlxuICAgKi9cbiAgYXN5bmMgbm90aWZ5U2F2ZWQocmVsYXRpdmVQYXRoOiBzdHJpbmcsIGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCB0aGlzLmJhY2tlbmQuc3RhdChhYnNvbHV0ZVBhdGgpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuYmFja2VuZC5yZWFkRmlsZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgY29uc3QgZm0gPSBGcm9udG1hdHRlclBhcnNlci5leHRyYWN0TWV0YWRhdGEoY29udGVudCk7XG5cbiAgICAgIHRoaXMuaW5kZXguc2V0KHtcbiAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgbmFtZTogZm0ubmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGZtLmRlc2NyaXB0aW9uLFxuICAgICAgICB2ZXJzaW9uOiBmbS52ZXJzaW9uLFxuICAgICAgICBhdXRob3I6IGZtLmF1dGhvcixcbiAgICAgICAgdGFnczogZm0udGFncyxcbiAgICAgICAgbXRpbWVNczogbWV0YS5tdGltZU1zLFxuICAgICAgICBzaXplQnl0ZXM6IG1ldGEuc2l6ZUJ5dGVzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm1hbmlmZXN0LnNldChyZWxhdGl2ZVBhdGgsIG1ldGEubXRpbWVNcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRWxlbWVudFN0b3JhZ2VMYXllci5ub3RpZnlTYXZlZCBmYWlsZWQsIGludmFsaWRhdGluZycsIHtcbiAgICAgICAgcmVsYXRpdmVQYXRoLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZ5IHRoZSBzdG9yYWdlIGxheWVyIHRoYXQgYSBmaWxlIHdhcyBkZWxldGVkLlxuICAgKiBSZW1vdmVzIHRoZSBlbnRyeSBmcm9tIGluZGV4IGFuZCBtYW5pZmVzdC5cbiAgICovXG4gIG5vdGlmeURlbGV0ZWQocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4LnJlbW92ZShyZWxhdGl2ZVBhdGgpO1xuICAgIHRoaXMubWFuaWZlc3QucmVtb3ZlKHJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgdGhlIG5leHQgc2NhbigpIHRvIGhpdCBkaXNrIGJ5IHJlc2V0dGluZyB0aGUgY29vbGRvd24gdGltZXIuXG4gICAqL1xuICBpbnZhbGlkYXRlKCk6IHZvaWQge1xuICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCBzdGF0ZSAoaW5kZXgsIG1hbmlmZXN0LCBjb29sZG93bikuXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4LmNsZWFyKCk7XG4gICAgdGhpcy5tYW5pZmVzdC5jbGVhcigpO1xuICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSAwO1xuICB9XG5cbiAgLy8gLS0tLSBwcml2YXRlIC0tLS1cblxuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1TY2FuKCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuYmFja2VuZC5kaXJlY3RvcnlFeGlzdHModGhpcy5lbGVtZW50RGlyKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIC8vIERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IOKAlCBjbGVhciBldmVyeXRoaW5nIGFuZCByZXR1cm5cbiAgICAgICAgY29uc3QgcmVtb3ZlZFBhdGhzID0gdGhpcy5pbmRleC5nZXRQYXRocygpO1xuICAgICAgICB0aGlzLmluZGV4LmNsZWFyKCk7XG4gICAgICAgIHRoaXMubWFuaWZlc3QuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWRkZWQ6IFtdLFxuICAgICAgICAgIG1vZGlmaWVkOiBbXSxcbiAgICAgICAgICByZW1vdmVkOiByZW1vdmVkUGF0aHMsXG4gICAgICAgICAgdW5jaGFuZ2VkOiBbXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gMS4gTGlzdCArIHN0YXRcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5iYWNrZW5kLmxpc3RGaWxlcyh0aGlzLmVsZW1lbnREaXIsIHRoaXMuZmlsZUV4dGVuc2lvbik7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuYmFja2VuZC5zdGF0TWFueSh0aGlzLmVsZW1lbnREaXIsIGZpbGVzKTtcblxuICAgICAgLy8gMi4gRGlmZiBhZ2FpbnN0IG1hbmlmZXN0XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5tYW5pZmVzdC5kaWZmKHN0YXRzKTtcblxuICAgICAgY29uc3QgaGFzQ2hhbmdlcyA9IGRpZmYuYWRkZWQubGVuZ3RoID4gMCB8fCBkaWZmLm1vZGlmaWVkLmxlbmd0aCA+IDAgfHwgZGlmZi5yZW1vdmVkLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEVsZW1lbnRTdG9yYWdlTGF5ZXIuc2NhbjogRElTSyBTQ0FOIGZvciAke3BhdGguYmFzZW5hbWUodGhpcy5lbGVtZW50RGlyKX0g4oCUICR7ZmlsZXMubGVuZ3RofSBmaWxlcywgJHtkaWZmLmFkZGVkLmxlbmd0aH0gYWRkZWQsICR7ZGlmZi5tb2RpZmllZC5sZW5ndGh9IG1vZGlmaWVkLCAke2RpZmYucmVtb3ZlZC5sZW5ndGh9IHJlbW92ZWRgKTtcbiAgICAgIH1cblxuICAgICAgLy8gMy4gRm9yIGFkZGVkL21vZGlmaWVkOiByZWFkIGZyb250bWF0dGVyLCB1cGRhdGUgaW5kZXhcbiAgICAgIGNvbnN0IHRvSW5kZXggPSBbLi4uZGlmZi5hZGRlZCwgLi4uZGlmZi5tb2RpZmllZF07XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdG9JbmRleC5tYXAoYXN5bmMgKHJlbFBhdGgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIHJlbFBhdGgpO1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuYmFja2VuZC5yZWFkRmlsZShhYnNQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGZtID0gRnJvbnRtYXR0ZXJQYXJzZXIuZXh0cmFjdE1ldGFkYXRhKGNvbnRlbnQpO1xuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHN0YXRzLmdldChyZWxQYXRoKTtcblxuICAgICAgICAgICAgdGhpcy5pbmRleC5zZXQoe1xuICAgICAgICAgICAgICBmaWxlUGF0aDogcmVsUGF0aCxcbiAgICAgICAgICAgICAgbmFtZTogZm0ubmFtZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGZtLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiBmbS52ZXJzaW9uLFxuICAgICAgICAgICAgICBhdXRob3I6IGZtLmF1dGhvcixcbiAgICAgICAgICAgICAgdGFnczogZm0udGFncyxcbiAgICAgICAgICAgICAgbXRpbWVNczogbWV0YT8ubXRpbWVNcyA/PyAwLFxuICAgICAgICAgICAgICBzaXplQnl0ZXM6IG1ldGE/LnNpemVCeXRlcyA/PyAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGZhaWx1cmUgaXMgbm9uLWZhdGFsIOKAlCBza2lwIHRoaXMgZW50cnlcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRWxlbWVudFN0b3JhZ2VMYXllcjogZmFpbGVkIHRvIGluZGV4ICR7cmVsUGF0aH1gLCB7XG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyA0LiBGb3IgcmVtb3ZlZDogcmVtb3ZlIGZyb20gaW5kZXhcbiAgICAgIGZvciAoY29uc3QgcmVsUGF0aCBvZiBkaWZmLnJlbW92ZWQpIHtcbiAgICAgICAgdGhpcy5pbmRleC5yZW1vdmUocmVsUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIFVwZGF0ZSBtYW5pZmVzdCBhbmQgdGltZXN0YW1wXG4gICAgICB0aGlzLm1hbmlmZXN0LnVwZGF0ZShzdGF0cyk7XG4gICAgICB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgICAgcmV0dXJuIGRpZmY7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRWxlbWVudFN0b3JhZ2VMYXllci5wZXJmb3JtU2NhbiBmYWlsZWQnLCBlcnJvcik7XG4gICAgICB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID0gRGF0ZS5ub3coKTsgLy8gUHJldmVudCByZXRyeSBzdG9ybXNcbiAgICAgIHJldHVybiBFTVBUWV9ESUZGO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryStorageLayer.d.ts","sourceRoot":"","sources":["../../src/storage/MemoryStorageLayer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAGlF,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5C;AAKD,qBAAa,kBAAmB,YAAW,aAAa;IAcpD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAgC;IAE5D,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA4C;IAClE,OAAO,CAAC,aAAa,CAAS;gBAGX,OAAO,EAAE,qBAAqB,EAC/C,OAAO,EAAE,yBAAyB;IAoB9B,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC;IA0BnC,aAAa,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAK7C,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAM1C;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAYzB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK/C,gBAAgB,IAAI,OAAO;IAIrB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC5E,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAMzC,UAAU,IAAI,IAAI;IAIlB,KAAK,IAAI,IAAI;IASb;;;OAGG;IACH,kBAAkB,IAAI,iBAAiB,EAAE;IAMzC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;;OAGG;YACW,SAAS;IA0BvB;;;OAGG;YACW,sBAAsB;IAkCpC;;OAEG;YACW,WAAW;CAiH1B"}
1
+ {"version":3,"file":"MemoryStorageLayer.d.ts","sourceRoot":"","sources":["../../src/storage/MemoryStorageLayer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAGlF,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5C;AAKD,qBAAa,kBAAmB,YAAW,aAAa;IAcpD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAgC;IAE5D,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA4C;IAClE,OAAO,CAAC,aAAa,CAAS;gBAGX,OAAO,EAAE,qBAAqB,EAC/C,OAAO,EAAE,yBAAyB;IAoB9B,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC;IA0BnC,aAAa,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAK7C,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAM1C;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAYzB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK/C,gBAAgB,IAAI,OAAO;IAIrB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC5E,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAMzC,UAAU,IAAI,IAAI;IAIlB,KAAK,IAAI,IAAI;IASb;;;OAGG;IACH,kBAAkB,IAAI,iBAAiB,EAAE;IAMzC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;;OAGG;YACW,SAAS;IA0BvB;;;OAGG;YACW,sBAAsB;IAkCpC;;OAEG;YACW,WAAW;CAoH1B"}
@@ -293,7 +293,10 @@ export class MemoryStorageLayer {
293
293
  const stats = await this.backend.statMany(this.memoriesDir, allRelativePaths);
294
294
  // 4. Diff against manifest
295
295
  const diff = this.manifest.diff(stats);
296
- logger.debug(`MemoryStorageLayer.scan: DISK SCAN — ${allRelativePaths.length} files, ${diff.added.length} added, ${diff.modified.length} modified, ${diff.removed.length} removed, ${diff.unchanged.length} unchanged`);
296
+ const hasChanges = diff.added.length > 0 || diff.modified.length > 0 || diff.removed.length > 0;
297
+ if (hasChanges) {
298
+ logger.debug(`MemoryStorageLayer.scan: DISK SCAN — ${allRelativePaths.length} files, ${diff.added.length} added, ${diff.modified.length} modified, ${diff.removed.length} removed`);
299
+ }
297
300
  // 5. For added/modified: read file, extract metadata, update index
298
301
  const toIndex = [...diff.added, ...diff.modified];
299
302
  let indexUpdated = false;
@@ -346,4 +349,4 @@ export class MemoryStorageLayer {
346
349
  }
347
350
  }
348
351
  }
349
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5U3RvcmFnZUxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3JhZ2UvTWVtb3J5U3RvcmFnZUxheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUk1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWU5RSxNQUFNLFVBQVUsR0FBdUIsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDL0YsTUFBTSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQztBQUVsRCxNQUFNLE9BQU8sa0JBQWtCO0lBY1Y7SUFiRixPQUFPLENBQWtCO0lBQ3pCLFFBQVEsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ2pDLEtBQUssR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQzVCLFNBQVMsQ0FBa0I7SUFDM0IsV0FBVyxDQUFTO0lBQ3BCLGNBQWMsQ0FBUztJQUN2QixVQUFVLENBQWlDO0lBRXBELGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUN0QixjQUFjLEdBQXVDLElBQUksQ0FBQztJQUMxRCxhQUFhLEdBQUcs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LElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUVwQywyREFBMkQ7WUFDM0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsdUJBQXVCO1lBQzVELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeVN0b3JhZ2VMYXllciAtIElTdG9yYWdlTGF5ZXIgaW1wbGVtZW50YXRpb24gZm9yIG11bHRpLWRpcmVjdG9yeSBtZW1vcnkgc2Nhbm5pbmcuXG4gKlxuICogTWVtb3JpZXMgdXNlIHB1cmUgWUFNTCBhY3Jvc3MgYSBtdWx0aS1kaXJlY3RvcnkgbGF5b3V0OlxuICogICBzeXN0ZW0vICAgICAgIOKAlCBTeXN0ZW0tcHJvdmlkZWQgbWVtb3JpZXNcbiAqICAgYWRhcHRlcnMvICAgICDigJQgQWRhcHRlci1zcGVjaWZpYyBtZW1vcmllc1xuICogICBZWVlZLU1NLURELyAgIOKAlCBVc2VyLWNyZWF0ZWQgZGF0ZS1mb2xkZXIgbWVtb3JpZXNcbiAqICAgKHJvb3QpICAgICAgICDigJQgTGVnYWN5IHJvb3QtbGV2ZWwgbWVtb3JpZXNcbiAqXG4gKiBSZXVzZXMgdGhlIHNhbWUgaW50ZXJuYWwgY29tcG9uZW50cyBhcyBFbGVtZW50U3RvcmFnZUxheWVyIChNZXRhZGF0YUluZGV4LFxuICogU3RvcmFnZU1hbmlmZXN0LCBGaWxlU3RvcmFnZUJhY2tlbmQpIGJ1dCB3aXRoIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IHNjYW5cbiAqIGxvZ2ljOiBtdWx0aS1kaXJlY3RvcnkgZW51bWVyYXRpb24gKyBfaW5kZXguanNvbiBjb2xkLXN0YXJ0IHBlcnNpc3RlbmNlLlxuICovXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZUxheWVyIH0gZnJvbSAnLi9JU3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VCYWNrZW5kIH0gZnJvbSAnLi9JU3RvcmFnZUJhY2tlbmQuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50SW5kZXhFbnRyeSwgTWFuaWZlc3REaWZmUmVzdWx0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBTdG9yYWdlTWFuaWZlc3QgfSBmcm9tICcuL1N0b3JhZ2VNYW5pZmVzdC5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YUluZGV4IH0gZnJvbSAnLi9NZXRhZGF0YUluZGV4LmpzJztcbmltcG9ydCB7IEZpbGVTdG9yYWdlQmFja2VuZCB9IGZyb20gJy4vRmlsZVN0b3JhZ2VCYWNrZW5kLmpzJztcbmltcG9ydCB7IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yIH0gZnJvbSAnLi9NZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5qcyc7XG5pbXBvcnQgeyBNZW1vcnlJbmRleEZpbGUgfSBmcm9tICcuL01lbW9yeUluZGV4RmlsZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlTdG9yYWdlTGF5ZXJPcHRpb25zIHtcbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIG1lbW9yaWVzIGRpcmVjdG9yeSAqL1xuICBtZW1vcmllc0Rpcjogc3RyaW5nO1xuICAvKiogTWluaW11bSBtaWxsaXNlY29uZHMgYmV0d2VlbiBmdWxsIHNjYW5zIChkZWZhdWx0OiAxMDAwKSAqL1xuICBzY2FuQ29vbGRvd25Ncz86IG51bWJlcjtcbiAgLyoqIE92ZXJyaWRlIHRoZSBzdG9yYWdlIGJhY2tlbmQgKHVzZWZ1bCBmb3IgdGVzdGluZykgKi9cbiAgc3RvcmFnZUJhY2tlbmQ/OiBJU3RvcmFnZUJhY2tlbmQ7XG4gIC8qKiBEZWJvdW5jZSBpbnRlcnZhbCBmb3IgX2luZGV4Lmpzb24gd3JpdGVzIChkZWZhdWx0OiAyMDAwKSAqL1xuICBpbmRleERlYm91bmNlTXM/OiBudW1iZXI7XG4gIC8qKiBGaWxlIGZpbHRlciBwcmVkaWNhdGUgKGUuZy4sIGV4Y2x1ZGUgYmFja3VwIGZpbGVzKSAqL1xuICBmaWxlRmlsdGVyPzogKGZpbGVuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG59XG5cbmNvbnN0IEVNUFRZX0RJRkY6IE1hbmlmZXN0RGlmZlJlc3VsdCA9IHsgYWRkZWQ6IFtdLCBtb2RpZmllZDogW10sIHJlbW92ZWQ6IFtdLCB1bmNoYW5nZWQ6IFtdIH07XG5jb25zdCBEQVRFX0ZPTERFUl9QQVRURVJOID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvO1xuXG5leHBvcnQgY2xhc3MgTWVtb3J5U3RvcmFnZUxheWVyIGltcGxlbWVudHMgSVN0b3JhZ2VMYXllciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFja2VuZDogSVN0b3JhZ2VCYWNrZW5kO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0ID0gbmV3IFN0b3JhZ2VNYW5pZmVzdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGluZGV4ID0gbmV3IE1ldGFkYXRhSW5kZXgoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRleEZpbGU6IE1lbW9yeUluZGV4RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcmllc0Rpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjYW5Db29sZG93bk1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZUZpbHRlcj86IChmaWxlbmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIHByaXZhdGUgbGFzdFNjYW5UaW1lc3RhbXAgPSAwO1xuICBwcml2YXRlIHNjYW5JblByb2dyZXNzOiBQcm9taXNlPE1hbmlmZXN0RGlmZlJlc3VsdD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb2xkU3RhcnREb25lID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlT3BzOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgb3B0aW9uczogTWVtb3J5U3RvcmFnZUxheWVyT3B0aW9uc1xuICApIHtcbiAgICB0aGlzLm1lbW9yaWVzRGlyID0gb3B0aW9ucy5tZW1vcmllc0RpcjtcbiAgICB0aGlzLnNjYW5Db29sZG93bk1zID0gb3B0aW9ucy5zY2FuQ29vbGRvd25NcyA/PyAxMDAwO1xuICAgIHRoaXMuZmlsZUZpbHRlciA9IG9wdGlvbnMuZmlsZUZpbHRlcjtcblxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2VCYWNrZW5kKSB7XG4gICAgICB0aGlzLmJhY2tlbmQgPSBvcHRpb25zLnN0b3JhZ2VCYWNrZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJhY2tlbmQgPSBuZXcgRmlsZVN0b3JhZ2VCYWNrZW5kKGZpbGVPcHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnX2luZGV4Lmpzb24nKTtcbiAgICB0aGlzLmluZGV4RmlsZSA9IG5ldyBNZW1vcnlJbmRleEZpbGUoaW5kZXhQYXRoLCBmaWxlT3BzLCB7XG4gICAgICBkZWJvdW5jZU1zOiBvcHRpb25zLmluZGV4RGVib3VuY2VNcyA/PyAyMDAwLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLSBJU3RvcmFnZUxheWVyIGltcGxlbWVudGF0aW9uIC0tLS1cblxuICBhc3luYyBzY2FuKCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgLy8gQ29sZCBzdGFydDogdHJ5IGxvYWRpbmcgZnJvbSBfaW5kZXguanNvbiBmaXJzdFxuICAgIGlmICghdGhpcy5jb2xkU3RhcnREb25lKSB7XG4gICAgICB0aGlzLmNvbGRTdGFydERvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuY29sZFN0YXJ0KCk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA8IHRoaXMuc2NhbkNvb2xkb3duTXMpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgTWVtb3J5U3RvcmFnZUxheWVyLnNjYW46IENPT0xET1dOIEFDVElWRSDigJQgc2tpcHBpbmcgZGlzayBJL08gKCR7dGhpcy5zY2FuQ29vbGRvd25NcyAtIChub3cgLSB0aGlzLmxhc3RTY2FuVGltZXN0YW1wKX1tcyByZW1haW5pbmcpYCk7XG4gICAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGxpY2F0ZSBjb25jdXJyZW50IHNjYW5zXG4gICAgaWYgKHRoaXMuc2NhbkluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH1cblxuICAgIHRoaXMuc2NhbkluUHJvZ3Jlc3MgPSB0aGlzLnBlcmZvcm1TY2FuKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNjYW5JblByb2dyZXNzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsaXN0U3VtbWFyaWVzKCk6IFByb21pc2U8RWxlbWVudEluZGV4RW50cnlbXT4ge1xuICAgIGF3YWl0IHRoaXMuc2NhbigpO1xuICAgIHJldHVybiB0aGlzLmRlZHVwbGljYXRlQnlOYW1lKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0SW5kZXhlZFBhdGhzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBhd2FpdCB0aGlzLnNjYW4oKTtcbiAgICBjb25zdCBkZWR1cGxpY2F0ZWQgPSB0aGlzLmRlZHVwbGljYXRlQnlOYW1lKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuICAgIHJldHVybiBkZWR1cGxpY2F0ZWQubWFwKGVudHJ5ID0+IGVudHJ5LmZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWR1cGxpY2F0ZSBpbmRleCBlbnRyaWVzIGJ5IG5vcm1hbGl6ZWQgbmFtZS5cbiAgICogV2hlbiB0aGUgc2FtZSBtZW1vcnkgYXBwZWFycyBpbiBtdWx0aXBsZSBkYXRlIGZvbGRlcnMsIGtlZXAgdGhlIG9uZVxuICAgKiB3aXRoIHRoZSBoaWdoZXN0IG10aW1lTXMgKG1vc3QgcmVjZW50bHkgbW9kaWZpZWQpLlxuICAgKlxuICAgKiBJc3N1ZSAjNjU0OiBTYW1lIG1lbW9yeSBmaWxlcyBkdXBsaWNhdGVkIGFjcm9zcyB+MTUwIGRhdGUgZm9sZGVyc1xuICAgKiBpbmZsYXRlZCBjb3VudHMgZnJvbSB+NzUwIHVuaXF1ZSB0byB+MywxMDArIGxvYWRlZCBtZW1vcmllcy5cbiAgICovXG4gIHByaXZhdGUgZGVkdXBsaWNhdGVCeU5hbWUoZW50cmllczogRWxlbWVudEluZGV4RW50cnlbXSk6IEVsZW1lbnRJbmRleEVudHJ5W10ge1xuICAgIGNvbnN0IGJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBFbGVtZW50SW5kZXhFbnRyeT4oKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGVudHJ5Lm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGJ5TmFtZS5nZXQoa2V5KTtcbiAgICAgIGlmICghZXhpc3RpbmcgfHwgZW50cnkubXRpbWVNcyA+IGV4aXN0aW5nLm10aW1lTXMpIHtcbiAgICAgICAgYnlOYW1lLnNldChrZXksIGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFsuLi5ieU5hbWUudmFsdWVzKCldO1xuICB9XG5cbiAgZ2V0UGF0aEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXguZ2V0UGF0aEJ5TmFtZShub3JtYWxpemVkTmFtZSk7XG4gIH1cblxuICBoYXNDb21wbGV0ZWRTY2FuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID4gMDtcbiAgfVxuXG4gIGFzeW5jIG5vdGlmeVNhdmVkKHJlbGF0aXZlUGF0aDogc3RyaW5nLCBhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5iYWNrZW5kLnJlYWRGaWxlKGFic29sdXRlUGF0aCk7XG4gICAgICBjb25zdCBtZXRhID0gYXdhaXQgdGhpcy5iYWNrZW5kLnN0YXQoYWJzb2x1dGVQYXRoKTtcbiAgICAgIGNvbnN0IGV4dHJhY3RlZCA9IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YShjb250ZW50LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICBjb25zdCBlbnRyeTogRWxlbWVudEluZGV4RW50cnkgPSB7XG4gICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgIG5hbWU6IGV4dHJhY3RlZC5uYW1lID8/ICd1bm5hbWVkJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGV4dHJhY3RlZC5kZXNjcmlwdGlvbiA/PyAnJyxcbiAgICAgICAgdmVyc2lvbjogZXh0cmFjdGVkLnZlcnNpb24gPz8gJzEuMC4wJyxcbiAgICAgICAgYXV0aG9yOiBleHRyYWN0ZWQuYXV0aG9yID8/ICcnLFxuICAgICAgICB0YWdzOiBleHRyYWN0ZWQudGFncyA/PyBbXSxcbiAgICAgICAgbXRpbWVNczogbWV0YS5tdGltZU1zLFxuICAgICAgICBzaXplQnl0ZXM6IG1ldGEuc2l6ZUJ5dGVzLFxuICAgICAgICBhdXRvTG9hZDogZXh0cmFjdGVkLmF1dG9Mb2FkLFxuICAgICAgICBwcmlvcml0eTogZXh0cmFjdGVkLnByaW9yaXR5LFxuICAgICAgICBtZW1vcnlUeXBlOiBleHRyYWN0ZWQubWVtb3J5VHlwZSxcbiAgICAgICAgdG90YWxFbnRyaWVzOiBleHRyYWN0ZWQudG90YWxFbnRyaWVzLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5pbmRleC5zZXQoZW50cnkpO1xuICAgICAgdGhpcy5tYW5pZmVzdC5zZXQocmVsYXRpdmVQYXRoLCBtZXRhLm10aW1lTXMpO1xuICAgICAgdGhpcy5pbmRleEZpbGUuc2NoZWR1bGVXcml0ZSh0aGlzLmluZGV4LmdldEFsbCgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdNZW1vcnlTdG9yYWdlTGF5ZXIubm90aWZ5U2F2ZWQgZmFpbGVkLCBpbnZhbGlkYXRpbmcnLCB7XG4gICAgICAgIHJlbGF0aXZlUGF0aCxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgbm90aWZ5RGVsZXRlZChyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXgucmVtb3ZlKHJlbGF0aXZlUGF0aCk7XG4gICAgdGhpcy5tYW5pZmVzdC5yZW1vdmUocmVsYXRpdmVQYXRoKTtcbiAgICB0aGlzLmluZGV4RmlsZS5zY2hlZHVsZVdyaXRlKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuICB9XG5cbiAgaW52YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID0gMDtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXhGaWxlLmRpc3Bvc2UoKTsgIC8vIENhbmNlbCBwZW5kaW5nIGRlYm91bmNlZCB3cml0ZSAocHJldmVudHMgRU5PVEVNUFRZIGluIHRlc3RzKVxuICAgIHRoaXMuaW5kZXguY2xlYXIoKTtcbiAgICB0aGlzLm1hbmlmZXN0LmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IDA7XG4gIH1cblxuICAvLyAtLS0tIE1lbW9yeS1zcGVjaWZpYyBtZXRob2RzIC0tLS1cblxuICAvKipcbiAgICogUmV0dXJuIGluZGV4IGVudHJpZXMgd2hlcmUgYXV0b0xvYWQgPT09IHRydWUsIHNvcnRlZCBieSBwcmlvcml0eSBhc2NlbmRpbmcuXG4gICAqIFB1cmUgaW4tbWVtb3J5IOKAlCBkb2VzIE5PVCB0cmlnZ2VyIGEgc2Nhbi5cbiAgICovXG4gIGdldEF1dG9Mb2FkRW50cmllcygpOiBFbGVtZW50SW5kZXhFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleC5nZXRBbGwoKVxuICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5hdXRvTG9hZCA9PT0gdHJ1ZSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5wcmlvcml0eSA/PyA5OTkpIC0gKGIucHJpb3JpdHkgPz8gOTk5KSk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbCBkaXNrIHNjYW4gb2YgYWxsIHN1YmRpcmVjdG9yaWVzICsgd3JpdGUgX2luZGV4Lmpzb24uXG4gICAqL1xuICBhc3luYyByZWJ1aWxkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oJ01lbW9yeVN0b3JhZ2VMYXllcjogcmVidWlsZGluZyBpbmRleCBmcm9tIGRpc2suLi4nKTtcbiAgICB0aGlzLmluZGV4LmNsZWFyKCk7XG4gICAgdGhpcy5tYW5pZmVzdC5jbGVhcigpO1xuXG4gICAgYXdhaXQgdGhpcy5wZXJmb3JtU2NhbigpO1xuICAgIGF3YWl0IHRoaXMuaW5kZXhGaWxlLndyaXRlKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuXG4gICAgbG9nZ2VyLmluZm8oYE1lbW9yeVN0b3JhZ2VMYXllcjogcmVidWlsZCBjb21wbGV0ZSDigJQgJHt0aGlzLmluZGV4LnNpemV9IGVudHJpZXMgaW5kZXhlZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHBlbmRpbmcgX2luZGV4Lmpzb24gd3JpdGUgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLlxuICAgKi9cbiAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluZGV4RmlsZS5mbHVzaCgpO1xuICAgIHRoaXMuaW5kZXhGaWxlLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIC0tLS0gUHJpdmF0ZSAtLS0tXG5cbiAgLyoqXG4gICAqIENvbGQgc3RhcnQ6IHRyeSB0byByZXN0b3JlIGZyb20gX2luZGV4Lmpzb24sIHRoZW4gcnVuIGluY3JlbWVudGFsIHNjYW4uXG4gICAqIEZhbGxzIGJhY2sgdG8gZnVsbCByZWJ1aWxkIGlmIGluZGV4IGlzIG1pc3NpbmcvY29ycnVwdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29sZFN0YXJ0KCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHRoaXMuaW5kZXhGaWxlLnJlYWQoKTtcblxuICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAvLyBQb3B1bGF0ZSBpbmRleCBhbmQgbWFuaWZlc3QgZnJvbSBjYWNoZWQgZGF0YVxuICAgICAgICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoY2FjaGVkLmVudHJpZXMpKSB7XG4gICAgICAgICAgdGhpcy5pbmRleC5zZXQoZW50cnkpO1xuICAgICAgICAgIHRoaXMubWFuaWZlc3Quc2V0KHJlbFBhdGgsIGVudHJ5Lm10aW1lTXMpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKGBNZW1vcnlTdG9yYWdlTGF5ZXI6IGNvbGQgc3RhcnQg4oCUIGxvYWRlZCAke09iamVjdC5rZXlzKGNhY2hlZC5lbnRyaWVzKS5sZW5ndGh9IGVudHJpZXMgZnJvbSBfaW5kZXguanNvbmApO1xuXG4gICAgICAgIC8vIFJ1biBpbmNyZW1lbnRhbCBzY2FuIHRvIGNhdGNoIGNoYW5nZXMgc2luY2UgX2luZGV4Lmpzb24gd2FzIHdyaXR0ZW5cbiAgICAgICAgcmV0dXJuIHRoaXMucGVyZm9ybVNjYW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdNZW1vcnlTdG9yYWdlTGF5ZXI6IGNvbGQgc3RhcnQgX2luZGV4Lmpzb24gcmVhZCBmYWlsZWQsIHJlYnVpbGRpbmcnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBObyB2YWxpZCBfaW5kZXguanNvbiDigJQgZnVsbCByZWJ1aWxkXG4gICAgYXdhaXQgdGhpcy5yZWJ1aWxkSW5kZXgoKTtcbiAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlciBhbGwgc3ViZGlyZWN0b3JpZXMgdG8gc2Nhbi5cbiAgICogUmV0dXJucyBbJ3N5c3RlbScsICdhZGFwdGVycycsIC4uLmRhdGVGb2xkZXJzLCAnJ10gd2hlcmUgJycgPSByb290LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNjb3ZlclN1YmRpcmVjdG9yaWVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBzdWJkaXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmZpbGVPcHMubGlzdERpcmVjdG9yeSh0aGlzLm1lbW9yaWVzRGlyKTtcblxuICAgICAgY29uc3QgZGF0ZUZvbGRlcnM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgLy8gSW5jbHVkZSBrbm93biBmaXhlZCBkaXJlY3Rvcmllc1xuICAgICAgICBpZiAoZW50cnkgPT09ICdzeXN0ZW0nIHx8IGVudHJ5ID09PSAnYWRhcHRlcnMnKSB7XG4gICAgICAgICAgc3ViZGlycy5wdXNoKGVudHJ5KTtcbiAgICAgICAgfSBlbHNlIGlmIChEQVRFX0ZPTERFUl9QQVRURVJOLnRlc3QoZW50cnkpKSB7XG4gICAgICAgICAgZGF0ZUZvbGRlcnMucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCBiYWNrdXBzLywgX2luZGV4Lmpzb24sIGFuZCBvdGhlciBub24tbWVtb3J5IGRpcmVjdG9yaWVzXG4gICAgICB9XG4gICAgICAvLyBTb3J0IGRhdGUgZm9sZGVycyBjaHJvbm9sb2dpY2FsbHkgKG9sZGVzdCBmaXJzdCDihpIgbmV3ZXN0IGxhc3QpXG4gICAgICAvLyBzbyB0aGF0IG5hbWVUb1BhdGggaW4gTWV0YWRhdGFJbmRleCBlbmRzIHVwIHBvaW50aW5nIHRvIHRoZSBuZXdlc3QgY29weVxuICAgICAgZGF0ZUZvbGRlcnMuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgICAgIHN1YmRpcnMucHVzaCguLi5kYXRlRm9sZGVycyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ01lbW9yeVN0b3JhZ2VMYXllcjogZmFpbGVkIHRvIGxpc3Qgc3ViZGlyZWN0b3JpZXMnLCB7XG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgcm9vdCAoZW1wdHkgc3RyaW5nID0gcm9vdCBkaXJlY3RvcnkpXG4gICAgc3ViZGlycy5wdXNoKCcnKTtcblxuICAgIHJldHVybiBzdWJkaXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBmdWxsIGluY3JlbWVudGFsIHNjYW4gYWNyb3NzIGFsbCBzdWJkaXJlY3Rvcmllcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybVNjYW4oKTogUHJvbWlzZTxNYW5pZmVzdERpZmZSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5iYWNrZW5kLmRpcmVjdG9yeUV4aXN0cyh0aGlzLm1lbW9yaWVzRGlyKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRQYXRocyA9IHRoaXMuaW5kZXguZ2V0UGF0aHMoKTtcbiAgICAgICAgdGhpcy5pbmRleC5jbGVhcigpO1xuICAgICAgICB0aGlzLm1hbmlmZXN0LmNsZWFyKCk7XG4gICAgICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFkZGVkOiBbXSxcbiAgICAgICAgICBtb2RpZmllZDogW10sXG4gICAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZFBhdGhzLFxuICAgICAgICAgIHVuY2hhbmdlZDogW10sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIDEuIERpc2NvdmVyIHN1YmRpcmVjdG9yaWVzXG4gICAgICBjb25zdCBzdWJkaXJzID0gYXdhaXQgdGhpcy5kaXNjb3ZlclN1YmRpcmVjdG9yaWVzKCk7XG5cbiAgICAgIC8vIDIuIEVudW1lcmF0ZSBhbGwgLnlhbWwgZmlsZXMgYWNyb3NzIHN1YmRpcmVjdG9yaWVzXG4gICAgICBjb25zdCBhbGxSZWxhdGl2ZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IHN1YmRpciBvZiBzdWJkaXJzKSB7XG4gICAgICAgIGNvbnN0IGFic0RpciA9IHN1YmRpciA/IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCBzdWJkaXIpIDogdGhpcy5tZW1vcmllc0RpcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5iYWNrZW5kLmxpc3RGaWxlcyhhYnNEaXIsICcueWFtbCcpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAvLyBBcHBseSBmaWxlIGZpbHRlciAoZS5nLiwgZXhjbHVkZSBiYWNrdXAgZmlsZXMpXG4gICAgICAgICAgICBpZiAodGhpcy5maWxlRmlsdGVyICYmICF0aGlzLmZpbGVGaWx0ZXIoZmlsZSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByZWZpeCB3aXRoIHN1YmRpciBmb3IgcmVsYXRpdmUgcGF0aFxuICAgICAgICAgICAgY29uc3QgcmVsUGF0aCA9IHN1YmRpciA/IGAke3N1YmRpcn0vJHtmaWxlfWAgOiBmaWxlO1xuICAgICAgICAgICAgYWxsUmVsYXRpdmVQYXRocy5wdXNoKHJlbFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBEaXJlY3RvcnkgbWlnaHQgbm90IGV4aXN0IChlLmcuLCBubyBzeXN0ZW0vIGZvbGRlciB5ZXQpXG4gICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYE1lbW9yeVN0b3JhZ2VMYXllcjogZmFpbGVkIHRvIGxpc3QgJHthYnNEaXJ9YCwge1xuICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFN0YXQgYWxsIGZpbGVzXG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuYmFja2VuZC5zdGF0TWFueSh0aGlzLm1lbW9yaWVzRGlyLCBhbGxSZWxhdGl2ZVBhdGhzKTtcblxuICAgICAgLy8gNC4gRGlmZiBhZ2FpbnN0IG1hbmlmZXN0XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5tYW5pZmVzdC5kaWZmKHN0YXRzKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKGBNZW1vcnlTdG9yYWdlTGF5ZXIuc2NhbjogRElTSyBTQ0FOIOKAlCAke2FsbFJlbGF0aXZlUGF0aHMubGVuZ3RofSBmaWxlcywgJHtkaWZmLmFkZGVkLmxlbmd0aH0gYWRkZWQsICR7ZGlmZi5tb2RpZmllZC5sZW5ndGh9IG1vZGlmaWVkLCAke2RpZmYucmVtb3ZlZC5sZW5ndGh9IHJlbW92ZWQsICR7ZGlmZi51bmNoYW5nZWQubGVuZ3RofSB1bmNoYW5nZWRgKTtcblxuICAgICAgLy8gNS4gRm9yIGFkZGVkL21vZGlmaWVkOiByZWFkIGZpbGUsIGV4dHJhY3QgbWV0YWRhdGEsIHVwZGF0ZSBpbmRleFxuICAgICAgY29uc3QgdG9JbmRleCA9IFsuLi5kaWZmLmFkZGVkLCAuLi5kaWZmLm1vZGlmaWVkXTtcbiAgICAgIGxldCBpbmRleFVwZGF0ZWQgPSBmYWxzZTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHRvSW5kZXgubWFwKGFzeW5jIChyZWxQYXRoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgcmVsUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5iYWNrZW5kLnJlYWRGaWxlKGFic1BhdGgpO1xuICAgICAgICAgICAgY29uc3QgZXh0cmFjdGVkID0gTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuZXh0cmFjdE1ldGFkYXRhKGNvbnRlbnQsIHJlbFBhdGgpO1xuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHN0YXRzLmdldChyZWxQYXRoKTtcblxuICAgICAgICAgICAgdGhpcy5pbmRleC5zZXQoe1xuICAgICAgICAgICAgICBmaWxlUGF0aDogcmVsUGF0aCxcbiAgICAgICAgICAgICAgbmFtZTogZXh0cmFjdGVkLm5hbWUgPz8gJ3VubmFtZWQnLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZXh0cmFjdGVkLmRlc2NyaXB0aW9uID8/ICcnLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiBleHRyYWN0ZWQudmVyc2lvbiA/PyAnMS4wLjAnLFxuICAgICAgICAgICAgICBhdXRob3I6IGV4dHJhY3RlZC5hdXRob3IgPz8gJycsXG4gICAgICAgICAgICAgIHRhZ3M6IGV4dHJhY3RlZC50YWdzID8/IFtdLFxuICAgICAgICAgICAgICBtdGltZU1zOiBtZXRhPy5tdGltZU1zID8/IDAsXG4gICAgICAgICAgICAgIHNpemVCeXRlczogbWV0YT8uc2l6ZUJ5dGVzID8/IDAsXG4gICAgICAgICAgICAgIGF1dG9Mb2FkOiBleHRyYWN0ZWQuYXV0b0xvYWQsXG4gICAgICAgICAgICAgIHByaW9yaXR5OiBleHRyYWN0ZWQucHJpb3JpdHksXG4gICAgICAgICAgICAgIG1lbW9yeVR5cGU6IGV4dHJhY3RlZC5tZW1vcnlUeXBlLFxuICAgICAgICAgICAgICB0b3RhbEVudHJpZXM6IGV4dHJhY3RlZC50b3RhbEVudHJpZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGluZGV4VXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgTWVtb3J5U3RvcmFnZUxheWVyOiBmYWlsZWQgdG8gaW5kZXggJHtyZWxQYXRofWAsIHtcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIDYuIEZvciByZW1vdmVkOiByZW1vdmUgZnJvbSBpbmRleFxuICAgICAgZm9yIChjb25zdCByZWxQYXRoIG9mIGRpZmYucmVtb3ZlZCkge1xuICAgICAgICB0aGlzLmluZGV4LnJlbW92ZShyZWxQYXRoKTtcbiAgICAgICAgaW5kZXhVcGRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gNy4gVXBkYXRlIG1hbmlmZXN0IGFuZCB0aW1lc3RhbXBcbiAgICAgIHRoaXMubWFuaWZlc3QudXBkYXRlKHN0YXRzKTtcbiAgICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyA4LiBTY2hlZHVsZSBkZWJvdW5jZWQgX2luZGV4Lmpzb24gd3JpdGUgaWYgaW5kZXggY2hhbmdlZFxuICAgICAgaWYgKGluZGV4VXBkYXRlZCkge1xuICAgICAgICB0aGlzLmluZGV4RmlsZS5zY2hlZHVsZVdyaXRlKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGlmZjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdNZW1vcnlTdG9yYWdlTGF5ZXIucGVyZm9ybVNjYW4gZmFpbGVkJywgZXJyb3IpO1xuICAgICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IERhdGUubm93KCk7IC8vIFByZXZlbnQgcmV0cnkgc3Rvcm1zXG4gICAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5U3RvcmFnZUxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3JhZ2UvTWVtb3J5U3RvcmFnZUxheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUk1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWU5RSxNQUFNLFVBQVUsR0FBdUIsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDL0YsTUFBTSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQztBQUVsRCxNQUFNLE9BQU8sa0JBQWtCO0lBY1Y7SUFiRixPQUFPLENBQWtCO0lBQ3pCLFFBQVEsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ2pDLEtBQUssR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQzVCLFNBQVMsQ0FBa0I7SUFDM0IsV0FBVyxDQUFTO0lBQ3BCLGNBQWMsQ0FBUztJQUN2QixVQUFVLENBQWlDO0lBRXBELGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUN0QixjQUFjLEdBQXVDLElBQUksQ0FBQztJQUMxRCxhQUFhLEdBQUcs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QUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQixZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLENBQUM7WUFFRCxtQ0FBbUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUVwQywyREFBMkQ7WUFDM0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsdUJBQXVCO1lBQzVELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeVN0b3JhZ2VMYXllciAtIElTdG9yYWdlTGF5ZXIgaW1wbGVtZW50YXRpb24gZm9yIG11bHRpLWRpcmVjdG9yeSBtZW1vcnkgc2Nhbm5pbmcuXG4gKlxuICogTWVtb3JpZXMgdXNlIHB1cmUgWUFNTCBhY3Jvc3MgYSBtdWx0aS1kaXJlY3RvcnkgbGF5b3V0OlxuICogICBzeXN0ZW0vICAgICAgIOKAlCBTeXN0ZW0tcHJvdmlkZWQgbWVtb3JpZXNcbiAqICAgYWRhcHRlcnMvICAgICDigJQgQWRhcHRlci1zcGVjaWZpYyBtZW1vcmllc1xuICogICBZWVlZLU1NLURELyAgIOKAlCBVc2VyLWNyZWF0ZWQgZGF0ZS1mb2xkZXIgbWVtb3JpZXNcbiAqICAgKHJvb3QpICAgICAgICDigJQgTGVnYWN5IHJvb3QtbGV2ZWwgbWVtb3JpZXNcbiAqXG4gKiBSZXVzZXMgdGhlIHNhbWUgaW50ZXJuYWwgY29tcG9uZW50cyBhcyBFbGVtZW50U3RvcmFnZUxheWVyIChNZXRhZGF0YUluZGV4LFxuICogU3RvcmFnZU1hbmlmZXN0LCBGaWxlU3RvcmFnZUJhY2tlbmQpIGJ1dCB3aXRoIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IHNjYW5cbiAqIGxvZ2ljOiBtdWx0aS1kaXJlY3RvcnkgZW51bWVyYXRpb24gKyBfaW5kZXguanNvbiBjb2xkLXN0YXJ0IHBlcnNpc3RlbmNlLlxuICovXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZUxheWVyIH0gZnJvbSAnLi9JU3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VCYWNrZW5kIH0gZnJvbSAnLi9JU3RvcmFnZUJhY2tlbmQuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50SW5kZXhFbnRyeSwgTWFuaWZlc3REaWZmUmVzdWx0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBTdG9yYWdlTWFuaWZlc3QgfSBmcm9tICcuL1N0b3JhZ2VNYW5pZmVzdC5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YUluZGV4IH0gZnJvbSAnLi9NZXRhZGF0YUluZGV4LmpzJztcbmltcG9ydCB7IEZpbGVTdG9yYWdlQmFja2VuZCB9IGZyb20gJy4vRmlsZVN0b3JhZ2VCYWNrZW5kLmpzJztcbmltcG9ydCB7IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yIH0gZnJvbSAnLi9NZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5qcyc7XG5pbXBvcnQgeyBNZW1vcnlJbmRleEZpbGUgfSBmcm9tICcuL01lbW9yeUluZGV4RmlsZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlTdG9yYWdlTGF5ZXJPcHRpb25zIHtcbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIG1lbW9yaWVzIGRpcmVjdG9yeSAqL1xuICBtZW1vcmllc0Rpcjogc3RyaW5nO1xuICAvKiogTWluaW11bSBtaWxsaXNlY29uZHMgYmV0d2VlbiBmdWxsIHNjYW5zIChkZWZhdWx0OiAxMDAwKSAqL1xuICBzY2FuQ29vbGRvd25Ncz86IG51bWJlcjtcbiAgLyoqIE92ZXJyaWRlIHRoZSBzdG9yYWdlIGJhY2tlbmQgKHVzZWZ1bCBmb3IgdGVzdGluZykgKi9cbiAgc3RvcmFnZUJhY2tlbmQ/OiBJU3RvcmFnZUJhY2tlbmQ7XG4gIC8qKiBEZWJvdW5jZSBpbnRlcnZhbCBmb3IgX2luZGV4Lmpzb24gd3JpdGVzIChkZWZhdWx0OiAyMDAwKSAqL1xuICBpbmRleERlYm91bmNlTXM/OiBudW1iZXI7XG4gIC8qKiBGaWxlIGZpbHRlciBwcmVkaWNhdGUgKGUuZy4sIGV4Y2x1ZGUgYmFja3VwIGZpbGVzKSAqL1xuICBmaWxlRmlsdGVyPzogKGZpbGVuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG59XG5cbmNvbnN0IEVNUFRZX0RJRkY6IE1hbmlmZXN0RGlmZlJlc3VsdCA9IHsgYWRkZWQ6IFtdLCBtb2RpZmllZDogW10sIHJlbW92ZWQ6IFtdLCB1bmNoYW5nZWQ6IFtdIH07XG5jb25zdCBEQVRFX0ZPTERFUl9QQVRURVJOID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvO1xuXG5leHBvcnQgY2xhc3MgTWVtb3J5U3RvcmFnZUxheWVyIGltcGxlbWVudHMgSVN0b3JhZ2VMYXllciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFja2VuZDogSVN0b3JhZ2VCYWNrZW5kO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0ID0gbmV3IFN0b3JhZ2VNYW5pZmVzdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGluZGV4ID0gbmV3IE1ldGFkYXRhSW5kZXgoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRleEZpbGU6IE1lbW9yeUluZGV4RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcmllc0Rpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjYW5Db29sZG93bk1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZUZpbHRlcj86IChmaWxlbmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIHByaXZhdGUgbGFzdFNjYW5UaW1lc3RhbXAgPSAwO1xuICBwcml2YXRlIHNjYW5JblByb2dyZXNzOiBQcm9taXNlPE1hbmlmZXN0RGlmZlJlc3VsdD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb2xkU3RhcnREb25lID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlT3BzOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgb3B0aW9uczogTWVtb3J5U3RvcmFnZUxheWVyT3B0aW9uc1xuICApIHtcbiAgICB0aGlzLm1lbW9yaWVzRGlyID0gb3B0aW9ucy5tZW1vcmllc0RpcjtcbiAgICB0aGlzLnNjYW5Db29sZG93bk1zID0gb3B0aW9ucy5zY2FuQ29vbGRvd25NcyA/PyAxMDAwO1xuICAgIHRoaXMuZmlsZUZpbHRlciA9IG9wdGlvbnMuZmlsZUZpbHRlcjtcblxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2VCYWNrZW5kKSB7XG4gICAgICB0aGlzLmJhY2tlbmQgPSBvcHRpb25zLnN0b3JhZ2VCYWNrZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJhY2tlbmQgPSBuZXcgRmlsZVN0b3JhZ2VCYWNrZW5kKGZpbGVPcHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnX2luZGV4Lmpzb24nKTtcbiAgICB0aGlzLmluZGV4RmlsZSA9IG5ldyBNZW1vcnlJbmRleEZpbGUoaW5kZXhQYXRoLCBmaWxlT3BzLCB7XG4gICAgICBkZWJvdW5jZU1zOiBvcHRpb25zLmluZGV4RGVib3VuY2VNcyA/PyAyMDAwLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLSBJU3RvcmFnZUxheWVyIGltcGxlbWVudGF0aW9uIC0tLS1cblxuICBhc3luYyBzY2FuKCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgLy8gQ29sZCBzdGFydDogdHJ5IGxvYWRpbmcgZnJvbSBfaW5kZXguanNvbiBmaXJzdFxuICAgIGlmICghdGhpcy5jb2xkU3RhcnREb25lKSB7XG4gICAgICB0aGlzLmNvbGRTdGFydERvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuY29sZFN0YXJ0KCk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA8IHRoaXMuc2NhbkNvb2xkb3duTXMpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgTWVtb3J5U3RvcmFnZUxheWVyLnNjYW46IENPT0xET1dOIEFDVElWRSDigJQgc2tpcHBpbmcgZGlzayBJL08gKCR7dGhpcy5zY2FuQ29vbGRvd25NcyAtIChub3cgLSB0aGlzLmxhc3RTY2FuVGltZXN0YW1wKX1tcyByZW1haW5pbmcpYCk7XG4gICAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGxpY2F0ZSBjb25jdXJyZW50IHNjYW5zXG4gICAgaWYgKHRoaXMuc2NhbkluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH1cblxuICAgIHRoaXMuc2NhbkluUHJvZ3Jlc3MgPSB0aGlzLnBlcmZvcm1TY2FuKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNjYW5JblByb2dyZXNzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsaXN0U3VtbWFyaWVzKCk6IFByb21pc2U8RWxlbWVudEluZGV4RW50cnlbXT4ge1xuICAgIGF3YWl0IHRoaXMuc2NhbigpO1xuICAgIHJldHVybiB0aGlzLmRlZHVwbGljYXRlQnlOYW1lKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0SW5kZXhlZFBhdGhzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBhd2FpdCB0aGlzLnNjYW4oKTtcbiAgICBjb25zdCBkZWR1cGxpY2F0ZWQgPSB0aGlzLmRlZHVwbGljYXRlQnlOYW1lKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuICAgIHJldHVybiBkZWR1cGxpY2F0ZWQubWFwKGVudHJ5ID0+IGVudHJ5LmZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWR1cGxpY2F0ZSBpbmRleCBlbnRyaWVzIGJ5IG5vcm1hbGl6ZWQgbmFtZS5cbiAgICogV2hlbiB0aGUgc2FtZSBtZW1vcnkgYXBwZWFycyBpbiBtdWx0aXBsZSBkYXRlIGZvbGRlcnMsIGtlZXAgdGhlIG9uZVxuICAgKiB3aXRoIHRoZSBoaWdoZXN0IG10aW1lTXMgKG1vc3QgcmVjZW50bHkgbW9kaWZpZWQpLlxuICAgKlxuICAgKiBJc3N1ZSAjNjU0OiBTYW1lIG1lbW9yeSBmaWxlcyBkdXBsaWNhdGVkIGFjcm9zcyB+MTUwIGRhdGUgZm9sZGVyc1xuICAgKiBpbmZsYXRlZCBjb3VudHMgZnJvbSB+NzUwIHVuaXF1ZSB0byB+MywxMDArIGxvYWRlZCBtZW1vcmllcy5cbiAgICovXG4gIHByaXZhdGUgZGVkdXBsaWNhdGVCeU5hbWUoZW50cmllczogRWxlbWVudEluZGV4RW50cnlbXSk6IEVsZW1lbnRJbmRleEVudHJ5W10ge1xuICAgIGNvbnN0IGJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBFbGVtZW50SW5kZXhFbnRyeT4oKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGVudHJ5Lm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGJ5TmFtZS5nZXQoa2V5KTtcbiAgICAgIGlmICghZXhpc3RpbmcgfHwgZW50cnkubXRpbWVNcyA+IGV4aXN0aW5nLm10aW1lTXMpIHtcbiAgICAgICAgYnlOYW1lLnNldChrZXksIGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFsuLi5ieU5hbWUudmFsdWVzKCldO1xuICB9XG5cbiAgZ2V0UGF0aEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXguZ2V0UGF0aEJ5TmFtZShub3JtYWxpemVkTmFtZSk7XG4gIH1cblxuICBoYXNDb21wbGV0ZWRTY2FuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID4gMDtcbiAgfVxuXG4gIGFzeW5jIG5vdGlmeVNhdmVkKHJlbGF0aXZlUGF0aDogc3RyaW5nLCBhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5iYWNrZW5kLnJlYWRGaWxlKGFic29sdXRlUGF0aCk7XG4gICAgICBjb25zdCBtZXRhID0gYXdhaXQgdGhpcy5iYWNrZW5kLnN0YXQoYWJzb2x1dGVQYXRoKTtcbiAgICAgIGNvbnN0IGV4dHJhY3RlZCA9IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YShjb250ZW50LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICBjb25zdCBlbnRyeTogRWxlbWVudEluZGV4RW50cnkgPSB7XG4gICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgIG5hbWU6IGV4dHJhY3RlZC5uYW1lID8/ICd1bm5hbWVkJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGV4dHJhY3RlZC5kZXNjcmlwdGlvbiA/PyAnJyxcbiAgICAgICAgdmVyc2lvbjogZXh0cmFjdGVkLnZlcnNpb24gPz8gJzEuMC4wJyxcbiAgICAgICAgYXV0aG9yOiBleHRyYWN0ZWQuYXV0aG9yID8/ICcnLFxuICAgICAgICB0YWdzOiBleHRyYWN0ZWQudGFncyA/PyBbXSxcbiAgICAgICAgbXRpbWVNczogbWV0YS5tdGltZU1zLFxuICAgICAgICBzaXplQnl0ZXM6IG1ldGEuc2l6ZUJ5dGVzLFxuICAgICAgICBhdXRvTG9hZDogZXh0cmFjdGVkLmF1dG9Mb2FkLFxuICAgICAgICBwcmlvcml0eTogZXh0cmFjdGVkLnByaW9yaXR5LFxuICAgICAgICBtZW1vcnlUeXBlOiBleHRyYWN0ZWQubWVtb3J5VHlwZSxcbiAgICAgICAgdG90YWxFbnRyaWVzOiBleHRyYWN0ZWQudG90YWxFbnRyaWVzLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5pbmRleC5zZXQoZW50cnkpO1xuICAgICAgdGhpcy5tYW5pZmVzdC5zZXQocmVsYXRpdmVQYXRoLCBtZXRhLm10aW1lTXMpO1xuICAgICAgdGhpcy5pbmRleEZpbGUuc2NoZWR1bGVXcml0ZSh0aGlzLmluZGV4LmdldEFsbCgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdNZW1vcnlTdG9yYWdlTGF5ZXIubm90aWZ5U2F2ZWQgZmFpbGVkLCBpbnZhbGlkYXRpbmcnLCB7XG4gICAgICAgIHJlbGF0aXZlUGF0aCxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgbm90aWZ5RGVsZXRlZChyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXgucmVtb3ZlKHJlbGF0aXZlUGF0aCk7XG4gICAgdGhpcy5tYW5pZmVzdC5yZW1vdmUocmVsYXRpdmVQYXRoKTtcbiAgICB0aGlzLmluZGV4RmlsZS5zY2hlZHVsZVdyaXRlKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuICB9XG5cbiAgaW52YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID0gMDtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXhGaWxlLmRpc3Bvc2UoKTsgIC8vIENhbmNlbCBwZW5kaW5nIGRlYm91bmNlZCB3cml0ZSAocHJldmVudHMgRU5PVEVNUFRZIGluIHRlc3RzKVxuICAgIHRoaXMuaW5kZXguY2xlYXIoKTtcbiAgICB0aGlzLm1hbmlmZXN0LmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IDA7XG4gIH1cblxuICAvLyAtLS0tIE1lbW9yeS1zcGVjaWZpYyBtZXRob2RzIC0tLS1cblxuICAvKipcbiAgICogUmV0dXJuIGluZGV4IGVudHJpZXMgd2hlcmUgYXV0b0xvYWQgPT09IHRydWUsIHNvcnRlZCBieSBwcmlvcml0eSBhc2NlbmRpbmcuXG4gICAqIFB1cmUgaW4tbWVtb3J5IOKAlCBkb2VzIE5PVCB0cmlnZ2VyIGEgc2Nhbi5cbiAgICovXG4gIGdldEF1dG9Mb2FkRW50cmllcygpOiBFbGVtZW50SW5kZXhFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleC5nZXRBbGwoKVxuICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5hdXRvTG9hZCA9PT0gdHJ1ZSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5wcmlvcml0eSA/PyA5OTkpIC0gKGIucHJpb3JpdHkgPz8gOTk5KSk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbCBkaXNrIHNjYW4gb2YgYWxsIHN1YmRpcmVjdG9yaWVzICsgd3JpdGUgX2luZGV4Lmpzb24uXG4gICAqL1xuICBhc3luYyByZWJ1aWxkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oJ01lbW9yeVN0b3JhZ2VMYXllcjogcmVidWlsZGluZyBpbmRleCBmcm9tIGRpc2suLi4nKTtcbiAgICB0aGlzLmluZGV4LmNsZWFyKCk7XG4gICAgdGhpcy5tYW5pZmVzdC5jbGVhcigpO1xuXG4gICAgYXdhaXQgdGhpcy5wZXJmb3JtU2NhbigpO1xuICAgIGF3YWl0IHRoaXMuaW5kZXhGaWxlLndyaXRlKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuXG4gICAgbG9nZ2VyLmluZm8oYE1lbW9yeVN0b3JhZ2VMYXllcjogcmVidWlsZCBjb21wbGV0ZSDigJQgJHt0aGlzLmluZGV4LnNpemV9IGVudHJpZXMgaW5kZXhlZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHBlbmRpbmcgX2luZGV4Lmpzb24gd3JpdGUgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLlxuICAgKi9cbiAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluZGV4RmlsZS5mbHVzaCgpO1xuICAgIHRoaXMuaW5kZXhGaWxlLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIC0tLS0gUHJpdmF0ZSAtLS0tXG5cbiAgLyoqXG4gICAqIENvbGQgc3RhcnQ6IHRyeSB0byByZXN0b3JlIGZyb20gX2luZGV4Lmpzb24sIHRoZW4gcnVuIGluY3JlbWVudGFsIHNjYW4uXG4gICAqIEZhbGxzIGJhY2sgdG8gZnVsbCByZWJ1aWxkIGlmIGluZGV4IGlzIG1pc3NpbmcvY29ycnVwdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29sZFN0YXJ0KCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHRoaXMuaW5kZXhGaWxlLnJlYWQoKTtcblxuICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAvLyBQb3B1bGF0ZSBpbmRleCBhbmQgbWFuaWZlc3QgZnJvbSBjYWNoZWQgZGF0YVxuICAgICAgICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoY2FjaGVkLmVudHJpZXMpKSB7XG4gICAgICAgICAgdGhpcy5pbmRleC5zZXQoZW50cnkpO1xuICAgICAgICAgIHRoaXMubWFuaWZlc3Quc2V0KHJlbFBhdGgsIGVudHJ5Lm10aW1lTXMpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKGBNZW1vcnlTdG9yYWdlTGF5ZXI6IGNvbGQgc3RhcnQg4oCUIGxvYWRlZCAke09iamVjdC5rZXlzKGNhY2hlZC5lbnRyaWVzKS5sZW5ndGh9IGVudHJpZXMgZnJvbSBfaW5kZXguanNvbmApO1xuXG4gICAgICAgIC8vIFJ1biBpbmNyZW1lbnRhbCBzY2FuIHRvIGNhdGNoIGNoYW5nZXMgc2luY2UgX2luZGV4Lmpzb24gd2FzIHdyaXR0ZW5cbiAgICAgICAgcmV0dXJuIHRoaXMucGVyZm9ybVNjYW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdNZW1vcnlTdG9yYWdlTGF5ZXI6IGNvbGQgc3RhcnQgX2luZGV4Lmpzb24gcmVhZCBmYWlsZWQsIHJlYnVpbGRpbmcnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBObyB2YWxpZCBfaW5kZXguanNvbiDigJQgZnVsbCByZWJ1aWxkXG4gICAgYXdhaXQgdGhpcy5yZWJ1aWxkSW5kZXgoKTtcbiAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlciBhbGwgc3ViZGlyZWN0b3JpZXMgdG8gc2Nhbi5cbiAgICogUmV0dXJucyBbJ3N5c3RlbScsICdhZGFwdGVycycsIC4uLmRhdGVGb2xkZXJzLCAnJ10gd2hlcmUgJycgPSByb290LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNjb3ZlclN1YmRpcmVjdG9yaWVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBzdWJkaXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmZpbGVPcHMubGlzdERpcmVjdG9yeSh0aGlzLm1lbW9yaWVzRGlyKTtcblxuICAgICAgY29uc3QgZGF0ZUZvbGRlcnM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgLy8gSW5jbHVkZSBrbm93biBmaXhlZCBkaXJlY3Rvcmllc1xuICAgICAgICBpZiAoZW50cnkgPT09ICdzeXN0ZW0nIHx8IGVudHJ5ID09PSAnYWRhcHRlcnMnKSB7XG4gICAgICAgICAgc3ViZGlycy5wdXNoKGVudHJ5KTtcbiAgICAgICAgfSBlbHNlIGlmIChEQVRFX0ZPTERFUl9QQVRURVJOLnRlc3QoZW50cnkpKSB7XG4gICAgICAgICAgZGF0ZUZvbGRlcnMucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCBiYWNrdXBzLywgX2luZGV4Lmpzb24sIGFuZCBvdGhlciBub24tbWVtb3J5IGRpcmVjdG9yaWVzXG4gICAgICB9XG4gICAgICAvLyBTb3J0IGRhdGUgZm9sZGVycyBjaHJvbm9sb2dpY2FsbHkgKG9sZGVzdCBmaXJzdCDihpIgbmV3ZXN0IGxhc3QpXG4gICAgICAvLyBzbyB0aGF0IG5hbWVUb1BhdGggaW4gTWV0YWRhdGFJbmRleCBlbmRzIHVwIHBvaW50aW5nIHRvIHRoZSBuZXdlc3QgY29weVxuICAgICAgZGF0ZUZvbGRlcnMuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgICAgIHN1YmRpcnMucHVzaCguLi5kYXRlRm9sZGVycyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ01lbW9yeVN0b3JhZ2VMYXllcjogZmFpbGVkIHRvIGxpc3Qgc3ViZGlyZWN0b3JpZXMnLCB7XG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgcm9vdCAoZW1wdHkgc3RyaW5nID0gcm9vdCBkaXJlY3RvcnkpXG4gICAgc3ViZGlycy5wdXNoKCcnKTtcblxuICAgIHJldHVybiBzdWJkaXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBmdWxsIGluY3JlbWVudGFsIHNjYW4gYWNyb3NzIGFsbCBzdWJkaXJlY3Rvcmllcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybVNjYW4oKTogUHJvbWlzZTxNYW5pZmVzdERpZmZSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5iYWNrZW5kLmRpcmVjdG9yeUV4aXN0cyh0aGlzLm1lbW9yaWVzRGlyKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRQYXRocyA9IHRoaXMuaW5kZXguZ2V0UGF0aHMoKTtcbiAgICAgICAgdGhpcy5pbmRleC5jbGVhcigpO1xuICAgICAgICB0aGlzLm1hbmlmZXN0LmNsZWFyKCk7XG4gICAgICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFkZGVkOiBbXSxcbiAgICAgICAgICBtb2RpZmllZDogW10sXG4gICAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZFBhdGhzLFxuICAgICAgICAgIHVuY2hhbmdlZDogW10sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIDEuIERpc2NvdmVyIHN1YmRpcmVjdG9yaWVzXG4gICAgICBjb25zdCBzdWJkaXJzID0gYXdhaXQgdGhpcy5kaXNjb3ZlclN1YmRpcmVjdG9yaWVzKCk7XG5cbiAgICAgIC8vIDIuIEVudW1lcmF0ZSBhbGwgLnlhbWwgZmlsZXMgYWNyb3NzIHN1YmRpcmVjdG9yaWVzXG4gICAgICBjb25zdCBhbGxSZWxhdGl2ZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IHN1YmRpciBvZiBzdWJkaXJzKSB7XG4gICAgICAgIGNvbnN0IGFic0RpciA9IHN1YmRpciA/IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCBzdWJkaXIpIDogdGhpcy5tZW1vcmllc0RpcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5iYWNrZW5kLmxpc3RGaWxlcyhhYnNEaXIsICcueWFtbCcpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAvLyBBcHBseSBmaWxlIGZpbHRlciAoZS5nLiwgZXhjbHVkZSBiYWNrdXAgZmlsZXMpXG4gICAgICAgICAgICBpZiAodGhpcy5maWxlRmlsdGVyICYmICF0aGlzLmZpbGVGaWx0ZXIoZmlsZSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByZWZpeCB3aXRoIHN1YmRpciBmb3IgcmVsYXRpdmUgcGF0aFxuICAgICAgICAgICAgY29uc3QgcmVsUGF0aCA9IHN1YmRpciA/IGAke3N1YmRpcn0vJHtmaWxlfWAgOiBmaWxlO1xuICAgICAgICAgICAgYWxsUmVsYXRpdmVQYXRocy5wdXNoKHJlbFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBEaXJlY3RvcnkgbWlnaHQgbm90IGV4aXN0IChlLmcuLCBubyBzeXN0ZW0vIGZvbGRlciB5ZXQpXG4gICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYE1lbW9yeVN0b3JhZ2VMYXllcjogZmFpbGVkIHRvIGxpc3QgJHthYnNEaXJ9YCwge1xuICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFN0YXQgYWxsIGZpbGVzXG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuYmFja2VuZC5zdGF0TWFueSh0aGlzLm1lbW9yaWVzRGlyLCBhbGxSZWxhdGl2ZVBhdGhzKTtcblxuICAgICAgLy8gNC4gRGlmZiBhZ2FpbnN0IG1hbmlmZXN0XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5tYW5pZmVzdC5kaWZmKHN0YXRzKTtcblxuICAgICAgY29uc3QgaGFzQ2hhbmdlcyA9IGRpZmYuYWRkZWQubGVuZ3RoID4gMCB8fCBkaWZmLm1vZGlmaWVkLmxlbmd0aCA+IDAgfHwgZGlmZi5yZW1vdmVkLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgICBsb2dnZXIuZGVidWcoYE1lbW9yeVN0b3JhZ2VMYXllci5zY2FuOiBESVNLIFNDQU4g4oCUICR7YWxsUmVsYXRpdmVQYXRocy5sZW5ndGh9IGZpbGVzLCAke2RpZmYuYWRkZWQubGVuZ3RofSBhZGRlZCwgJHtkaWZmLm1vZGlmaWVkLmxlbmd0aH0gbW9kaWZpZWQsICR7ZGlmZi5yZW1vdmVkLmxlbmd0aH0gcmVtb3ZlZGApO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiBGb3IgYWRkZWQvbW9kaWZpZWQ6IHJlYWQgZmlsZSwgZXh0cmFjdCBtZXRhZGF0YSwgdXBkYXRlIGluZGV4XG4gICAgICBjb25zdCB0b0luZGV4ID0gWy4uLmRpZmYuYWRkZWQsIC4uLmRpZmYubW9kaWZpZWRdO1xuICAgICAgbGV0IGluZGV4VXBkYXRlZCA9IGZhbHNlO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdG9JbmRleC5tYXAoYXN5bmMgKHJlbFBhdGgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCByZWxQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmJhY2tlbmQucmVhZEZpbGUoYWJzUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBleHRyYWN0ZWQgPSBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5leHRyYWN0TWV0YWRhdGEoY29udGVudCwgcmVsUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gc3RhdHMuZ2V0KHJlbFBhdGgpO1xuXG4gICAgICAgICAgICB0aGlzLmluZGV4LnNldCh7XG4gICAgICAgICAgICAgIGZpbGVQYXRoOiByZWxQYXRoLFxuICAgICAgICAgICAgICBuYW1lOiBleHRyYWN0ZWQubmFtZSA/PyAndW5uYW1lZCcsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBleHRyYWN0ZWQuZGVzY3JpcHRpb24gPz8gJycsXG4gICAgICAgICAgICAgIHZlcnNpb246IGV4dHJhY3RlZC52ZXJzaW9uID8/ICcxLjAuMCcsXG4gICAgICAgICAgICAgIGF1dGhvcjogZXh0cmFjdGVkLmF1dGhvciA/PyAnJyxcbiAgICAgICAgICAgICAgdGFnczogZXh0cmFjdGVkLnRhZ3MgPz8gW10sXG4gICAgICAgICAgICAgIG10aW1lTXM6IG1ldGE/Lm10aW1lTXMgPz8gMCxcbiAgICAgICAgICAgICAgc2l6ZUJ5dGVzOiBtZXRhPy5zaXplQnl0ZXMgPz8gMCxcbiAgICAgICAgICAgICAgYXV0b0xvYWQ6IGV4dHJhY3RlZC5hdXRvTG9hZCxcbiAgICAgICAgICAgICAgcHJpb3JpdHk6IGV4dHJhY3RlZC5wcmlvcml0eSxcbiAgICAgICAgICAgICAgbWVtb3J5VHlwZTogZXh0cmFjdGVkLm1lbW9yeVR5cGUsXG4gICAgICAgICAgICAgIHRvdGFsRW50cmllczogZXh0cmFjdGVkLnRvdGFsRW50cmllcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5kZXhVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBNZW1vcnlTdG9yYWdlTGF5ZXI6IGZhaWxlZCB0byBpbmRleCAke3JlbFBhdGh9YCwge1xuICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gNi4gRm9yIHJlbW92ZWQ6IHJlbW92ZSBmcm9tIGluZGV4XG4gICAgICBmb3IgKGNvbnN0IHJlbFBhdGggb2YgZGlmZi5yZW1vdmVkKSB7XG4gICAgICAgIHRoaXMuaW5kZXgucmVtb3ZlKHJlbFBhdGgpO1xuICAgICAgICBpbmRleFVwZGF0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyA3LiBVcGRhdGUgbWFuaWZlc3QgYW5kIHRpbWVzdGFtcFxuICAgICAgdGhpcy5tYW5pZmVzdC51cGRhdGUoc3RhdHMpO1xuICAgICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIDguIFNjaGVkdWxlIGRlYm91bmNlZCBfaW5kZXguanNvbiB3cml0ZSBpZiBpbmRleCBjaGFuZ2VkXG4gICAgICBpZiAoaW5kZXhVcGRhdGVkKSB7XG4gICAgICAgIHRoaXMuaW5kZXhGaWxlLnNjaGVkdWxlV3JpdGUodGhpcy5pbmRleC5nZXRBbGwoKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaWZmO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ01lbW9yeVN0b3JhZ2VMYXllci5wZXJmb3JtU2NhbiBmYWlsZWQnLCBlcnJvcik7XG4gICAgICB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID0gRGF0ZS5ub3coKTsgLy8gUHJldmVudCByZXRyeSBzdG9ybXNcbiAgICAgIHJldHVybiBFTVBUWV9ESUZGO1xuICAgIH1cbiAgfVxufVxuIl19