@dollhousemcp/mcp-server 1.5.2 → 1.6.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 (272) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +494 -111
  3. package/data/agents/code-reviewer.md +8 -1
  4. package/data/agents/research-assistant.md +8 -1
  5. package/data/agents/task-manager.md +8 -1
  6. package/data/ensembles/business-advisor.md +8 -1
  7. package/data/ensembles/creative-studio.md +8 -1
  8. package/data/ensembles/development-team.md +8 -1
  9. package/data/ensembles/security-analysis-team.md +8 -1
  10. package/data/memories/conversation-history.md +8 -1
  11. package/data/memories/learning-progress.md +8 -1
  12. package/data/memories/project-context.md +8 -1
  13. package/data/personas/business-consultant.md +8 -1
  14. package/data/personas/creative-writer.md +8 -1
  15. package/data/personas/debug-detective.md +8 -1
  16. package/data/personas/eli5-explainer.md +8 -1
  17. package/data/personas/security-analyst.md +8 -1
  18. package/data/personas/technical-analyst.md +8 -1
  19. package/data/skills/code-review.md +8 -1
  20. package/data/skills/creative-writing.md +8 -1
  21. package/data/skills/data-analysis.md +8 -1
  22. package/data/skills/penetration-testing.md +8 -1
  23. package/data/skills/research.md +8 -1
  24. package/data/skills/threat-modeling.md +8 -1
  25. package/data/skills/translation.md +8 -1
  26. package/data/templates/code-documentation.md +8 -1
  27. package/data/templates/email-professional.md +8 -1
  28. package/data/templates/meeting-notes.md +8 -1
  29. package/data/templates/penetration-test-report.md +8 -1
  30. package/data/templates/project-brief.md +8 -1
  31. package/data/templates/report-executive.md +8 -1
  32. package/data/templates/security-vulnerability-report.md +8 -1
  33. package/data/templates/threat-assessment-report.md +8 -1
  34. package/dist/auth/GitHubAuthManager.d.ts +6 -1
  35. package/dist/auth/GitHubAuthManager.d.ts.map +1 -1
  36. package/dist/auth/GitHubAuthManager.js +45 -18
  37. package/dist/benchmarks/IndexPerformanceBenchmark.d.ts +98 -0
  38. package/dist/benchmarks/IndexPerformanceBenchmark.d.ts.map +1 -0
  39. package/dist/benchmarks/IndexPerformanceBenchmark.js +531 -0
  40. package/dist/cache/CollectionCache.d.ts.map +1 -1
  41. package/dist/cache/CollectionCache.js +13 -3
  42. package/dist/cache/CollectionIndexCache.d.ts +77 -0
  43. package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
  44. package/dist/cache/CollectionIndexCache.js +349 -0
  45. package/dist/cache/LRUCache.d.ts +93 -0
  46. package/dist/cache/LRUCache.d.ts.map +1 -0
  47. package/dist/cache/LRUCache.js +299 -0
  48. package/dist/cache/index.d.ts +1 -0
  49. package/dist/cache/index.d.ts.map +1 -1
  50. package/dist/cache/index.js +2 -1
  51. package/dist/collection/CollectionBrowser.d.ts +21 -1
  52. package/dist/collection/CollectionBrowser.d.ts.map +1 -1
  53. package/dist/collection/CollectionBrowser.js +130 -10
  54. package/dist/collection/CollectionIndexManager.d.ts +151 -0
  55. package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
  56. package/dist/collection/CollectionIndexManager.js +499 -0
  57. package/dist/collection/CollectionSearch.d.ts +55 -0
  58. package/dist/collection/CollectionSearch.d.ts.map +1 -1
  59. package/dist/collection/CollectionSearch.js +338 -13
  60. package/dist/collection/CollectionSeeder.d.ts.map +1 -1
  61. package/dist/collection/CollectionSeeder.js +38 -1
  62. package/dist/collection/ElementInstaller.d.ts +31 -0
  63. package/dist/collection/ElementInstaller.d.ts.map +1 -1
  64. package/dist/collection/ElementInstaller.js +77 -15
  65. package/dist/collection/PersonaSubmitter.d.ts +1 -1
  66. package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
  67. package/dist/collection/PersonaSubmitter.js +2 -2
  68. package/dist/collection/index.d.ts +1 -0
  69. package/dist/collection/index.d.ts.map +1 -1
  70. package/dist/collection/index.js +2 -1
  71. package/dist/config/ConfigManager.d.ts +78 -0
  72. package/dist/config/ConfigManager.d.ts.map +1 -0
  73. package/dist/config/ConfigManager.js +216 -0
  74. package/dist/config/element-types.d.ts +135 -0
  75. package/dist/config/element-types.d.ts.map +1 -0
  76. package/dist/config/element-types.js +108 -0
  77. package/dist/config/index.d.ts +2 -0
  78. package/dist/config/index.d.ts.map +1 -1
  79. package/dist/config/index.js +3 -1
  80. package/dist/config/portfolio-constants.d.ts +83 -0
  81. package/dist/config/portfolio-constants.d.ts.map +1 -0
  82. package/dist/config/portfolio-constants.js +99 -0
  83. package/dist/elements/BaseElement.d.ts +14 -2
  84. package/dist/elements/BaseElement.d.ts.map +1 -1
  85. package/dist/elements/BaseElement.js +88 -6
  86. package/dist/elements/agents/Agent.d.ts +10 -1
  87. package/dist/elements/agents/Agent.d.ts.map +1 -1
  88. package/dist/elements/agents/Agent.js +66 -19
  89. package/dist/elements/agents/AgentManager.d.ts +2 -0
  90. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  91. package/dist/elements/agents/AgentManager.js +12 -10
  92. package/dist/elements/skills/Skill.d.ts +10 -1
  93. package/dist/elements/skills/Skill.d.ts.map +1 -1
  94. package/dist/elements/skills/Skill.js +40 -3
  95. package/dist/elements/skills/SkillManager.d.ts +1 -0
  96. package/dist/elements/skills/SkillManager.d.ts.map +1 -1
  97. package/dist/elements/skills/SkillManager.js +10 -4
  98. package/dist/elements/templates/Template.d.ts +10 -1
  99. package/dist/elements/templates/Template.d.ts.map +1 -1
  100. package/dist/elements/templates/Template.js +35 -18
  101. package/dist/elements/templates/TemplateManager.d.ts +1 -1
  102. package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
  103. package/dist/elements/templates/TemplateManager.js +6 -5
  104. package/dist/generated/version.d.ts +2 -2
  105. package/dist/generated/version.js +3 -3
  106. package/dist/index.barrel.d.ts +1 -2
  107. package/dist/index.barrel.d.ts.map +1 -1
  108. package/dist/index.barrel.js +2 -4
  109. package/dist/index.d.ts +143 -25
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +1883 -310
  112. package/dist/persona/PersonaElement.d.ts +10 -0
  113. package/dist/persona/PersonaElement.d.ts.map +1 -1
  114. package/dist/persona/PersonaElement.js +55 -32
  115. package/dist/persona/PersonaElementManager.d.ts.map +1 -1
  116. package/dist/persona/PersonaElementManager.js +13 -11
  117. package/dist/persona/PersonaLoader.d.ts.map +1 -1
  118. package/dist/persona/PersonaLoader.js +8 -2
  119. package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
  120. package/dist/persona/export-import/PersonaImporter.js +24 -5
  121. package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
  122. package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
  123. package/dist/persona/export-import/PersonaSharer.js +198 -22
  124. package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
  125. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  126. package/dist/portfolio/DefaultElementProvider.js +499 -7
  127. package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
  128. package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
  129. package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
  130. package/dist/portfolio/MigrationManager.d.ts.map +1 -1
  131. package/dist/portfolio/MigrationManager.js +136 -3
  132. package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
  133. package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
  134. package/dist/portfolio/PortfolioIndexManager.js +478 -0
  135. package/dist/portfolio/PortfolioManager.d.ts +5 -0
  136. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  137. package/dist/portfolio/PortfolioManager.js +61 -20
  138. package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
  139. package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
  140. package/dist/portfolio/PortfolioRepoManager.js +337 -0
  141. package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
  142. package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
  143. package/dist/portfolio/UnifiedIndexManager.js +1434 -0
  144. package/dist/portfolio/index.d.ts +15 -0
  145. package/dist/portfolio/index.d.ts.map +1 -0
  146. package/dist/portfolio/index.js +15 -0
  147. package/dist/portfolio/types.d.ts +7 -0
  148. package/dist/portfolio/types.d.ts.map +1 -1
  149. package/dist/portfolio/types.js +6 -1
  150. package/dist/security/InputValidator.d.ts.map +1 -1
  151. package/dist/security/InputValidator.js +50 -48
  152. package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
  153. package/dist/security/audit/SecurityAuditor.js +17 -9
  154. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  155. package/dist/security/audit/config/suppressions.js +19 -3
  156. package/dist/security/contentValidator.d.ts +2 -0
  157. package/dist/security/contentValidator.d.ts.map +1 -1
  158. package/dist/security/contentValidator.js +115 -4
  159. package/dist/security/secureYamlParser.d.ts +1 -0
  160. package/dist/security/secureYamlParser.d.ts.map +1 -1
  161. package/dist/security/secureYamlParser.js +29 -7
  162. package/dist/security/securityMonitor.d.ts +1 -1
  163. package/dist/security/securityMonitor.d.ts.map +1 -1
  164. package/dist/security/securityMonitor.js +1 -1
  165. package/dist/security/tokenManager.d.ts +1 -1
  166. package/dist/security/tokenManager.d.ts.map +1 -1
  167. package/dist/security/tokenManager.js +30 -10
  168. package/dist/server/ServerSetup.d.ts +22 -2
  169. package/dist/server/ServerSetup.d.ts.map +1 -1
  170. package/dist/server/ServerSetup.js +77 -12
  171. package/dist/server/tools/AuthTools.d.ts.map +1 -1
  172. package/dist/server/tools/AuthTools.js +33 -1
  173. package/dist/server/tools/BuildInfoTools.d.ts +25 -0
  174. package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
  175. package/dist/server/tools/BuildInfoTools.js +36 -0
  176. package/dist/server/tools/CollectionTools.d.ts.map +1 -1
  177. package/dist/server/tools/CollectionTools.js +55 -46
  178. package/dist/server/tools/ConfigTools.d.ts.map +1 -1
  179. package/dist/server/tools/ConfigTools.js +29 -1
  180. package/dist/server/tools/PersonaTools.d.ts +4 -2
  181. package/dist/server/tools/PersonaTools.d.ts.map +1 -1
  182. package/dist/server/tools/PersonaTools.js +5 -152
  183. package/dist/server/tools/PortfolioTools.d.ts +12 -0
  184. package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
  185. package/dist/server/tools/PortfolioTools.js +221 -0
  186. package/dist/server/tools/index.d.ts +3 -1
  187. package/dist/server/tools/index.d.ts.map +1 -1
  188. package/dist/server/tools/index.js +4 -2
  189. package/dist/server/types.d.ts +40 -5
  190. package/dist/server/types.d.ts.map +1 -1
  191. package/dist/server/types.js +1 -1
  192. package/dist/services/BuildInfoService.d.ts +84 -0
  193. package/dist/services/BuildInfoService.d.ts.map +1 -0
  194. package/dist/services/BuildInfoService.js +271 -0
  195. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
  196. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
  197. package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
  198. package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
  199. package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
  200. package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
  201. package/dist/tools/portfolio/types.d.ts +41 -0
  202. package/dist/tools/portfolio/types.d.ts.map +1 -0
  203. package/dist/tools/portfolio/types.js +15 -0
  204. package/dist/types/collection.d.ts +51 -0
  205. package/dist/types/collection.d.ts.map +1 -1
  206. package/dist/types/collection.js +1 -1
  207. package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
  208. package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
  209. package/dist/utils/EarlyTerminationSearch.js +164 -0
  210. package/dist/utils/ErrorHandler.d.ts +86 -0
  211. package/dist/utils/ErrorHandler.d.ts.map +1 -0
  212. package/dist/utils/ErrorHandler.js +201 -0
  213. package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
  214. package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
  215. package/dist/utils/FileDiscoveryUtil.js +169 -0
  216. package/dist/utils/GitHubRateLimiter.d.ts +88 -0
  217. package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
  218. package/dist/utils/GitHubRateLimiter.js +315 -0
  219. package/dist/utils/PerformanceMonitor.d.ts +134 -0
  220. package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
  221. package/dist/utils/PerformanceMonitor.js +347 -0
  222. package/dist/utils/RateLimiter.d.ts.map +1 -0
  223. package/dist/utils/RateLimiter.js +172 -0
  224. package/dist/utils/SecureDownloader.d.ts +241 -0
  225. package/dist/utils/SecureDownloader.d.ts.map +1 -0
  226. package/dist/utils/SecureDownloader.js +759 -0
  227. package/dist/utils/ToolCache.d.ts +82 -0
  228. package/dist/utils/ToolCache.d.ts.map +1 -0
  229. package/dist/utils/ToolCache.js +196 -0
  230. package/dist/utils/errorCodes.d.ts +136 -0
  231. package/dist/utils/errorCodes.d.ts.map +1 -0
  232. package/dist/utils/errorCodes.js +87 -0
  233. package/dist/utils/index.d.ts +3 -0
  234. package/dist/utils/index.d.ts.map +1 -1
  235. package/dist/utils/index.js +4 -1
  236. package/dist/utils/installation.d.ts +1 -1
  237. package/dist/utils/installation.d.ts.map +1 -1
  238. package/dist/utils/installation.js +9 -8
  239. package/dist/utils/searchUtils.d.ts +31 -0
  240. package/dist/utils/searchUtils.d.ts.map +1 -1
  241. package/dist/utils/searchUtils.js +62 -1
  242. package/package.json +17 -7
  243. package/dist/config/updateConfig.d.ts +0 -84
  244. package/dist/config/updateConfig.d.ts.map +0 -1
  245. package/dist/config/updateConfig.js +0 -148
  246. package/dist/server/tools/UpdateTools.d.ts +0 -10
  247. package/dist/server/tools/UpdateTools.d.ts.map +0 -1
  248. package/dist/server/tools/UpdateTools.js +0 -85
  249. package/dist/update/BackupManager.d.ts +0 -63
  250. package/dist/update/BackupManager.d.ts.map +0 -1
  251. package/dist/update/BackupManager.js +0 -370
  252. package/dist/update/DependencyChecker.d.ts +0 -41
  253. package/dist/update/DependencyChecker.d.ts.map +0 -1
  254. package/dist/update/DependencyChecker.js +0 -132
  255. package/dist/update/RateLimiter.d.ts.map +0 -1
  256. package/dist/update/RateLimiter.js +0 -172
  257. package/dist/update/SignatureVerifier.d.ts +0 -71
  258. package/dist/update/SignatureVerifier.d.ts.map +0 -1
  259. package/dist/update/SignatureVerifier.js +0 -214
  260. package/dist/update/UpdateChecker.d.ts +0 -132
  261. package/dist/update/UpdateChecker.d.ts.map +0 -1
  262. package/dist/update/UpdateChecker.js +0 -506
  263. package/dist/update/UpdateManager.d.ts +0 -60
  264. package/dist/update/UpdateManager.d.ts.map +0 -1
  265. package/dist/update/UpdateManager.js +0 -730
  266. package/dist/update/VersionManager.d.ts +0 -31
  267. package/dist/update/VersionManager.d.ts.map +0 -1
  268. package/dist/update/VersionManager.js +0 -181
  269. package/dist/update/index.d.ts +0 -9
  270. package/dist/update/index.d.ts.map +0 -1
  271. package/dist/update/index.js +0 -9
  272. /package/dist/{update → utils}/RateLimiter.d.ts +0 -0
@@ -278,9 +278,9 @@ export class Skill extends BaseElement {
278
278
  return result;
279
279
  }
280
280
  /**
281
- * Serialize skill to JSON format
281
+ * Serialize to JSON format for internal use and testing
282
282
  */
