@dollhousemcp/mcp-server 1.9.13 → 1.9.15

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 (79) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.github.md +54 -0
  3. package/README.md.backup +1241 -49
  4. package/dist/cache/CollectionCache.js +2 -2
  5. package/dist/collection/CollectionIndexManager.js +3 -3
  6. package/dist/config/ConfigWizard.js +3 -3
  7. package/dist/config/indicator-config.js +2 -2
  8. package/dist/config/portfolio-constants.js +12 -12
  9. package/dist/elements/BaseElement.js +7 -7
  10. package/dist/elements/FeedbackProcessor.d.ts +7 -0
  11. package/dist/elements/FeedbackProcessor.d.ts.map +1 -1
  12. package/dist/elements/FeedbackProcessor.js +67 -14
  13. package/dist/elements/agents/AgentManager.js +6 -6
  14. package/dist/elements/memories/Memory.js +4 -4
  15. package/dist/elements/memories/MemoryManager.js +3 -3
  16. package/dist/elements/memories/utils.js +3 -3
  17. package/dist/elements/skills/Skill.js +2 -2
  18. package/dist/elements/skills/SkillManager.js +2 -2
  19. package/dist/elements/templates/Template.d.ts.map +1 -1
  20. package/dist/elements/templates/Template.js +38 -14
  21. package/dist/elements/templates/TemplateManager.js +2 -2
  22. package/dist/generated/version.d.ts +2 -2
  23. package/dist/generated/version.js +3 -3
  24. package/dist/handlers/ConfigHandler.js +3 -3
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +20 -16
  27. package/dist/persona/PersonaElementManager.js +3 -3
  28. package/dist/persona/PersonaManager.js +2 -2
  29. package/dist/persona/export-import/PersonaImporter.js +3 -3
  30. package/dist/portfolio/DefaultElementProvider.d.ts +12 -0
  31. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  32. package/dist/portfolio/DefaultElementProvider.js +23 -6
  33. package/dist/portfolio/GitHubPortfolioIndexer.js +2 -2
  34. package/dist/portfolio/MigrationManager.js +2 -2
  35. package/dist/portfolio/NLPScoringManager.js +2 -2
  36. package/dist/portfolio/PortfolioManager.d.ts +5 -0
  37. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  38. package/dist/portfolio/PortfolioManager.js +8 -1
  39. package/dist/portfolio/PortfolioRepoManager.js +2 -2
  40. package/dist/portfolio/PortfolioSyncManager.js +5 -5
  41. package/dist/portfolio/RelationshipManager.js +4 -4
  42. package/dist/portfolio/UnifiedIndexManager.js +4 -4
  43. package/dist/portfolio/types/RelationshipTypes.js +2 -2
  44. package/dist/security/InputValidator.d.ts +12 -0
  45. package/dist/security/InputValidator.d.ts.map +1 -1
  46. package/dist/security/InputValidator.js +38 -18
  47. package/dist/security/audit/config/suppressions.js +10 -10
  48. package/dist/security/commandValidator.js +2 -2
  49. package/dist/security/dosProtection.d.ts +123 -0
  50. package/dist/security/dosProtection.d.ts.map +1 -0
  51. package/dist/security/dosProtection.js +392 -0
  52. package/dist/security/pathValidator.js +2 -2
  53. package/dist/security/secureYamlParser.d.ts.map +1 -1
  54. package/dist/security/secureYamlParser.js +4 -3
  55. package/dist/security/tokenManager.js +10 -10
  56. package/dist/security/validators/unicodeValidator.js +2 -2
  57. package/dist/security/yamlValidator.js +3 -3
  58. package/dist/sync/PortfolioDownloader.js +2 -2
  59. package/dist/sync/PortfolioSyncComparer.js +2 -2
  60. package/dist/tools/portfolio/PortfolioElementAdapter.js +3 -3
  61. package/dist/tools/portfolio/submitToPortfolioTool.js +14 -14
  62. package/dist/utils/EarlyTerminationSearch.d.ts +1 -1
  63. package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -1
  64. package/dist/utils/EarlyTerminationSearch.js +3 -3
  65. package/dist/utils/ElementFormatter.d.ts +1 -0
  66. package/dist/utils/ElementFormatter.d.ts.map +1 -1
  67. package/dist/utils/ElementFormatter.js +21 -13
  68. package/dist/utils/GitHubRateLimiter.d.ts +6 -0
  69. package/dist/utils/GitHubRateLimiter.d.ts.map +1 -1
  70. package/dist/utils/GitHubRateLimiter.js +20 -5
  71. package/dist/utils/RateLimiter.js +2 -2
  72. package/dist/utils/SecureDownloader.js +2 -2
  73. package/dist/utils/fileOperations.d.ts +6 -1
  74. package/dist/utils/fileOperations.d.ts.map +1 -1
  75. package/dist/utils/fileOperations.js +29 -5
  76. package/dist/utils/filesystem.js +6 -6
  77. package/dist/utils/searchUtils.js +2 -2
  78. package/dist/utils/version.js +3 -3
  79. package/package.json +1 -1