283
- serialize() {
283
+ serializeToJSON() {
284
284
  const data = {
285
285
  id: this.id,
286
286
  type: this.type,
@@ -294,6 +294,43 @@ export class Skill extends BaseElement {
294
294
  };
295
295
  return JSON.stringify(data, null, 2);
296
296
  }
297
+ /**
298
+ * Get content for serialization
299
+ */
300
+ getContent() {
301
+ let content = `# ${this.metadata.name}\n\n`;
302
+ content += `${this.metadata.description}\n\n`;
303
+ if (this.instructions) {
304
+ content += `## Instructions\n\n${this.instructions}\n\n`;
305
+ }
306
+ const params = this.getAllParameters();
307
+ if (params && Object.keys(params).length > 0) {
308
+ content += `## Parameters\n\n`;
309
+ for (const [key, value] of Object.entries(params)) {
310
+ content += `- **${key}**: ${JSON.stringify(value)}\n`;
311
+ }
312
+ content += '\n';
313
+ }
314
+ return content;
315
+ }
316
+ /**
317
+ * Serialize skill to markdown format with YAML frontmatter
318
+ * FIX: Changed from JSON to markdown for GitHub portfolio compatibility
319
+ */
320
+ serialize() {
321
+ // Add skill-specific data to extensions for frontmatter
322
+ const originalExtensions = this.extensions;
323
+ this.extensions = {
324
+ ...originalExtensions,
325
+ instructions: this.instructions,
326
+ parameters: this.getAllParameters()
327
+ };
328
+ // Use base class serialize which now outputs markdown
329
+ const result = super.serialize();
330
+ // Restore original extensions
331
+ this.extensions = originalExtensions;
332
+ return result;
333
+ }
297
334
  /**
298
335
  * Deserialize skill from JSON format
299
336
  */
@@ -379,4 +416,4 @@ export class Skill extends BaseElement {
379
416
  logger.debug(`Cleared all parameters for skill: ${this.metadata.name}`);
380
417
  }
381
418
  }
382
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tpbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2tpbGxzL1NraWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFnQixNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQWlDcEUsTUFBTSxPQUFPLEtBQU0sU0FBUSxXQUFXO0lBRTdCLFlBQVksQ0FBUztJQUNyQixVQUFVLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFaEQsMkVBQTJFO0lBQzNFLDhFQUE4RTtJQUM5RSw4Q0FBOEM7SUFDN0IsbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0lBQzFCLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxDQUFDLCtCQUErQjtJQUU1RSxZQUFZLFFBQWdDLEVBQUUsZUFBdUIsRUFBRTtRQUNyRSw2REFBNkQ7UUFDN0QsNERBQTREO1FBQzVELDBFQUEwRTtRQUMxRSwyQ0FBMkM7UUFDM0MsOEJBQThCO1FBQzlCLDZCQUE2QjtRQUM3QixNQUFNLGlCQUFpQixHQUFHO1lBQ3hCLEdBQUcsUUFBUTtZQUNYLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNqSCxXQUFXLEVB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QUMsWUFBWSxDQUFDLENBQUM7UUFFM0QsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUVILDJDQUEyQztRQUMzQyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtnQkFDckQsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDYSxLQUFLLENBQUMsVUFBVTtRQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV0RSxxRUFBcUU7UUFDckUsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QixNQUFNLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGVBQWU7UUFDYixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMscUNBQXFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNraWxsIGVsZW1lbnQgY2xhc3MgaW1wbGVtZW50aW5nIElFbGVtZW50IGludGVyZmFjZS5cbiAqIFJlcHJlc2VudHMgYSBkaXNjcmV0ZSBjYXBhYmlsaXR5IGZvciBzcGVjaWZpYyB0YXNrcy5cbiAqIFxuICogU0VDVVJJVFkgRklYRVMgSU1QTEVNRU5URUQgKFBSICMzMTkpOlxuICogMS4gQ1JJVElDQUw6IEFkZGVkIGNvbXByZWhlbnNpdmUgaW5wdXQgdmFsaWRhdGlvbiBmb3IgYWxsIHNraWxsIHBhcmFtZXRlcnNcbiAqIDIuIE1FRElVTTogSW1wbGVtZW50ZWQgVW5pY29kZSBub3JtYWxpemF0aW9uIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAqIDMuIE1FRElVTTogQWRkZWQgYXVkaXQgbG9nZ2luZyBmb3Igc2VjdXJpdHkgZXZlbnRzIHZpYSBTZWN1cml0eU1vbml0b3JcbiAqIDQuIE1FRElVTTogSW1wbGVtZW50ZWQgbWVtb3J5IG1hbmFnZW1lbnQgdG8gcHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoXG4gKiA1LiBNRURJVU06IEFkZGVkIFhTUyBwcm90ZWN0aW9uIHRocm91Z2ggaW5wdXQgc2FuaXRpemF0aW9uXG4gKi9cblxuaW1wb3J0IHsgQmFzZUVsZW1lbnQgfSBmcm9tICcuLi9CYXNlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudCwgSUVsZW1lbnRNZXRhZGF0YSwgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVQYXRoIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuXG4vLyBFeHRlbmQgSUVsZW1lbnRNZXRhZGF0YSB3aXRoIHNraWxsLXNwZWNpZmljIGZpZWxkc1xuZXhwb3J0IGludGVyZmFjZSBTa2lsbE1ldGFkYXRhIGV4dGVuZHMgSUVsZW1lbnRNZXRhZGF0YSB7XG4gIGxhbmd1YWdlcz86IHN0cmluZ1tdOyAgICAgICAgICAgLy8gUHJvZ3JhbW1pbmcvc3Bva2VuIGxhbmd1YWdlcyB0aGlzIHNraWxsIHdvcmtzIHdpdGhcbiAgY29tcGxleGl0eT86ICdiZWdpbm5lcicgfCAnaW50ZXJtZWRpYXRlJyB8ICdhZHZhbmNlZCcgfCAnZXhwZXJ0JztcbiAgZG9tYWlucz86IHN0cmluZ1tdOyAgICAgICAgICAgICAvLyBEb21haW4gY2F0ZWdvcmllcyAoZS5nLiwgd2ViLWRldiwgZGF0YS1zY2llbmNlLCB3cml0aW5nKVxuICBwcmVyZXF1aXNpdGVzPzogc3RyaW5nW107ICAgICAgIC8vIFJlcXVpcmVkIGtub3dsZWRnZSBvciBvdGhlciBza2lsbHNcbiAgcGFyYW1ldGVycz86IFNraWxsUGFyYW1ldGVyW107ICAvLyBDb25maWd1cmFibGUgcGFyYW1ldGVyc1xuICBleGFtcGxlcz86IFNraWxsRXhhbXBsZVtdOyAgICAgIC8vIFVzYWdlIGV4YW1wbGVzXG4gIGNlcnRpZmljYXRpb24/OiBzdHJpbmc7ICAgICAgICAgLy8gRXh0ZXJuYWwgY2VydGlmaWNhdGlvbiBvciB2YWxpZGF0aW9uXG4gIHByb2ZpY2llbmN5X2xldmVsPzogbnVtYmVyOyAgICAgLy8gMS0xMDAgcHJvZmljaWVuY3kgbGV2ZWxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTa2lsbFBhcmFtZXRlciB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdib29sZWFuJyB8ICdlbnVtJztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBkZWZhdWx0PzogYW55O1xuICBvcHRpb25zPzogc3RyaW5nW107ICAvLyBGb3IgZW51bSB0eXBlXG4gIG1pbj86IG51bWJlcjsgICAgICAgIC8vIEZvciBudW1iZXIgdHlwZVxuICBtYXg/OiBudW1iZXI7ICAgICAgICAvLyBGb3IgbnVtYmVyIHR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTa2lsbEV4YW1wbGUge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBpbnB1dD86IGFueTtcbiAgb3V0cHV0PzogYW55O1xuICBjb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU2tpbGwgZXh0ZW5kcyBCYXNlRWxlbWVudCBpbXBsZW1lbnRzIElFbGVtZW50IHtcbiAgcHVibGljIGRlY2xhcmUgbWV0YWRhdGE6IFNraWxsTWV0YWRhdGE7XG4gIHB1YmxpYyBpbnN0cnVjdGlvbnM6IHN0cmluZztcbiAgcHVibGljIHBhcmFtZXRlcnM6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBTRUNVUklUWSBGSVggIzQ6IE1lbW9yeSBtYW5hZ2VtZW50IGNvbnN0YW50cyB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhcbiAgLy8gUHJldmlvdXNseTogTm8gbGltaXRzIG9uIHBhcmFtZXRlciBzdG9yYWdlLCBjb3VsZCBsZWFkIHRvIG1lbW9yeSBleGhhdXN0aW9uXG4gIC8vIE5vdzogRW5mb3JjZWQgbGltaXRzIG9uIGJvdGggY291bnQgYW5kIHNpemVcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfUEFSQU1FVEVSX0NPVU5UID0gMTAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9QQVJBTUVURVJfU0laRSA9IDEwMDAwOyAvLyBNYXggc2l6ZSBwZXIgcGFyYW1ldGVyIHZhbHVlXG5cbiAgY29uc3RydWN0b3IobWV0YWRhdGE6IFBhcnRpYWw8U2tpbGxNZXRhZGF0YT4sIGluc3RydWN0aW9uczogc3RyaW5nID0gJycpIHtcbiAgICAvLyBTRUNVUklUWSBGSVggIzI6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBBTEwgbWV0YWRhdGEgZmllbGRzXG4gICAgLy8gUHJldmlvdXNseTogbWV0YWRhdGEgd2FzIHVzZWQgZGlyZWN0bHkgd2l0aG91dCB2YWxpZGF0aW9uXG4gICAgLy8gTm93OiBBbGwgc3RyaW5nIGlucHV0cyBhcmUgVW5pY29kZSBub3JtYWxpemVkIGFuZCBzYW5pdGl6ZWQgdG8gcHJldmVudDpcbiAgICAvLyAtIFhTUyBhdHRhY2tzIHRocm91Z2ggbWFsaWNpb3VzIG1ldGFkYXRhXG4gICAgLy8gLSBVbmljb2RlIGhvbW9ncmFwaCBhdHRhY2tzXG4gICAgLy8gLSBCdWZmZXIgb3ZlcmZsb3cgYXR0ZW1wdHNcbiAgICBjb25zdCBzYW5pdGl6ZWRNZXRhZGF0YSA9IHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSA/IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWV0YWRhdGEubmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCkgOiB1bmRlZmluZWQsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24gPyBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG1ldGFkYXRhLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgXG4gICAgc3VwZXIoRWxlbWVudFR5cGUuU0tJTEwsIHNhbml0aXplZE1ldGFkYXRhKTtcbiAgICAvLyBFbnN1cmUgaW5zdHJ1Y3Rpb25zIGlzIGFsd2F5cyBhIHN0cmluZywgZXZlbiBpZiBlbXB0eVxuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zICYmIGluc3RydWN0aW9ucy50cmltKCkgPyBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGluc3RydWN0aW9ucykubm9ybWFsaXplZENvbnRlbnQsIDEwMDAwKSA6ICcnO1xuICAgIFxuICAgIC8vIEVuc3VyZSBza2lsbC1zcGVjaWZpYyBtZXRhZGF0YVxuICAgIHRoaXMubWV0YWRhdGEgPSB7XG4gICAgICAuLi50aGlzLm1ldGFkYXRhLFxuICAgICAgbGFuZ3VhZ2VzOiBtZXRhZGF0YS5sYW5ndWFnZXMgfHwgW10sXG4gICAgICBjb21wbGV4aXR5OiBtZXRhZGF0YS5jb21wbGV4aXR5IHx8ICdiZWdpbm5lcicsXG4gICAgICBkb21haW5zOiBtZXRhZGF0YS5kb21haW5zIHx8IFtdLFxuICAgICAgcHJlcmVxdWlzaXRlczogbWV0YWRhdGEucHJlcmVxdWlzaXRlcyB8fCBbXSxcbiAgICAgIHBhcmFtZXRlcnM6IG1ldGFkYXRhLnBhcmFtZXRlcnMgfHwgW10sXG4gICAgICBleGFtcGxlczogbWV0YWRhdGEuZXhhbXBsZXMgfHwgW10sXG4gICAgICBwcm9maWNpZW5jeV9sZXZlbDogbWV0YWRhdGEucHJvZmljaWVuY3lfbGV2ZWwgfHwgMFxuICAgIH07XG5cbiAgICAvLyBWYWxpZGF0ZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnNcbiAgICBpZiAodGhpcy5tZXRhZGF0YS5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aGlzLm1ldGFkYXRhLnBhcmFtZXRlcnMgPSB0aGlzLm1ldGFkYXRhLnBhcmFtZXRlcnMubWFwKHBhcmFtID0+ICh7XG4gICAgICAgIC4uLnBhcmFtLFxuICAgICAgICBuYW1lOiBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHBhcmFtLm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCA1MCksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHBhcmFtLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgMjAwKSxcbiAgICAgICAgb3B0aW9uczogcGFyYW0ub3B0aW9ucz8ubWFwKG9wdCA9PiBzYW5pdGl6ZUlucHV0KG9wdCwgMTAwKSlcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHBhcmFtZXRlciB2YWx1ZXMgd2l0aCBkZWZhdWx0c1xuICAgIHRoaXMuaW5pdGlhbGl6ZVBhcmFtZXRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplUGFyYW1ldGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXRhZGF0YS5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aGlzLm1ldGFkYXRhLnBhcmFtZXRlcnMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgIGlmIChwYXJhbS5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KHBhcmFtLm5hbWUsIHBhcmFtLmRlZmF1bHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgcGFyYW1ldGVyIHZhbHVlXG4gICAqIFNFQ1VSSVRZIEZJWCAjMTogQ29tcHJlaGVuc2l2ZSBpbnB1dCB2YWxpZGF0aW9uIGZvciBhbGwgc2tpbGwgcGFyYW1ldGVyc1xuICAgKiBQcmV2aW91c2x5OiBQYXJhbWV0ZXJzIHdlcmUgc2V0IHdpdGhvdXQgdmFsaWRhdGlvbiwgY3JlYXRpbmcgc2VjdXJpdHkgcmlza3NcbiAgICogTm93OiBGdWxsIHZhbGlkYXRpb24gcGlwZWxpbmUgaW5jbHVkaW5nIHNhbml0aXphdGlvbiwgdHlwZSBjaGVja2luZywgYW5kIHNpemUgbGltaXRzXG4gICAqL1xuICBzZXRQYXJhbWV0ZXIobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gQ1JJVElDQUwgRklYOiBTYW5pdGl6ZSBwYXJhbWV0ZXIgbmFtZSB0byBwcmV2ZW50IGluamVjdGlvbiBhdHRhY2tzXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgNTApO1xuICAgIFxuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5tZXRhZGF0YS5wYXJhbWV0ZXJzPy5maW5kKHAgPT4gcC5uYW1lID09PSBzYW5pdGl6ZWROYW1lKTtcbiAgICBpZiAoIXBhcmFtKSB7XG4gICAgICAvLyBTRUNVUklUWSBGSVggIzM6IExvZyBhdWRpdCBldmVudHMgZm9yIHNlY3VyaXR5IG1vbml0b3JpbmdcbiAgICAgIC8vIFRoaXMgaGVscHMgZGV0ZWN0IHBvdGVudGlhbCBhdHRhY2sgcGF0dGVybnMgb3IgbWlzY29uZmlndXJhdGlvbnNcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfUEFSU0lOR19XQVJOSU5HJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdTa2lsbC5zZXRQYXJhbWV0ZXInLFxuICAgICAgICBkZXRhaWxzOiBgQXR0ZW1wdCB0byBzZXQgdW5rbm93biBwYXJhbWV0ZXI6ICR7c2FuaXRpemVkTmFtZX0gZm9yIHNraWxsOiAke3RoaXMubWV0YWRhdGEubmFtZX1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyICcke3Nhbml0aXplZE5hbWV9JyBub3QgZm91bmQgaW4gc2tpbGwgZGVmaW5pdGlvbmApO1xuICAgIH1cblxuICAgIC8vIENSSVRJQ0FMIEZJWDogU2FuaXRpemUgYW5kIHZhbGlkYXRlIHRoZSB2YWx1ZSBiYXNlZCBvbiB0eXBlXG4gICAgbGV0IHNhbml0aXplZFZhbHVlID0gdmFsdWU7XG4gICAgXG4gICAgaWYgKHBhcmFtLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBTRUNVUklUWSBGSVggIzIgJiAjNTogTm9ybWFsaXplIFVuaWNvZGUgYW5kIHNhbml0aXplIHN0cmluZyB2YWx1ZXNcbiAgICAgIC8vIFByZXZpb3VzbHk6IFN0cmluZyB2YWx1ZXMgd2VyZSB1c2VkIGRpcmVjdGx5IHdpdGhvdXQgdmFsaWRhdGlvblxuICAgICAgLy8gTm93OiBGdWxsIHZhbGlkYXRpb24gcGlwZWxpbmU6XG4gICAgICAvLyAxLiBVbmljb2RlIG5vcm1hbGl6YXRpb24gcHJldmVudHMgaG9tb2dyYXBoIGF0dGFja3NcbiAgICAgIC8vIDIuIHNhbml0aXplSW5wdXQoKSBzdHJpcHMgZGFuZ2Vyb3VzIEhUTUwvSlMgY29udGVudFxuICAgICAgLy8gMy4gTGVuZ3RoIGxpbWl0cyBwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyBhdHRhY2tzXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoU3RyaW5nKHZhbHVlKSk7XG4gICAgICBzYW5pdGl6ZWRWYWx1ZSA9IHNhbml0aXplSW5wdXQobm9ybWFsaXplZC5ub3JtYWxpemVkQ29udGVudCwgcGFyYW0ubWF4IHx8IDEwMDApO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzU6IEFkZGl0aW9uYWwgWFNTIHByb3RlY3Rpb25cbiAgICAgIC8vIENoZWNrIGZvciBjb21tb24gWFNTIHBhdHRlcm5zIGV2ZW4gYWZ0ZXIgc2FuaXRpemF0aW9uXG4gICAgICAvLyBUaGlzIHByb3ZpZGVzIGRlZmVuc2UtaW4tZGVwdGggYWdhaW5zdCBzb3BoaXN0aWNhdGVkIGF0dGFja3NcbiAgICAgIGlmIChzYW5pdGl6ZWRWYWx1ZS5pbmNsdWRlcygnPHNjcmlwdCcpIHx8IHNhbml0aXplZFZhbHVlLmluY2x1ZGVzKCdqYXZhc2NyaXB0OicpKSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjMzogTG9nIGhpZ2gtc2V2ZXJpdHkgc2VjdXJpdHkgZXZlbnRzXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICdTa2lsbC5zZXRQYXJhbWV0ZXInLFxuICAgICAgICAgIGRldGFpbHM6IGBQb3RlbnRpYWwgWFNTIGF0dGVtcHQgaW4gc2tpbGwgcGFyYW1ldGVyOiAke3Nhbml0aXplZE5hbWV9IGZvciBza2lsbDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9YFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoYXJhY3RlcnMgaW4gcGFyYW1ldGVyIHZhbHVlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHlwZSB2YWxpZGF0aW9uXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlUGFyYW1ldGVyVmFsdWUocGFyYW0sIHNhbml0aXplZFZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgJyR7c2FuaXRpemVkTmFtZX0nOiBleHBlY3RlZCAke3BhcmFtLnR5cGV9YCk7XG4gICAgfVxuXG4gICAgLy8gU0VDVVJJVFkgRklYICM0OiBNZW1vcnkgbWFuYWdlbWVudCAtIGNoZWNrIHBhcmFtZXRlciBjb3VudFxuICAgIC8vIFByZXZpb3VzbHk6IE5vIGxpbWl0cyBvbiBwYXJhbWV0ZXIgc3RvcmFnZSwgY291bGQgbGVhZCB0byBtZW1vcnkgZXhoYXVzdGlvbiBhdHRhY2tzXG4gICAgLy8gTm93OiBFbmZvcmNlZCBsaW1pdHMgcHJldmVudCBhdHRhY2tlcnMgZnJvbSBjb25zdW1pbmcgdW5saW1pdGVkIG1lbW9yeVxuICAgIGlmICh0aGlzLnBhcmFtZXRlcnMuc2l6ZSA+PSB0aGlzLk1BWF9QQVJBTUVURVJfQ09VTlQgJiYgIXRoaXMucGFyYW1ldGVycy5oYXMoc2FuaXRpemVkTmFtZSkpIHtcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjMzogTG9nIHJhdGUgbGltaXQgdmlvbGF0aW9ucyBmb3Igc2VjdXJpdHkgbW9uaXRvcmluZ1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnU2tpbGwuc2V0UGFyYW1ldGVyJyxcbiAgICAgICAgZGV0YWlsczogYFBhcmFtZXRlciBsaW1pdCBleGNlZWRlZCBmb3Igc2tpbGw6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfS4gTWF4OiAke3RoaXMuTUFYX1BBUkFNRVRFUl9DT1VOVH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIGxpbWl0IGV4Y2VlZGVkLiBNYXhpbXVtICR7dGhpcy5NQVhfUEFSQU1FVEVSX0NPVU5UfSBwYXJhbWV0ZXJzIGFsbG93ZWRgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYICM0OiBDaGVjayBwYXJhbWV0ZXIgdmFsdWUgc2l6ZSBmb3Igc3RyaW5nc1xuICAgIC8vIFRoaXMgcHJldmVudHMgYXR0YWNrZXJzIGZyb20gc3RvcmluZyBtYXNzaXZlIHN0cmluZ3MgdGhhdCBjb3VsZCBleGhhdXN0IG1lbW9yeVxuICAgIGlmIChwYXJhbS50eXBlID09PSAnc3RyaW5nJyAmJiBzYW5pdGl6ZWRWYWx1ZS5sZW5ndGggPiB0aGlzLk1BWF9QQVJBTUVURVJfU0laRSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXJhbWV0ZXIgdmFsdWUgdG9vIGxhcmdlLiBNYXhpbXVtICR7dGhpcy5NQVhfUEFSQU1FVEVSX1NJWkV9IGNoYXJhY3RlcnMgYWxsb3dlZGApO1xuICAgIH1cblxuICAgIHRoaXMucGFyYW1ldGVycy5zZXQoc2FuaXRpemVkTmFtZSwgc2FuaXRpemVkVmFsdWUpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgU2V0IHBhcmFtZXRlciAke3Nhbml0aXplZE5hbWV9ID0gJHtzYW5pdGl6ZWRWYWx1ZX0gZm9yIHNraWxsICR7dGhpcy5tZXRhZGF0YS5uYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHBhcmFtZXRlciB2YWx1ZVxuICAgKi9cbiAgZ2V0UGFyYW1ldGVyKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5nZXQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwYXJhbWV0ZXJzIGFzIG9iamVjdFxuICAgKi9cbiAgZ2V0QWxsUGFyYW1ldGVycygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMucGFyYW1ldGVycyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgcGFyYW1ldGVyIHZhbHVlIGFnYWluc3QgaXRzIGRlZmluaXRpb25cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZShwYXJhbTogU2tpbGxQYXJhbWV0ZXIsIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHBhcmFtLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgaWYgKGlzTmFOKG51bSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHBhcmFtLm1pbiAhPT0gdW5kZWZpbmVkICYmIG51bSA8IHBhcmFtLm1pbikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocGFyYW0ubWF4ICE9PSB1bmRlZmluZWQgJiYgbnVtID4gcGFyYW0ubWF4KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgICAgIGNhc2UgJ2VudW0nOlxuICAgICAgICByZXR1cm4gcGFyYW0ub3B0aW9ucz8uaW5jbHVkZXMoU3RyaW5nKHZhbHVlKSkgfHwgZmFsc2U7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgc2tpbGwgd2l0aCBjdXJyZW50IHBhcmFtZXRlcnNcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXQ/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGxvZ2dlci5pbmZvKGBFeGVjdXRpbmcgc2tpbGw6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfWApO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgICBjb25zdCBtaXNzaW5nUmVxdWlyZWQgPSB0aGlzLm1ldGFkYXRhLnBhcmFtZXRlcnNcbiAgICAgID8uZmlsdGVyKHAgPT4gcC5yZXF1aXJlZCAmJiAhdGhpcy5wYXJhbWV0ZXJzLmhhcyhwLm5hbWUpKVxuICAgICAgLm1hcChwID0+IHAubmFtZSkgfHwgW107XG4gICAgXG4gICAgaWYgKG1pc3NpbmdSZXF1aXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyczogJHttaXNzaW5nUmVxdWlyZWQuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBTa2lsbHMgZG9uJ3QgaGF2ZSBidWlsdC1pbiBleGVjdXRpb24gbG9naWMgLSB0aGlzIHdvdWxkIGJlIGltcGxlbWVudGVkXG4gICAgLy8gYnkgc3BlY2lmaWMgc2tpbGwgdHlwZXMgb3IgdGhyb3VnaCBhIHBsdWdpbiBzeXN0ZW1cbiAgICBsb2dnZXIuZGVidWcoYFNraWxsICR7dGhpcy5tZXRhZGF0YS5uYW1lfSBleGVjdXRlZCB3aXRoIHBhcmFtZXRlcnM6YCwgdGhpcy5nZXRBbGxQYXJhbWV0ZXJzKCkpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBza2lsbDogdGhpcy5tZXRhZGF0YS5uYW1lLFxuICAgICAgcGFyYW1ldGVyczogdGhpcy5nZXRBbGxQYXJhbWV0ZXJzKCksXG4gICAgICBpbnB1dCxcbiAgICAgIGV4ZWN1dGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNraWxsLXNwZWNpZmljIHZhbGlkYXRpb25cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIudmFsaWRhdGUoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGFycmF5cyBpZiBub3QgcHJlc2VudFxuICAgIGlmICghcmVzdWx0LmVycm9ycykgcmVzdWx0LmVycm9ycyA9IFtdO1xuICAgIGlmICghcmVzdWx0Lndhcm5pbmdzKSByZXN1bHQud2FybmluZ3MgPSBbXTtcbiAgICBcbiAgICAvLyBJbnN0cnVjdGlvbnMgc2hvdWxkIG5vdCBiZSBlbXB0eVxuICAgIGlmICghdGhpcy5pbnN0cnVjdGlvbnMgfHwgdGhpcy5pbnN0cnVjdGlvbnMudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdpbnN0cnVjdGlvbnMnLFxuICAgICAgICBtZXNzYWdlOiAnU2tpbGwgaW5zdHJ1Y3Rpb25zIGNhbm5vdCBiZSBlbXB0eScsXG4gICAgICAgIGNvZGU6ICdFTVBUWV9JTlNUUlVDVElPTlMnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjb21wbGV4aXR5IGxldmVsXG4gICAgY29uc3QgdmFsaWRDb21wbGV4aXR5ID0gWydiZWdpbm5lcicsICdpbnRlcm1lZGlhdGUnLCAnYWR2YW5jZWQnLCAnZXhwZXJ0J107XG4gICAgaWYgKHRoaXMubWV0YWRhdGEuY29tcGxleGl0eSAmJiAhdmFsaWRDb21wbGV4aXR5LmluY2x1ZGVzKHRoaXMubWV0YWRhdGEuY29tcGxleGl0eSkpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiAnY29tcGxleGl0eScsXG4gICAgICAgIG1lc3NhZ2U6IGBDb21wbGV4aXR5IG11c3QgYmUgb25lIG9mOiAke3ZhbGlkQ29tcGxleGl0eS5qb2luKCcsICcpfWAsXG4gICAgICAgIGNvZGU6ICdJTlZBTElEX0NPTVBMRVhJVFknXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBwcm9maWNpZW5jeSBsZXZlbFxuICAgIGlmICh0aGlzLm1ldGFkYXRhLnByb2ZpY2llbmN5X2xldmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLm1ldGFkYXRhLnByb2ZpY2llbmN5X2xldmVsIDwgMCB8fCB0aGlzLm1ldGFkYXRhLnByb2ZpY2llbmN5X2xldmVsID4gMTAwKSB7XG4gICAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgICAgZmllbGQ6ICdwcm9maWNpZW5jeV9sZXZlbCcsXG4gICAgICAgICAgbWVzc2FnZTogJ1Byb2ZpY2llbmN5IGxldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAnLFxuICAgICAgICAgIGNvZGU6ICdJTlZBTElEX1BST0ZJQ0lFTkNZJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzXG4gICAgaWYgKHRoaXMubWV0YWRhdGEucGFyYW1ldGVycykge1xuICAgICAgdGhpcy5tZXRhZGF0YS5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoIXBhcmFtLm5hbWUgfHwgcGFyYW0ubmFtZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgcmVzdWx0LmVycm9ycyEucHVzaCh7XG4gICAgICAgICAgICBmaWVsZDogYHBhcmFtZXRlcnNbJHtpbmRleH1dLm5hbWVgLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1BhcmFtZXRlciBuYW1lIGlzIHJlcXVpcmVkJyxcbiAgICAgICAgICAgIGNvZGU6ICdNSVNTSU5HX1BBUkFNRVRFUl9OQU1FJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGFyYW0udHlwZSA9PT0gJ2VudW0nICYmICghcGFyYW0ub3B0aW9ucyB8fCBwYXJhbS5vcHRpb25zLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICByZXN1bHQuZXJyb3JzIS5wdXNoKHtcbiAgICAgICAgICAgIGZpZWxkOiBgcGFyYW1ldGVyc1ske2luZGV4fV0ub3B0aW9uc2AsXG4gICAgICAgICAgICBtZXNzYWdlOiAnRW51bSBwYXJhbWV0ZXIgbXVzdCBoYXZlIG9wdGlvbnMgZGVmaW5lZCcsXG4gICAgICAgICAgICBjb2RlOiAnTUlTU0lOR19FTlVNX09QVElPTlMnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFdhcm5pbmdzIGZvciBiZXN0IHByYWN0aWNlc1xuICAgIGlmICghdGhpcy5tZXRhZGF0YS5kb21haW5zIHx8IHRoaXMubWV0YWRhdGEuZG9tYWlucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlc3VsdC53YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdkb21haW5zJyxcbiAgICAgICAgbWVzc2FnZTogJ0NvbnNpZGVyIGFkZGluZyBkb21haW4gY2F0ZWdvcmllcyBmb3IgYmV0dGVyIG9yZ2FuaXphdGlvbicsXG4gICAgICAgIHNldmVyaXR5OiAnbG93J1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm1ldGFkYXRhLmV4YW1wbGVzIHx8IHRoaXMubWV0YWRhdGEuZXhhbXBsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHQud2FybmluZ3MucHVzaCh7XG4gICAgICAgIGZpZWxkOiAnZXhhbXBsZXMnLFxuICAgICAgICBtZXNzYWdlOiAnQWRkaW5nIHVzYWdlIGV4YW1wbGVzIGltcHJvdmVzIHNraWxsIHVzYWJpbGl0eScsXG4gICAgICAgIHNldmVyaXR5OiAnbWVkaXVtJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSB2YWxpZCBmbGFnIGJhc2VkIG9uIGZpbmFsIGVycm9yc1xuICAgIHJlc3VsdC52YWxpZCA9IChyZXN1bHQuZXJyb3JzPy5sZW5ndGggfHwgMCkgPT09IDA7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBza2lsbCB0byBKU09OIGZvcm1hdFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiB0aGlzLmluc3RydWN0aW9ucyxcbiAgICAgIHBhcmFtZXRlcnM6IHRoaXMuZ2V0QWxsUGFyYW1ldGVycygpLFxuICAgICAgcmVmZXJlbmNlczogdGhpcy5yZWZlcmVuY2VzLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5leHRlbnNpb25zLFxuICAgICAgcmF0aW5nczogdGhpcy5yYXRpbmdzXG4gICAgfTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBza2lsbCBmcm9tIEpTT04gZm9ybWF0XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZGVzZXJpYWxpemUoZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBtZXRhZGF0YVxuICAgICAgdGhpcy5tZXRhZGF0YSA9IHsgLi4udGhpcy5tZXRhZGF0YSwgLi4ucGFyc2VkLm1ldGFkYXRhIH07XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBvdGhlciBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLmluc3RydWN0aW9ucyA9IHBhcnNlZC5pbnN0cnVjdGlvbnMgfHwgJyc7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMgPSBwYXJzZWQucmVmZXJlbmNlcyB8fCBbXTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHBhcnNlZC5leHRlbnNpb25zIHx8IHt9O1xuICAgICAgdGhpcy5yYXRpbmdzID0gcGFyc2VkLnJhdGluZ3MgfHwgdGhpcy5yYXRpbmdzO1xuICAgICAgXG4gICAgICAvLyBVcGRhdGUgSUQgYW5kIHZlcnNpb24gaWYgcHJvdmlkZWRcbiAgICAgIGlmIChwYXJzZWQuaWQpIHRoaXMuaWQgPSBwYXJzZWQuaWQ7XG4gICAgICBpZiAocGFyc2VkLnZlcnNpb24pIHRoaXMudmVyc2lvbiA9IHBhcnNlZC52ZXJzaW9uO1xuICAgICAgXG4gICAgICAvLyBSZXN0b3JlIHBhcmFtZXRlcnNcbiAgICAgIGlmIChwYXJzZWQucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuY2xlYXIoKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocGFyc2VkLnBhcmFtZXRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRGVzZXJpYWxpemVkIHNraWxsOiAke3RoaXMubWV0YWRhdGEubmFtZX1gKTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkZXNlcmlhbGl6ZSBza2lsbDogJHtlcnJvcn1gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGVzZXJpYWxpemF0aW9uIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2tpbGwgYWN0aXZhdGlvbiBsaWZlY3ljbGVcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBhY3RpdmF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuaW5mbyhgQWN0aXZhdGluZyBza2lsbDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9ICgke3RoaXMuaWR9KWApO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIHRoYXQgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIHNldFxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhY3RpdmF0ZSBza2lsbCB3aXRoIHZhbGlkYXRpb24gZXJyb3JzOiAke3ZhbGlkYXRpb24uZXJyb3JzPy5tYXAoZSA9PiBlLm1lc3NhZ2UpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIFxuICAgIGF3YWl0IHN1cGVyLmFjdGl2YXRlPy4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZSB0aGUgc2tpbGwgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVyc1xuICAgKi9cbiAgY2xvbmUobmV3UGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBTa2lsbCB7XG4gICAgY29uc3QgY2xvbmVkID0gbmV3IFNraWxsKHRoaXMubWV0YWRhdGEsIHRoaXMuaW5zdHJ1Y3Rpb25zKTtcbiAgICBcbiAgICAvLyBDb3B5IGN1cnJlbnQgcGFyYW1ldGVyc1xuICAgIHRoaXMucGFyYW1ldGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBjbG9uZWQucGFyYW1ldGVycy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gT3ZlcnJpZGUgd2l0aCBuZXcgcGFyYW1ldGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChuZXdQYXJhbWV0ZXJzKSB7XG4gICAgICBPYmplY3QuZW50cmllcyhuZXdQYXJhbWV0ZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY2xvbmVkLnNldFBhcmFtZXRlcihrZXksIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG4gIFxuICAvKipcbiAgICogU2tpbGwgZGVhY3RpdmF0aW9uIGxpZmVjeWNsZVxuICAgKiBTRUNVUklUWSBGSVggIzQ6IEF1dG9tYXRpY2FsbHkgY2xlYXJzIHBhcmFtZXRlcnMgb24gZGVhY3RpdmF0aW9uXG4gICAqIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIGxvbmctcnVubmluZyBwcm9jZXNzZXNcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBkZWFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKGBEZWFjdGl2YXRpbmcgc2tpbGw6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfSAoJHt0aGlzLmlkfSlgKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzQ6IENsZWFyIHBhcmFtZXRlcnMgdG8gZnJlZSBtZW1vcnkgYW5kIHByZXZlbnQgbGVha3NcbiAgICAvLyBUaGlzIGVuc3VyZXMgc2tpbGxzIGRvbid0IHJldGFpbiBkYXRhIGFmdGVyIGRlYWN0aXZhdGlvblxuICAgIHRoaXMuY2xlYXJQYXJhbWV0ZXJzKCk7XG4gICAgXG4gICAgYXdhaXQgc3VwZXIuZGVhY3RpdmF0ZT8uKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgcGFyYW1ldGVycyAoZm9yIG1lbW9yeSBtYW5hZ2VtZW50KVxuICAgKiBTRUNVUklUWSBGSVggIzQ6IEFkZGVkIG1ldGhvZCB0byBjbGVhciBwYXJhbWV0ZXJzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgKiBQcmV2aW91c2x5OiBQYXJhbWV0ZXJzIGFjY3VtdWxhdGVkIGluZGVmaW5pdGVseSBpbiBsb25nLXJ1bm5pbmcgcHJvY2Vzc2VzXG4gICAqIE5vdzogUHJvdmlkZXMgZXhwbGljaXQgY2xlYW51cCBtZWNoYW5pc20gY2FsbGVkIGR1cmluZyBkZWFjdGl2YXRpb25cbiAgICovXG4gIGNsZWFyUGFyYW1ldGVycygpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtZXRlcnMuY2xlYXIoKTtcbiAgICBsb2dnZXIuZGVidWcoYENsZWFyZWQgYWxsIHBhcmFtZXRlcnMgZm9yIHNraWxsOiAke3RoaXMubWV0YWRhdGEubmFtZX1gKTtcbiAgfVxufSJdfQ==
419
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tpbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvc2tpbGxzL1NraWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFnQixNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQWlDcEUsTUFBTSxPQUFPLEtBQU0sU0FBUSxXQUFXO0lBRTdCLFlBQVksQ0FBUztJQUNyQixVQUFVLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFaEQsMkVBQTJFO0lBQzNFLDhFQUE4RTtJQUM5RSw4Q0FBOEM7SUFDN0IsbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0lBQzFCLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxDQUFDLCtCQUErQjtJQUU1RSxZQUFZLFFBQWdDLEVBQUUsZUFBdUIsRUFBRTtRQUNyRSw2REFBNkQ7UUFDN0QsNERBQTREO1FBQzVELDBFQUEwRTtRQUMxRSwyQ0FBMkM7UUFDM0MsOEJBQThCO1FBQzlCLDZCQUE2QjtRQUM3QixNQUFNLGlCQUFpQixHQUFHO1lBQ3hCLEdBQUcsUUFBUTtZQUNYLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNqSCxXQUFXLEVB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KipcbiAqIFNraWxsIGVsZW1lbnQgY2xhc3MgaW1wbGVtZW50aW5nIElFbGVtZW50IGludGVyZmFjZS5cbiAqIFJlcHJlc2VudHMgYSBkaXNjcmV0ZSBjYXBhYmlsaXR5IGZvciBzcGVjaWZpYyB0YXNrcy5cbiAqIFxuICogU0VDVVJJVFkgRklYRVMgSU1QTEVNRU5URUQgKFBSICMzMTkpOlxuICogMS4gQ1JJVElDQUw6IEFkZGVkIGNvbXByZWhlbnNpdmUgaW5wdXQgdmFsaWRhdGlvbiBmb3IgYWxsIHNraWxsIHBhcmFtZXRlcnNcbiAqIDIuIE1FRElVTTogSW1wbGVtZW50ZWQgVW5pY29kZSBub3JtYWxpemF0aW9uIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAqIDMuIE1FRElVTTogQWRkZWQgYXVkaXQgbG9nZ2luZyBmb3Igc2VjdXJpdHkgZXZlbnRzIHZpYSBTZWN1cml0eU1vbml0b3JcbiAqIDQuIE1FRElVTTogSW1wbGVtZW50ZWQgbWVtb3J5IG1hbmFnZW1lbnQgdG8gcHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoXG4gKiA1LiBNRURJVU06IEFkZGVkIFhTUyBwcm90ZWN0aW9uIHRocm91Z2ggaW5wdXQgc2FuaXRpemF0aW9uXG4gKi9cblxuaW1wb3J0IHsgQmFzZUVsZW1lbnQgfSBmcm9tICcuLi9CYXNlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudCwgSUVsZW1lbnRNZXRhZGF0YSwgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVQYXRoIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuXG4vLyBFeHRlbmQgSUVsZW1lbnRNZXRhZGF0YSB3aXRoIHNraWxsLXNwZWNpZmljIGZpZWxkc1xuZXhwb3J0IGludGVyZmFjZSBTa2lsbE1ldGFkYXRhIGV4dGVuZHMgSUVsZW1lbnRNZXRhZGF0YSB7XG4gIGxhbmd1YWdlcz86IHN0cmluZ1tdOyAgICAgICAgICAgLy8gUHJvZ3JhbW1pbmcvc3Bva2VuIGxhbmd1YWdlcyB0aGlzIHNraWxsIHdvcmtzIHdpdGhcbiAgY29tcGxleGl0eT86ICdiZWdpbm5lcicgfCAnaW50ZXJtZWRpYXRlJyB8ICdhZHZhbmNlZCcgfCAnZXhwZXJ0JztcbiAgZG9tYWlucz86IHN0cmluZ1tdOyAgICAgICAgICAgICAvLyBEb21haW4gY2F0ZWdvcmllcyAoZS5nLiwgd2ViLWRldiwgZGF0YS1zY2llbmNlLCB3cml0aW5nKVxuICBwcmVyZXF1aXNpdGVzPzogc3RyaW5nW107ICAgICAgIC8vIFJlcXVpcmVkIGtub3dsZWRnZSBvciBvdGhlciBza2lsbHNcbiAgcGFyYW1ldGVycz86IFNraWxsUGFyYW1ldGVyW107ICAvLyBDb25maWd1cmFibGUgcGFyYW1ldGVyc1xuICBleGFtcGxlcz86IFNraWxsRXhhbXBsZVtdOyAgICAgIC8vIFVzYWdlIGV4YW1wbGVzXG4gIGNlcnRpZmljYXRpb24/OiBzdHJpbmc7ICAgICAgICAgLy8gRXh0ZXJuYWwgY2VydGlmaWNhdGlvbiBvciB2YWxpZGF0aW9uXG4gIHByb2ZpY2llbmN5X2xldmVsPzogbnVtYmVyOyAgICAgLy8gMS0xMDAgcHJvZmljaWVuY3kgbGV2ZWxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTa2lsbFBhcmFtZXRlciB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdib29sZWFuJyB8ICdlbnVtJztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBkZWZhdWx0PzogYW55O1xuICBvcHRpb25zPzogc3RyaW5nW107ICAvLyBGb3IgZW51bSB0eXBlXG4gIG1pbj86IG51bWJlcjsgICAgICAgIC8vIEZvciBudW1iZXIgdHlwZVxuICBtYXg/OiBudW1iZXI7ICAgICAgICAvLyBGb3IgbnVtYmVyIHR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTa2lsbEV4YW1wbGUge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBpbnB1dD86IGFueTtcbiAgb3V0cHV0PzogYW55O1xuICBjb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU2tpbGwgZXh0ZW5kcyBCYXNlRWxlbWVudCBpbXBsZW1lbnRzIElFbGVtZW50IHtcbiAgcHVibGljIGRlY2xhcmUgbWV0YWRhdGE6IFNraWxsTWV0YWRhdGE7XG4gIHB1YmxpYyBpbnN0cnVjdGlvbnM6IHN0cmluZztcbiAgcHVibGljIHBhcmFtZXRlcnM6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBTRUNVUklUWSBGSVggIzQ6IE1lbW9yeSBtYW5hZ2VtZW50IGNvbnN0YW50cyB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhcbiAgLy8gUHJldmlvdXNseTogTm8gbGltaXRzIG9uIHBhcmFtZXRlciBzdG9yYWdlLCBjb3VsZCBsZWFkIHRvIG1lbW9yeSBleGhhdXN0aW9uXG4gIC8vIE5vdzogRW5mb3JjZWQgbGltaXRzIG9uIGJvdGggY291bnQgYW5kIHNpemVcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfUEFSQU1FVEVSX0NPVU5UID0gMTAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9QQVJBTUVURVJfU0laRSA9IDEwMDAwOyAvLyBNYXggc2l6ZSBwZXIgcGFyYW1ldGVyIHZhbHVlXG5cbiAgY29uc3RydWN0b3IobWV0YWRhdGE6IFBhcnRpYWw8U2tpbGxNZXRhZGF0YT4sIGluc3RydWN0aW9uczogc3RyaW5nID0gJycpIHtcbiAgICAvLyBTRUNVUklUWSBGSVggIzI6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBBTEwgbWV0YWRhdGEgZmllbGRzXG4gICAgLy8gUHJldmlvdXNseTogbWV0YWRhdGEgd2FzIHVzZWQgZGlyZWN0bHkgd2l0aG91dCB2YWxpZGF0aW9uXG4gICAgLy8gTm93OiBBbGwgc3RyaW5nIGlucHV0cyBhcmUgVW5pY29kZSBub3JtYWxpemVkIGFuZCBzYW5pdGl6ZWQgdG8gcHJldmVudDpcbiAgICAvLyAtIFhTUyBhdHRhY2tzIHRocm91Z2ggbWFsaWNpb3VzIG1ldGFkYXRhXG4gICAgLy8gLSBVbmljb2RlIGhvbW9ncmFwaCBhdHRhY2tzXG4gICAgLy8gLSBCdWZmZXIgb3ZlcmZsb3cgYXR0ZW1wdHNcbiAgICBjb25zdCBzYW5pdGl6ZWRNZXRhZGF0YSA9IHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSA/IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWV0YWRhdGEubmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCkgOiB1bmRlZmluZWQsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24gPyBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG1ldGFkYXRhLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgXG4gICAgc3VwZXIoRWxlbWVudFR5cGUuU0tJTEwsIHNhbml0aXplZE1ldGFkYXRhKTtcbiAgICAvLyBFbnN1cmUgaW5zdHJ1Y3Rpb25zIGlzIGFsd2F5cyBhIHN0cmluZywgZXZlbiBpZiBlbXB0eVxuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zICYmIGluc3RydWN0aW9ucy50cmltKCkgPyBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGluc3RydWN0aW9ucykubm9ybWFsaXplZENvbnRlbnQsIDEwMDAwKSA6ICcnO1xuICAgIFxuICAgIC8vIEVuc3VyZSBza2lsbC1zcGVjaWZpYyBtZXRhZGF0YVxuICAgIHRoaXMubWV0YWRhdGEgPSB7XG4gICAgICAuLi50aGlzLm1ldGFkYXRhLFxuICAgICAgbGFuZ3VhZ2VzOiBtZXRhZGF0YS5sYW5ndWFnZXMgfHwgW10sXG4gICAgICBjb21wbGV4aXR5OiBtZXRhZGF0YS5jb21wbGV4aXR5IHx8ICdiZWdpbm5lcicsXG4gICAgICBkb21haW5zOiBtZXRhZGF0YS5kb21haW5zIHx8IFtdLFxuICAgICAgcHJlcmVxdWlzaXRlczogbWV0YWRhdGEucHJlcmVxdWlzaXRlcyB8fCBbXSxcbiAgICAgIHBhcmFtZXRlcnM6IG1ldGFkYXRhLnBhcmFtZXRlcnMgfHwgW10sXG4gICAgICBleGFtcGxlczogbWV0YWRhdGEuZXhhbXBsZXMgfHwgW10sXG4gICAgICBwcm9maWNpZW5jeV9sZXZlbDogbWV0YWRhdGEucHJvZmljaWVuY3lfbGV2ZWwgfHwgMFxuICAgIH07XG5cbiAgICAvLyBWYWxpZGF0ZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnNcbiAgICBpZiAodGhpcy5tZXRhZGF0YS5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aGlzLm1ldGFkYXRhLnBhcmFtZXRlcnMgPSB0aGlzLm1ldGFkYXRhLnBhcmFtZXRlcnMubWFwKHBhcmFtID0+ICh7XG4gICAgICAgIC4uLnBhcmFtLFxuICAgICAgICBuYW1lOiBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHBhcmFtLm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCA1MCksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHBhcmFtLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgMjAwKSxcbiAgICAgICAgb3B0aW9uczogcGFyYW0ub3B0aW9ucz8ubWFwKG9wdCA9PiBzYW5pdGl6ZUlucHV0KG9wdCwgMTAwKSlcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHBhcmFtZXRlciB2YWx1ZXMgd2l0aCBkZWZhdWx0c1xuICAgIHRoaXMuaW5pdGlhbGl6ZVBhcmFtZXRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplUGFyYW1ldGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXRhZGF0YS5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aGlzLm1ldGFkYXRhLnBhcmFtZXRlcnMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgIGlmIChwYXJhbS5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KHBhcmFtLm5hbWUsIHBhcmFtLmRlZmF1bHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgcGFyYW1ldGVyIHZhbHVlXG4gICAqIFNFQ1VSSVRZIEZJWCAjMTogQ29tcHJlaGVuc2l2ZSBpbnB1dCB2YWxpZGF0aW9uIGZvciBhbGwgc2tpbGwgcGFyYW1ldGVyc1xuICAgKiBQcmV2aW91c2x5OiBQYXJhbWV0ZXJzIHdlcmUgc2V0IHdpdGhvdXQgdmFsaWRhdGlvbiwgY3JlYXRpbmcgc2VjdXJpdHkgcmlza3NcbiAgICogTm93OiBGdWxsIHZhbGlkYXRpb24gcGlwZWxpbmUgaW5jbHVkaW5nIHNhbml0aXphdGlvbiwgdHlwZSBjaGVja2luZywgYW5kIHNpemUgbGltaXRzXG4gICAqL1xuICBzZXRQYXJhbWV0ZXIobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gQ1JJVElDQUwgRklYOiBTYW5pdGl6ZSBwYXJhbWV0ZXIgbmFtZSB0byBwcmV2ZW50IGluamVjdGlvbiBhdHRhY2tzXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgNTApO1xuICAgIFxuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5tZXRhZGF0YS5wYXJhbWV0ZXJzPy5maW5kKHAgPT4gcC5uYW1lID09PSBzYW5pdGl6ZWROYW1lKTtcbiAgICBpZiAoIXBhcmFtKSB7XG4gICAgICAvLyBTRUNVUklUWSBGSVggIzM6IExvZyBhdWRpdCBldmVudHMgZm9yIHNlY3VyaXR5IG1vbml0b3JpbmdcbiAgICAgIC8vIFRoaXMgaGVscHMgZGV0ZWN0IHBvdGVudGlhbCBhdHRhY2sgcGF0dGVybnMgb3IgbWlzY29uZmlndXJhdGlvbnNcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfUEFSU0lOR19XQVJOSU5HJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdTa2lsbC5zZXRQYXJhbWV0ZXInLFxuICAgICAgICBkZXRhaWxzOiBgQXR0ZW1wdCB0byBzZXQgdW5rbm93biBwYXJhbWV0ZXI6ICR7c2FuaXRpemVkTmFtZX0gZm9yIHNraWxsOiAke3RoaXMubWV0YWRhdGEubmFtZX1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyICcke3Nhbml0aXplZE5hbWV9JyBub3QgZm91bmQgaW4gc2tpbGwgZGVmaW5pdGlvbmApO1xuICAgIH1cblxuICAgIC8vIENSSVRJQ0FMIEZJWDogU2FuaXRpemUgYW5kIHZhbGlkYXRlIHRoZSB2YWx1ZSBiYXNlZCBvbiB0eXBlXG4gICAgbGV0IHNhbml0aXplZFZhbHVlID0gdmFsdWU7XG4gICAgXG4gICAgaWYgKHBhcmFtLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBTRUNVUklUWSBGSVggIzIgJiAjNTogTm9ybWFsaXplIFVuaWNvZGUgYW5kIHNhbml0aXplIHN0cmluZyB2YWx1ZXNcbiAgICAgIC8vIFByZXZpb3VzbHk6IFN0cmluZyB2YWx1ZXMgd2VyZSB1c2VkIGRpcmVjdGx5IHdpdGhvdXQgdmFsaWRhdGlvblxuICAgICAgLy8gTm93OiBGdWxsIHZhbGlkYXRpb24gcGlwZWxpbmU6XG4gICAgICAvLyAxLiBVbmljb2RlIG5vcm1hbGl6YXRpb24gcHJldmVudHMgaG9tb2dyYXBoIGF0dGFja3NcbiAgICAgIC8vIDIuIHNhbml0aXplSW5wdXQoKSBzdHJpcHMgZGFuZ2Vyb3VzIEhUTUwvSlMgY29udGVudFxuICAgICAgLy8gMy4gTGVuZ3RoIGxpbWl0cyBwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyBhdHRhY2tzXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoU3RyaW5nKHZhbHVlKSk7XG4gICAgICBzYW5pdGl6ZWRWYWx1ZSA9IHNhbml0aXplSW5wdXQobm9ybWFsaXplZC5ub3JtYWxpemVkQ29udGVudCwgcGFyYW0ubWF4IHx8IDEwMDApO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzU6IEFkZGl0aW9uYWwgWFNTIHByb3RlY3Rpb25cbiAgICAgIC8vIENoZWNrIGZvciBjb21tb24gWFNTIHBhdHRlcm5zIGV2ZW4gYWZ0ZXIgc2FuaXRpemF0aW9uXG4gICAgICAvLyBUaGlzIHByb3ZpZGVzIGRlZmVuc2UtaW4tZGVwdGggYWdhaW5zdCBzb3BoaXN0aWNhdGVkIGF0dGFja3NcbiAgICAgIGlmIChzYW5pdGl6ZWRWYWx1ZS5pbmNsdWRlcygnPHNjcmlwdCcpIHx8IHNhbml0aXplZFZhbHVlLmluY2x1ZGVzKCdqYXZhc2NyaXB0OicpKSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjMzogTG9nIGhpZ2gtc2V2ZXJpdHkgc2VjdXJpdHkgZXZlbnRzXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICdTa2lsbC5zZXRQYXJhbWV0ZXInLFxuICAgICAgICAgIGRldGFpbHM6IGBQb3RlbnRpYWwgWFNTIGF0dGVtcHQgaW4gc2tpbGwgcGFyYW1ldGVyOiAke3Nhbml0aXplZE5hbWV9IGZvciBza2lsbDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9YFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoYXJhY3RlcnMgaW4gcGFyYW1ldGVyIHZhbHVlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHlwZSB2YWxpZGF0aW9uXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlUGFyYW1ldGVyVmFsdWUocGFyYW0sIHNhbml0aXplZFZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgJyR7c2FuaXRpemVkTmFtZX0nOiBleHBlY3RlZCAke3BhcmFtLnR5cGV9YCk7XG4gICAgfVxuXG4gICAgLy8gU0VDVVJJVFkgRklYICM0OiBNZW1vcnkgbWFuYWdlbWVudCAtIGNoZWNrIHBhcmFtZXRlciBjb3VudFxuICAgIC8vIFByZXZpb3VzbHk6IE5vIGxpbWl0cyBvbiBwYXJhbWV0ZXIgc3RvcmFnZSwgY291bGQgbGVhZCB0byBtZW1vcnkgZXhoYXVzdGlvbiBhdHRhY2tzXG4gICAgLy8gTm93OiBFbmZvcmNlZCBsaW1pdHMgcHJldmVudCBhdHRhY2tlcnMgZnJvbSBjb25zdW1pbmcgdW5saW1pdGVkIG1lbW9yeVxuICAgIGlmICh0aGlzLnBhcmFtZXRlcnMuc2l6ZSA+PSB0aGlzLk1BWF9QQVJBTUVURVJfQ09VTlQgJiYgIXRoaXMucGFyYW1ldGVycy5oYXMoc2FuaXRpemVkTmFtZSkpIHtcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjMzogTG9nIHJhdGUgbGltaXQgdmlvbGF0aW9ucyBmb3Igc2VjdXJpdHkgbW9uaXRvcmluZ1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnU2tpbGwuc2V0UGFyYW1ldGVyJyxcbiAgICAgICAgZGV0YWlsczogYFBhcmFtZXRlciBsaW1pdCBleGNlZWRlZCBmb3Igc2tpbGw6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfS4gTWF4OiAke3RoaXMuTUFYX1BBUkFNRVRFUl9DT1VOVH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIGxpbWl0IGV4Y2VlZGVkLiBNYXhpbXVtICR7dGhpcy5NQVhfUEFSQU1FVEVSX0NPVU5UfSBwYXJhbWV0ZXJzIGFsbG93ZWRgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYICM0OiBDaGVjayBwYXJhbWV0ZXIgdmFsdWUgc2l6ZSBmb3Igc3RyaW5nc1xuICAgIC8vIFRoaXMgcHJldmVudHMgYXR0YWNrZXJzIGZyb20gc3RvcmluZyBtYXNzaXZlIHN0cmluZ3MgdGhhdCBjb3VsZCBleGhhdXN0IG1lbW9yeVxuICAgIGlmIChwYXJhbS50eXBlID09PSAnc3RyaW5nJyAmJiBzYW5pdGl6ZWRWYWx1ZS5sZW5ndGggPiB0aGlzLk1BWF9QQVJBTUVURVJfU0laRSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXJhbWV0ZXIgdmFsdWUgdG9vIGxhcmdlLiBNYXhpbXVtICR7dGhpcy5NQVhfUEFSQU1FVEVSX1NJWkV9IGNoYXJhY3RlcnMgYWxsb3dlZGApO1xuICAgIH1cblxuICAgIHRoaXMucGFyYW1ldGVycy5zZXQoc2FuaXRpemVkTmFtZSwgc2FuaXRpemVkVmFsdWUpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgU2V0IHBhcmFtZXRlciAke3Nhbml0aXplZE5hbWV9ID0gJHtzYW5pdGl6ZWRWYWx1ZX0gZm9yIHNraWxsICR7dGhpcy5tZXRhZGF0YS5uYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHBhcmFtZXRlciB2YWx1ZVxuICAgKi9cbiAgZ2V0UGFyYW1ldGVyKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5nZXQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwYXJhbWV0ZXJzIGFzIG9iamVjdFxuICAgKi9cbiAgZ2V0QWxsUGFyYW1ldGVycygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMucGFyYW1ldGVycyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgcGFyYW1ldGVyIHZhbHVlIGFnYWluc3QgaXRzIGRlZmluaXRpb25cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZShwYXJhbTogU2tpbGxQYXJhbWV0ZXIsIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHBhcmFtLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgaWYgKGlzTmFOKG51bSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHBhcmFtLm1pbiAhPT0gdW5kZWZpbmVkICYmIG51bSA8IHBhcmFtLm1pbikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocGFyYW0ubWF4ICE9PSB1bmRlZmluZWQgJiYgbnVtID4gcGFyYW0ubWF4KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgICAgIGNhc2UgJ2VudW0nOlxuICAgICAgICByZXR1cm4gcGFyYW0ub3B0aW9ucz8uaW5jbHVkZXMoU3RyaW5nKHZhbHVlKSkgfHwgZmFsc2U7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgc2tpbGwgd2l0aCBjdXJyZW50IHBhcmFtZXRlcnNcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXQ/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGxvZ2dlci5pbmZvKGBFeGVjdXRpbmcgc2tpbGw6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfWApO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgICBjb25zdCBtaXNzaW5nUmVxdWlyZWQgPSB0aGlzLm1ldGFkYXRhLnBhcmFtZXRlcnNcbiAgICAgID8uZmlsdGVyKHAgPT4gcC5yZXF1aXJlZCAmJiAhdGhpcy5wYXJhbWV0ZXJzLmhhcyhwLm5hbWUpKVxuICAgICAgLm1hcChwID0+IHAubmFtZSkgfHwgW107XG4gICAgXG4gICAgaWYgKG1pc3NpbmdSZXF1aXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyczogJHttaXNzaW5nUmVxdWlyZWQuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBTa2lsbHMgZG9uJ3QgaGF2ZSBidWlsdC1pbiBleGVjdXRpb24gbG9naWMgLSB0aGlzIHdvdWxkIGJlIGltcGxlbWVudGVkXG4gICAgLy8gYnkgc3BlY2lmaWMgc2tpbGwgdHlwZXMgb3IgdGhyb3VnaCBhIHBsdWdpbiBzeXN0ZW1cbiAgICBsb2dnZXIuZGVidWcoYFNraWxsICR7dGhpcy5tZXRhZGF0YS5uYW1lfSBleGVjdXRlZCB3aXRoIHBhcmFtZXRlcnM6YCwgdGhpcy5nZXRBbGxQYXJhbWV0ZXJzKCkpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBza2lsbDogdGhpcy5tZXRhZGF0YS5uYW1lLFxuICAgICAgcGFyYW1ldGVyczogdGhpcy5nZXRBbGxQYXJhbWV0ZXJzKCksXG4gICAgICBpbnB1dCxcbiAgICAgIGV4ZWN1dGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNraWxsLXNwZWNpZmljIHZhbGlkYXRpb25cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIudmFsaWRhdGUoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGFycmF5cyBpZiBub3QgcHJlc2VudFxuICAgIGlmICghcmVzdWx0LmVycm9ycykgcmVzdWx0LmVycm9ycyA9IFtdO1xuICAgIGlmICghcmVzdWx0Lndhcm5pbmdzKSByZXN1bHQud2FybmluZ3MgPSBbXTtcbiAgICBcbiAgICAvLyBJbnN0cnVjdGlvbnMgc2hvdWxkIG5vdCBiZSBlbXB0eVxuICAgIGlmICghdGhpcy5pbnN0cnVjdGlvbnMgfHwgdGhpcy5pbnN0cnVjdGlvbnMudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdpbnN0cnVjdGlvbnMnLFxuICAgICAgICBtZXNzYWdlOiAnU2tpbGwgaW5zdHJ1Y3Rpb25zIGNhbm5vdCBiZSBlbXB0eScsXG4gICAgICAgIGNvZGU6ICdFTVBUWV9JTlNUUlVDVElPTlMnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjb21wbGV4aXR5IGxldmVsXG4gICAgY29uc3QgdmFsaWRDb21wbGV4aXR5ID0gWydiZWdpbm5lcicsICdpbnRlcm1lZGlhdGUnLCAnYWR2YW5jZWQnLCAnZXhwZXJ0J107XG4gICAgaWYgKHRoaXMubWV0YWRhdGEuY29tcGxleGl0eSAmJiAhdmFsaWRDb21wbGV4aXR5LmluY2x1ZGVzKHRoaXMubWV0YWRhdGEuY29tcGxleGl0eSkpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiAnY29tcGxleGl0eScsXG4gICAgICAgIG1lc3NhZ2U6IGBDb21wbGV4aXR5IG11c3QgYmUgb25lIG9mOiAke3ZhbGlkQ29tcGxleGl0eS5qb2luKCcsICcpfWAsXG4gICAgICAgIGNvZGU6ICdJTlZBTElEX0NPTVBMRVhJVFknXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBwcm9maWNpZW5jeSBsZXZlbFxuICAgIGlmICh0aGlzLm1ldGFkYXRhLnByb2ZpY2llbmN5X2xldmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLm1ldGFkYXRhLnByb2ZpY2llbmN5X2xldmVsIDwgMCB8fCB0aGlzLm1ldGFkYXRhLnByb2ZpY2llbmN5X2xldmVsID4gMTAwKSB7XG4gICAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgICAgZmllbGQ6ICdwcm9maWNpZW5jeV9sZXZlbCcsXG4gICAgICAgICAgbWVzc2FnZTogJ1Byb2ZpY2llbmN5IGxldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAnLFxuICAgICAgICAgIGNvZGU6ICdJTlZBTElEX1BST0ZJQ0lFTkNZJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzXG4gICAgaWYgKHRoaXMubWV0YWRhdGEucGFyYW1ldGVycykge1xuICAgICAgdGhpcy5tZXRhZGF0YS5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoIXBhcmFtLm5hbWUgfHwgcGFyYW0ubmFtZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgcmVzdWx0LmVycm9ycyEucHVzaCh7XG4gICAgICAgICAgICBmaWVsZDogYHBhcmFtZXRlcnNbJHtpbmRleH1dLm5hbWVgLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1BhcmFtZXRlciBuYW1lIGlzIHJlcXVpcmVkJyxcbiAgICAgICAgICAgIGNvZGU6ICdNSVNTSU5HX1BBUkFNRVRFUl9OQU1FJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGFyYW0udHlwZSA9PT0gJ2VudW0nICYmICghcGFyYW0ub3B0aW9ucyB8fCBwYXJhbS5vcHRpb25zLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICByZXN1bHQuZXJyb3JzIS5wdXNoKHtcbiAgICAgICAgICAgIGZpZWxkOiBgcGFyYW1ldGVyc1ske2luZGV4fV0ub3B0aW9uc2AsXG4gICAgICAgICAgICBtZXNzYWdlOiAnRW51bSBwYXJhbWV0ZXIgbXVzdCBoYXZlIG9wdGlvbnMgZGVmaW5lZCcsXG4gICAgICAgICAgICBjb2RlOiAnTUlTU0lOR19FTlVNX09QVElPTlMnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFdhcm5pbmdzIGZvciBiZXN0IHByYWN0aWNlc1xuICAgIGlmICghdGhpcy5tZXRhZGF0YS5kb21haW5zIHx8IHRoaXMubWV0YWRhdGEuZG9tYWlucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlc3VsdC53YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdkb21haW5zJyxcbiAgICAgICAgbWVzc2FnZTogJ0NvbnNpZGVyIGFkZGluZyBkb21haW4gY2F0ZWdvcmllcyBmb3IgYmV0dGVyIG9yZ2FuaXphdGlvbicsXG4gICAgICAgIHNldmVyaXR5OiAnbG93J1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm1ldGFkYXRhLmV4YW1wbGVzIHx8IHRoaXMubWV0YWRhdGEuZXhhbXBsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHQud2FybmluZ3MucHVzaCh7XG4gICAgICAgIGZpZWxkOiAnZXhhbXBsZXMnLFxuICAgICAgICBtZXNzYWdlOiAnQWRkaW5nIHVzYWdlIGV4YW1wbGVzIGltcHJvdmVzIHNraWxsIHVzYWJpbGl0eScsXG4gICAgICAgIHNldmVyaXR5OiAnbWVkaXVtJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSB2YWxpZCBmbGFnIGJhc2VkIG9uIGZpbmFsIGVycm9yc1xuICAgIHJlc3VsdC52YWxpZCA9IChyZXN1bHQuZXJyb3JzPy5sZW5ndGggfHwgMCkgPT09IDA7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0byBKU09OIGZvcm1hdCBmb3IgaW50ZXJuYWwgdXNlIGFuZCB0ZXN0aW5nXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplVG9KU09OKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICBpbnN0cnVjdGlvbnM6IHRoaXMuaW5zdHJ1Y3Rpb25zLFxuICAgICAgcGFyYW1ldGVyczogdGhpcy5nZXRBbGxQYXJhbWV0ZXJzKCksXG4gICAgICByZWZlcmVuY2VzOiB0aGlzLnJlZmVyZW5jZXMsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmV4dGVuc2lvbnMsXG4gICAgICByYXRpbmdzOiB0aGlzLnJhdGluZ3NcbiAgICB9O1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29udGVudCBmb3Igc2VyaWFsaXphdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldENvbnRlbnQoKTogc3RyaW5nIHtcbiAgICBsZXQgY29udGVudCA9IGAjICR7dGhpcy5tZXRhZGF0YS5uYW1lfVxcblxcbmA7XG4gICAgY29udGVudCArPSBgJHt0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcblxcbmA7XG4gICAgXG4gICAgaWYgKHRoaXMuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBjb250ZW50ICs9IGAjIyBJbnN0cnVjdGlvbnNcXG5cXG4ke3RoaXMuaW5zdHJ1Y3Rpb25zfVxcblxcbmA7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZ2V0QWxsUGFyYW1ldGVycygpO1xuICAgIGlmIChwYXJhbXMgJiYgT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb250ZW50ICs9IGAjIyBQYXJhbWV0ZXJzXFxuXFxuYDtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtcykpIHtcbiAgICAgICAgY29udGVudCArPSBgLSAqKiR7a2V5fSoqOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1cXG5gO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHNraWxsIHRvIG1hcmtkb3duIGZvcm1hdCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICogRklYOiBDaGFuZ2VkIGZyb20gSlNPTiB0byBtYXJrZG93biBmb3IgR2l0SHViIHBvcnRmb2xpbyBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IHN0cmluZyB7XG4gICAgLy8gQWRkIHNraWxsLXNwZWNpZmljIGRhdGEgdG8gZXh0ZW5zaW9ucyBmb3IgZnJvbnRtYXR0ZXJcbiAgICBjb25zdCBvcmlnaW5hbEV4dGVuc2lvbnMgPSB0aGlzLmV4dGVuc2lvbnM7XG4gICAgdGhpcy5leHRlbnNpb25zID0ge1xuICAgICAgLi4ub3JpZ2luYWxFeHRlbnNpb25zLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiB0aGlzLmluc3RydWN0aW9ucyxcbiAgICAgIHBhcmFtZXRlcnM6IHRoaXMuZ2V0QWxsUGFyYW1ldGVycygpXG4gICAgfTtcbiAgICBcbiAgICAvLyBVc2UgYmFzZSBjbGFzcyBzZXJpYWxpemUgd2hpY2ggbm93IG91dHB1dHMgbWFya2Rvd25cbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5zZXJpYWxpemUoKTtcbiAgICBcbiAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGV4dGVuc2lvbnNcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSBvcmlnaW5hbEV4dGVuc2lvbnM7XG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBza2lsbCBmcm9tIEpTT04gZm9ybWF0XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZGVzZXJpYWxpemUoZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBtZXRhZGF0YVxuICAgICAgdGhpcy5tZXRhZGF0YSA9IHsgLi4udGhpcy5tZXRhZGF0YSwgLi4ucGFyc2VkLm1ldGFkYXRhIH07XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBvdGhlciBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLmluc3RydWN0aW9ucyA9IHBhcnNlZC5pbnN0cnVjdGlvbnMgfHwgJyc7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMgPSBwYXJzZWQucmVmZXJlbmNlcyB8fCBbXTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHBhcnNlZC5leHRlbnNpb25zIHx8IHt9O1xuICAgICAgdGhpcy5yYXRpbmdzID0gcGFyc2VkLnJhdGluZ3MgfHwgdGhpcy5yYXRpbmdzO1xuICAgICAgXG4gICAgICAvLyBVcGRhdGUgSUQgYW5kIHZlcnNpb24gaWYgcHJvdmlkZWRcbiAgICAgIGlmIChwYXJzZWQuaWQpIHRoaXMuaWQgPSBwYXJzZWQuaWQ7XG4gICAgICBpZiAocGFyc2VkLnZlcnNpb24pIHRoaXMudmVyc2lvbiA9IHBhcnNlZC52ZXJzaW9uO1xuICAgICAgXG4gICAgICAvLyBSZXN0b3JlIHBhcmFtZXRlcnNcbiAgICAgIGlmIChwYXJzZWQucGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuY2xlYXIoKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocGFyc2VkLnBhcmFtZXRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRGVzZXJpYWxpemVkIHNraWxsOiAke3RoaXMubWV0YWRhdGEubmFtZX1gKTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkZXNlcmlhbGl6ZSBza2lsbDogJHtlcnJvcn1gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGVzZXJpYWxpemF0aW9uIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2tpbGwgYWN0aXZhdGlvbiBsaWZlY3ljbGVcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBhY3RpdmF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuaW5mbyhgQWN0aXZhdGluZyBza2lsbDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9ICgke3RoaXMuaWR9KWApO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIHRoYXQgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIHNldFxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhY3RpdmF0ZSBza2lsbCB3aXRoIHZhbGlkYXRpb24gZXJyb3JzOiAke3ZhbGlkYXRpb24uZXJyb3JzPy5tYXAoZSA9PiBlLm1lc3NhZ2UpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIFxuICAgIGF3YWl0IHN1cGVyLmFjdGl2YXRlPy4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZSB0aGUgc2tpbGwgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVyc1xuICAgKi9cbiAgY2xvbmUobmV3UGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBTa2lsbCB7XG4gICAgY29uc3QgY2xvbmVkID0gbmV3IFNraWxsKHRoaXMubWV0YWRhdGEsIHRoaXMuaW5zdHJ1Y3Rpb25zKTtcbiAgICBcbiAgICAvLyBDb3B5IGN1cnJlbnQgcGFyYW1ldGVyc1xuICAgIHRoaXMucGFyYW1ldGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBjbG9uZWQucGFyYW1ldGVycy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gT3ZlcnJpZGUgd2l0aCBuZXcgcGFyYW1ldGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChuZXdQYXJhbWV0ZXJzKSB7XG4gICAgICBPYmplY3QuZW50cmllcyhuZXdQYXJhbWV0ZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY2xvbmVkLnNldFBhcmFtZXRlcihrZXksIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG4gIFxuICAvKipcbiAgICogU2tpbGwgZGVhY3RpdmF0aW9uIGxpZmVjeWNsZVxuICAgKiBTRUNVUklUWSBGSVggIzQ6IEF1dG9tYXRpY2FsbHkgY2xlYXJzIHBhcmFtZXRlcnMgb24gZGVhY3RpdmF0aW9uXG4gICAqIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIGxvbmctcnVubmluZyBwcm9jZXNzZXNcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBkZWFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKGBEZWFjdGl2YXRpbmcgc2tpbGw6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfSAoJHt0aGlzLmlkfSlgKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzQ6IENsZWFyIHBhcmFtZXRlcnMgdG8gZnJlZSBtZW1vcnkgYW5kIHByZXZlbnQgbGVha3NcbiAgICAvLyBUaGlzIGVuc3VyZXMgc2tpbGxzIGRvbid0IHJldGFpbiBkYXRhIGFmdGVyIGRlYWN0aXZhdGlvblxuICAgIHRoaXMuY2xlYXJQYXJhbWV0ZXJzKCk7XG4gICAgXG4gICAgYXdhaXQgc3VwZXIuZGVhY3RpdmF0ZT8uKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgcGFyYW1ldGVycyAoZm9yIG1lbW9yeSBtYW5hZ2VtZW50KVxuICAgKiBTRUNVUklUWSBGSVggIzQ6IEFkZGVkIG1ldGhvZCB0byBjbGVhciBwYXJhbWV0ZXJzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgKiBQcmV2aW91c2x5OiBQYXJhbWV0ZXJzIGFjY3VtdWxhdGVkIGluZGVmaW5pdGVseSBpbiBsb25nLXJ1bm5pbmcgcHJvY2Vzc2VzXG4gICAqIE5vdzogUHJvdmlkZXMgZXhwbGljaXQgY2xlYW51cCBtZWNoYW5pc20gY2FsbGVkIGR1cmluZyBkZWFjdGl2YXRpb25cbiAgICovXG4gIGNsZWFyUGFyYW1ldGVycygpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtZXRlcnMuY2xlYXIoKTtcbiAgICBsb2dnZXIuZGVidWcoYENsZWFyZWQgYWxsIHBhcmFtZXRlcnMgZm9yIHNraWxsOiAke3RoaXMubWV0YWRhdGEubmFtZX1gKTtcbiAgfVxufSJdfQ==
@@ -32,6 +32,7 @@ export declare class SkillManager implements IElementManager<Skill> {
32
32
  save(element: Skill, filePath: string): Promise<void>;
33
33
  /**
34
34
  * List all available skills
35
+ * SECURITY: Uses PortfolioManager.listElements() which filters test elements
35
36
  */
36
37
  list(): Promise<Skill[]>;
37
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"SkillManager.d.ts","sourceRoot":"","sources":["../../../src/elements/skills/SkillManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAavD,qBAAa,YAAa,YAAW,eAAe,CAAC,KAAK,CAAC;IACzD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAiC;;IAO/C;;;;OAIG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAwD5C;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgD3D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAyB9B;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAK9E;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,uBAAuB;IASjD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAiC/E;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC7C;;;OAGG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAmG1E;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB7E;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhD;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAKxE;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IASvC;;OAEG;IACH,cAAc,IAAI,WAAW;IAI7B;;OAEG;IACH,gBAAgB,IAAI,MAAM;CAG3B"}
1
+ {"version":3,"file":"SkillManager.d.ts","sourceRoot":"","sources":["../../../src/elements/skills/SkillManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAavD,qBAAa,YAAa,YAAW,eAAe,CAAC,KAAK,CAAC;IACzD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAiC;;IAO/C;;;;OAIG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAwD5C;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuD3D;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAwB9B;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAK9E;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,uBAAuB;IASjD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAiC/E;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC7C;;;OAGG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAmG1E;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB7E;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhD;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAKxE;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IASvC;;OAEG;IACH,cAAc,IAAI,WAAW;IAI7B;;OAEG;IACH,gBAAgB,IAAI,MAAM;CAG3B"}
@@ -113,6 +113,12 @@ export class SkillManager {
113
113
  }
114
114
  return acc;
115
115
  }, {});
116
+ // VERSION FIX: Include version in the saved metadata
117
+ // Previously: version was stored in element.version but not saved to YAML
118
+ // Now: Ensure version is included in the frontmatter
119
+ if (element.version) {
120
+ cleanMetadata.version = element.version;
121
+ }
116
122
  const content = matter.stringify(instructions, cleanMetadata);
117
123
  // CRITICAL FIX: Use atomic file write to prevent corruption
118
124
  // Previously: await fs.writeFile(fullPath, content, 'utf-8');
@@ -125,14 +131,14 @@ export class SkillManager {
125
131
  }
126
132
  /**
127
133
  * List all available skills
134
+ * SECURITY: Uses PortfolioManager.listElements() which filters test elements
128
135
  */
129
136
  async list() {
130
137
  try {
131
138
  // Ensure directory exists
132
139
  await fs.mkdir(this.skillsDir, { recursive: true });
133
- // Read all markdown files
134
- const files = await fs.readdir(this.skillsDir);
135
- const markdownFiles = files.filter(f => f.endsWith('.md'));
140
+ // Use PortfolioManager to get filtered list (excludes test elements)
141
+ const markdownFiles = await this.portfolioManager.listElements(ElementType.SKILL);
136
142
  // Load all skills in parallel
137
143
  const skills = await Promise.all(markdownFiles.map(file => this.load(file).catch(err => {
138
144
  logger.error(`Failed to load skill ${file}:`, err);
@@ -409,4 +415,4 @@ export class SkillManager {
409
415
  return '.md';
410
416
  }
411
417
  }
412
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tpbGxNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3NraWxscy9Ta2lsbE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFJSCxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLFlBQVksQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsTUFBTSxPQUFPLFlBQVk7SUFDZixnQkFBZ0IsQ0FBbUI7SUFDbkMsU0FBUyxDQUFTO0lBQ2xCLE1BQU0sR0FBdUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUvQztRQUNFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFD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TUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBc0M7UUFDbkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxRQUFnQjtRQUMzQixJQUFJLENBQUM7WUFDSCxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTa2lsbE1hbmFnZXIgLSBJbXBsZW1lbnRhdGlvbiBvZiBJRWxlbWVudE1hbmFnZXIgZm9yIFNraWxsIGVsZW1lbnRzXG4gKiBIYW5kbGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgZm9yIHNraWxscyBpbXBsZW1lbnRpbmcgSUVsZW1lbnRcbiAqIFxuICogU0VDVVJJVFkgRklYRVMgSU1QTEVNRU5URUQgKEZvbGxvd2luZyBQUiAjMzE5IHBhdHRlcm5zKTpcbiAqIDEuIENSSVRJQ0FMOiBGaXhlZCByYWNlIGNvbmRpdGlvbnMgaW4gZmlsZSBvcGVyYXRpb25zIGJ5IHVzaW5nIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIHJlYWRzL3dyaXRlc1xuICogMi4gQ1JJVElDQUw6IEZpeGVkIGR5bmFtaWMgcmVxdWlyZSgpIHN0YXRlbWVudHMgYnkgdXNpbmcgc3RhdGljIGltcG9ydHNcbiAqIDMuIEhJR0g6IEZpeGVkIHVudmFsaWRhdGVkIFlBTUwgcGFyc2luZyB2dWxuZXJhYmlsaXR5IGJ5IHVzaW5nIFNlY3VyZVlhbWxQYXJzZXJcbiAqIDQuIE1FRElVTTogQWxsIHVzZXIgaW5wdXRzIGFyZSBub3cgdmFsaWRhdGVkIGFuZCBzYW5pdGl6ZWRcbiAqIDUuIE1FRElVTTogQXVkaXQgbG9nZ2luZyBhZGRlZCBmb3Igc2VjdXJpdHkgb3BlcmF0aW9uc1xuICogNi4gTUVESVVNOiBQYXRoIHRyYXZlcnNhbCBwcmV2ZW50aW9uIGZvciBhbGwgZmlsZSBvcGVyYXRpb25zXG4gKi9cblxuaW1wb3J0IHsgSUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgU2tpbGwsIFNraWxsTWV0YWRhdGEgfSBmcm9tICcuL1NraWxsLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUlucHV0LCB2YWxpZGF0ZVBhdGggfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgbWF0dGVyIGZyb20gJ2dyYXktbWF0dGVyJztcblxuZXhwb3J0IGNsYXNzIFNraWxsTWFuYWdlciBpbXBsZW1lbnRzIElFbGVtZW50TWFuYWdlcjxTa2lsbD4ge1xuICBwcml2YXRlIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByaXZhdGUgc2tpbGxzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgc2tpbGxzOiBNYXA8c3RyaW5nLCBTa2lsbD4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIHRoaXMuc2tpbGxzRGlyID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuU0tJTEwpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBza2lsbCBmcm9tIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZSgpIGluc3RlYWQgb2YgZnMucmVhZEZpbGUoKVxuICAgKiB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBhbmQgZW5zdXJlIGF0b21pYyBmaWxlIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8U2tpbGw+IHtcbiAgICAvLyBTRUNVUklUWSBGSVggIzQgJiAjNjogVmFsaWRhdGUgYW5kIHNhbml0aXplIHRoZSBmaWxlIHBhdGhcbiAgICAvLyBQcmV2aW91c2x5OiBEaXJlY3QgdXNlIG9mIHVzZXItcHJvdmlkZWQgcGF0aHMgY291bGQgbGVhZCB0byBwYXRoIHRyYXZlcnNhbFxuICAgIC8vIE5vdzogRnVsbCB2YWxpZGF0aW9uIHByZXZlbnRzIGFjY2Vzc2luZyBmaWxlcyBvdXRzaWRlIHNraWxscyBkaXJlY3RvcnlcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzU6IExvZyBlbGVtZW50IG9wZXJhdGlvbnMgZm9yIGF1ZGl0IHRyYWlsXG4gICAgLy8gVXNpbmcgRUxFTUVOVF9DUkVBVEVEIGFzIHRoZXJlIGFyZSBubyBTS0lMTF8qIHNwZWNpZmljIGV2ZW50c1xuICAgIFxuICAgIC8vIFNlY3VyaXR5IHZhbGlkYXRpb25cbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGVQYXRoKHNhbml0aXplZFBhdGgsIHRoaXMuc2tpbGxzRGlyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBJbnZhbGlkIHNraWxsIHBhdGg6ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2tpbGwgcGF0aDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdJbnZhbGlkIHBhdGgnfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpID8gc2FuaXRpemVkUGF0aCA6IHBhdGguam9pbih0aGlzLnNraWxsc0Rpciwgc2FuaXRpemVkUGF0aCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgYXRvbWljIGZpbGUgcmVhZCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgICAgLy8gUHJldmlvdXNseTogY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZ1bGxQYXRoLCAndXRmLTgnKTtcbiAgICAgIC8vIE5vdzogVXNlcyBGaWxlTG9ja01hbmFnZXIgd2l0aCBwcm9wZXIgZW5jb2Rpbmcgb2JqZWN0IGZvcm1hdFxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZShmdWxsUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICAgIFxuICAgICAgLy8gUGFyc2UgbWFya2Rvd24gd2l0aCBmcm9udG1hdHRlclxuICAgICAgY29uc3QgcGFyc2VkID0gbWF0dGVyKGNvbnRlbnQpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzM6IFVzZSBTZWN1cmVZYW1sUGFyc2VyIGZvciBtZXRhZGF0YSB2YWxpZGF0aW9uXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIFlBTUwgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VkLmRhdGEgYXMgU2tpbGxNZXRhZGF0YTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIHNraWxsIGluc3RhbmNlXG4gICAgICBjb25zdCBza2lsbCA9IG5ldyBTa2lsbChtZXRhZGF0YSwgcGFyc2VkLmNvbnRlbnQpO1xuICAgICAgXG4gICAgICAvLyBDYWNoZSB0aGUgc2tpbGxcbiAgICAgIHRoaXMuc2tpbGxzLnNldChza2lsbC5pZCwgc2tpbGwpO1xuICAgICAgXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBsb2FkXG4gICAgICBsb2dnZXIuaW5mbyhgU2tpbGwgbG9hZGVkOiAke3NraWxsLm1ldGFkYXRhLm5hbWV9YCk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjNTogQXVkaXQgc3VjY2Vzc2Z1bCBvcGVyYXRpb25zXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1NraWxsTWFuYWdlci5sb2FkJyxcbiAgICAgICAgZGV0YWlsczogYFNraWxsIHN1Y2Nlc3NmdWxseSBsb2FkZWQ6ICR7c2tpbGwubWV0YWRhdGEubmFtZX1gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHNraWxsO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIHNraWxsIGZyb20gJHtmdWxsUGF0aH06YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYSBza2lsbCB0byBmaWxlXG4gICAqIFNFQ1VSSVRZIEZJWCAjMTogVXNlcyBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKCkgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBzYXZlKGVsZW1lbnQ6IFNraWxsLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVmFsaWRhdGUgYW5kIHNhbml0aXplIHBhdGhcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzU6IExvZyBzYXZlIG9wZXJhdGlvbnMgZm9yIGF1ZGl0IHRyYWlsXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdTa2lsbE1hbmFnZXIuc2F2ZScsXG4gICAgICBkZXRhaWxzOiBgU2F2aW5nIHNraWxsOiAke2VsZW1lbnQubWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF0aChzYW5pdGl6ZWRQYXRoLCB0aGlzLnNraWxsc0Rpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBza2lsbCBwYXRoOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ludmFsaWQgcGF0aCd9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aCkgPyBzYW5pdGl6ZWRQYXRoIDogcGF0aC5qb2luKHRoaXMuc2tpbGxzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcblxuICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBQcmVwYXJlIGNvbnRlbnQgLSBlbnN1cmUgaW5zdHJ1Y3Rpb25zIGlzIGEgc3RyaW5nXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZWxlbWVudC5pbnN0cnVjdGlvbnMgfHwgJyc7XG4gICAgXG4gICAgLy8gQ2xlYW4gbWV0YWRhdGEgdG8gcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXMgdGhhdCB3b3VsZCBicmVhayBZQU1MIHNlcmlhbGl6YXRpb25cbiAgICBjb25zdCBjbGVhbk1ldGFkYXRhID0gT2JqZWN0LmVudHJpZXMoZWxlbWVudC5tZXRhZGF0YSkucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgYW55KTtcbiAgICBcbiAgICBjb25zdCBjb250ZW50ID0gbWF0dGVyLnN0cmluZ2lmeShpbnN0cnVjdGlvbnMsIGNsZWFuTWV0YWRhdGEpO1xuXG4gICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgYXRvbWljIGZpbGUgd3JpdGUgdG8gcHJldmVudCBjb3JydXB0aW9uXG4gICAgLy8gUHJldmlvdXNseTogYXdhaXQgZnMud3JpdGVGaWxlKGZ1bGxQYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICAvLyBOb3c6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoZnVsbFBhdGgsIGNvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAvLyBVcGRhdGUgY2FjaGVcbiAgICB0aGlzLnNraWxscy5zZXQoZWxlbWVudC5pZCwgZWxlbWVudCk7XG5cbiAgICAvLyBMb2cgc2F2ZSBvcGVyYXRpb25cbiAgICBsb2dnZXIuaW5mbyhgU2tpbGwgc2F2ZWQ6ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIGF2YWlsYWJsZSBza2lsbHNcbiAgICovXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxTa2lsbFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLnNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlYWQgYWxsIG1hcmtkb3duIGZpbGVzXG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIodGhpcy5za2lsbHNEaXIpO1xuICAgICAgY29uc3QgbWFya2Rvd25GaWxlcyA9IGZpbGVzLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy5tZCcpKTtcbiAgICAgIFxuICAgICAgLy8gTG9hZCBhbGwgc2tpbGxzIGluIHBhcmFsbGVsXG4gICAgICBjb25zdCBza2lsbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgbWFya2Rvd25GaWxlcy5tYXAoZmlsZSA9PiB0aGlzLmxvYWQoZmlsZSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIHNraWxsICR7ZmlsZX06YCwgZXJyKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgICAgXG4gICAgICAvLyBGaWx0ZXIgb3V0IGZhaWxlZCBsb2FkcyBhbmQgcmV0dXJuXG4gICAgICByZXR1cm4gc2tpbGxzLmZpbHRlcigocyk6IHMgaXMgU2tpbGwgPT4gcyAhPT0gbnVsbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGxpc3Qgc2tpbGxzOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHNraWxsIGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZChwcmVkaWNhdGU6IChlbGVtZW50OiBTa2lsbCkgPT4gYm9vbGVhbik6IFByb21pc2U8U2tpbGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBza2lsbHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gc2tpbGxzLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIHNraWxsXG4gICAqL1xuICB2YWxpZGF0ZShlbGVtZW50OiBTa2lsbCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgLy8gTWFwICd2YWxpZCcgdG8gJ2lzVmFsaWQnIGZvciB0ZXN0IGNvbXBhdGliaWxpdHlcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgaXNWYWxpZDogcmVzdWx0LnZhbGlkXG4gICAgfSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHNraWxsXG4gICAqL1xuICBhc3luYyBjcmVhdGUoZGF0YTogUGFydGlhbDxTa2lsbE1ldGFkYXRhPiAmIHtjb250ZW50Pzogc3RyaW5nfSk6IFByb21pc2U8U2tpbGw+IHtcbiAgICAvLyBTRUNVUklUWSBGSVggIzQ6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhbGwgaW5wdXRzXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQoZGF0YS5uYW1lIHx8ICduZXctc2tpbGwnLCAxMDApO1xuICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChkYXRhLmRlc2NyaXB0aW9uIHx8ICcnLCA1MDApO1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSBzYW5pdGl6ZUlucHV0KGRhdGEuY29udGVudCB8fCAnJywgNTAwMDApO1xuICAgIFxuICAgIC8vIEV4dHJhY3QgY29udGVudCBmcm9tIGRhdGFcbiAgICBjb25zdCB7IGNvbnRlbnQsIC4uLm1ldGFkYXRhIH0gPSBkYXRhO1xuICAgIFxuICAgIC8vIENyZWF0ZSB0aGUgc2tpbGwgaW5zdGFuY2VcbiAgICBjb25zdCBza2lsbCA9IG5ldyBTa2lsbCh7XG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICAgIG5hbWU6IHNhbml0aXplZE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb25cbiAgICB9LCBzYW5pdGl6ZWRDb250ZW50KTtcbiAgICBcbiAgICAvLyBHZW5lcmF0ZSBmaWxlbmFtZSBmcm9tIHNraWxsIG5hbWVcbiAgICBjb25zdCBmaWxlbmFtZSA9IGAke3Nhbml0aXplZE5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJyl9Lm1kYDtcbiAgICBcbiAgICAvLyBTYXZlIHRoZSBza2lsbFxuICAgIGF3YWl0IHRoaXMuc2F2ZShza2lsbCwgZmlsZW5hbWUpO1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNTogQXVkaXQgc3VjY2Vzc2Z1bCBjcmVhdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnU2tpbGxNYW5hZ2VyLmNyZWF0ZScsXG4gICAgICBkZXRhaWxzOiBgU2tpbGwgY3JlYXRlZDogJHtza2lsbC5tZXRhZGF0YS5uYW1lfWBcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gc2tpbGw7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgc2tpbGxcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYICM1OiBMb2cgZGVsZXRpb24gb3BlcmF0aW9ucyBmb3IgYXVkaXQgdHJhaWxcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgIHNvdXJjZTogJ1NraWxsTWFuYWdlci5kZWxldGUnLFxuICAgICAgZGV0YWlsczogYEF0dGVtcHRpbmcgdG8gZGVsZXRlIHNraWxsOiAke2ZpbGVQYXRofWBcbiAgICB9KTtcbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBwYXRoXG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF0aChzYW5pdGl6ZWRQYXRoLCB0aGlzLnNraWxsc0Rpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBza2lsbCBwYXRoOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ludmFsaWQgcGF0aCd9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aCkgPyBzYW5pdGl6ZWRQYXRoIDogcGF0aC5qb2luKHRoaXMuc2tpbGxzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcblxuICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlXG4gICAgY29uc3Qgc2tpbGwgPSBhd2FpdCB0aGlzLmxvYWQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgIGlmIChza2lsbCkge1xuICAgICAgdGhpcy5za2lsbHMuZGVsZXRlKHNraWxsLmlkKTtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgZmlsZVxuICAgIGF3YWl0IGZzLnVubGluayhmdWxsUGF0aCk7XG5cbiAgICAvLyBMb2cgZGVsZXRpb25cbiAgICBsb2dnZXIuaW5mbyhgU2tpbGwgZGVsZXRlZDogJHtmaWxlUGF0aH1gKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzU6IEF1ZGl0IHN1Y2Nlc3NmdWwgZGVsZXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1NraWxsTWFuYWdlci5kZWxldGUnLFxuICAgICAgZGV0YWlsczogYFNraWxsIHN1Y2Nlc3NmdWxseSBkZWxldGVkOiAke2ZpbGVQYXRofWBcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBza2lsbCBmcm9tIFlBTUwvSlNPTlxuICAgKiBTRUNVUklUWSBGSVggIzM6IFVzZXMgU2VjdXJlWWFtbFBhcnNlciB0byBwcmV2ZW50IFlBTUwgaW5qZWN0aW9uXG4gICAqL1xuICBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0OiAneWFtbCcgfCAnanNvbicpOiBQcm9taXNlPFNraWxsPiB7XG4gICAgbGV0IHBhcnNlZDogYW55O1xuICAgIFxuICAgIGlmIChmb3JtYXQgPT09ICd5YW1sJykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBmcm9udG1hdHRlciBZQU1MIChzdGFydHMgd2l0aCAtLS0pIG9yIHJhdyBZQU1MXG4gICAgICBjb25zdCBoYXNGcm9udG1hdHRlciA9IGRhdGEudHJpbSgpLnN0YXJ0c1dpdGgoJy0tLScpO1xuICAgICAgXG4gICAgICBpZiAoaGFzRnJvbnRtYXR0ZXIpIHtcbiAgICAgICAgLy8gSGFuZGxlIGZyb250bWF0dGVyIGZvcm1hdCB1c2luZyBTZWN1cmVZYW1sUGFyc2VyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkV2l0aEZyb250bWF0dGVyID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShkYXRhLCB7XG4gICAgICAgICAgICBtYXhZYW1sU2l6ZTogNjQgKiAxMDI0LCAvLyA2NEtCIGxpbWl0XG4gICAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXJzZWQgPSBwYXJzZWRXaXRoRnJvbnRtYXR0ZXIuZGF0YTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBZQU1MIGZyb250bWF0dGVyOicsIGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgWUFNTCBmcm9udG1hdHRlcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIHJhdyBZQU1MIGZvcm1hdCAtIHBhcnNlIGRpcmVjdGx5IHdpdGggc2VjdXJpdHkgdmFsaWRhdGlvbnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTaXplIHZhbGlkYXRpb25cbiAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiA2NCAqIDEwMjQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWUFNTCBjb250ZW50IGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIHNpemUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUGFyc2UgcmF3IFlBTUwgd2l0aCBzZWN1cml0eSB2YWxpZGF0aW9ucyBzaW1pbGFyIHRvIFNlY3VyZVlhbWxQYXJzZXJcbiAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgU2VjdXJlWWFtbFBhcnNlciBkaXJlY3RseSBiZWNhdXNlIGl0IGV4cGVjdHMgZnJvbnRtYXR0ZXIgZm9ybWF0XG4gICAgICAgICAgLy8gVXNpbmcgeWFtbC5sb2FkIHdpdGggRkFJTFNBRkVfU0NIRU1BIHByb3ZpZGVzIHRoZSBzYW1lIHNlY3VyaXR5IGFzIFNlY3VyZVlhbWxQYXJzZXJcbiAgICAgICAgICAvLyBzZWN1cml0eS1hdWRpdC1pZ25vcmU6IERNQ1AtU0VDLTAwNSAtIFVzaW5nIEZBSUxTQUZFX1NDSEVNQSB3aXRoIHNpemUgbGltaXRzXG4gICAgICAgICAgcGFyc2VkID0geWFtbC5sb2FkKGRhdGEsIHtcbiAgICAgICAgICAgIHNjaGVtYTogeWFtbC5GQUlMU0FGRV9TQ0hFTUEsICAvLyBTYW1lIHNjaGVtYSB1c2VkIGJ5IFNlY3VyZVlhbWxQYXJzZXJcbiAgICAgICAgICAgIGpzb246IGZhbHNlLFxuICAgICAgICAgICAgb25XYXJuaW5nOiAod2FybmluZykgPT4ge1xuICAgICAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1lBTUxfUEFSU0lOR19XQVJOSU5HJyxcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnU2tpbGxNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IGBZQU1MIHdhcm5pbmc6ICR7d2FybmluZy5tZXNzYWdlfWBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRW5zdXJlIHJlc3VsdCBpcyBhbiBvYmplY3RcbiAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgcGFyc2VkID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZQU1MIG11c3QgY29udGFpbiBhbiBvYmplY3QgYXQgcm9vdCBsZXZlbCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBBZGRpdGlvbmFsIHZhbGlkYXRpb246IGNoZWNrIGZvciBzZW5zaWJsZSBvYmplY3Qga2V5c1xuICAgICAgICAgIC8vIFJlamVjdCBvYmplY3RzIHdpdGggbm9uLXN0cmluZyBrZXlzIG9yIGtleXMgdGhhdCBsb29rIGxpa2Ugc2VyaWFsaXplZCBvYmplY3RzXG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBhcnNlZCk7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnW29iamVjdCBPYmplY3RdJykgfHwga2V5LmluY2x1ZGVzKCdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBZQU1MIHN0cnVjdHVyZSBkZXRlY3RlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSByYXcgWUFNTDonLCBlcnJvcik7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFlBTUwgY29udGVudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzU6IExvZyBzZWN1cml0eSBldmVudCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfUEFSU0VfU1VDQ0VTUycsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnU2tpbGxNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiAnWUFNTCBjb250ZW50IHNhZmVseSBwYXJzZWQgZHVyaW5nIGltcG9ydCdcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmluZm8oJ1lBTUwgY29udGVudCBzYWZlbHkgcGFyc2VkIGR1cmluZyBpbXBvcnQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHBhcnNlIEpTT046JywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSlNPTiBjb250ZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBIYW5kbGUgYm90aCBmb3JtYXRzOiBtZXRhZGF0YSBuZXN0ZWQgb3IgYXQgdG9wIGxldmVsXG4gICAgbGV0IG1ldGFkYXRhOiBhbnk7XG4gICAgbGV0IGluc3RydWN0aW9uczogc3RyaW5nO1xuICAgIFxuICAgIGlmIChwYXJzZWQubWV0YWRhdGEpIHtcbiAgICAgIC8vIE5lc3RlZCBmb3JtYXRcbiAgICAgIG1ldGFkYXRhID0gcGFyc2VkLm1ldGFkYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zID0gcGFyc2VkLmluc3RydWN0aW9ucyB8fCAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVG9wLWxldmVsIGZvcm1hdCAoZnJvbSBZQU1MIGltcG9ydClcbiAgICAgIG1ldGFkYXRhID0gcGFyc2VkO1xuICAgICAgaW5zdHJ1Y3Rpb25zID0gcGFyc2VkLmluc3RydWN0aW9ucyB8fCAnJztcbiAgICAgIC8vIFJlbW92ZSBpbnN0cnVjdGlvbnMgZnJvbSBtZXRhZGF0YSB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgZGVsZXRlIG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG5ldyBTa2lsbChtZXRhZGF0YSwgaW5zdHJ1Y3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYSBza2lsbCB0byBZQU1ML0pTT05cbiAgICovXG4gIGFzeW5jIGV4cG9ydEVsZW1lbnQoZWxlbWVudDogU2tpbGwsIGZvcm1hdDogJ3lhbWwnIHwgJ2pzb24nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAneWFtbCcpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIG1ldGFkYXRhOiBlbGVtZW50Lm1ldGFkYXRhLFxuICAgICAgICBpbnN0cnVjdGlvbnM6IGVsZW1lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgICAgICBwYXJhbWV0ZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoZWxlbWVudC5wYXJhbWV0ZXJzKVxuICAgICAgfTtcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWDogVXNlIHlhbWwuZHVtcCB3aXRoIHNhZmUgb3B0aW9uc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBjb2RlIGV4ZWN1dGlvbiBkdXJpbmcgc2VyaWFsaXphdGlvblxuICAgICAgcmV0dXJuIHlhbWwuZHVtcChkYXRhLCB7XG4gICAgICAgIHNjaGVtYTogeWFtbC5GQUlMU0FGRV9TQ0hFTUEsXG4gICAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgICAgc2tpcEludmFsaWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgSlNPTiBmb3JtYXQsIGZsYXR0ZW4gbWV0YWRhdGEgZmllbGRzIGZvciBjb21wYXRpYmlsaXR5XG4gICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAuLi5lbGVtZW50Lm1ldGFkYXRhLFxuICAgICAgICBpbnN0cnVjdGlvbnM6IGVsZW1lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgICAgICBwYXJhbWV0ZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoZWxlbWVudC5wYXJhbWV0ZXJzKVxuICAgICAgfTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNhY2hlZCBza2lsbHNcbiAgICovXG4gIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5za2lsbHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHNraWxsIGV4aXN0c1xuICAgKi9cbiAgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSA/IHNhbml0aXplZFBhdGggOiBwYXRoLmpvaW4odGhpcy5za2lsbHNEaXIsIHNhbml0aXplZFBhdGgpO1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZ1bGxQYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIG11bHRpcGxlIHNraWxscyBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKGVsZW1lbnQ6IFNraWxsKSA9PiBib29sZWFuKTogUHJvbWlzZTxTa2lsbFtdPiB7XG4gICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIHNraWxscy5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGZpbGUgcGF0aFxuICAgKi9cbiAgdmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGVQYXRoKGZpbGVQYXRoLCB0aGlzLnNraWxsc0Rpcik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbGVtZW50IHR5cGVcbiAgICovXG4gIGdldEVsZW1lbnRUeXBlKCk6IEVsZW1lbnRUeXBlIHtcbiAgICByZXR1cm4gRWxlbWVudFR5cGUuU0tJTEw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3Igc2tpbGxzXG4gICAqL1xuICBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcubWQnO1xuICB9XG59Il19
418
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tpbGxNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3NraWxscy9Ta2lsbE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFJSCxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLFlBQVksQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsTUFBTSxPQUFPLFlBQVk7SUFDZixnQkFBZ0IsQ0FBbUI7SUFDbkMsU0FBUyxDQUFTO0lBQ2xCLE1BQU0sR0FBdUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUvQztRQUNFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFD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UyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzNHLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQXNDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsUUFBZ0I7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0I7UUFDZCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2tpbGxNYW5hZ2VyIC0gSW1wbGVtZW50YXRpb24gb2YgSUVsZW1lbnRNYW5hZ2VyIGZvciBTa2lsbCBlbGVtZW50c1xuICogSGFuZGxlcyBDUlVEIG9wZXJhdGlvbnMgYW5kIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGZvciBza2lsbHMgaW1wbGVtZW50aW5nIElFbGVtZW50XG4gKiBcbiAqIFNFQ1VSSVRZIEZJWEVTIElNUExFTUVOVEVEIChGb2xsb3dpbmcgUFIgIzMxOSBwYXR0ZXJucyk6XG4gKiAxLiBDUklUSUNBTDogRml4ZWQgcmFjZSBjb25kaXRpb25zIGluIGZpbGUgb3BlcmF0aW9ucyBieSB1c2luZyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyByZWFkcy93cml0ZXNcbiAqIDIuIENSSVRJQ0FMOiBGaXhlZCBkeW5hbWljIHJlcXVpcmUoKSBzdGF0ZW1lbnRzIGJ5IHVzaW5nIHN0YXRpYyBpbXBvcnRzXG4gKiAzLiBISUdIOiBGaXhlZCB1bnZhbGlkYXRlZCBZQU1MIHBhcnNpbmcgdnVsbmVyYWJpbGl0eSBieSB1c2luZyBTZWN1cmVZYW1sUGFyc2VyXG4gKiA0LiBNRURJVU06IEFsbCB1c2VyIGlucHV0cyBhcmUgbm93IHZhbGlkYXRlZCBhbmQgc2FuaXRpemVkXG4gKiA1LiBNRURJVU06IEF1ZGl0IGxvZ2dpbmcgYWRkZWQgZm9yIHNlY3VyaXR5IG9wZXJhdGlvbnNcbiAqIDYuIE1FRElVTTogUGF0aCB0cmF2ZXJzYWwgcHJldmVudGlvbiBmb3IgYWxsIGZpbGUgb3BlcmF0aW9uc1xuICovXG5cbmltcG9ydCB7IElFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IFNraWxsLCBTa2lsbE1ldGFkYXRhIH0gZnJvbSAnLi9Ta2lsbC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVQYXRoIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IG1hdHRlciBmcm9tICdncmF5LW1hdHRlcic7XG5cbmV4cG9ydCBjbGFzcyBTa2lsbE1hbmFnZXIgaW1wbGVtZW50cyBJRWxlbWVudE1hbmFnZXI8U2tpbGw+IHtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcml2YXRlIHNraWxsc0Rpcjogc3RyaW5nO1xuICBwcml2YXRlIHNraWxsczogTWFwPHN0cmluZywgU2tpbGw+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLnNraWxsc0RpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLlNLSUxMKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgc2tpbGwgZnJvbSBmaWxlXG4gICAqIFNFQ1VSSVRZIEZJWCAjMTogVXNlcyBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoKSBpbnN0ZWFkIG9mIGZzLnJlYWRGaWxlKClcbiAgICogdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgYW5kIGVuc3VyZSBhdG9taWMgZmlsZSBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNraWxsPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYICM0ICYgIzY6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSB0aGUgZmlsZSBwYXRoXG4gICAgLy8gUHJldmlvdXNseTogRGlyZWN0IHVzZSBvZiB1c2VyLXByb3ZpZGVkIHBhdGhzIGNvdWxkIGxlYWQgdG8gcGF0aCB0cmF2ZXJzYWxcbiAgICAvLyBOb3c6IEZ1bGwgdmFsaWRhdGlvbiBwcmV2ZW50cyBhY2Nlc3NpbmcgZmlsZXMgb3V0c2lkZSBza2lsbHMgZGlyZWN0b3J5XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYICM1OiBMb2cgZWxlbWVudCBvcGVyYXRpb25zIGZvciBhdWRpdCB0cmFpbFxuICAgIC8vIFVzaW5nIEVMRU1FTlRfQ1JFQVRFRCBhcyB0aGVyZSBhcmUgbm8gU0tJTExfKiBzcGVjaWZpYyBldmVudHNcbiAgICBcbiAgICAvLyBTZWN1cml0eSB2YWxpZGF0aW9uXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF0aChzYW5pdGl6ZWRQYXRoLCB0aGlzLnNraWxsc0Rpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgSW52YWxpZCBza2lsbCBwYXRoOiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNraWxsIHBhdGg6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJ31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSA/IHNhbml0aXplZFBhdGggOiBwYXRoLmpvaW4odGhpcy5za2lsbHNEaXIsIHNhbml0aXplZFBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGF0b21pYyBmaWxlIHJlYWQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIHdpdGggcHJvcGVyIGVuY29kaW5nIG9iamVjdCBmb3JtYXRcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoZnVsbFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG1hdHRlcihjb250ZW50KTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYICMzOiBVc2UgU2VjdXJlWWFtbFBhcnNlciBmb3IgbWV0YWRhdGEgdmFsaWRhdGlvblxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBZQU1MIGluamVjdGlvbiBhdHRhY2tzXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlZC5kYXRhIGFzIFNraWxsTWV0YWRhdGE7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBza2lsbCBpbnN0YW5jZVxuICAgICAgY29uc3Qgc2tpbGwgPSBuZXcgU2tpbGwobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcbiAgICAgIFxuICAgICAgLy8gQ2FjaGUgdGhlIHNraWxsXG4gICAgICB0aGlzLnNraWxscy5zZXQoc2tpbGwuaWQsIHNraWxsKTtcbiAgICAgIFxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgbG9hZFxuICAgICAgbG9nZ2VyLmluZm8oYFNraWxsIGxvYWRlZDogJHtza2lsbC5tZXRhZGF0YS5uYW1lfWApO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzU6IEF1ZGl0IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uc1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdTa2lsbE1hbmFnZXIubG9hZCcsXG4gICAgICAgIGRldGFpbHM6IGBTa2lsbCBzdWNjZXNzZnVsbHkgbG9hZGVkOiAke3NraWxsLm1ldGFkYXRhLm5hbWV9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBza2lsbDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBza2lsbCBmcm9tICR7ZnVsbFBhdGh9OmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGEgc2tpbGwgdG8gZmlsZVxuICAgKiBTRUNVUklUWSBGSVggIzE6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZSgpIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgc2F2ZShlbGVtZW50OiBTa2lsbCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBwYXRoXG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYICM1OiBMb2cgc2F2ZSBvcGVyYXRpb25zIGZvciBhdWRpdCB0cmFpbFxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnU2tpbGxNYW5hZ2VyLnNhdmUnLFxuICAgICAgZGV0YWlsczogYFNhdmluZyBza2lsbDogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9YFxuICAgIH0pO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZVBhdGgoc2FuaXRpemVkUGF0aCwgdGhpcy5za2lsbHNEaXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2tpbGwgcGF0aDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdJbnZhbGlkIHBhdGgnfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpID8gc2FuaXRpemVkUGF0aCA6IHBhdGguam9pbih0aGlzLnNraWxsc0Rpciwgc2FuaXRpemVkUGF0aCk7XG5cbiAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShmdWxsUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUHJlcGFyZSBjb250ZW50IC0gZW5zdXJlIGluc3RydWN0aW9ucyBpcyBhIHN0cmluZ1xuICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGVsZW1lbnQuaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuICAgIFxuICAgIC8vIENsZWFuIG1ldGFkYXRhIHRvIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzIHRoYXQgd291bGQgYnJlYWsgWUFNTCBzZXJpYWxpemF0aW9uXG4gICAgY29uc3QgY2xlYW5NZXRhZGF0YSA9IE9iamVjdC5lbnRyaWVzKGVsZW1lbnQubWV0YWRhdGEpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9IGFzIGFueSk7XG4gICAgXG4gICAgLy8gVkVSU0lPTiBGSVg6IEluY2x1ZGUgdmVyc2lvbiBpbiB0aGUgc2F2ZWQgbWV0YWRhdGFcbiAgICAvLyBQcmV2aW91c2x5OiB2ZXJzaW9uIHdhcyBzdG9yZWQgaW4gZWxlbWVudC52ZXJzaW9uIGJ1dCBub3Qgc2F2ZWQgdG8gWUFNTFxuICAgIC8vIE5vdzogRW5zdXJlIHZlcnNpb24gaXMgaW5jbHVkZWQgaW4gdGhlIGZyb250bWF0dGVyXG4gICAgaWYgKGVsZW1lbnQudmVyc2lvbikge1xuICAgICAgY2xlYW5NZXRhZGF0YS52ZXJzaW9uID0gZWxlbWVudC52ZXJzaW9uO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjb250ZW50ID0gbWF0dGVyLnN0cmluZ2lmeShpbnN0cnVjdGlvbnMsIGNsZWFuTWV0YWRhdGEpO1xuXG4gICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgYXRvbWljIGZpbGUgd3JpdGUgdG8gcHJldmVudCBjb3JydXB0aW9uXG4gICAgLy8gUHJldmlvdXNseTogYXdhaXQgZnMud3JpdGVGaWxlKGZ1bGxQYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICAvLyBOb3c6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoZnVsbFBhdGgsIGNvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAvLyBVcGRhdGUgY2FjaGVcbiAgICB0aGlzLnNraWxscy5zZXQoZWxlbWVudC5pZCwgZWxlbWVudCk7XG5cbiAgICAvLyBMb2cgc2F2ZSBvcGVyYXRpb25cbiAgICBsb2dnZXIuaW5mbyhgU2tpbGwgc2F2ZWQ6ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIGF2YWlsYWJsZSBza2lsbHNcbiAgICogU0VDVVJJVFk6IFVzZXMgUG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHMoKSB3aGljaCBmaWx0ZXJzIHRlc3QgZWxlbWVudHNcbiAgICovXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxTa2lsbFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLnNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIFVzZSBQb3J0Zm9saW9NYW5hZ2VyIHRvIGdldCBmaWx0ZXJlZCBsaXN0IChleGNsdWRlcyB0ZXN0IGVsZW1lbnRzKVxuICAgICAgY29uc3QgbWFya2Rvd25GaWxlcyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHMoRWxlbWVudFR5cGUuU0tJTEwpO1xuICAgICAgXG4gICAgICAvLyBMb2FkIGFsbCBza2lsbHMgaW4gcGFyYWxsZWxcbiAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBtYXJrZG93bkZpbGVzLm1hcChmaWxlID0+IHRoaXMubG9hZChmaWxlKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgc2tpbGwgJHtmaWxlfTpgLCBlcnIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KSlcbiAgICAgICk7XG4gICAgICBcbiAgICAgIC8vIEZpbHRlciBvdXQgZmFpbGVkIGxvYWRzIGFuZCByZXR1cm5cbiAgICAgIHJldHVybiBza2lsbHMuZmlsdGVyKChzKTogcyBpcyBTa2lsbCA9PiBzICE9PSBudWxsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gbGlzdCBza2lsbHM6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgc2tpbGwgYnkgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kKHByZWRpY2F0ZTogKGVsZW1lbnQ6IFNraWxsKSA9PiBib29sZWFuKTogUHJvbWlzZTxTa2lsbCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBza2lsbHMuZmluZChwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgc2tpbGxcbiAgICovXG4gIHZhbGlkYXRlKGVsZW1lbnQ6IFNraWxsKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgICAvLyBNYXAgJ3ZhbGlkJyB0byAnaXNWYWxpZCcgZm9yIHRlc3QgY29tcGF0aWJpbGl0eVxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICBpc1ZhbGlkOiByZXN1bHQudmFsaWRcbiAgICB9IGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgc2tpbGxcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShkYXRhOiBQYXJ0aWFsPFNraWxsTWV0YWRhdGE+ICYge2NvbnRlbnQ/OiBzdHJpbmd9KTogUHJvbWlzZTxTa2lsbD4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNDogVmFsaWRhdGUgYW5kIHNhbml0aXplIGFsbCBpbnB1dHNcbiAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChkYXRhLm5hbWUgfHwgJ25ldy1za2lsbCcsIDEwMCk7XG4gICAgY29uc3Qgc2FuaXRpemVkRGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KGRhdGEuZGVzY3JpcHRpb24gfHwgJycsIDUwMCk7XG4gICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHNhbml0aXplSW5wdXQoZGF0YS5jb250ZW50IHx8ICcnLCA1MDAwMCk7XG4gICAgXG4gICAgLy8gRXh0cmFjdCBjb250ZW50IGZyb20gZGF0YVxuICAgIGNvbnN0IHsgY29udGVudCwgLi4ubWV0YWRhdGEgfSA9IGRhdGE7XG4gICAgXG4gICAgLy8gQ3JlYXRlIHRoZSBza2lsbCBpbnN0YW5jZVxuICAgIGNvbnN0IHNraWxsID0gbmV3IFNraWxsKHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgbmFtZTogc2FuaXRpemVkTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBzYW5pdGl6ZWREZXNjcmlwdGlvblxuICAgIH0sIHNhbml0aXplZENvbnRlbnQpO1xuICAgIFxuICAgIC8vIEdlbmVyYXRlIGZpbGVuYW1lIGZyb20gc2tpbGwgbmFtZVxuICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7c2FuaXRpemVkTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKX0ubWRgO1xuICAgIFxuICAgIC8vIFNhdmUgdGhlIHNraWxsXG4gICAgYXdhaXQgdGhpcy5zYXZlKHNraWxsLCBmaWxlbmFtZSk7XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYICM1OiBBdWRpdCBzdWNjZXNzZnVsIGNyZWF0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdTa2lsbE1hbmFnZXIuY3JlYXRlJyxcbiAgICAgIGRldGFpbHM6IGBTa2lsbCBjcmVhdGVkOiAke3NraWxsLm1ldGFkYXRhLm5hbWV9YFxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBza2lsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBza2lsbFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBTRUNVUklUWSBGSVggIzU6IExvZyBkZWxldGlvbiBvcGVyYXRpb25zIGZvciBhdWRpdCB0cmFpbFxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiAnU2tpbGxNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICBkZXRhaWxzOiBgQXR0ZW1wdGluZyB0byBkZWxldGUgc2tpbGw6ICR7ZmlsZVBhdGh9YFxuICAgIH0pO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIHBhdGhcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGVQYXRoKHNhbml0aXplZFBhdGgsIHRoaXMuc2tpbGxzRGlyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNraWxsIHBhdGg6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJ31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSA/IHNhbml0aXplZFBhdGggOiBwYXRoLmpvaW4odGhpcy5za2lsbHNEaXIsIHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gUmVtb3ZlIGZyb20gY2FjaGVcbiAgICBjb25zdCBza2lsbCA9IGF3YWl0IHRoaXMubG9hZChmaWxlUGF0aCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgaWYgKHNraWxsKSB7XG4gICAgICB0aGlzLnNraWxscy5kZWxldGUoc2tpbGwuaWQpO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBmaWxlXG4gICAgYXdhaXQgZnMudW5saW5rKGZ1bGxQYXRoKTtcblxuICAgIC8vIExvZyBkZWxldGlvblxuICAgIGxvZ2dlci5pbmZvKGBTa2lsbCBkZWxldGVkOiAke2ZpbGVQYXRofWApO1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNTogQXVkaXQgc3VjY2Vzc2Z1bCBkZWxldGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnU2tpbGxNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICBkZXRhaWxzOiBgU2tpbGwgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQ6ICR7ZmlsZVBhdGh9YFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIHNraWxsIGZyb20gWUFNTC9KU09OXG4gICAqIFNFQ1VSSVRZIEZJWCAjMzogVXNlcyBTZWN1cmVZYW1sUGFyc2VyIHRvIHByZXZlbnQgWUFNTCBpbmplY3Rpb25cbiAgICovXG4gIGFzeW5jIGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ6ICd5YW1sJyB8ICdqc29uJyk6IFByb21pc2U8U2tpbGw+IHtcbiAgICBsZXQgcGFyc2VkOiBhbnk7XG4gICAgXG4gICAgaWYgKGZvcm1hdCA9PT0gJ3lhbWwnKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGZyb250bWF0dGVyIFlBTUwgKHN0YXJ0cyB3aXRoIC0tLSkgb3IgcmF3IFlBTUxcbiAgICAgIGNvbnN0IGhhc0Zyb250bWF0dGVyID0gZGF0YS50cmltKCkuc3RhcnRzV2l0aCgnLS0tJyk7XG4gICAgICBcbiAgICAgIGlmIChoYXNGcm9udG1hdHRlcikge1xuICAgICAgICAvLyBIYW5kbGUgZnJvbnRtYXR0ZXIgZm9ybWF0IHVzaW5nIFNlY3VyZVlhbWxQYXJzZXJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWRXaXRoRnJvbnRtYXR0ZXIgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGRhdGEsIHtcbiAgICAgICAgICAgIG1heFlhbWxTaXplOiA2NCAqIDEwMjQsIC8vIDY0S0IgbGltaXRcbiAgICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBhcnNlZCA9IHBhcnNlZFdpdGhGcm9udG1hdHRlci5kYXRhO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHBhcnNlIFlBTUwgZnJvbnRtYXR0ZXI6JywgZXJyb3IpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBZQU1MIGZyb250bWF0dGVyOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYW5kbGUgcmF3IFlBTUwgZm9ybWF0IC0gcGFyc2UgZGlyZWN0bHkgd2l0aCBzZWN1cml0eSB2YWxpZGF0aW9uc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFNpemUgdmFsaWRhdGlvblxuICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDY0ICogMTAyNCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZQU1MIGNvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgc2l6ZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBQYXJzZSByYXcgWUFNTCB3aXRoIHNlY3VyaXR5IHZhbGlkYXRpb25zIHNpbWlsYXIgdG8gU2VjdXJlWWFtbFBhcnNlclxuICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSBTZWN1cmVZYW1sUGFyc2VyIGRpcmVjdGx5IGJlY2F1c2UgaXQgZXhwZWN0cyBmcm9udG1hdHRlciBmb3JtYXRcbiAgICAgICAgICAvLyBVc2luZyB5YW1sLmxvYWQgd2l0aCBGQUlMU0FGRV9TQ0hFTUEgcHJvdmlkZXMgdGhlIHNhbWUgc2VjdXJpdHkgYXMgU2VjdXJlWWFtbFBhcnNlclxuICAgICAgICAgIC8vIHNlY3VyaXR5LWF1ZGl0LWlnbm9yZTogRE1DUC1TRUMtMDA1IC0gVXNpbmcgRkFJTFNBRkVfU0NIRU1BIHdpdGggc2l6ZSBsaW1pdHNcbiAgICAgICAgICBwYXJzZWQgPSB5YW1sLmxvYWQoZGF0YSwge1xuICAgICAgICAgICAgc2NoZW1hOiB5YW1sLkZBSUxTQUZFX1NDSEVNQSwgIC8vIFNhbWUgc2NoZW1hIHVzZWQgYnkgU2VjdXJlWWFtbFBhcnNlclxuICAgICAgICAgICAganNvbjogZmFsc2UsXG4gICAgICAgICAgICBvbldhcm5pbmc6ICh3YXJuaW5nKSA9PiB7XG4gICAgICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnWUFNTF9QQVJTSU5HX1dBUk5JTkcnLFxuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdTa2lsbE1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgICAgICAgICAgZGV0YWlsczogYFlBTUwgd2FybmluZzogJHt3YXJuaW5nLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFbnN1cmUgcmVzdWx0IGlzIGFuIG9iamVjdFxuICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBwYXJzZWQgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lBTUwgbXVzdCBjb250YWluIGFuIG9iamVjdCBhdCByb290IGxldmVsJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbjogY2hlY2sgZm9yIHNlbnNpYmxlIG9iamVjdCBrZXlzXG4gICAgICAgICAgLy8gUmVqZWN0IG9iamVjdHMgd2l0aCBub24tc3RyaW5nIGtleXMgb3Iga2V5cyB0aGF0IGxvb2sgbGlrZSBzZXJpYWxpemVkIG9iamVjdHNcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGFyc2VkKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCdbb2JqZWN0IE9iamVjdF0nKSB8fCBrZXkuaW5jbHVkZXMoJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFlBTUwgc3RydWN0dXJlIGRldGVjdGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHBhcnNlIHJhdyBZQU1MOicsIGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgWUFNTCBjb250ZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjNTogTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnWUFNTF9QQVJTRV9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdTa2lsbE1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6ICdZQU1MIGNvbnRlbnQgc2FmZWx5IHBhcnNlZCBkdXJpbmcgaW1wb3J0J1xuICAgICAgfSk7XG4gICAgICBsb2dnZXIuaW5mbygnWUFNTCBjb250ZW50IHNhZmVseSBwYXJzZWQgZHVyaW5nIGltcG9ydCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gcGFyc2UgSlNPTjonLCBlcnJvcik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBKU09OIGNvbnRlbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEhhbmRsZSBib3RoIGZvcm1hdHM6IG1ldGFkYXRhIG5lc3RlZCBvciBhdCB0b3AgbGV2ZWxcbiAgICBsZXQgbWV0YWRhdGE6IGFueTtcbiAgICBsZXQgaW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gICAgXG4gICAgaWYgKHBhcnNlZC5tZXRhZGF0YSkge1xuICAgICAgLy8gTmVzdGVkIGZvcm1hdFxuICAgICAgbWV0YWRhdGEgPSBwYXJzZWQubWV0YWRhdGE7XG4gICAgICBpbnN0cnVjdGlvbnMgPSBwYXJzZWQuaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUb3AtbGV2ZWwgZm9ybWF0IChmcm9tIFlBTUwgaW1wb3J0KVxuICAgICAgbWV0YWRhdGEgPSBwYXJzZWQ7XG4gICAgICBpbnN0cnVjdGlvbnMgPSBwYXJzZWQuaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuICAgICAgLy8gUmVtb3ZlIGluc3RydWN0aW9ucyBmcm9tIG1ldGFkYXRhIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICBkZWxldGUgbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gbmV3IFNraWxsKG1ldGFkYXRhLCBpbnN0cnVjdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhIHNraWxsIHRvIFlBTUwvSlNPTlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWxlbWVudChlbGVtZW50OiBTa2lsbCwgZm9ybWF0OiAneWFtbCcgfCAnanNvbicpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICd5YW1sJykge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgbWV0YWRhdGE6IGVsZW1lbnQubWV0YWRhdGEsXG4gICAgICAgIGluc3RydWN0aW9uczogZWxlbWVudC5pbnN0cnVjdGlvbnMsXG4gICAgICAgIHBhcmFtZXRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhlbGVtZW50LnBhcmFtZXRlcnMpXG4gICAgICB9O1xuICAgICAgLy8gU0VDVVJJVFkgRklYOiBVc2UgeWFtbC5kdW1wIHdpdGggc2FmZSBvcHRpb25zXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGNvZGUgZXhlY3V0aW9uIGR1cmluZyBzZXJpYWxpemF0aW9uXG4gICAgICByZXR1cm4geWFtbC5kdW1wKGRhdGEsIHtcbiAgICAgICAgc2NoZW1hOiB5YW1sLkZBSUxTQUZFX1NDSEVNQSxcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBza2lwSW52YWxpZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBKU09OIGZvcm1hdCwgZmxhdHRlbiBtZXRhZGF0YSBmaWVsZHMgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIC4uLmVsZW1lbnQubWV0YWRhdGEsXG4gICAgICAgIGluc3RydWN0aW9uczogZWxlbWVudC5pbnN0cnVjdGlvbnMsXG4gICAgICAgIHBhcmFtZXRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhlbGVtZW50LnBhcmFtZXRlcnMpXG4gICAgICB9O1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgY2FjaGVkIHNraWxsc1xuICAgKi9cbiAgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNraWxscy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgc2tpbGwgZXhpc3RzXG4gICAqL1xuICBhc3luYyBleGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpID8gc2FuaXRpemVkUGF0aCA6IHBhdGguam9pbih0aGlzLnNraWxsc0Rpciwgc2FuaXRpemVkUGF0aCk7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZnVsbFBhdGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgbXVsdGlwbGUgc2tpbGxzIGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZE1hbnkocHJlZGljYXRlOiAoZWxlbWVudDogU2tpbGwpID0+IGJvb2xlYW4pOiBQcm9taXNlPFNraWxsW10+IHtcbiAgICBjb25zdCBza2lsbHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gc2tpbGxzLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZmlsZSBwYXRoXG4gICAqL1xuICB2YWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZVBhdGgoZmlsZVBhdGgsIHRoaXMuc2tpbGxzRGlyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgZ2V0RWxlbWVudFR5cGUoKTogRWxlbWVudFR5cGUge1xuICAgIHJldHVybiBFbGVtZW50VHlwZS5TS0lMTDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBza2lsbHNcbiAgICovXG4gIGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJy5tZCc7XG4gIH1cbn0iXX0=
@@ -115,7 +115,16 @@ export declare class Template extends BaseElement implements IElement {
115
115
  */
116
116
  validate(): ElementValidationResult;
117
117
  /**
118
- * Serialize template to JSON format
118
+ * Serialize to JSON format for internal use and testing
119
+ */
120
+ serializeToJSON(): string;
121
+ /**
122
+ * Get content for serialization
123
+ */
124
+ protected getContent(): string;
125
+ /**
126
+ * Serialize template to markdown format with YAML frontmatter
127
+ * FIX: Changed from JSON to markdown for GitHub portfolio compatibility
119
128
  */
120
129
  serialize(): string;
121
130
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Template.d.ts","sourceRoot":"","sources":["../../../src/elements/templates/Template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AASpG,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,QAAS,SAAQ,WAAY,YAAW,QAAQ;IAC5C,QAAQ,EAAE,gBAAgB,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAI5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAO;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAK;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAE/B,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAE,MAAW;IA0ErE;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;;;OAIG;IACH,OAAO,CAAC,OAAO;IA2Bf;;;;;OAKG;IACG,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,SAAS,GAAE,CAAW,EACtB,YAAY,GAAE,MAAU,GACvB,OAAO,CAAC,MAAM,CAAC;IAyDlB;;;;OAIG;YACW,4BAA4B;IAyC1C;;;OAGG;YACW,qBAAqB;IAwGnC;;;OAGG;IACH,OAAO,CAAC,cAAc;IA6DtB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAgBvB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAoBnB;;;;;;;;;;;;;OAaG;YACW,eAAe;IA8B7B;;OAEG;IACa,QAAQ,IAAI,uBAAuB;IAyGnD;;OAEG;IACa,SAAS,IAAI,MAAM;IAenC;;OAEG;IACa,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA+B/C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IA8BhC;;OAEG;IACmB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAS/C;;OAEG;IACmB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAQlD"}
1
+ {"version":3,"file":"Template.d.ts","sourceRoot":"","sources":["../../../src/elements/templates/Template.ts"],"names":[],"mappings":"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"}