@@ -751,12 +751,12 @@ export class PortfolioSyncManager {
751
751
  * Find a fuzzy match for an element name
752
752
  */
753
753
  findFuzzyMatch(searchName, entries) {
754
- const search = searchName.toLowerCase().replace(/[-_]/g, '');
754
+ const search = searchName.toLowerCase().replaceAll(/[-_]/g, '');
755
755
  let bestMatch = null;
756
756
  let bestScore = 0;
757
757
  for (const entry of entries) {
758
758
  // Normalize the entry name for comparison
759
- const normalized = entry.name.toLowerCase().replace(/[-_]/g, '');
759
+ const normalized = entry.name.toLowerCase().replaceAll(/[-_]/g, '');
760
760
  // Calculate similarity score
761
761
  const score = this.calculateSimilarity(search, normalized);
762
762
  if (score > bestScore && score > 0.5) { // Minimum threshold of 0.5
@@ -770,10 +770,10 @@ export class PortfolioSyncManager {
770
770
  * Get suggestions for similar element names
771
771
  */
772
772
  getSuggestions(searchName, entries) {
773
- const search = searchName.toLowerCase().replace(/[-_]/g, '');
773
+ const search = searchName.toLowerCase().replaceAll(/[-_]/g, '');
774
774
  const scored = [];
775
775
  for (const entry of entries) {
776
- const normalized = entry.name.toLowerCase().replace(/[-_]/g, '');
776
+ const normalized = entry.name.toLowerCase().replaceAll(/[-_]/g, '');
777
777
  const score = this.calculateSimilarity(search, normalized);
778
778
  if (score > 0.3) { // Lower threshold for suggestions
779
779
  scored.push({ entry, score });
@@ -823,4 +823,4 @@ export class PortfolioSyncManager {
823
823
  return 0;
824
824
  }
825
825
  }
826
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvU3luY01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL1BvcnRmb2xpb1N5bmNNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFtQixNQUFNLDRCQUE0QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBb0IsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQWtFeEYsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixhQUFhLENBQWdCO0lBQzdCLGdCQUFnQixDQUFtQjtJQUNuQyxXQUFXLENBQXVCO0lBQ2xDLE9BQU8sQ0FBeUI7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QUNuRCxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsa0NBQWtDO1FBQ25FLENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUMzQixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ25ELE9BQU8sR0FBRyxDQUFDO29CQUNiLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsNEJBQTRCO1FBQzVCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0Zm9saW9TeW5jTWFuYWdlciAtIEhhbmRsZXMgc3luY2hyb25pemF0aW9uIGJldHdlZW4gbG9jYWwgYW5kIEdpdEh1YiBwb3J0Zm9saW9zXG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBEb3dubG9hZCBlbGVtZW50cyBmcm9tIEdpdEh1YiBwb3J0Zm9saW9cbiAqIC0gVXBsb2FkIGVsZW1lbnRzIHdpdGggY29uc2VudFxuICogLSBWZXJzaW9uIGNvbXBhcmlzb24gYW5kIGRpZmYgdmlld2luZ1xuICogLSBQcml2YWN5LWZpcnN0IHdpdGggZXhwbGljaXQgcGVybWlzc2lvbnNcbiAqIC0gQ29uZmxpY3QgcmVzb2x1dGlvbiBzdHJhdGVnaWVzXG4gKiAtIEJ1bGsgb3BlcmF0aW9ucyB3aXRoIGNvbmZpZ3VyYXRpb24gY2hlY2tzXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IENvbmZpZ01hbmFnZXIsIERvbGxob3VzZUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvUmVwb01hbmFnZXIgfSBmcm9tICcuL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IEdpdEh1YlBvcnRmb2xpb0luZGV4ZXIsIEdpdEh1YkluZGV4RW50cnkgfSBmcm9tICcuL0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIuanMnO1xuaW1wb3J0IHsgZ2V0UG9ydGZvbGlvUmVwb3NpdG9yeU5hbWUgfSBmcm9tICcuLi9jb25maWcvcG9ydGZvbGlvQ29uZmlnLmpzJztcbmltcG9ydCB7IFRva2VuTWFuYWdlciB9IGZyb20gJy4uL3NlY3VyaXR5L3Rva2VuTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudCwgRWxlbWVudFN0YXR1cyB9IGZyb20gJy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyIH0gZnJvbSAnLi4vdG9vbHMvcG9ydGZvbGlvL1BvcnRmb2xpb0VsZW1lbnRBZGFwdGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTeW5jT3BlcmF0aW9uIHtcbiAgb3BlcmF0aW9uOiAnZG93bmxvYWQnIHwgJ3VwbG9hZCcgfCAnY29tcGFyZScgfCAnbGlzdC1yZW1vdGUnO1xuICBlbGVtZW50X25hbWU/OiBzdHJpbmc7XG4gIGVsZW1lbnRfdHlwZT86IEVsZW1lbnRUeXBlO1xuICBidWxrPzogYm9vbGVhbjtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgc2hvd19kaWZmPzogYm9vbGVhbjtcbiAgZm9yY2U/OiBib29sZWFuO1xuICBjb25maXJtPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkYXRhPzogYW55O1xuICBlbGVtZW50cz86IFN5bmNFbGVtZW50SW5mb1tdO1xuICBjb25mbGljdHM/OiBDb25mbGljdEluZm9bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jRWxlbWVudEluZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IEVsZW1lbnRUeXBlO1xuICBsb2NhbFZlcnNpb24/OiBzdHJpbmc7XG4gIHJlbW90ZVZlcnNpb24/OiBzdHJpbmc7XG4gIHN0YXR1czogJ25ldycgfCAndXBkYXRlZCcgfCAnY29uZmxpY3QnIHwgJ3VuY2hhbmdlZCcgfCAnbG9jYWwtb25seSc7XG4gIGFjdGlvbj86ICdkb3dubG9hZCcgfCAndXBsb2FkJyB8ICdza2lwJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25mbGljdEluZm8ge1xuICBlbGVtZW50OiBzdHJpbmc7XG4gIHR5cGU6IEVsZW1lbnRUeXBlO1xuICBsb2NhbFZlcnNpb246IHN0cmluZztcbiAgcmVtb3RlVmVyc2lvbjogc3RyaW5nO1xuICBsb2NhbE1vZGlmaWVkOiBEYXRlO1xuICByZW1vdGVNb2RpZmllZDogRGF0ZTtcbiAgcmVzb2x1dGlvbj86ICdsb2NhbCcgfCAncmVtb3RlJyB8ICdtYW51YWwnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25JbmZvIHtcbiAgdmVyc2lvbjogc3RyaW5nO1xuICB0aW1lc3RhbXA6IERhdGU7XG4gIGF1dGhvcjogc3RyaW5nO1xuICBoYXNoOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbiAgc291cmNlOiAnbG9jYWwnIHwgJ3JlbW90ZSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudERpZmYge1xuICBlbGVtZW50OiBzdHJpbmc7XG4gIHR5cGU6IEVsZW1lbnRUeXBlO1xuICBjaGFuZ2VzOiB7XG4gICAgbWV0YWRhdGE/OiB7XG4gICAgICBmaWVsZDogc3RyaW5nO1xuICAgICAgb2xkVmFsdWU6IGFueTtcbiAgICAgIG5ld1ZhbHVlOiBhbnk7XG4gICAgfVtdO1xuICAgIGNvbnRlbnQ/OiB7XG4gICAgICBhZGRpdGlvbnM6IG51bWJlcjtcbiAgICAgIGRlbGV0aW9uczogbnVtYmVyO1xuICAgICAgZGlmZjogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBQb3J0Zm9saW9TeW5jTWFuYWdlciB7XG4gIHByaXZhdGUgY29uZmlnTWFuYWdlcjogQ29uZmlnTWFuYWdlcjtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcml2YXRlIHJlcG9NYW5hZ2VyOiBQb3J0Zm9saW9SZXBvTWFuYWdlcjtcbiAgcHJpdmF0ZSBpbmRleGVyOiBHaXRIdWJQb3J0Zm9saW9JbmRleGVyO1xuICBcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb25maWdNYW5hZ2VyID0gQ29uZmlnTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLnJlcG9NYW5hZ2VyID0gbmV3IFBvcnRmb2xpb1JlcG9NYW5hZ2VyKGdldFBvcnRmb2xpb1JlcG9zaXRvcnlOYW1lKCkpO1xuICAgIHRoaXMuaW5kZXhlciA9IEdpdEh1YlBvcnRmb2xpb0luZGV4ZXIuZ2V0SW5zdGFuY2UoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE1haW4gaGFuZGxlciBmb3Igc3luYyBvcGVyYXRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZGxlU3luY09wZXJhdGlvbihwYXJhbXM6IFN5bmNPcGVyYXRpb24pOiBQcm9taXNlPFN5bmNSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgc3luYyBpcyBlbmFibGVkIGluIGNvbmZpZ1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdNYW5hZ2VyLmdldENvbmZpZygpO1xuICAgICAgaWYgKCFjb25maWcuc3luYy5lbmFibGVkICYmIHBhcmFtcy5vcGVyYXRpb24gIT09ICdsaXN0LXJlbW90ZScpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnU3luYyBpcyBkaXNhYmxlZC4gRW5hYmxlIGl0IHdpdGg6IGRvbGxob3VzZV9jb25maWcgLS1hY3Rpb24gdXBkYXRlIC0tc2V0dGluZyBzeW5jLmVuYWJsZWQgLS12YWx1ZSB0cnVlJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBidWxrIHBlcm1pc3Npb25zXG4gICAgICBpZiAocGFyYW1zLmJ1bGspIHtcbiAgICAgICAgY29uc3QgYnVsa0FsbG93ZWQgPSB0aGlzLmlzQnVsa09wZXJhdGlvbkFsbG93ZWQocGFyYW1zLm9wZXJhdGlvbiwgY29uZmlnKTtcbiAgICAgICAgaWYgKCFidWxrQWxsb3dlZC5hbGxvd2VkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYnVsa0FsbG93ZWQubWVzc2FnZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIG9wZXJhdGlvbnNcbiAgICAgIHN3aXRjaCAocGFyYW1zLm9wZXJhdGlvbikge1xuICAgICAgICBjYXNlICdsaXN0LXJlbW90ZSc6XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubGlzdFJlbW90ZUVsZW1lbnRzKHBhcmFtcy5lbGVtZW50X3R5cGUpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlICdkb3dubG9hZCc6XG4gICAgICAgICAgaWYgKHBhcmFtcy5idWxrKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5idWxrRG93bmxvYWQocGFyYW1zLmVsZW1lbnRfdHlwZSwgcGFyYW1zLmNvbmZpcm0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLmVsZW1lbnRfbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZG93bmxvYWRFbGVtZW50KFxuICAgICAgICAgICAgICBwYXJhbXMuZWxlbWVudF9uYW1lLFxuICAgICAgICAgICAgICBwYXJhbXMuZWxlbWVudF90eXBlISxcbiAgICAgICAgICAgICAgcGFyYW1zLnZlcnNpb24sXG4gICAgICAgICAgICAgIHBhcmFtcy5mb3JjZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdFbGVtZW50IG5hbWUgcmVxdWlyZWQgZm9yIGluZGl2aWR1YWwgZG93bmxvYWQnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgY2FzZSAndXBsb2FkJzpcbiAgICAgICAgICBpZiAocGFyYW1zLmJ1bGspIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJ1bGtVcGxvYWQocGFyYW1zLmVsZW1lbnRfdHlwZSwgcGFyYW1zLmNvbmZpcm0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLmVsZW1lbnRfbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXBsb2FkRWxlbWVudChcbiAgICAgICAgICAgICAgcGFyYW1zLmVsZW1lbnRfbmFtZSxcbiAgICAgICAgICAgICAgcGFyYW1zLmVsZW1lbnRfdHlwZSEsXG4gICAgICAgICAgICAgIHBhcmFtcy5jb25maXJtXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VsZW1lbnQgbmFtZSByZXF1aXJlZCBmb3IgaW5kaXZpZHVhbCB1cGxvYWQnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgY2FzZSAnY29tcGFyZSc6XG4gICAgICAgICAgaWYgKHBhcmFtcy5lbGVtZW50X25hbWUgJiYgcGFyYW1zLmVsZW1lbnRfdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29tcGFyZVZlcnNpb25zKFxuICAgICAgICAgICAgICBwYXJhbXMuZWxlbWVudF9uYW1lLFxuICAgICAgICAgICAgICBwYXJhbXMuZWxlbWVudF90eXBlLFxuICAgICAgICAgICAgICBwYXJhbXMuc2hvd19kaWZmXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VsZW1lbnQgbmFtZSBhbmQgdHlwZSByZXF1aXJlZCBmb3IgY29tcGFyaXNvbidcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBVbmtub3duIG9wZXJhdGlvbjogJHtwYXJhbXMub3BlcmF0aW9ufWBcbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1N5bmMgb3BlcmF0aW9uIGZhaWxlZCcsIHtcbiAgICAgICAgb3BlcmF0aW9uOiBwYXJhbXMub3BlcmF0aW9uLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBTeW5jIG9wZXJhdGlvbiBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYnVsayBvcGVyYXRpb24gaXMgYWxsb3dlZFxuICAgKi9cbiAgcHJpdmF0ZSBpc0J1bGtPcGVyYXRpb25BbGxvd2VkKG9wZXJhdGlvbjogc3RyaW5nLCBjb25maWc6IERvbGxob3VzZUNvbmZpZyk6IHsgYWxsb3dlZDogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nIH0ge1xuICAgIGlmIChvcGVyYXRpb24gPT09ICdkb3dubG9hZCcgJiYgIWNvbmZpZy5zeW5jLmJ1bGsuZG93bmxvYWRfZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dlZDogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6ICdCdWxrIGRvd25sb2FkIGlzIGRpc2FibGVkLiBFbmFibGUgd2l0aDogZG9sbGhvdXNlX2NvbmZpZyAtLWFjdGlvbiB1cGRhdGUgLS1zZXR0aW5nIHN5bmMuYnVsay5kb3dubG9hZF9lbmFibGVkIC0tdmFsdWUgdHJ1ZSdcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIGlmIChvcGVyYXRpb24gPT09ICd1cGxvYWQnICYmICFjb25maWcuc3luYy5idWxrLnVwbG9hZF9lbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbGxvd2VkOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJ0J1bGsgdXBsb2FkIGlzIGRpc2FibGVkLiBFbmFibGUgd2l0aDogZG9sbGhvdXNlX2NvbmZpZyAtLWFjdGlvbiB1cGRhdGUgLS1zZXR0aW5nIHN5bmMuYnVsay51cGxvYWRfZW5hYmxlZCAtLXZhbHVlIHRydWUnXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4geyBhbGxvd2VkOiB0cnVlLCBtZXNzYWdlOiAnJyB9O1xuICB9XG4gIFxuICAvKipcbiAgICogTGlzdCBlbGVtZW50cyBhdmFpbGFibGUgaW4gR2l0SHViIHBvcnRmb2xpb1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0UmVtb3RlRWxlbWVudHMoZmlsdGVyVHlwZT86IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxTeW5jUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCBHaXRIdWIgdG9rZW5cbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnR2l0SHViIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLiBVc2Ugc2V0dXBfZ2l0aHViX2F1dGggZmlyc3QuJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLnJlcG9NYW5hZ2VyLnNldFRva2VuKHRva2VuKTtcbiAgICAgIFxuICAgICAgLy8gR2V0IGluZGV4IG9mIEdpdEh1YiBwb3J0Zm9saW9cbiAgICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5pbmRleGVyLmdldEluZGV4KCk7XG4gICAgICBcbiAgICAgIGlmICghaW5kZXggfHwgaW5kZXgudG90YWxFbGVtZW50cyA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogJ05vIGVsZW1lbnRzIGZvdW5kIGluIEdpdEh1YiBwb3J0Zm9saW8nLFxuICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3JtYXQgZWxlbWVudHMgZm9yIGRpc3BsYXlcbiAgICAgIGNvbnN0IGVsZW1lbnRzOiBTeW5jRWxlbWVudEluZm9bXSA9IFtdO1xuICAgICAgXG4gICAgICBmb3IgKGNvbnN0IFt0eXBlLCBlbnRyaWVzXSBvZiBpbmRleC5lbGVtZW50cykge1xuICAgICAgICAvLyBTa2lwIGlmIGZpbHRlcmluZyBieSB0eXBlIGFuZCB0aGlzIGlzbid0IHRoZSByZXF1ZXN0ZWQgdHlwZVxuICAgICAgICBpZiAoZmlsdGVyVHlwZSAmJiB0eXBlICE9PSBmaWx0ZXJUeXBlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICByZW1vdGVWZXJzaW9uOiBlbnRyeS52ZXJzaW9uLFxuICAgICAgICAgICAgc3RhdHVzOiAndW5jaGFuZ2VkJyxcbiAgICAgICAgICAgIGFjdGlvbjogJ2Rvd25sb2FkJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBGb3VuZCAke2VsZW1lbnRzLmxlbmd0aH0gZWxlbWVudHMgaW4gR2l0SHViIHBvcnRmb2xpb2AsXG4gICAgICAgIGVsZW1lbnRzXG4gICAgICB9O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIGxpc3QgcmVtb3RlIGVsZW1lbnRzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIERvd25sb2FkIGEgc3BlY2lmaWMgZWxlbWVudCBmcm9tIEdpdEh1YlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkb3dubG9hZEVsZW1lbnQoXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgdmVyc2lvbj86IHN0cmluZyxcbiAgICBmb3JjZT86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxTeW5jUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudCBuYW1lXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZWxlbWVudE5hbWUpO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCBlbGVtZW50IG5hbWU6ICR7dmFsaWRhdGlvbi5kZXRlY3RlZElzc3Vlcz8uWzBdIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCB0b2tlbiBhbmQgc2V0IGl0XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5yZXBvTWFuYWdlci5zZXRUb2tlbih0b2tlbik7XG4gICAgICBcbiAgICAgIC8vIEdldCBHaXRIdWIgaW5kZXhcbiAgICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5pbmRleGVyLmdldEluZGV4KCk7XG4gICAgICBcbiAgICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgLSBmaXJzdCB0cnkgZXhhY3QgbWF0Y2gsIHRoZW4gZnV6enkgbWF0Y2hcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBpbmRleC5lbGVtZW50cy5nZXQoZWxlbWVudFR5cGUpIHx8IFtdO1xuICAgICAgbGV0IGVudHJ5ID0gZW50cmllcy5maW5kKGUgPT4gZS5uYW1lID09PSBlbGVtZW50TmFtZSk7XG4gICAgICBcbiAgICAgIC8vIElmIGV4YWN0IG1hdGNoIG5vdCBmb3VuZCwgdHJ5IGZ1enp5IG1hdGNoaW5nXG4gICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIC8vIFRyeSBjYXNlLWluc2Vuc2l0aXZlIGV4YWN0IG1hdGNoIGZpcnN0XG4gICAgICAgIGVudHJ5ID0gZW50cmllcy5maW5kKGUgPT4gZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGVsZW1lbnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgc3RpbGwgbm90IGZvdW5kLCB0cnkgZnV6enkgbWF0Y2hpbmdcbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgIGNvbnN0IGZ1enp5TWF0Y2ggPSB0aGlzLmZpbmRGdXp6eU1hdGNoKGVsZW1lbnROYW1lLCBlbnRyaWVzKTtcbiAgICAgICAgICBpZiAoZnV6enlNYXRjaCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEZ1enp5IG1hdGNoIGZvdW5kOiAnJHtlbGVtZW50TmFtZX0nIG1hdGNoZWQgdG8gJyR7ZnV6enlNYXRjaC5uYW1lfSdgKTtcbiAgICAgICAgICAgIGVudHJ5ID0gZnV6enlNYXRjaDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAvLyBHZW5lcmF0ZSBoZWxwZnVsIHN1Z2dlc3Rpb25zXG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gdGhpcy5nZXRTdWdnZXN0aW9ucyhlbGVtZW50TmFtZSwgZW50cmllcyk7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25UZXh0ID0gc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCBcbiAgICAgICAgICA/IGBcXG5cXG5EaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlP1xcbiR7c3VnZ2VzdGlvbnMubWFwKHMgPT4gYCAg4oCiICR7cy5uYW1lfWApLmpvaW4oJ1xcbicpfWBcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgRWxlbWVudCAnJHtlbGVtZW50TmFtZX0nICgke2VsZW1lbnRUeXBlfSkgbm90IGZvdW5kIGluIEdpdEh1YiBwb3J0Zm9saW8ke3N1Z2dlc3Rpb25UZXh0fWBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIGxvY2FsIGNvbmZsaWN0c1xuICAgICAgY29uc3QgbG9jYWxQYXRoID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnRUeXBlLCBgJHtlbGVtZW50TmFtZX0ubWRgKTtcbiAgICAgIGxldCBoYXNMb2NhbFZlcnNpb24gPSBmYWxzZTtcbiAgICAgIGxldCBsb2NhbENvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbENvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShsb2NhbFBhdGgsICd1dGYtOCcpO1xuICAgICAgICBoYXNMb2NhbFZlcnNpb24gPSB0cnVlO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE5vIGxvY2FsIHZlcnNpb24gZXhpc3RzXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERvd25sb2FkIHRoZSBlbGVtZW50XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGVudHJ5LmRvd25sb2FkVXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52My5yYXcnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRvd25sb2FkOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IHJlbW90ZUNvbnRlbnQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGNvbnRlbnQgc2VjdXJpdHlcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUocmVtb3RlQ29udGVudCk7XG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCAmJiB2YWxpZGF0aW9uUmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYFNlY3VyaXR5IGlzc3VlIGRldGVjdGVkIGluIHJlbW90ZSBjb250ZW50OiAke3ZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGNvbnRlbnQgaXMgZGlmZmVyZW50XG4gICAgICBpZiAoaGFzTG9jYWxWZXJzaW9uICYmIGxvY2FsQ29udGVudCkge1xuICAgICAgICBjb25zdCBsb2NhbEhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUobG9jYWxDb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuICAgICAgICBjb25zdCByZW1vdGVIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHJlbW90ZUNvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIFxuICAgICAgICBpZiAobG9jYWxIYXNoID09PSByZW1vdGVIYXNoKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBgRWxlbWVudCAnJHtlbGVtZW50TmFtZX0nIGlzIGFscmVhZHkgdXAgdG8gZGF0ZWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTaG93IGNvbmZpcm1hdGlvbiBmb3Igb3ZlcndyaXRlIHVubGVzcyBmb3JjZSBmbGFnIGlzIHNldFxuICAgICAgICBpZiAoY29uZmlnLnN5bmMuaW5kaXZpZHVhbC5yZXF1aXJlX2NvbmZpcm1hdGlvbiAmJiAhZm9yY2UpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gYXdhaXQgdGhpcy5nZW5lcmF0ZURpZmYobG9jYWxDb250ZW50LCByZW1vdGVDb250ZW50KTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgTG9jYWwgdmVyc2lvbiBleGlzdHMuIFBsZWFzZSBjb25maXJtIGRvd25sb2FkIHdpbGwgb3ZlcndyaXRlOlxcblxcbiR7ZGlmZn1cXG5cXG5UbyBwcm9jZWVkLCB1c2UgLS1mb3JjZSBmbGFnYCxcbiAgICAgICAgICAgIGRhdGE6IHsgcmVxdWlyZXNDb25maXJtYXRpb246IHRydWUgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2F2ZSB0aGUgZWxlbWVudFxuICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKGxvY2FsUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGxvY2FsUGF0aCwgcmVtb3RlQ29udGVudCwgJ3V0Zi04Jyk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKCdFbGVtZW50IGRvd25sb2FkZWQgZnJvbSBHaXRIdWInLCB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnROYW1lLFxuICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgdmVyc2lvbjogZW50cnkudmVyc2lvblxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBTdWNjZXNzZnVsbHkgZG93bmxvYWRlZCAnJHtlbGVtZW50TmFtZX0nICgke2VsZW1lbnRUeXBlfSkgZnJvbSBHaXRIdWIgcG9ydGZvbGlvYFxuICAgICAgfTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBkb3dubG9hZCBlbGVtZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFVwbG9hZCBhIHNwZWNpZmljIGVsZW1lbnQgdG8gR2l0SHViXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHVwbG9hZEVsZW1lbnQoXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgY29uZmlybT86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxTeW5jUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIGxvY2FsIGVsZW1lbnRcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50UGF0aChlbGVtZW50VHlwZSwgYCR7ZWxlbWVudE5hbWV9Lm1kYCk7XG4gICAgICBcbiAgICAgIGxldCBjb250ZW50OiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUobG9jYWxQYXRoLCAndXRmLTgnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBFbGVtZW50ICcke2VsZW1lbnROYW1lfScgKCR7ZWxlbWVudFR5cGV9KSBub3QgZm91bmQgbG9jYWxseWBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgcHJpdmFjeSBtZXRhZGF0YVxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShjb250ZW50LCB7XG4gICAgICAgIG1heFlhbWxTaXplOiA2NCAqIDEwMjQsXG4gICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmIChwYXJzZWQuZGF0YT8ucHJpdmFjeT8ubG9jYWxfb25seSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBFbGVtZW50ICcke2VsZW1lbnROYW1lfScgaXMgbWFya2VkIGFzIGxvY2FsLW9ubHkgYW5kIGNhbm5vdCBiZSB1cGxvYWRlZGBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgY29udGVudCBzZWN1cml0eVxuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50KTtcbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkICYmIHZhbGlkYXRpb25SZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgU2VjdXJpdHkgaXNzdWUgZGV0ZWN0ZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2NhbiBmb3Igc2Vuc2l0aXZlIGNvbnRlbnQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKGNvbmZpZy5zeW5jLnByaXZhY3kuc2Nhbl9mb3Jfc2VjcmV0cykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NjYW5uaW5nIGZvciBzZWNyZXRzIGJlZm9yZSB1cGxvYWQnKTtcbiAgICAgICAgLy8gSW1wbGVtZW50IGFjdHVhbCBzZWNyZXQgc2Nhbm5pbmdcbiAgICAgICAgY29uc3Qgc2VjcmV0UGF0dGVybnMgPSBbXG4gICAgICAgICAgL2FwaVtfLV0/a2V5XFxzKls6PV1cXHMqWydcIl1bXidcIl0rWydcIl0vZ2ksXG4gICAgICAgICAgL3NlY3JldFxccypbOj1dXFxzKlsnXCJdW14nXCJdK1snXCJdL2dpLFxuICAgICAgICAgIC9wYXNzd29yZFxccypbOj1dXFxzKlsnXCJdW14nXCJdK1snXCJdL2dpLFxuICAgICAgICAgIC90b2tlblxccypbOj1dXFxzKlsnXCJdW14nXCJdK1snXCJdL2dpLFxuICAgICAgICAgIC9wcml2YXRlW18tXT9rZXlcXHMqWzo9XVxccypbJ1wiXVteJ1wiXStbJ1wiXS9naVxuICAgICAgICBdO1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHNlY3JldFBhdHRlcm5zKSB7XG4gICAgICAgICAgaWYgKHBhdHRlcm4udGVzdChjb250ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBQb3RlbnRpYWwgc2VjcmV0IGRldGVjdGVkIGluIGNvbnRlbnQuIFBsZWFzZSByZXZpZXcgYW5kIHJlbW92ZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gYmVmb3JlIHVwbG9hZGluZy5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBHZXQgY29uZmlybWF0aW9uIGlmIHJlcXVpcmVkICh1bmxlc3MgYWxyZWFkeSBjb25maXJtZWQpXG4gICAgICBpZiAoY29uZmlnLnN5bmMuaW5kaXZpZHVhbC5yZXF1aXJlX2NvbmZpcm1hdGlvbiAmJiAhY29uZmlybSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBQbGVhc2UgY29uZmlybSB1cGxvYWQgb2YgJyR7ZWxlbWVudE5hbWV9JyAoJHtlbGVtZW50VHlwZX0pIHRvIEdpdEh1Yi5cXG5cXG5Db250ZW50IHByZXZpZXc6XFxuJHtjb250ZW50LnN1YnN0cmluZygwLCA1MDApfS4uLlxcblxcblRvIHByb2NlZWQsIHVzZSAtLWNvbmZpcm0gZmxhZ2AsXG4gICAgICAgICAgZGF0YTogeyByZXF1aXJlc0NvbmZpcm1hdGlvbjogdHJ1ZSB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCB0b2tlbiBhbmQgdmFsaWRhdGVcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnR2l0SHViIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYSBQb3J0Zm9saW9FbGVtZW50IGZvciB0aGUgYWRhcHRlciAoZml4ZXMgSXNzdWUgIzkxMylcbiAgICAgIC8vIFVzaW5nIFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyIGluc3RlYWQgb2YgaW5jb21wbGV0ZSBJRWxlbWVudCBpbXBsZW1lbnRhdGlvblxuICAgICAgY29uc3QgcG9ydGZvbGlvRWxlbWVudCA9IHtcbiAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHBhcnNlZC5kYXRhPy5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICBhdXRob3I6IHBhcnNlZC5kYXRhPy5hdXRob3IgfHwgJ3Vua25vd24nLFxuICAgICAgICAgIGNyZWF0ZWQ6IHBhcnNlZC5kYXRhPy5jcmVhdGVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB1cGRhdGVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgdmVyc2lvbjogcGFyc2VkLmRhdGE/LnZlcnNpb24gfHwgJzEuMC4wJyxcbiAgICAgICAgICB0YWdzOiBwYXJzZWQuZGF0YT8udGFncyB8fCBbXVxuICAgICAgICB9LFxuICAgICAgICBjb250ZW50OiBjb250ZW50XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBVc2UgUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIgdG8gcHJvcGVybHkgaW1wbGVtZW50IElFbGVtZW50IGludGVyZmFjZVxuICAgICAgY29uc3QgYWRhcHRlciA9IG5ldyBQb3J0Zm9saW9FbGVtZW50QWRhcHRlcihwb3J0Zm9saW9FbGVtZW50KTtcbiAgICAgIFxuICAgICAgLy8gVXNlIFBvcnRmb2xpb1JlcG9NYW5hZ2VyIHRvIHVwbG9hZFxuICAgICAgdGhpcy5yZXBvTWFuYWdlci5zZXRUb2tlbih0b2tlbik7XG4gICAgICBcbiAgICAgIC8vIERFQlVHOiBMb2cgdXBsb2FkIGF0dGVtcHRcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW0JVTEtfU1lOQ19ERUJVR10gVXBsb2FkIGVsZW1lbnQgYXR0ZW1wdCcsIHtcbiAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBoYXNUb2tlbjogISF0b2tlbixcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRva2VuID8gdG9rZW4uc3Vic3RyaW5nKDAsIDEwKSArICcuLi4nIDogJ25vbmUnLFxuICAgICAgICBhZGFwdGVySGFzTWV0YWRhdGE6ICEhKGFkYXB0ZXIgJiYgYWRhcHRlci5tZXRhZGF0YSksXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5yZXBvTWFuYWdlci5zYXZlRWxlbWVudChhZGFwdGVyLCB0cnVlKTsgLy8gY29uc2VudCBpcyB0cnVlIHNpbmNlIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZFxuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0VsZW1lbnQgdXBsb2FkZWQgdG8gR2l0SHViJywge1xuICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICAgIHVybFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBgU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkICcke2VsZW1lbnROYW1lfScgKCR7ZWxlbWVudFR5cGV9KSB0byBHaXRIdWIgcG9ydGZvbGlvYCxcbiAgICAgICAgICBkYXRhOiB7IHVybCB9XG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoICh1cGxvYWRFcnJvcikge1xuICAgICAgICAvLyBIYW5kbGUgc3BlY2lmaWMgZXJyb3JzXG4gICAgICAgIGlmICh1cGxvYWRFcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIHVwbG9hZEVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ3JlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QnKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnkgbm90IGZvdW5kLiBQbGVhc2UgaW5pdGlhbGl6ZSBpdCBmaXJzdCB1c2luZyBpbml0X3BvcnRmb2xpbyB0b29sLmBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHVwbG9hZEVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIHVwbG9hZCBlbGVtZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENvbXBhcmUgbG9jYWwgYW5kIHJlbW90ZSB2ZXJzaW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb21wYXJlVmVyc2lvbnMoXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgc2hvd0RpZmY/OiBib29sZWFuXG4gICk6IFByb21pc2U8U3luY1Jlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgbG9jYWwgdmVyc2lvblxuICAgICAgY29uc3QgbG9jYWxQYXRoID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnRUeXBlLCBgJHtlbGVtZW50TmFtZX0ubWRgKTtcbiAgICAgIGxldCBsb2NhbENvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IGxvY2FsVmVyc2lvbjogVmVyc2lvbkluZm8gfCBudWxsID0gbnVsbDtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUobG9jYWxQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShsb2NhbENvbnRlbnQsIHtcbiAgICAgICAgICBtYXhZYW1sU2l6ZTogNjQgKiAxMDI0LFxuICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgbG9jYWxWZXJzaW9uID0ge1xuICAgICAgICAgIHZlcnNpb246IHBhcnNlZC5kYXRhPy52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZShwYXJzZWQuZGF0YT8udXBkYXRlZCB8fCBwYXJzZWQuZGF0YT8uY3JlYXRlZCB8fCBEYXRlLm5vdygpKSxcbiAgICAgICAgICBhdXRob3I6IHBhcnNlZC5kYXRhPy5hdXRob3IgfHwgJ3Vua25vd24nLFxuICAgICAgICAgIGhhc2g6IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShsb2NhbENvbnRlbnQpLmRpZ2VzdCgnaGV4JyksXG4gICAgICAgICAgc2l6ZTogQnVmZmVyLmJ5dGVMZW5ndGgobG9jYWxDb250ZW50KSxcbiAgICAgICAgICBzb3VyY2U6ICdsb2NhbCdcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBObyBsb2NhbCB2ZXJzaW9uXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCByZW1vdGUgdmVyc2lvblxuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW5Bc3luYygpO1xuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdHaXRIdWIgYXV0aGVudGljYXRpb24gcmVxdWlyZWQnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5pbmRleGVyLmdldEluZGV4KCk7XG4gICAgICBjb25zdCBlbnRyaWVzID0gaW5kZXguZWxlbWVudHMuZ2V0KGVsZW1lbnRUeXBlKSB8fCBbXTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllcy5maW5kKGUgPT4gZS5uYW1lID09PSBlbGVtZW50TmFtZSk7XG4gICAgICBcbiAgICAgIGxldCByZW1vdGVWZXJzaW9uOiBWZXJzaW9uSW5mbyB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHJlbW90ZUNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgXG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChlbnRyeS5kb3dubG9hZFVybCwge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMucmF3J1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICByZW1vdGVDb250ZW50ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgIHJlbW90ZVZlcnNpb24gPSB7XG4gICAgICAgICAgICB2ZXJzaW9uOiBlbnRyeS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGVudHJ5Lmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgIGF1dGhvcjogZW50cnkuYXV0aG9yIHx8ICd1bmtub3duJyxcbiAgICAgICAgICAgIGhhc2g6IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShyZW1vdGVDb250ZW50KS5kaWdlc3QoJ2hleCcpLFxuICAgICAgICAgICAgc2l6ZTogZW50cnkuc2l6ZSxcbiAgICAgICAgICAgIHNvdXJjZTogJ3JlbW90ZSdcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEJ1aWxkIGNvbXBhcmlzb24gcmVzdWx0XG4gICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgZWxlbWVudDogZWxlbWVudE5hbWUsXG4gICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICBsb2NhbDogbG9jYWxWZXJzaW9uLFxuICAgICAgICByZW1vdGU6IHJlbW90ZVZlcnNpb25cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGlmIChsb2NhbFZlcnNpb24gJiYgcmVtb3RlVmVyc2lvbikge1xuICAgICAgICByZXN1bHQuc3RhdHVzID0gbG9jYWxWZXJzaW9uLmhhc2ggPT09IHJlbW90ZVZlcnNpb24uaGFzaCA/ICdpZGVudGljYWwnIDogJ2RpZmZlcmVudCc7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2hvd0RpZmYgJiYgbG9jYWxDb250ZW50ICYmIHJlbW90ZUNvbnRlbnQgJiYgcmVzdWx0LnN0YXR1cyA9PT0gJ2RpZmZlcmVudCcpIHtcbiAgICAgICAgICByZXN1bHQuZGlmZiA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVEaWZmKGxvY2FsQ29udGVudCwgcmVtb3RlQ29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobG9jYWxWZXJzaW9uICYmICFyZW1vdGVWZXJzaW9uKSB7XG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSAnbG9jYWwtb25seSc7XG4gICAgICB9IGVsc2UgaWYgKCFsb2NhbFZlcnNpb24gJiYgcmVtb3RlVmVyc2lvbikge1xuICAgICAgICByZXN1bHQuc3RhdHVzID0gJ3JlbW90ZS1vbmx5JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSAnbm90LWZvdW5kJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYFZlcnNpb24gY29tcGFyaXNvbiBmb3IgJyR7ZWxlbWVudE5hbWV9JyAoJHtlbGVtZW50VHlwZX0pYCxcbiAgICAgICAgZGF0YTogcmVzdWx0XG4gICAgICB9O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIGNvbXBhcmUgdmVyc2lvbnM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQnVsayBkb3dubG9hZCBlbGVtZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWxrRG93bmxvYWQoZWxlbWVudFR5cGU/OiBFbGVtZW50VHlwZSwgY29uZmlybT86IGJvb2xlYW4pOiBQcm9taXNlPFN5bmNSZXN1bHQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ01hbmFnZXIuZ2V0Q29uZmlnKCk7XG4gICAgXG4gICAgaWYgKCFjb25maWcuc3luYy5idWxrLmRvd25sb2FkX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnQnVsayBkb3dubG9hZCBpcyBub3QgZW5hYmxlZCBpbiBjb25maWd1cmF0aW9uJ1xuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gR2V0IGxpc3Qgb2YgcmVtb3RlIGVsZW1lbnRzXG4gICAgY29uc3QgcmVtb3RlUmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0UmVtb3RlRWxlbWVudHMoKTtcbiAgICBpZiAoIXJlbW90ZVJlc3VsdC5zdWNjZXNzIHx8ICFyZW1vdGVSZXN1bHQuZWxlbWVudHMpIHtcbiAgICAgIHJldHVybiByZW1vdGVSZXN1bHQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEZpbHRlciBieSB0eXBlIGlmIHNwZWNpZmllZFxuICAgIGxldCBlbGVtZW50c1RvRG93bmxvYWQgPSByZW1vdGVSZXN1bHQuZWxlbWVudHM7XG4gICAgaWYgKGVsZW1lbnRUeXBlKSB7XG4gICAgICBlbGVtZW50c1RvRG93bmxvYWQgPSBlbGVtZW50c1RvRG93bmxvYWQuZmlsdGVyKGUgPT4gZS50eXBlID09PSBlbGVtZW50VHlwZSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChlbGVtZW50c1RvRG93bmxvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiAnTm8gZWxlbWVudHMgdG8gZG93bmxvYWQnLFxuICAgICAgICBlbGVtZW50czogW11cbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIFNob3cgcHJldmlldyBpZiByZXF1aXJlZCAodW5sZXNzIGFscmVhZHkgY29uZmlybWVkKVxuICAgIGlmIChjb25maWcuc3luYy5idWxrLnJlcXVpcmVfcHJldmlldyAmJiAhY29uZmlybSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBCdWxrIGRvd25sb2FkIHByZXZpZXc6XFxuXFxuJHtlbGVtZW50c1RvRG93bmxvYWQubGVuZ3RofSBlbGVtZW50cyB3aWxsIGJlIGRvd25sb2FkZWQ6XFxuJHtlbGVtZW50c1RvRG93bmxvYWQubWFwKGUgPT4gYC0gJHtlLm5hbWV9ICgke2UudHlwZX0pYCkuam9pbignXFxuJyl9XFxuXFxuVG8gcHJvY2VlZCwgdXNlIC0tY29uZmlybSBmbGFnYCxcbiAgICAgICAgZGF0YTogeyByZXF1aXJlc0NvbmZpcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICBlbGVtZW50czogZWxlbWVudHNUb0Rvd25sb2FkXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBQZXJmb3JtIGFjdHVhbCBidWxrIGRvd25sb2FkXG4gICAgY29uc3QgcmVzdWx0cyA9IHtcbiAgICAgIGRvd25sb2FkZWQ6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgc2tpcHBlZDogW10gYXMgc3RyaW5nW10sXG4gICAgICBmYWlsZWQ6IFtdIGFzIHsgbmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH1bXVxuICAgIH07XG4gICAgXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9Eb3dubG9hZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kb3dubG9hZEVsZW1lbnQoZWxlbWVudC5uYW1lLCBlbGVtZW50LnR5cGUsIHVuZGVmaW5lZCwgdHJ1ZSk7IC8vIGZvcmNlPXRydWUgdG8gc2tpcCBpbmRpdmlkdWFsIGNvbmZpcm1hdGlvbnNcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cy5kb3dubG9hZGVkLnB1c2goZWxlbWVudC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgdXAgdG8gZGF0ZScpKSB7XG4gICAgICAgICAgcmVzdWx0cy5za2lwcGVkLnB1c2goZWxlbWVudC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRzLmZhaWxlZC5wdXNoKHsgbmFtZTogZWxlbWVudC5uYW1lLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXN1bHRzLmZhaWxlZC5wdXNoKHsgXG4gICAgICAgICAgbmFtZTogZWxlbWVudC5uYW1lLCBcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpIFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQnVpbGQgc3VtbWFyeSBtZXNzYWdlXG4gICAgbGV0IG1lc3NhZ2UgPSBgQnVsayBkb3dubG9hZCBjb21wbGV0ZTpcXG5gO1xuICAgIG1lc3NhZ2UgKz0gYC0gRG93bmxvYWRlZDogJHtyZXN1bHRzLmRvd25sb2FkZWQubGVuZ3RofSBlbGVtZW50c1xcbmA7XG4gICAgbWVzc2FnZSArPSBgLSBTa2lwcGVkICh1cCB0byBkYXRlKTogJHtyZXN1bHRzLnNraXBwZWQubGVuZ3RofSBlbGVtZW50c1xcbmA7XG4gICAgbWVzc2FnZSArPSBgLSBGYWlsZWQ6ICR7cmVzdWx0cy5mYWlsZWQubGVuZ3RofSBlbGVtZW50c2A7XG4gICAgXG4gICAgaWYgKHJlc3VsdHMuZmFpbGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIG1lc3NhZ2UgKz0gYFxcblxcbkZhaWxlZCBkb3dubG9hZHM6XFxuJHtyZXN1bHRzLmZhaWxlZC5tYXAoZiA9PiBgLSAke2YubmFtZX06ICR7Zi5lcnJvcn1gKS5qb2luKCdcXG4nKX1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogcmVzdWx0cy5mYWlsZWQubGVuZ3RoID09PSAwLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGRhdGE6IHJlc3VsdHNcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogQnVsayB1cGxvYWQgZWxlbWVudHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVsa1VwbG9hZChlbGVtZW50VHlwZT86IEVsZW1lbnRUeXBlLCBjb25maXJtPzogYm9vbGVhbik6IFByb21pc2U8U3luY1Jlc3VsdD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcbiAgICBcbiAgICBpZiAoIWNvbmZpZy5zeW5jLmJ1bGsudXBsb2FkX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnQnVsayB1cGxvYWQgaXMgbm90IGVuYWJsZWQgaW4gY29uZmlndXJhdGlvbidcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIEdldCBsaXN0IG9mIGxvY2FsIGVsZW1lbnRzXG4gICAgY29uc3QgdHlwZXMgPSBlbGVtZW50VHlwZSA/IFtlbGVtZW50VHlwZV0gOiBbXG4gICAgICBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAgRWxlbWVudFR5cGUuU0tJTEwsXG4gICAgICBFbGVtZW50VHlwZS5URU1QTEFURSxcbiAgICAgIEVsZW1lbnRUeXBlLkFHRU5ULFxuICAgICAgRWxlbWVudFR5cGUuTUVNT1JZLFxuICAgICAgRWxlbWVudFR5cGUuRU5TRU1CTEVcbiAgICBdO1xuICAgIFxuICAgIGNvbnN0IGxvY2FsRWxlbWVudHM6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBFbGVtZW50VHlwZTsgcGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIFxuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0eXBlcykge1xuICAgICAgY29uc3QgZGlyID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKTtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgICAgICBsb2NhbEVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICBuYW1lOiBmaWxlLnJlcGxhY2UoJy5tZCcsICcnKSxcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgcGF0aDogcGF0aC5qb2luKGRpciwgZmlsZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRGlyZWN0b3J5IG1heSBub3QgZXhpc3QgeWV0XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRGlyZWN0b3J5IGZvciAke3R5cGV9IGRvZXMgbm90IGV4aXN0IHlldGApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAobG9jYWxFbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6ICdObyBsb2NhbCBlbGVtZW50cyB0byB1cGxvYWQnLFxuICAgICAgICBlbGVtZW50czogW11cbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIFNob3cgcHJldmlldyBpZiByZXF1aXJlZCAodW5sZXNzIGFscmVhZHkgY29uZmlybWVkKVxuICAgIGlmIChjb25maWcuc3luYy5idWxrLnJlcXVpcmVfcHJldmlldyAmJiAhY29uZmlybSkge1xuICAgICAgLy8gQ29udmVydCB0byBTeW5jRWxlbWVudEluZm8gZm9ybWF0IGZvciBwcmV2aWV3XG4gICAgICBjb25zdCBwcmV2aWV3RWxlbWVudHM6IFN5bmNFbGVtZW50SW5mb1tdID0gbG9jYWxFbGVtZW50cy5tYXAoZSA9PiAoe1xuICAgICAgICBuYW1lOiBlLm5hbWUsXG4gICAgICAgIHR5cGU6IGUudHlwZSxcbiAgICAgICAgc3RhdHVzOiAnbG9jYWwtb25seScgYXMgY29uc3QsXG4gICAgICAgIGFjdGlvbjogJ3VwbG9hZCcgYXMgY29uc3RcbiAgICAgIH0pKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBCdWxrIHVwbG9hZCBwcmV2aWV3OlxcblxcbiR7bG9jYWxFbGVtZW50cy5sZW5ndGh9IGVsZW1lbnRzIHdpbGwgYmUgdXBsb2FkZWQ6XFxuJHtsb2NhbEVsZW1lbnRzLm1hcChlID0+IGAtICR7ZS5uYW1lfSAoJHtlLnR5cGV9KWApLmpvaW4oJ1xcbicpfVxcblxcblRvIHByb2NlZWQsIHVzZSAtLWNvbmZpcm0gZmxhZ2AsXG4gICAgICAgIGRhdGE6IHsgcmVxdWlyZXNDb25maXJtYXRpb246IHRydWUgfSxcbiAgICAgICAgZWxlbWVudHM6IHByZXZpZXdFbGVtZW50c1xuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gUGVyZm9ybSBhY3R1YWwgYnVsayB1cGxvYWRcbiAgICBjb25zdCByZXN1bHRzID0ge1xuICAgICAgdXBsb2FkZWQ6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgc2tpcHBlZDogW10gYXMgc3RyaW5nW10sXG4gICAgICBmYWlsZWQ6IFtdIGFzIHsgbmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH1bXVxuICAgIH07XG4gICAgXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGxvY2FsRWxlbWVudHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudXBsb2FkRWxlbWVudChlbGVtZW50Lm5hbWUsIGVsZW1lbnQudHlwZSwgdHJ1ZSk7IC8vIGNvbmZpcm09dHJ1ZSB0byBza2lwIGluZGl2aWR1YWwgY29uZmlybWF0aW9uc1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXN1bHRzLnVwbG9hZGVkLnB1c2goZWxlbWVudC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubWVzc2FnZT8uaW5jbHVkZXMoJ2xvY2FsLW9ubHknKSkge1xuICAgICAgICAgIHJlc3VsdHMuc2tpcHBlZC5wdXNoKGVsZW1lbnQubmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0cy5mYWlsZWQucHVzaCh7IG5hbWU6IGVsZW1lbnQubmFtZSwgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJyB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVzdWx0cy5mYWlsZWQucHVzaCh7IFxuICAgICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSwgXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEJ1aWxkIHN1bW1hcnkgbWVzc2FnZVxuICAgIGxldCBtZXNzYWdlID0gYEJ1bGsgdXBsb2FkIGNvbXBsZXRlOlxcbmA7XG4gICAgbWVzc2FnZSArPSBgLSBVcGxvYWRlZDogJHtyZXN1bHRzLnVwbG9hZGVkLmxlbmd0aH0gZWxlbWVudHNcXG5gO1xuICAgIG1lc3NhZ2UgKz0gYC0gU2tpcHBlZCAobG9jYWwtb25seSk6ICR7cmVzdWx0cy5za2lwcGVkLmxlbmd0aH0gZWxlbWVudHNcXG5gO1xuICAgIG1lc3NhZ2UgKz0gYC0gRmFpbGVkOiAke3Jlc3VsdHMuZmFpbGVkLmxlbmd0aH0gZWxlbWVudHNgO1xuICAgIFxuICAgIGlmIChyZXN1bHRzLmZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICBtZXNzYWdlICs9IGBcXG5cXG5GYWlsZWQgdXBsb2FkczpcXG4ke3Jlc3VsdHMuZmFpbGVkLm1hcChmID0+IGAtICR7Zi5uYW1lfTogJHtmLmVycm9yfWApLmpvaW4oJ1xcbicpfWA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiByZXN1bHRzLmZhaWxlZC5sZW5ndGggPT09IDAsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZGF0YTogcmVzdWx0c1xuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBkaWZmIGJldHdlZW4gdHdvIGNvbnRlbnQgdmVyc2lvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVEaWZmKGxvY2FsOiBzdHJpbmcsIHJlbW90ZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBTaW1wbGUgbGluZS1iYXNlZCBkaWZmIGZvciBub3dcbiAgICBjb25zdCBsb2NhbExpbmVzID0gbG9jYWwuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHJlbW90ZUxpbmVzID0gcmVtb3RlLnNwbGl0KCdcXG4nKTtcbiAgICBcbiAgICBsZXQgZGlmZiA9ICcnO1xuICAgIGNvbnN0IG1heExpbmVzID0gTWF0aC5tYXgobG9jYWxMaW5lcy5sZW5ndGgsIHJlbW90ZUxpbmVzLmxlbmd0aCk7XG4gICAgXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhMaW5lcyAmJiBpIDwgMTA7IGkrKykgeyAvLyBTaG93IGZpcnN0IDEwIGxpbmVzIG9mIGRpZmZcbiAgICAgIGNvbnN0IGxvY2FsTGluZSA9IGxvY2FsTGluZXNbaV0gfHwgJyc7XG4gICAgICBjb25zdCByZW1vdGVMaW5lID0gcmVtb3RlTGluZXNbaV0gfHwgJyc7XG4gICAgICBcbiAgICAgIGlmIChsb2NhbExpbmUgIT09IHJlbW90ZUxpbmUpIHtcbiAgICAgICAgaWYgKGxvY2FsTGluZSAmJiAhcmVtb3RlTGluZSkge1xuICAgICAgICAgIGRpZmYgKz0gYC0gJHtsb2NhbExpbmV9XFxuYDtcbiAgICAgICAgfSBlbHNlIGlmICghbG9jYWxMaW5lICYmIHJlbW90ZUxpbmUpIHtcbiAgICAgICAgICBkaWZmICs9IGArICR7cmVtb3RlTGluZX1cXG5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpZmYgKz0gYC0gJHtsb2NhbExpbmV9XFxuYDtcbiAgICAgICAgICBkaWZmICs9IGArICR7cmVtb3RlTGluZX1cXG5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChtYXhMaW5lcyA+IDEwKSB7XG4gICAgICBkaWZmICs9IGBcXG4uLi4gJHttYXhMaW5lcyAtIDEwfSBtb3JlIGxpbmVzIC4uLmA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkaWZmIHx8ICdObyBkaWZmZXJlbmNlcyBmb3VuZCc7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaW5kIGEgZnV6enkgbWF0Y2ggZm9yIGFuIGVsZW1lbnQgbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kRnV6enlNYXRjaChzZWFyY2hOYW1lOiBzdHJpbmcsIGVudHJpZXM6IEdpdEh1YkluZGV4RW50cnlbXSk6IEdpdEh1YkluZGV4RW50cnkgfCBudWxsIHtcbiAgICBjb25zdCBzZWFyY2ggPSBzZWFyY2hOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS9nLCAnJyk7XG4gICAgbGV0IGJlc3RNYXRjaDogdHlwZW9mIGVudHJpZXNbMF0gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgYmVzdFNjb3JlID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgZW50cnkgbmFtZSBmb3IgY29tcGFyaXNvblxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGVudHJ5Lm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dL2csICcnKTtcbiAgICAgIFxuICAgICAgLy8gQ2FsY3VsYXRlIHNpbWlsYXJpdHkgc2NvcmVcbiAgICAgIGNvbnN0IHNjb3JlID0gdGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaCwgbm9ybWFsaXplZCk7XG4gICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUgJiYgc2NvcmUgPiAwLjUpIHsgLy8gTWluaW11bSB0aHJlc2hvbGQgb2YgMC41XG4gICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xuICAgICAgICBiZXN0TWF0Y2ggPSBlbnRyeTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBzdWdnZXN0aW9ucyBmb3Igc2ltaWxhciBlbGVtZW50IG5hbWVzXG4gICAqL1xuICBwcml2YXRlIGdldFN1Z2dlc3Rpb25zKHNlYXJjaE5hbWU6IHN0cmluZywgZW50cmllczogR2l0SHViSW5kZXhFbnRyeVtdKTogQXJyYXk8e25hbWU6IHN0cmluZ30+IHtcbiAgICBjb25zdCBzZWFyY2ggPSBzZWFyY2hOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS9nLCAnJyk7XG4gICAgY29uc3Qgc2NvcmVkOiBBcnJheTx7ZW50cnk6IHR5cGVvZiBlbnRyaWVzWzBdOyBzY29yZTogbnVtYmVyfT4gPSBbXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBlbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS9nLCAnJyk7XG4gICAgICBjb25zdCBzY29yZSA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2gsIG5vcm1hbGl6ZWQpO1xuICAgICAgaWYgKHNjb3JlID4gMC4zKSB7IC8vIExvd2VyIHRocmVzaG9sZCBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgICAgc2NvcmVkLnB1c2goeyBlbnRyeSwgc2NvcmUgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFNvcnQgYnkgc2NvcmUgYW5kIHJldHVybiB0b3AgNVxuICAgIHJldHVybiBzY29yZWRcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnNjb3JlIC0gYS5zY29yZSlcbiAgICAgIC5zbGljZSgwLCA1KVxuICAgICAgLm1hcChzID0+ICh7IG5hbWU6IHMuZW50cnkubmFtZSB9KSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgc2ltaWxhcml0eSBiZXR3ZWVuIHR3byBzdHJpbmdzXG4gICAqIFJldHVybnMgYSBzY29yZSBiZXR3ZWVuIDAgYW5kIDFcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlU2ltaWxhcml0eShhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8gRXhhY3QgbWF0Y2hcbiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIDEuMDtcbiAgICBcbiAgICAvLyBPbmUgY29udGFpbnMgdGhlIG90aGVyXG4gICAgaWYgKGEuaW5jbHVkZXMoYikgfHwgYi5pbmNsdWRlcyhhKSkgcmV0dXJuIDAuODtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgd29yZCBvdmVybGFwXG4gICAgY29uc3Qgd29yZHNBID0gYS5zcGxpdCgvW15hLXowLTldKy8pO1xuICAgIGNvbnN0IHdvcmRzQiA9IGIuc3BsaXQoL1teYS16MC05XSsvKTtcbiAgICBcbiAgICBsZXQgbWF0Y2hlcyA9IDA7XG4gICAgZm9yIChjb25zdCB3b3JkQSBvZiB3b3Jkc0EpIHtcbiAgICAgIGlmICh3b3JkQSAmJiB3b3Jkc0Iuc29tZSh3b3JkQiA9PiB3b3JkQiA9PT0gd29yZEEpKSB7XG4gICAgICAgIG1hdGNoZXMrKztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKG1hdGNoZXMgPiAwKSB7XG4gICAgICBjb25zdCBvdmVybGFwID0gKG1hdGNoZXMgKiAyKSAvICh3b3Jkc0EubGVuZ3RoICsgd29yZHNCLmxlbmd0aCk7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMC42LCBvdmVybGFwKTsgLy8gQXQgbGVhc3QgMC42IGZvciBhbnkgd29yZCBtYXRjaFxuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGFydGlhbCBtYXRjaGVzXG4gICAgZm9yIChjb25zdCB3b3JkQSBvZiB3b3Jkc0EpIHtcbiAgICAgIGZvciAoY29uc3Qgd29yZEIgb2Ygd29yZHNCKSB7XG4gICAgICAgIGlmICh3b3JkQS5sZW5ndGggPiAzICYmIHdvcmRCLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICBpZiAod29yZEEuaW5jbHVkZXMod29yZEIpIHx8IHdvcmRCLmluY2x1ZGVzKHdvcmRBKSkge1xuICAgICAgICAgICAgcmV0dXJuIDAuNTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gTm8gc2lnbmlmaWNhbnQgc2ltaWxhcml0eVxuICAgIHJldHVybiAwO1xuICB9XG59Il19
826
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvU3luY01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL1BvcnRmb2xpb1N5bmNNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFtQixNQUFNLDRCQUE0QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBb0IsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQWtFeEYsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixhQUFhLENBQWdCO0lBQzdCLGdCQUFnQixDQUFtQjtJQUNuQyxXQUFXLENBQXVCO0lBQ2xDLE9BQU8sQ0FBeUI7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QUNuRCxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsa0NBQWtDO1FBQ25FLENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUMzQixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ25ELE9BQU8sR0FBRyxDQUFDO29CQUNiLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsNEJBQTRCO1FBQzVCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0Zm9saW9TeW5jTWFuYWdlciAtIEhhbmRsZXMgc3luY2hyb25pemF0aW9uIGJldHdlZW4gbG9jYWwgYW5kIEdpdEh1YiBwb3J0Zm9saW9zXG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBEb3dubG9hZCBlbGVtZW50cyBmcm9tIEdpdEh1YiBwb3J0Zm9saW9cbiAqIC0gVXBsb2FkIGVsZW1lbnRzIHdpdGggY29uc2VudFxuICogLSBWZXJzaW9uIGNvbXBhcmlzb24gYW5kIGRpZmYgdmlld2luZ1xuICogLSBQcml2YWN5LWZpcnN0IHdpdGggZXhwbGljaXQgcGVybWlzc2lvbnNcbiAqIC0gQ29uZmxpY3QgcmVzb2x1dGlvbiBzdHJhdGVnaWVzXG4gKiAtIEJ1bGsgb3BlcmF0aW9ucyB3aXRoIGNvbmZpZ3VyYXRpb24gY2hlY2tzXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IENvbmZpZ01hbmFnZXIsIERvbGxob3VzZUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvUmVwb01hbmFnZXIgfSBmcm9tICcuL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IEdpdEh1YlBvcnRmb2xpb0luZGV4ZXIsIEdpdEh1YkluZGV4RW50cnkgfSBmcm9tICcuL0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIuanMnO1xuaW1wb3J0IHsgZ2V0UG9ydGZvbGlvUmVwb3NpdG9yeU5hbWUgfSBmcm9tICcuLi9jb25maWcvcG9ydGZvbGlvQ29uZmlnLmpzJztcbmltcG9ydCB7IFRva2VuTWFuYWdlciB9IGZyb20gJy4uL3NlY3VyaXR5L3Rva2VuTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudCwgRWxlbWVudFN0YXR1cyB9IGZyb20gJy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyIH0gZnJvbSAnLi4vdG9vbHMvcG9ydGZvbGlvL1BvcnRmb2xpb0VsZW1lbnRBZGFwdGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTeW5jT3BlcmF0aW9uIHtcbiAgb3BlcmF0aW9uOiAnZG93bmxvYWQnIHwgJ3VwbG9hZCcgfCAnY29tcGFyZScgfCAnbGlzdC1yZW1vdGUnO1xuICBlbGVtZW50X25hbWU/OiBzdHJpbmc7XG4gIGVsZW1lbnRfdHlwZT86IEVsZW1lbnRUeXBlO1xuICBidWxrPzogYm9vbGVhbjtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgc2hvd19kaWZmPzogYm9vbGVhbjtcbiAgZm9yY2U/OiBib29sZWFuO1xuICBjb25maXJtPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkYXRhPzogYW55O1xuICBlbGVtZW50cz86IFN5bmNFbGVtZW50SW5mb1tdO1xuICBjb25mbGljdHM/OiBDb25mbGljdEluZm9bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jRWxlbWVudEluZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IEVsZW1lbnRUeXBlO1xuICBsb2NhbFZlcnNpb24/OiBzdHJpbmc7XG4gIHJlbW90ZVZlcnNpb24/OiBzdHJpbmc7XG4gIHN0YXR1czogJ25ldycgfCAndXBkYXRlZCcgfCAnY29uZmxpY3QnIHwgJ3VuY2hhbmdlZCcgfCAnbG9jYWwtb25seSc7XG4gIGFjdGlvbj86ICdkb3dubG9hZCcgfCAndXBsb2FkJyB8ICdza2lwJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25mbGljdEluZm8ge1xuICBlbGVtZW50OiBzdHJpbmc7XG4gIHR5cGU6IEVsZW1lbnRUeXBlO1xuICBsb2NhbFZlcnNpb246IHN0cmluZztcbiAgcmVtb3RlVmVyc2lvbjogc3RyaW5nO1xuICBsb2NhbE1vZGlmaWVkOiBEYXRlO1xuICByZW1vdGVNb2RpZmllZDogRGF0ZTtcbiAgcmVzb2x1dGlvbj86ICdsb2NhbCcgfCAncmVtb3RlJyB8ICdtYW51YWwnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25JbmZvIHtcbiAgdmVyc2lvbjogc3RyaW5nO1xuICB0aW1lc3RhbXA6IERhdGU7XG4gIGF1dGhvcjogc3RyaW5nO1xuICBoYXNoOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbiAgc291cmNlOiAnbG9jYWwnIHwgJ3JlbW90ZSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudERpZmYge1xuICBlbGVtZW50OiBzdHJpbmc7XG4gIHR5cGU6IEVsZW1lbnRUeXBlO1xuICBjaGFuZ2VzOiB7XG4gICAgbWV0YWRhdGE/OiB7XG4gICAgICBmaWVsZDogc3RyaW5nO1xuICAgICAgb2xkVmFsdWU6IGFueTtcbiAgICAgIG5ld1ZhbHVlOiBhbnk7XG4gICAgfVtdO1xuICAgIGNvbnRlbnQ/OiB7XG4gICAgICBhZGRpdGlvbnM6IG51bWJlcjtcbiAgICAgIGRlbGV0aW9uczogbnVtYmVyO1xuICAgICAgZGlmZjogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBQb3J0Zm9saW9TeW5jTWFuYWdlciB7XG4gIHByaXZhdGUgY29uZmlnTWFuYWdlcjogQ29uZmlnTWFuYWdlcjtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcml2YXRlIHJlcG9NYW5hZ2VyOiBQb3J0Zm9saW9SZXBvTWFuYWdlcjtcbiAgcHJpdmF0ZSBpbmRleGVyOiBHaXRIdWJQb3J0Zm9saW9JbmRleGVyO1xuICBcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb25maWdNYW5hZ2VyID0gQ29uZmlnTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLnJlcG9NYW5hZ2VyID0gbmV3IFBvcnRmb2xpb1JlcG9NYW5hZ2VyKGdldFBvcnRmb2xpb1JlcG9zaXRvcnlOYW1lKCkpO1xuICAgIHRoaXMuaW5kZXhlciA9IEdpdEh1YlBvcnRmb2xpb0luZGV4ZXIuZ2V0SW5zdGFuY2UoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE1haW4gaGFuZGxlciBmb3Igc3luYyBvcGVyYXRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZGxlU3luY09wZXJhdGlvbihwYXJhbXM6IFN5bmNPcGVyYXRpb24pOiBQcm9taXNlPFN5bmNSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgc3luYyBpcyBlbmFibGVkIGluIGNvbmZpZ1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdNYW5hZ2VyLmdldENvbmZpZygpO1xuICAgICAgaWYgKCFjb25maWcuc3luYy5lbmFibGVkICYmIHBhcmFtcy5vcGVyYXRpb24gIT09ICdsaXN0LXJlbW90ZScpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnU3luYyBpcyBkaXNhYmxlZC4gRW5hYmxlIGl0IHdpdGg6IGRvbGxob3VzZV9jb25maWcgLS1hY3Rpb24gdXBkYXRlIC0tc2V0dGluZyBzeW5jLmVuYWJsZWQgLS12YWx1ZSB0cnVlJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBidWxrIHBlcm1pc3Npb25zXG4gICAgICBpZiAocGFyYW1zLmJ1bGspIHtcbiAgICAgICAgY29uc3QgYnVsa0FsbG93ZWQgPSB0aGlzLmlzQnVsa09wZXJhdGlvbkFsbG93ZWQocGFyYW1zLm9wZXJhdGlvbiwgY29uZmlnKTtcbiAgICAgICAgaWYgKCFidWxrQWxsb3dlZC5hbGxvd2VkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYnVsa0FsbG93ZWQubWVzc2FnZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIG9wZXJhdGlvbnNcbiAgICAgIHN3aXRjaCAocGFyYW1zLm9wZXJhdGlvbikge1xuICAgICAgICBjYXNlICdsaXN0LXJlbW90ZSc6XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubGlzdFJlbW90ZUVsZW1lbnRzKHBhcmFtcy5lbGVtZW50X3R5cGUpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlICdkb3dubG9hZCc6XG4gICAgICAgICAgaWYgKHBhcmFtcy5idWxrKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5idWxrRG93bmxvYWQocGFyYW1zLmVsZW1lbnRfdHlwZSwgcGFyYW1zLmNvbmZpcm0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLmVsZW1lbnRfbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZG93bmxvYWRFbGVtZW50KFxuICAgICAgICAgICAgICBwYXJhbXMuZWxlbWVudF9uYW1lLFxuICAgICAgICAgICAgICBwYXJhbXMuZWxlbWVudF90eXBlISxcbiAgICAgICAgICAgICAgcGFyYW1zLnZlcnNpb24sXG4gICAgICAgICAgICAgIHBhcmFtcy5mb3JjZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdFbGVtZW50IG5hbWUgcmVxdWlyZWQgZm9yIGluZGl2aWR1YWwgZG93bmxvYWQnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgY2FzZSAndXBsb2FkJzpcbiAgICAgICAgICBpZiAocGFyYW1zLmJ1bGspIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJ1bGtVcGxvYWQocGFyYW1zLmVsZW1lbnRfdHlwZSwgcGFyYW1zLmNvbmZpcm0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLmVsZW1lbnRfbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXBsb2FkRWxlbWVudChcbiAgICAgICAgICAgICAgcGFyYW1zLmVsZW1lbnRfbmFtZSxcbiAgICAgICAgICAgICAgcGFyYW1zLmVsZW1lbnRfdHlwZSEsXG4gICAgICAgICAgICAgIHBhcmFtcy5jb25maXJtXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VsZW1lbnQgbmFtZSByZXF1aXJlZCBmb3IgaW5kaXZpZHVhbCB1cGxvYWQnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgY2FzZSAnY29tcGFyZSc6XG4gICAgICAgICAgaWYgKHBhcmFtcy5lbGVtZW50X25hbWUgJiYgcGFyYW1zLmVsZW1lbnRfdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29tcGFyZVZlcnNpb25zKFxuICAgICAgICAgICAgICBwYXJhbXMuZWxlbWVudF9uYW1lLFxuICAgICAgICAgICAgICBwYXJhbXMuZWxlbWVudF90eXBlLFxuICAgICAgICAgICAgICBwYXJhbXMuc2hvd19kaWZmXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0VsZW1lbnQgbmFtZSBhbmQgdHlwZSByZXF1aXJlZCBmb3IgY29tcGFyaXNvbidcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBVbmtub3duIG9wZXJhdGlvbjogJHtwYXJhbXMub3BlcmF0aW9ufWBcbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1N5bmMgb3BlcmF0aW9uIGZhaWxlZCcsIHtcbiAgICAgICAgb3BlcmF0aW9uOiBwYXJhbXMub3BlcmF0aW9uLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBTeW5jIG9wZXJhdGlvbiBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYnVsayBvcGVyYXRpb24gaXMgYWxsb3dlZFxuICAgKi9cbiAgcHJpdmF0ZSBpc0J1bGtPcGVyYXRpb25BbGxvd2VkKG9wZXJhdGlvbjogc3RyaW5nLCBjb25maWc6IERvbGxob3VzZUNvbmZpZyk6IHsgYWxsb3dlZDogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nIH0ge1xuICAgIGlmIChvcGVyYXRpb24gPT09ICdkb3dubG9hZCcgJiYgIWNvbmZpZy5zeW5jLmJ1bGsuZG93bmxvYWRfZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dlZDogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6ICdCdWxrIGRvd25sb2FkIGlzIGRpc2FibGVkLiBFbmFibGUgd2l0aDogZG9sbGhvdXNlX2NvbmZpZyAtLWFjdGlvbiB1cGRhdGUgLS1zZXR0aW5nIHN5bmMuYnVsay5kb3dubG9hZF9lbmFibGVkIC0tdmFsdWUgdHJ1ZSdcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIGlmIChvcGVyYXRpb24gPT09ICd1cGxvYWQnICYmICFjb25maWcuc3luYy5idWxrLnVwbG9hZF9lbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbGxvd2VkOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJ0J1bGsgdXBsb2FkIGlzIGRpc2FibGVkLiBFbmFibGUgd2l0aDogZG9sbGhvdXNlX2NvbmZpZyAtLWFjdGlvbiB1cGRhdGUgLS1zZXR0aW5nIHN5bmMuYnVsay51cGxvYWRfZW5hYmxlZCAtLXZhbHVlIHRydWUnXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4geyBhbGxvd2VkOiB0cnVlLCBtZXNzYWdlOiAnJyB9O1xuICB9XG4gIFxuICAvKipcbiAgICogTGlzdCBlbGVtZW50cyBhdmFpbGFibGUgaW4gR2l0SHViIHBvcnRmb2xpb1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0UmVtb3RlRWxlbWVudHMoZmlsdGVyVHlwZT86IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxTeW5jUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCBHaXRIdWIgdG9rZW5cbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnR2l0SHViIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLiBVc2Ugc2V0dXBfZ2l0aHViX2F1dGggZmlyc3QuJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLnJlcG9NYW5hZ2VyLnNldFRva2VuKHRva2VuKTtcbiAgICAgIFxuICAgICAgLy8gR2V0IGluZGV4IG9mIEdpdEh1YiBwb3J0Zm9saW9cbiAgICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5pbmRleGVyLmdldEluZGV4KCk7XG4gICAgICBcbiAgICAgIGlmICghaW5kZXggfHwgaW5kZXgudG90YWxFbGVtZW50cyA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogJ05vIGVsZW1lbnRzIGZvdW5kIGluIEdpdEh1YiBwb3J0Zm9saW8nLFxuICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3JtYXQgZWxlbWVudHMgZm9yIGRpc3BsYXlcbiAgICAgIGNvbnN0IGVsZW1lbnRzOiBTeW5jRWxlbWVudEluZm9bXSA9IFtdO1xuICAgICAgXG4gICAgICBmb3IgKGNvbnN0IFt0eXBlLCBlbnRyaWVzXSBvZiBpbmRleC5lbGVtZW50cykge1xuICAgICAgICAvLyBTa2lwIGlmIGZpbHRlcmluZyBieSB0eXBlIGFuZCB0aGlzIGlzbid0IHRoZSByZXF1ZXN0ZWQgdHlwZVxuICAgICAgICBpZiAoZmlsdGVyVHlwZSAmJiB0eXBlICE9PSBmaWx0ZXJUeXBlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICByZW1vdGVWZXJzaW9uOiBlbnRyeS52ZXJzaW9uLFxuICAgICAgICAgICAgc3RhdHVzOiAndW5jaGFuZ2VkJyxcbiAgICAgICAgICAgIGFjdGlvbjogJ2Rvd25sb2FkJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBGb3VuZCAke2VsZW1lbnRzLmxlbmd0aH0gZWxlbWVudHMgaW4gR2l0SHViIHBvcnRmb2xpb2AsXG4gICAgICAgIGVsZW1lbnRzXG4gICAgICB9O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIGxpc3QgcmVtb3RlIGVsZW1lbnRzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIERvd25sb2FkIGEgc3BlY2lmaWMgZWxlbWVudCBmcm9tIEdpdEh1YlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkb3dubG9hZEVsZW1lbnQoXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgdmVyc2lvbj86IHN0cmluZyxcbiAgICBmb3JjZT86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxTeW5jUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudCBuYW1lXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZWxlbWVudE5hbWUpO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCBlbGVtZW50IG5hbWU6ICR7dmFsaWRhdGlvbi5kZXRlY3RlZElzc3Vlcz8uWzBdIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCB0b2tlbiBhbmQgc2V0IGl0XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5yZXBvTWFuYWdlci5zZXRUb2tlbih0b2tlbik7XG4gICAgICBcbiAgICAgIC8vIEdldCBHaXRIdWIgaW5kZXhcbiAgICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5pbmRleGVyLmdldEluZGV4KCk7XG4gICAgICBcbiAgICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgLSBmaXJzdCB0cnkgZXhhY3QgbWF0Y2gsIHRoZW4gZnV6enkgbWF0Y2hcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBpbmRleC5lbGVtZW50cy5nZXQoZWxlbWVudFR5cGUpIHx8IFtdO1xuICAgICAgbGV0IGVudHJ5ID0gZW50cmllcy5maW5kKGUgPT4gZS5uYW1lID09PSBlbGVtZW50TmFtZSk7XG4gICAgICBcbiAgICAgIC8vIElmIGV4YWN0IG1hdGNoIG5vdCBmb3VuZCwgdHJ5IGZ1enp5IG1hdGNoaW5nXG4gICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIC8vIFRyeSBjYXNlLWluc2Vuc2l0aXZlIGV4YWN0IG1hdGNoIGZpcnN0XG4gICAgICAgIGVudHJ5ID0gZW50cmllcy5maW5kKGUgPT4gZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGVsZW1lbnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgc3RpbGwgbm90IGZvdW5kLCB0cnkgZnV6enkgbWF0Y2hpbmdcbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgIGNvbnN0IGZ1enp5TWF0Y2ggPSB0aGlzLmZpbmRGdXp6eU1hdGNoKGVsZW1lbnROYW1lLCBlbnRyaWVzKTtcbiAgICAgICAgICBpZiAoZnV6enlNYXRjaCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEZ1enp5IG1hdGNoIGZvdW5kOiAnJHtlbGVtZW50TmFtZX0nIG1hdGNoZWQgdG8gJyR7ZnV6enlNYXRjaC5uYW1lfSdgKTtcbiAgICAgICAgICAgIGVudHJ5ID0gZnV6enlNYXRjaDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAvLyBHZW5lcmF0ZSBoZWxwZnVsIHN1Z2dlc3Rpb25zXG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gdGhpcy5nZXRTdWdnZXN0aW9ucyhlbGVtZW50TmFtZSwgZW50cmllcyk7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25UZXh0ID0gc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCBcbiAgICAgICAgICA/IGBcXG5cXG5EaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlP1xcbiR7c3VnZ2VzdGlvbnMubWFwKHMgPT4gYCAg4oCiICR7cy5uYW1lfWApLmpvaW4oJ1xcbicpfWBcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgRWxlbWVudCAnJHtlbGVtZW50TmFtZX0nICgke2VsZW1lbnRUeXBlfSkgbm90IGZvdW5kIGluIEdpdEh1YiBwb3J0Zm9saW8ke3N1Z2dlc3Rpb25UZXh0fWBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIGxvY2FsIGNvbmZsaWN0c1xuICAgICAgY29uc3QgbG9jYWxQYXRoID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnRUeXBlLCBgJHtlbGVtZW50TmFtZX0ubWRgKTtcbiAgICAgIGxldCBoYXNMb2NhbFZlcnNpb24gPSBmYWxzZTtcbiAgICAgIGxldCBsb2NhbENvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbENvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShsb2NhbFBhdGgsICd1dGYtOCcpO1xuICAgICAgICBoYXNMb2NhbFZlcnNpb24gPSB0cnVlO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE5vIGxvY2FsIHZlcnNpb24gZXhpc3RzXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERvd25sb2FkIHRoZSBlbGVtZW50XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGVudHJ5LmRvd25sb2FkVXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52My5yYXcnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRvd25sb2FkOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IHJlbW90ZUNvbnRlbnQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGNvbnRlbnQgc2VjdXJpdHlcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUocmVtb3RlQ29udGVudCk7XG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCAmJiB2YWxpZGF0aW9uUmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYFNlY3VyaXR5IGlzc3VlIGRldGVjdGVkIGluIHJlbW90ZSBjb250ZW50OiAke3ZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGNvbnRlbnQgaXMgZGlmZmVyZW50XG4gICAgICBpZiAoaGFzTG9jYWxWZXJzaW9uICYmIGxvY2FsQ29udGVudCkge1xuICAgICAgICBjb25zdCBsb2NhbEhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUobG9jYWxDb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuICAgICAgICBjb25zdCByZW1vdGVIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHJlbW90ZUNvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIFxuICAgICAgICBpZiAobG9jYWxIYXNoID09PSByZW1vdGVIYXNoKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBgRWxlbWVudCAnJHtlbGVtZW50TmFtZX0nIGlzIGFscmVhZHkgdXAgdG8gZGF0ZWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTaG93IGNvbmZpcm1hdGlvbiBmb3Igb3ZlcndyaXRlIHVubGVzcyBmb3JjZSBmbGFnIGlzIHNldFxuICAgICAgICBpZiAoY29uZmlnLnN5bmMuaW5kaXZpZHVhbC5yZXF1aXJlX2NvbmZpcm1hdGlvbiAmJiAhZm9yY2UpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gYXdhaXQgdGhpcy5nZW5lcmF0ZURpZmYobG9jYWxDb250ZW50LCByZW1vdGVDb250ZW50KTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgTG9jYWwgdmVyc2lvbiBleGlzdHMuIFBsZWFzZSBjb25maXJtIGRvd25sb2FkIHdpbGwgb3ZlcndyaXRlOlxcblxcbiR7ZGlmZn1cXG5cXG5UbyBwcm9jZWVkLCB1c2UgLS1mb3JjZSBmbGFnYCxcbiAgICAgICAgICAgIGRhdGE6IHsgcmVxdWlyZXNDb25maXJtYXRpb246IHRydWUgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2F2ZSB0aGUgZWxlbWVudFxuICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKGxvY2FsUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGxvY2FsUGF0aCwgcmVtb3RlQ29udGVudCwgJ3V0Zi04Jyk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKCdFbGVtZW50IGRvd25sb2FkZWQgZnJvbSBHaXRIdWInLCB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnROYW1lLFxuICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgdmVyc2lvbjogZW50cnkudmVyc2lvblxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBTdWNjZXNzZnVsbHkgZG93bmxvYWRlZCAnJHtlbGVtZW50TmFtZX0nICgke2VsZW1lbnRUeXBlfSkgZnJvbSBHaXRIdWIgcG9ydGZvbGlvYFxuICAgICAgfTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBkb3dubG9hZCBlbGVtZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFVwbG9hZCBhIHNwZWNpZmljIGVsZW1lbnQgdG8gR2l0SHViXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHVwbG9hZEVsZW1lbnQoXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgY29uZmlybT86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxTeW5jUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIGxvY2FsIGVsZW1lbnRcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50UGF0aChlbGVtZW50VHlwZSwgYCR7ZWxlbWVudE5hbWV9Lm1kYCk7XG4gICAgICBcbiAgICAgIGxldCBjb250ZW50OiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUobG9jYWxQYXRoLCAndXRmLTgnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBFbGVtZW50ICcke2VsZW1lbnROYW1lfScgKCR7ZWxlbWVudFR5cGV9KSBub3QgZm91bmQgbG9jYWxseWBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgcHJpdmFjeSBtZXRhZGF0YVxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShjb250ZW50LCB7XG4gICAgICAgIG1heFlhbWxTaXplOiA2NCAqIDEwMjQsXG4gICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmIChwYXJzZWQuZGF0YT8ucHJpdmFjeT8ubG9jYWxfb25seSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBFbGVtZW50ICcke2VsZW1lbnROYW1lfScgaXMgbWFya2VkIGFzIGxvY2FsLW9ubHkgYW5kIGNhbm5vdCBiZSB1cGxvYWRlZGBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgY29udGVudCBzZWN1cml0eVxuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50KTtcbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkICYmIHZhbGlkYXRpb25SZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgU2VjdXJpdHkgaXNzdWUgZGV0ZWN0ZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2NhbiBmb3Igc2Vuc2l0aXZlIGNvbnRlbnQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKGNvbmZpZy5zeW5jLnByaXZhY3kuc2Nhbl9mb3Jfc2VjcmV0cykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1NjYW5uaW5nIGZvciBzZWNyZXRzIGJlZm9yZSB1cGxvYWQnKTtcbiAgICAgICAgLy8gSW1wbGVtZW50IGFjdHVhbCBzZWNyZXQgc2Nhbm5pbmdcbiAgICAgICAgY29uc3Qgc2VjcmV0UGF0dGVybnMgPSBbXG4gICAgICAgICAgL2FwaVtfLV0/a2V5XFxzKls6PV1cXHMqWydcIl1bXidcIl0rWydcIl0vZ2ksXG4gICAgICAgICAgL3NlY3JldFxccypbOj1dXFxzKlsnXCJdW14nXCJdK1snXCJdL2dpLFxuICAgICAgICAgIC9wYXNzd29yZFxccypbOj1dXFxzKlsnXCJdW14nXCJdK1snXCJdL2dpLFxuICAgICAgICAgIC90b2tlblxccypbOj1dXFxzKlsnXCJdW14nXCJdK1snXCJdL2dpLFxuICAgICAgICAgIC9wcml2YXRlW18tXT9rZXlcXHMqWzo9XVxccypbJ1wiXVteJ1wiXStbJ1wiXS9naVxuICAgICAgICBdO1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHNlY3JldFBhdHRlcm5zKSB7XG4gICAgICAgICAgaWYgKHBhdHRlcm4udGVzdChjb250ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBQb3RlbnRpYWwgc2VjcmV0IGRldGVjdGVkIGluIGNvbnRlbnQuIFBsZWFzZSByZXZpZXcgYW5kIHJlbW92ZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gYmVmb3JlIHVwbG9hZGluZy5gXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBHZXQgY29uZmlybWF0aW9uIGlmIHJlcXVpcmVkICh1bmxlc3MgYWxyZWFkeSBjb25maXJtZWQpXG4gICAgICBpZiAoY29uZmlnLnN5bmMuaW5kaXZpZHVhbC5yZXF1aXJlX2NvbmZpcm1hdGlvbiAmJiAhY29uZmlybSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBQbGVhc2UgY29uZmlybSB1cGxvYWQgb2YgJyR7ZWxlbWVudE5hbWV9JyAoJHtlbGVtZW50VHlwZX0pIHRvIEdpdEh1Yi5cXG5cXG5Db250ZW50IHByZXZpZXc6XFxuJHtjb250ZW50LnN1YnN0cmluZygwLCA1MDApfS4uLlxcblxcblRvIHByb2NlZWQsIHVzZSAtLWNvbmZpcm0gZmxhZ2AsXG4gICAgICAgICAgZGF0YTogeyByZXF1aXJlc0NvbmZpcm1hdGlvbjogdHJ1ZSB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCB0b2tlbiBhbmQgdmFsaWRhdGVcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnR2l0SHViIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYSBQb3J0Zm9saW9FbGVtZW50IGZvciB0aGUgYWRhcHRlciAoZml4ZXMgSXNzdWUgIzkxMylcbiAgICAgIC8vIFVzaW5nIFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyIGluc3RlYWQgb2YgaW5jb21wbGV0ZSBJRWxlbWVudCBpbXBsZW1lbnRhdGlvblxuICAgICAgY29uc3QgcG9ydGZvbGlvRWxlbWVudCA9IHtcbiAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHBhcnNlZC5kYXRhPy5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICBhdXRob3I6IHBhcnNlZC5kYXRhPy5hdXRob3IgfHwgJ3Vua25vd24nLFxuICAgICAgICAgIGNyZWF0ZWQ6IHBhcnNlZC5kYXRhPy5jcmVhdGVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB1cGRhdGVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgdmVyc2lvbjogcGFyc2VkLmRhdGE/LnZlcnNpb24gfHwgJzEuMC4wJyxcbiAgICAgICAgICB0YWdzOiBwYXJzZWQuZGF0YT8udGFncyB8fCBbXVxuICAgICAgICB9LFxuICAgICAgICBjb250ZW50OiBjb250ZW50XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBVc2UgUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIgdG8gcHJvcGVybHkgaW1wbGVtZW50IElFbGVtZW50IGludGVyZmFjZVxuICAgICAgY29uc3QgYWRhcHRlciA9IG5ldyBQb3J0Zm9saW9FbGVtZW50QWRhcHRlcihwb3J0Zm9saW9FbGVtZW50KTtcbiAgICAgIFxuICAgICAgLy8gVXNlIFBvcnRmb2xpb1JlcG9NYW5hZ2VyIHRvIHVwbG9hZFxuICAgICAgdGhpcy5yZXBvTWFuYWdlci5zZXRUb2tlbih0b2tlbik7XG4gICAgICBcbiAgICAgIC8vIERFQlVHOiBMb2cgdXBsb2FkIGF0dGVtcHRcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW0JVTEtfU1lOQ19ERUJVR10gVXBsb2FkIGVsZW1lbnQgYXR0ZW1wdCcsIHtcbiAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBoYXNUb2tlbjogISF0b2tlbixcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRva2VuID8gdG9rZW4uc3Vic3RyaW5nKDAsIDEwKSArICcuLi4nIDogJ25vbmUnLFxuICAgICAgICBhZGFwdGVySGFzTWV0YWRhdGE6ICEhKGFkYXB0ZXIgJiYgYWRhcHRlci5tZXRhZGF0YSksXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5yZXBvTWFuYWdlci5zYXZlRWxlbWVudChhZGFwdGVyLCB0cnVlKTsgLy8gY29uc2VudCBpcyB0cnVlIHNpbmNlIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZFxuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0VsZW1lbnQgdXBsb2FkZWQgdG8gR2l0SHViJywge1xuICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICAgIHVybFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBgU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkICcke2VsZW1lbnROYW1lfScgKCR7ZWxlbWVudFR5cGV9KSB0byBHaXRIdWIgcG9ydGZvbGlvYCxcbiAgICAgICAgICBkYXRhOiB7IHVybCB9XG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoICh1cGxvYWRFcnJvcikge1xuICAgICAgICAvLyBIYW5kbGUgc3BlY2lmaWMgZXJyb3JzXG4gICAgICAgIGlmICh1cGxvYWRFcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIHVwbG9hZEVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ3JlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QnKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnkgbm90IGZvdW5kLiBQbGVhc2UgaW5pdGlhbGl6ZSBpdCBmaXJzdCB1c2luZyBpbml0X3BvcnRmb2xpbyB0b29sLmBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHVwbG9hZEVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIHVwbG9hZCBlbGVtZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENvbXBhcmUgbG9jYWwgYW5kIHJlbW90ZSB2ZXJzaW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb21wYXJlVmVyc2lvbnMoXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgc2hvd0RpZmY/OiBib29sZWFuXG4gICk6IFByb21pc2U8U3luY1Jlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgbG9jYWwgdmVyc2lvblxuICAgICAgY29uc3QgbG9jYWxQYXRoID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnRUeXBlLCBgJHtlbGVtZW50TmFtZX0ubWRgKTtcbiAgICAgIGxldCBsb2NhbENvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IGxvY2FsVmVyc2lvbjogVmVyc2lvbkluZm8gfCBudWxsID0gbnVsbDtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUobG9jYWxQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShsb2NhbENvbnRlbnQsIHtcbiAgICAgICAgICBtYXhZYW1sU2l6ZTogNjQgKiAxMDI0LFxuICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgbG9jYWxWZXJzaW9uID0ge1xuICAgICAgICAgIHZlcnNpb246IHBhcnNlZC5kYXRhPy52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZShwYXJzZWQuZGF0YT8udXBkYXRlZCB8fCBwYXJzZWQuZGF0YT8uY3JlYXRlZCB8fCBEYXRlLm5vdygpKSxcbiAgICAgICAgICBhdXRob3I6IHBhcnNlZC5kYXRhPy5hdXRob3IgfHwgJ3Vua25vd24nLFxuICAgICAgICAgIGhhc2g6IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShsb2NhbENvbnRlbnQpLmRpZ2VzdCgnaGV4JyksXG4gICAgICAgICAgc2l6ZTogQnVmZmVyLmJ5dGVMZW5ndGgobG9jYWxDb250ZW50KSxcbiAgICAgICAgICBzb3VyY2U6ICdsb2NhbCdcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBObyBsb2NhbCB2ZXJzaW9uXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCByZW1vdGUgdmVyc2lvblxuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW5Bc3luYygpO1xuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdHaXRIdWIgYXV0aGVudGljYXRpb24gcmVxdWlyZWQnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5pbmRleGVyLmdldEluZGV4KCk7XG4gICAgICBjb25zdCBlbnRyaWVzID0gaW5kZXguZWxlbWVudHMuZ2V0KGVsZW1lbnRUeXBlKSB8fCBbXTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllcy5maW5kKGUgPT4gZS5uYW1lID09PSBlbGVtZW50TmFtZSk7XG4gICAgICBcbiAgICAgIGxldCByZW1vdGVWZXJzaW9uOiBWZXJzaW9uSW5mbyB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHJlbW90ZUNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgXG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChlbnRyeS5kb3dubG9hZFVybCwge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMucmF3J1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICByZW1vdGVDb250ZW50ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgIHJlbW90ZVZlcnNpb24gPSB7XG4gICAgICAgICAgICB2ZXJzaW9uOiBlbnRyeS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGVudHJ5Lmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgIGF1dGhvcjogZW50cnkuYXV0aG9yIHx8ICd1bmtub3duJyxcbiAgICAgICAgICAgIGhhc2g6IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShyZW1vdGVDb250ZW50KS5kaWdlc3QoJ2hleCcpLFxuICAgICAgICAgICAgc2l6ZTogZW50cnkuc2l6ZSxcbiAgICAgICAgICAgIHNvdXJjZTogJ3JlbW90ZSdcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEJ1aWxkIGNvbXBhcmlzb24gcmVzdWx0XG4gICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgZWxlbWVudDogZWxlbWVudE5hbWUsXG4gICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICBsb2NhbDogbG9jYWxWZXJzaW9uLFxuICAgICAgICByZW1vdGU6IHJlbW90ZVZlcnNpb25cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGlmIChsb2NhbFZlcnNpb24gJiYgcmVtb3RlVmVyc2lvbikge1xuICAgICAgICByZXN1bHQuc3RhdHVzID0gbG9jYWxWZXJzaW9uLmhhc2ggPT09IHJlbW90ZVZlcnNpb24uaGFzaCA/ICdpZGVudGljYWwnIDogJ2RpZmZlcmVudCc7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2hvd0RpZmYgJiYgbG9jYWxDb250ZW50ICYmIHJlbW90ZUNvbnRlbnQgJiYgcmVzdWx0LnN0YXR1cyA9PT0gJ2RpZmZlcmVudCcpIHtcbiAgICAgICAgICByZXN1bHQuZGlmZiA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVEaWZmKGxvY2FsQ29udGVudCwgcmVtb3RlQ29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobG9jYWxWZXJzaW9uICYmICFyZW1vdGVWZXJzaW9uKSB7XG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSAnbG9jYWwtb25seSc7XG4gICAgICB9IGVsc2UgaWYgKCFsb2NhbFZlcnNpb24gJiYgcmVtb3RlVmVyc2lvbikge1xuICAgICAgICByZXN1bHQuc3RhdHVzID0gJ3JlbW90ZS1vbmx5JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSAnbm90LWZvdW5kJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYFZlcnNpb24gY29tcGFyaXNvbiBmb3IgJyR7ZWxlbWVudE5hbWV9JyAoJHtlbGVtZW50VHlwZX0pYCxcbiAgICAgICAgZGF0YTogcmVzdWx0XG4gICAgICB9O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIGNvbXBhcmUgdmVyc2lvbnM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQnVsayBkb3dubG9hZCBlbGVtZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWxrRG93bmxvYWQoZWxlbWVudFR5cGU/OiBFbGVtZW50VHlwZSwgY29uZmlybT86IGJvb2xlYW4pOiBQcm9taXNlPFN5bmNSZXN1bHQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ01hbmFnZXIuZ2V0Q29uZmlnKCk7XG4gICAgXG4gICAgaWYgKCFjb25maWcuc3luYy5idWxrLmRvd25sb2FkX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnQnVsayBkb3dubG9hZCBpcyBub3QgZW5hYmxlZCBpbiBjb25maWd1cmF0aW9uJ1xuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gR2V0IGxpc3Qgb2YgcmVtb3RlIGVsZW1lbnRzXG4gICAgY29uc3QgcmVtb3RlUmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0UmVtb3RlRWxlbWVudHMoKTtcbiAgICBpZiAoIXJlbW90ZVJlc3VsdC5zdWNjZXNzIHx8ICFyZW1vdGVSZXN1bHQuZWxlbWVudHMpIHtcbiAgICAgIHJldHVybiByZW1vdGVSZXN1bHQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEZpbHRlciBieSB0eXBlIGlmIHNwZWNpZmllZFxuICAgIGxldCBlbGVtZW50c1RvRG93bmxvYWQgPSByZW1vdGVSZXN1bHQuZWxlbWVudHM7XG4gICAgaWYgKGVsZW1lbnRUeXBlKSB7XG4gICAgICBlbGVtZW50c1RvRG93bmxvYWQgPSBlbGVtZW50c1RvRG93bmxvYWQuZmlsdGVyKGUgPT4gZS50eXBlID09PSBlbGVtZW50VHlwZSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChlbGVtZW50c1RvRG93bmxvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiAnTm8gZWxlbWVudHMgdG8gZG93bmxvYWQnLFxuICAgICAgICBlbGVtZW50czogW11cbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIFNob3cgcHJldmlldyBpZiByZXF1aXJlZCAodW5sZXNzIGFscmVhZHkgY29uZmlybWVkKVxuICAgIGlmIChjb25maWcuc3luYy5idWxrLnJlcXVpcmVfcHJldmlldyAmJiAhY29uZmlybSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBCdWxrIGRvd25sb2FkIHByZXZpZXc6XFxuXFxuJHtlbGVtZW50c1RvRG93bmxvYWQubGVuZ3RofSBlbGVtZW50cyB3aWxsIGJlIGRvd25sb2FkZWQ6XFxuJHtlbGVtZW50c1RvRG93bmxvYWQubWFwKGUgPT4gYC0gJHtlLm5hbWV9ICgke2UudHlwZX0pYCkuam9pbignXFxuJyl9XFxuXFxuVG8gcHJvY2VlZCwgdXNlIC0tY29uZmlybSBmbGFnYCxcbiAgICAgICAgZGF0YTogeyByZXF1aXJlc0NvbmZpcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICBlbGVtZW50czogZWxlbWVudHNUb0Rvd25sb2FkXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBQZXJmb3JtIGFjdHVhbCBidWxrIGRvd25sb2FkXG4gICAgY29uc3QgcmVzdWx0cyA9IHtcbiAgICAgIGRvd25sb2FkZWQ6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgc2tpcHBlZDogW10gYXMgc3RyaW5nW10sXG4gICAgICBmYWlsZWQ6IFtdIGFzIHsgbmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH1bXVxuICAgIH07XG4gICAgXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9Eb3dubG9hZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kb3dubG9hZEVsZW1lbnQoZWxlbWVudC5uYW1lLCBlbGVtZW50LnR5cGUsIHVuZGVmaW5lZCwgdHJ1ZSk7IC8vIGZvcmNlPXRydWUgdG8gc2tpcCBpbmRpdmlkdWFsIGNvbmZpcm1hdGlvbnNcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cy5kb3dubG9hZGVkLnB1c2goZWxlbWVudC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgdXAgdG8gZGF0ZScpKSB7XG4gICAgICAgICAgcmVzdWx0cy5za2lwcGVkLnB1c2goZWxlbWVudC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRzLmZhaWxlZC5wdXNoKHsgbmFtZTogZWxlbWVudC5uYW1lLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXN1bHRzLmZhaWxlZC5wdXNoKHsgXG4gICAgICAgICAgbmFtZTogZWxlbWVudC5uYW1lLCBcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpIFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQnVpbGQgc3VtbWFyeSBtZXNzYWdlXG4gICAgbGV0IG1lc3NhZ2UgPSBgQnVsayBkb3dubG9hZCBjb21wbGV0ZTpcXG5gO1xuICAgIG1lc3NhZ2UgKz0gYC0gRG93bmxvYWRlZDogJHtyZXN1bHRzLmRvd25sb2FkZWQubGVuZ3RofSBlbGVtZW50c1xcbmA7XG4gICAgbWVzc2FnZSArPSBgLSBTa2lwcGVkICh1cCB0byBkYXRlKTogJHtyZXN1bHRzLnNraXBwZWQubGVuZ3RofSBlbGVtZW50c1xcbmA7XG4gICAgbWVzc2FnZSArPSBgLSBGYWlsZWQ6ICR7cmVzdWx0cy5mYWlsZWQubGVuZ3RofSBlbGVtZW50c2A7XG4gICAgXG4gICAgaWYgKHJlc3VsdHMuZmFpbGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIG1lc3NhZ2UgKz0gYFxcblxcbkZhaWxlZCBkb3dubG9hZHM6XFxuJHtyZXN1bHRzLmZhaWxlZC5tYXAoZiA9PiBgLSAke2YubmFtZX06ICR7Zi5lcnJvcn1gKS5qb2luKCdcXG4nKX1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogcmVzdWx0cy5mYWlsZWQubGVuZ3RoID09PSAwLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGRhdGE6IHJlc3VsdHNcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogQnVsayB1cGxvYWQgZWxlbWVudHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVsa1VwbG9hZChlbGVtZW50VHlwZT86IEVsZW1lbnRUeXBlLCBjb25maXJtPzogYm9vbGVhbik6IFByb21pc2U8U3luY1Jlc3VsdD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcbiAgICBcbiAgICBpZiAoIWNvbmZpZy5zeW5jLmJ1bGsudXBsb2FkX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnQnVsayB1cGxvYWQgaXMgbm90IGVuYWJsZWQgaW4gY29uZmlndXJhdGlvbidcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIEdldCBsaXN0IG9mIGxvY2FsIGVsZW1lbnRzXG4gICAgY29uc3QgdHlwZXMgPSBlbGVtZW50VHlwZSA/IFtlbGVtZW50VHlwZV0gOiBbXG4gICAgICBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAgRWxlbWVudFR5cGUuU0tJTEwsXG4gICAgICBFbGVtZW50VHlwZS5URU1QTEFURSxcbiAgICAgIEVsZW1lbnRUeXBlLkFHRU5ULFxuICAgICAgRWxlbWVudFR5cGUuTUVNT1JZLFxuICAgICAgRWxlbWVudFR5cGUuRU5TRU1CTEVcbiAgICBdO1xuICAgIFxuICAgIGNvbnN0IGxvY2FsRWxlbWVudHM6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBFbGVtZW50VHlwZTsgcGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIFxuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0eXBlcykge1xuICAgICAgY29uc3QgZGlyID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKTtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgICAgICBsb2NhbEVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICBuYW1lOiBmaWxlLnJlcGxhY2UoJy5tZCcsICcnKSxcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgcGF0aDogcGF0aC5qb2luKGRpciwgZmlsZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRGlyZWN0b3J5IG1heSBub3QgZXhpc3QgeWV0XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRGlyZWN0b3J5IGZvciAke3R5cGV9IGRvZXMgbm90IGV4aXN0IHlldGApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAobG9jYWxFbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6ICdObyBsb2NhbCBlbGVtZW50cyB0byB1cGxvYWQnLFxuICAgICAgICBlbGVtZW50czogW11cbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIFNob3cgcHJldmlldyBpZiByZXF1aXJlZCAodW5sZXNzIGFscmVhZHkgY29uZmlybWVkKVxuICAgIGlmIChjb25maWcuc3luYy5idWxrLnJlcXVpcmVfcHJldmlldyAmJiAhY29uZmlybSkge1xuICAgICAgLy8gQ29udmVydCB0byBTeW5jRWxlbWVudEluZm8gZm9ybWF0IGZvciBwcmV2aWV3XG4gICAgICBjb25zdCBwcmV2aWV3RWxlbWVudHM6IFN5bmNFbGVtZW50SW5mb1tdID0gbG9jYWxFbGVtZW50cy5tYXAoZSA9PiAoe1xuICAgICAgICBuYW1lOiBlLm5hbWUsXG4gICAgICAgIHR5cGU6IGUudHlwZSxcbiAgICAgICAgc3RhdHVzOiAnbG9jYWwtb25seScgYXMgY29uc3QsXG4gICAgICAgIGFjdGlvbjogJ3VwbG9hZCcgYXMgY29uc3RcbiAgICAgIH0pKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBCdWxrIHVwbG9hZCBwcmV2aWV3OlxcblxcbiR7bG9jYWxFbGVtZW50cy5sZW5ndGh9IGVsZW1lbnRzIHdpbGwgYmUgdXBsb2FkZWQ6XFxuJHtsb2NhbEVsZW1lbnRzLm1hcChlID0+IGAtICR7ZS5uYW1lfSAoJHtlLnR5cGV9KWApLmpvaW4oJ1xcbicpfVxcblxcblRvIHByb2NlZWQsIHVzZSAtLWNvbmZpcm0gZmxhZ2AsXG4gICAgICAgIGRhdGE6IHsgcmVxdWlyZXNDb25maXJtYXRpb246IHRydWUgfSxcbiAgICAgICAgZWxlbWVudHM6IHByZXZpZXdFbGVtZW50c1xuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gUGVyZm9ybSBhY3R1YWwgYnVsayB1cGxvYWRcbiAgICBjb25zdCByZXN1bHRzID0ge1xuICAgICAgdXBsb2FkZWQ6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgc2tpcHBlZDogW10gYXMgc3RyaW5nW10sXG4gICAgICBmYWlsZWQ6IFtdIGFzIHsgbmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH1bXVxuICAgIH07XG4gICAgXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGxvY2FsRWxlbWVudHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudXBsb2FkRWxlbWVudChlbGVtZW50Lm5hbWUsIGVsZW1lbnQudHlwZSwgdHJ1ZSk7IC8vIGNvbmZpcm09dHJ1ZSB0byBza2lwIGluZGl2aWR1YWwgY29uZmlybWF0aW9uc1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXN1bHRzLnVwbG9hZGVkLnB1c2goZWxlbWVudC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubWVzc2FnZT8uaW5jbHVkZXMoJ2xvY2FsLW9ubHknKSkge1xuICAgICAgICAgIHJlc3VsdHMuc2tpcHBlZC5wdXNoKGVsZW1lbnQubmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0cy5mYWlsZWQucHVzaCh7IG5hbWU6IGVsZW1lbnQubmFtZSwgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJyB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVzdWx0cy5mYWlsZWQucHVzaCh7IFxuICAgICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSwgXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEJ1aWxkIHN1bW1hcnkgbWVzc2FnZVxuICAgIGxldCBtZXNzYWdlID0gYEJ1bGsgdXBsb2FkIGNvbXBsZXRlOlxcbmA7XG4gICAgbWVzc2FnZSArPSBgLSBVcGxvYWRlZDogJHtyZXN1bHRzLnVwbG9hZGVkLmxlbmd0aH0gZWxlbWVudHNcXG5gO1xuICAgIG1lc3NhZ2UgKz0gYC0gU2tpcHBlZCAobG9jYWwtb25seSk6ICR7cmVzdWx0cy5za2lwcGVkLmxlbmd0aH0gZWxlbWVudHNcXG5gO1xuICAgIG1lc3NhZ2UgKz0gYC0gRmFpbGVkOiAke3Jlc3VsdHMuZmFpbGVkLmxlbmd0aH0gZWxlbWVudHNgO1xuICAgIFxuICAgIGlmIChyZXN1bHRzLmZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICBtZXNzYWdlICs9IGBcXG5cXG5GYWlsZWQgdXBsb2FkczpcXG4ke3Jlc3VsdHMuZmFpbGVkLm1hcChmID0+IGAtICR7Zi5uYW1lfTogJHtmLmVycm9yfWApLmpvaW4oJ1xcbicpfWA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiByZXN1bHRzLmZhaWxlZC5sZW5ndGggPT09IDAsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZGF0YTogcmVzdWx0c1xuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBkaWZmIGJldHdlZW4gdHdvIGNvbnRlbnQgdmVyc2lvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVEaWZmKGxvY2FsOiBzdHJpbmcsIHJlbW90ZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBTaW1wbGUgbGluZS1iYXNlZCBkaWZmIGZvciBub3dcbiAgICBjb25zdCBsb2NhbExpbmVzID0gbG9jYWwuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHJlbW90ZUxpbmVzID0gcmVtb3RlLnNwbGl0KCdcXG4nKTtcbiAgICBcbiAgICBsZXQgZGlmZiA9ICcnO1xuICAgIGNvbnN0IG1heExpbmVzID0gTWF0aC5tYXgobG9jYWxMaW5lcy5sZW5ndGgsIHJlbW90ZUxpbmVzLmxlbmd0aCk7XG4gICAgXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhMaW5lcyAmJiBpIDwgMTA7IGkrKykgeyAvLyBTaG93IGZpcnN0IDEwIGxpbmVzIG9mIGRpZmZcbiAgICAgIGNvbnN0IGxvY2FsTGluZSA9IGxvY2FsTGluZXNbaV0gfHwgJyc7XG4gICAgICBjb25zdCByZW1vdGVMaW5lID0gcmVtb3RlTGluZXNbaV0gfHwgJyc7XG4gICAgICBcbiAgICAgIGlmIChsb2NhbExpbmUgIT09IHJlbW90ZUxpbmUpIHtcbiAgICAgICAgaWYgKGxvY2FsTGluZSAmJiAhcmVtb3RlTGluZSkge1xuICAgICAgICAgIGRpZmYgKz0gYC0gJHtsb2NhbExpbmV9XFxuYDtcbiAgICAgICAgfSBlbHNlIGlmICghbG9jYWxMaW5lICYmIHJlbW90ZUxpbmUpIHtcbiAgICAgICAgICBkaWZmICs9IGArICR7cmVtb3RlTGluZX1cXG5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpZmYgKz0gYC0gJHtsb2NhbExpbmV9XFxuYDtcbiAgICAgICAgICBkaWZmICs9IGArICR7cmVtb3RlTGluZX1cXG5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChtYXhMaW5lcyA+IDEwKSB7XG4gICAgICBkaWZmICs9IGBcXG4uLi4gJHttYXhMaW5lcyAtIDEwfSBtb3JlIGxpbmVzIC4uLmA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkaWZmIHx8ICdObyBkaWZmZXJlbmNlcyBmb3VuZCc7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaW5kIGEgZnV6enkgbWF0Y2ggZm9yIGFuIGVsZW1lbnQgbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kRnV6enlNYXRjaChzZWFyY2hOYW1lOiBzdHJpbmcsIGVudHJpZXM6IEdpdEh1YkluZGV4RW50cnlbXSk6IEdpdEh1YkluZGV4RW50cnkgfCBudWxsIHtcbiAgICBjb25zdCBzZWFyY2ggPSBzZWFyY2hOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgvWy1fXS9nLCAnJyk7XG4gICAgbGV0IGJlc3RNYXRjaDogdHlwZW9mIGVudHJpZXNbMF0gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgYmVzdFNjb3JlID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgZW50cnkgbmFtZSBmb3IgY29tcGFyaXNvblxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGVudHJ5Lm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKC9bLV9dL2csICcnKTtcbiAgICAgIFxuICAgICAgLy8gQ2FsY3VsYXRlIHNpbWlsYXJpdHkgc2NvcmVcbiAgICAgIGNvbnN0IHNjb3JlID0gdGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaCwgbm9ybWFsaXplZCk7XG4gICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUgJiYgc2NvcmUgPiAwLjUpIHsgLy8gTWluaW11bSB0aHJlc2hvbGQgb2YgMC41XG4gICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xuICAgICAgICBiZXN0TWF0Y2ggPSBlbnRyeTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBzdWdnZXN0aW9ucyBmb3Igc2ltaWxhciBlbGVtZW50IG5hbWVzXG4gICAqL1xuICBwcml2YXRlIGdldFN1Z2dlc3Rpb25zKHNlYXJjaE5hbWU6IHN0cmluZywgZW50cmllczogR2l0SHViSW5kZXhFbnRyeVtdKTogQXJyYXk8e25hbWU6IHN0cmluZ30+IHtcbiAgICBjb25zdCBzZWFyY2ggPSBzZWFyY2hOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgvWy1fXS9nLCAnJyk7XG4gICAgY29uc3Qgc2NvcmVkOiBBcnJheTx7ZW50cnk6IHR5cGVvZiBlbnRyaWVzWzBdOyBzY29yZTogbnVtYmVyfT4gPSBbXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBlbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbCgvWy1fXS9nLCAnJyk7XG4gICAgICBjb25zdCBzY29yZSA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2gsIG5vcm1hbGl6ZWQpO1xuICAgICAgaWYgKHNjb3JlID4gMC4zKSB7IC8vIExvd2VyIHRocmVzaG9sZCBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgICAgc2NvcmVkLnB1c2goeyBlbnRyeSwgc2NvcmUgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFNvcnQgYnkgc2NvcmUgYW5kIHJldHVybiB0b3AgNVxuICAgIHJldHVybiBzY29yZWRcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnNjb3JlIC0gYS5zY29yZSlcbiAgICAgIC5zbGljZSgwLCA1KVxuICAgICAgLm1hcChzID0+ICh7IG5hbWU6IHMuZW50cnkubmFtZSB9KSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgc2ltaWxhcml0eSBiZXR3ZWVuIHR3byBzdHJpbmdzXG4gICAqIFJldHVybnMgYSBzY29yZSBiZXR3ZWVuIDAgYW5kIDFcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlU2ltaWxhcml0eShhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8gRXhhY3QgbWF0Y2hcbiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIDEuMDtcbiAgICBcbiAgICAvLyBPbmUgY29udGFpbnMgdGhlIG90aGVyXG4gICAgaWYgKGEuaW5jbHVkZXMoYikgfHwgYi5pbmNsdWRlcyhhKSkgcmV0dXJuIDAuODtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgd29yZCBvdmVybGFwXG4gICAgY29uc3Qgd29yZHNBID0gYS5zcGxpdCgvW15hLXowLTldKy8pO1xuICAgIGNvbnN0IHdvcmRzQiA9IGIuc3BsaXQoL1teYS16MC05XSsvKTtcbiAgICBcbiAgICBsZXQgbWF0Y2hlcyA9IDA7XG4gICAgZm9yIChjb25zdCB3b3JkQSBvZiB3b3Jkc0EpIHtcbiAgICAgIGlmICh3b3JkQSAmJiB3b3Jkc0Iuc29tZSh3b3JkQiA9PiB3b3JkQiA9PT0gd29yZEEpKSB7XG4gICAgICAgIG1hdGNoZXMrKztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKG1hdGNoZXMgPiAwKSB7XG4gICAgICBjb25zdCBvdmVybGFwID0gKG1hdGNoZXMgKiAyKSAvICh3b3Jkc0EubGVuZ3RoICsgd29yZHNCLmxlbmd0aCk7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMC42LCBvdmVybGFwKTsgLy8gQXQgbGVhc3QgMC42IGZvciBhbnkgd29yZCBtYXRjaFxuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGFydGlhbCBtYXRjaGVzXG4gICAgZm9yIChjb25zdCB3b3JkQSBvZiB3b3Jkc0EpIHtcbiAgICAgIGZvciAoY29uc3Qgd29yZEIgb2Ygd29yZHNCKSB7XG4gICAgICAgIGlmICh3b3JkQS5sZW5ndGggPiAzICYmIHdvcmRCLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICBpZiAod29yZEEuaW5jbHVkZXMod29yZEIpIHx8IHdvcmRCLmluY2x1ZGVzKHdvcmRBKSkge1xuICAgICAgICAgICAgcmV0dXJuIDAuNTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gTm8gc2lnbmlmaWNhbnQgc2ltaWxhcml0eVxuICAgIHJldHVybiAwO1xuICB9XG59Il19