@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
@@ -688,8 +688,8 @@ export class UnifiedIndexManager {
688
688
  if (result.version && result.version !== 'unknown') {
689
689
  const versionParts = result.version.split('.');
690
690
  if (versionParts.length >= 2) {
691
- const major = parseInt(versionParts[0]) || 0;
692
- const minor = parseInt(versionParts[1]) || 0;
691
+ const major = Number.parseInt(versionParts[0]) || 0;
692
+ const minor = Number.parseInt(versionParts[1]) || 0;
693
693
  adjustedScore += (major * 0.1) + (minor * 0.01);
694
694
  }
695
695
  }
@@ -1289,7 +1289,7 @@ export class UnifiedIndexManager {
1289
1289
  */
1290
1290
  compareVersions(a, b) {
1291
1291
  const parseVersion = (version) => {
1292
- const parts = version.split('.').map(part => parseInt(part) || 0);
1292
+ const parts = version.split('.').map(part => Number.parseInt(part) || 0);
1293
1293
  return [parts[0] || 0, parts[1] || 0, parts[2] || 0];
1294
1294
  };
1295
1295
  const [aMajor, aMinor, aPatch] = parseVersion(a);
@@ -1485,4 +1485,4 @@ export class UnifiedIndexManager {
1485
1485
  };
1486
1486
  }
1487
1487
  }
1488
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pZmllZEluZGV4TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vVW5pZmllZEluZGV4TWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxxQkFBcUIsRUFBMkMsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RyxPQUFPLEVBQUUsc0JBQXNCLEVBQTBDLE1BQU0sNkJBQTZCLENBQUM7QUFDN0csT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBWSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQWlCLE1BQU0sZ0NBQWdDLENBQUM7QUFFbkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBOElqRSxNQUFNLE9BQU8sbUJBQW1CO0lBQ3RCLE1BQU0sQ0FBQyxRQUFRLEdBQStCLElBQUksQ0FBQztJQUVuRCxpQkFBaUIsQ0FBd0I7SUFDekMsYUFBYSxDQUF5QjtJQUN0QyxvQkFBb0IsQ0FBdUI7SUFDM0MsWUFBWSxDQUFlO0lBRW5DLHFDQUFxQztJQUM3QixrQkFBa0IsQ0FBcUI7SUFDdkMsV0FBVyxDQUFrQztJQUM3QyxVQUFVLENBQWdCO0lBQ2pC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LFFBQVEsRUFBRTtnQkFDMUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO2FBQ3ZDO1lBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUU7U0FDaEQsQ0FBQztJQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVuaWZpZWQgSW5kZXggTWFuYWdlciAtIENvbWJpbmVzIGxvY2FsLCBHaXRIdWIsIGFuZCBjb2xsZWN0aW9uIHBvcnRmb2xpbyBpbmRleGluZ1xuICogXG4gKiBGZWF0dXJlczpcbiAqIC0gVW5pZmllZCBzZWFyY2ggYWNyb3NzIGxvY2FsLCBHaXRIdWIsIGFuZCBjb2xsZWN0aW9uIHBvcnRmb2xpb3NcbiAqIC0gSW50ZWxsaWdlbnQgcmVzdWx0IG1lcmdpbmcgYW5kIGRlZHVwbGljYXRpb25cbiAqIC0gVmVyc2lvbiBjb25mbGljdCBkZXRlY3Rpb24gYW5kIHJlc29sdXRpb25cbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHdpdGggcGFyYWxsZWwgaW5kZXhpbmdcbiAqIC0gQWR2YW5jZWQgZmFsbGJhY2sgc3RyYXRlZ2llcyBmb3IgcmVzaWxpZW50IG9wZXJhdGlvblxuICogLSBDb21wcmVoZW5zaXZlIHNlYXJjaCBjYXBhYmlsaXRpZXMgd2l0aCBwYWdpbmF0aW9uXG4gKiAtIFNtYXJ0IHJlc3VsdCByYW5raW5nIGFuZCBkdXBsaWNhdGUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLCBJbmRleEVudHJ5LCBTZWFyY2hSZXN1bHQsIFNlYXJjaE9wdGlvbnMgfSBmcm9tICcuL1BvcnRmb2xpb0luZGV4TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBHaXRIdWJQb3J0Zm9saW9JbmRleGVyLCBHaXRIdWJJbmRleEVudHJ5LCBHaXRIdWJQb3J0Zm9saW9JbmRleCB9IGZyb20gJy4vR2l0SHViUG9ydGZvbGlvSW5kZXhlci5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uSW5kZXhDYWNoZSB9IGZyb20gJy4uL2NhY2hlL0NvbGxlY3Rpb25JbmRleENhY2hlLmpzJztcbmltcG9ydCB7IEdpdEh1YkNsaWVudCB9IGZyb20gJy4uL2NvbGxlY3Rpb24vR2l0SHViQ2xpZW50LmpzJztcbmltcG9ydCB7IEFQSUNhY2hlIH0gZnJvbSAnLi4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgTFJVQ2FjaGUsIENhY2hlRmFjdG9yeSB9IGZyb20gJy4uL2NhY2hlL0xSVUNhY2hlLmpzJztcbmltcG9ydCB7IFBlcmZvcm1hbmNlTW9uaXRvciwgU2VhcmNoTWV0cmljcyB9IGZyb20gJy4uL3V0aWxzL1BlcmZvcm1hbmNlTW9uaXRvci5qcyc7XG5pbXBvcnQgeyBJbmRleEVudHJ5IGFzIENvbGxlY3Rpb25JbmRleEVudHJ5LCBDb2xsZWN0aW9uSW5kZXggfSBmcm9tICcuLi90eXBlcy9jb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBVbmlmaWVkU2VhcmNoT3B0aW9ucyB7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIGluY2x1ZGVMb2NhbD86IGJvb2xlYW47ICAgICAvLyBkZWZhdWx0IHRydWVcbiAgaW5jbHVkZUdpdEh1Yj86IGJvb2xlYW47ICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICBpbmNsdWRlQ29sbGVjdGlvbj86IGJvb2xlYW47IC8vIGRlZmF1bHQgZmFsc2VcbiAgZWxlbWVudFR5cGU/OiBFbGVtZW50VHlwZTtcbiAgcGFnZT86IG51bWJlcjtcbiAgcGFnZVNpemU/OiBudW1iZXI7XG4gIHNvcnRCeT86ICdyZWxldmFuY2UnIHwgJ3NvdXJjZScgfCAnbmFtZScgfCAndmVyc2lvbic7XG4gIHN0cmVhbVJlc3VsdHM/OiBib29sZWFuOyAvLyBFbmFibGUgcmVzdWx0IHN0cmVhbWluZ1xuICBjdXJzb3I/OiBzdHJpbmc7IC8vIEZvciBwYWdpbmF0aW9uIGN1cnNvclxuICBtYXhSZXN1bHRzPzogbnVtYmVyOyAvLyBIYXJkIGxpbWl0IG9uIHJlc3VsdHNcbiAgbGF6eUxvYWQ/OiBib29sZWFuOyAvLyBFbmFibGUgbGF6eSBsb2FkaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbkNvbmZsaWN0IHtcbiAgbG9jYWw/OiBzdHJpbmc7XG4gIGdpdGh1Yj86IHN0cmluZztcbiAgY29sbGVjdGlvbj86IHN0cmluZztcbiAgcmVjb21tZW5kZWQ6ICdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJztcbiAgcmVhc29uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHVwbGljYXRlSW5mbyB7XG4gIG5hbWU6IHN0cmluZztcbiAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBzb3VyY2VzOiBBcnJheTx7XG4gICAgc291cmNlOiAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbic7XG4gICAgdmVyc2lvbj86IHN0cmluZztcbiAgICBsYXN0TW9kaWZpZWQ6IERhdGU7XG4gICAgcGF0aD86IHN0cmluZztcbiAgfT47XG4gIGhhc1ZlcnNpb25Db25mbGljdDogYm9vbGVhbjtcbiAgdmVyc2lvbkNvbmZsaWN0PzogVmVyc2lvbkNvbmZsaWN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25JbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gIHZlcnNpb25zOiB7XG4gICAgbG9jYWw/OiB7IHZlcnNpb246IHN0cmluZzsgbGFzdE1vZGlmaWVkOiBEYXRlOyBwYXRoOiBzdHJpbmcgfTtcbiAgICBnaXRodWI/OiB7IHZlcnNpb246IHN0cmluZzsgbGFzdE1vZGlmaWVkOiBEYXRlOyBwYXRoOiBzdHJpbmcgfTtcbiAgICBjb2xsZWN0aW9uPzogeyB2ZXJzaW9uOiBzdHJpbmc7IGxhc3RNb2RpZmllZDogRGF0ZTsgcGF0aDogc3RyaW5nIH07XG4gIH07XG4gIHJlY29tbWVuZGVkOiB7XG4gICAgc291cmNlOiAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbic7XG4gICAgcmVhc29uOiBzdHJpbmc7XG4gIH07XG4gIHVwZGF0ZUF2YWlsYWJsZTogYm9vbGVhbjtcbiAgdXBkYXRlRnJvbT86ICdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVbmlmaWVkSW5kZXhFbnRyeSB7XG4gIC8vIENvbW1vbiBwcm9wZXJ0aWVzXG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGF1dGhvcj86IHN0cmluZztcbiAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBsYXN0TW9kaWZpZWQ6IERhdGU7XG4gIFxuICAvLyBTb3VyY2UgaW5mb3JtYXRpb25cbiAgc291cmNlOiAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbic7XG4gIFxuICAvLyBMb2NhbCBwcm9wZXJ0aWVzICh3aGVuIHNvdXJjZSA9PT0gJ2xvY2FsJylcbiAgbG9jYWxGaWxlUGF0aD86IHN0cmluZztcbiAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAga2V5d29yZHM/OiBzdHJpbmdbXTtcbiAgdHJpZ2dlcnM/OiBzdHJpbmdbXTtcbiAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIFxuICAvLyBHaXRIdWIgcHJvcGVydGllcyAod2hlbiBzb3VyY2UgPT09ICdnaXRodWInKVxuICBnaXRodWJQYXRoPzogc3RyaW5nO1xuICBnaXRodWJTaGE/OiBzdHJpbmc7XG4gIGdpdGh1Ykh0bWxVcmw/OiBzdHJpbmc7XG4gIGdpdGh1YkRvd25sb2FkVXJsPzogc3RyaW5nO1xuICBnaXRodWJTaXplPzogbnVtYmVyO1xuICBcbiAgLy8gQ29sbGVjdGlvbiBwcm9wZXJ0aWVzICh3aGVuIHNvdXJjZSA9PT0gJ2NvbGxlY3Rpb24nKVxuICBjb2xsZWN0aW9uUGF0aD86IHN0cmluZztcbiAgY29sbGVjdGlvblNoYT86IHN0cmluZztcbiAgY29sbGVjdGlvblRhZ3M/OiBzdHJpbmdbXTtcbiAgY29sbGVjdGlvbkNhdGVnb3J5Pzogc3RyaW5nO1xuICBjb2xsZWN0aW9uTGljZW5zZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVbmlmaWVkU2VhcmNoUmVzdWx0IHtcbiAgc291cmNlOiAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbic7XG4gIGVudHJ5OiBVbmlmaWVkSW5kZXhFbnRyeTtcbiAgbWF0Y2hUeXBlOiBzdHJpbmc7XG4gIHNjb3JlOiBudW1iZXI7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGlzRHVwbGljYXRlPzogYm9vbGVhbjtcbiAgdmVyc2lvbkNvbmZsaWN0PzogVmVyc2lvbkNvbmZsaWN0O1xuICBjdXJzb3I/OiBzdHJpbmc7IC8vIEZvciBzdHJlYW1pbmcgcGFnaW5hdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbWVkU2VhcmNoUmVzdWx0IHtcbiAgcmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdO1xuICBoYXNNb3JlOiBib29sZWFuO1xuICBuZXh0Q3Vyc29yPzogc3RyaW5nO1xuICB0b3RhbEVzdGltYXRlPzogbnVtYmVyO1xuICBwcm9jZXNzaW5nVGltZU1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVW5pZmllZEluZGV4U3RhdHMge1xuICBsb2NhbDoge1xuICAgIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgICBlbGVtZW50c0J5VHlwZTogUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+O1xuICAgIGxhc3RCdWlsdDogRGF0ZSB8IG51bGw7XG4gICAgaXNTdGFsZTogYm9vbGVhbjtcbiAgfTtcbiAgZ2l0aHViOiB7XG4gICAgdG90YWxFbGVtZW50czogbnVtYmVyO1xuICAgIGVsZW1lbnRzQnlUeXBlOiBSZWNvcmQ8RWxlbWVudFR5cGUsIG51bWJlcj47XG4gICAgbGFzdEZldGNoZWQ6IERhdGUgfCBudWxsO1xuICAgIGlzU3RhbGU6IGJvb2xlYW47XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgfTtcbiAgY29sbGVjdGlvbjoge1xuICAgIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgICBlbGVtZW50c0J5VHlwZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICBsYXN0RmV0Y2hlZDogRGF0ZSB8IG51bGw7XG4gICAgaXNTdGFsZTogYm9vbGVhbjtcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICB9O1xuICBjb21iaW5lZDoge1xuICAgIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgICB1bmlxdWVFbGVtZW50czogbnVtYmVyO1xuICAgIGR1cGxpY2F0ZXM6IG51bWJlcjtcbiAgfTtcbiAgcGVyZm9ybWFuY2U6IHtcbiAgICBhdmVyYWdlU2VhcmNoVGltZTogbnVtYmVyO1xuICAgIGNhY2hlSGl0UmF0ZTogbnVtYmVyO1xuICAgIGxhc3RPcHRpbWl6ZWQ6IERhdGUgfCBudWxsO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgVW5pZmllZEluZGV4TWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBVbmlmaWVkSW5kZXhNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIFxuICBwcml2YXRlIGxvY2FsSW5kZXhNYW5hZ2VyOiBQb3J0Zm9saW9JbmRleE1hbmFnZXI7XG4gIHByaXZhdGUgZ2l0aHViSW5kZXhlcjogR2l0SHViUG9ydGZvbGlvSW5kZXhlcjtcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uSW5kZXhDYWNoZTogQ29sbGVjdGlvbkluZGV4Q2FjaGU7XG4gIHByaXZhdGUgZ2l0aHViQ2xpZW50OiBHaXRIdWJDbGllbnQ7XG4gIFxuICAvLyBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGFuZCBjYWNoaW5nXG4gIHByaXZhdGUgcGVyZm9ybWFuY2VNb25pdG9yOiBQZXJmb3JtYW5jZU1vbml0b3I7XG4gIHByaXZhdGUgcmVzdWx0Q2FjaGU6IExSVUNhY2hlPFVuaWZpZWRTZWFyY2hSZXN1bHRbXT47XG4gIHByaXZhdGUgaW5kZXhDYWNoZTogTFJVQ2FjaGU8YW55PjtcbiAgcHJpdmF0ZSByZWFkb25seSBCQVRDSF9TSVpFID0gNTA7IC8vIEZvciBzdHJlYW1pbmcgcmVzdWx0c1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9DT05DVVJSRU5UX1NPVVJDRVMgPSAzO1xuICBcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmxvY2FsSW5kZXhNYW5hZ2VyID0gUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgdGhpcy5naXRodWJJbmRleGVyID0gR2l0SHViUG9ydGZvbGlvSW5kZXhlci5nZXRJbnN0YW5jZSgpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgR2l0SHViQ2xpZW50IHdpdGggcmVxdWlyZWQgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgYXBpQ2FjaGUgPSBuZXcgQVBJQ2FjaGUoKTtcbiAgICBjb25zdCByYXRlTGltaXRUcmFja2VyID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICAgIHRoaXMuZ2l0aHViQ2xpZW50ID0gbmV3IEdpdEh1YkNsaWVudChhcGlDYWNoZSwgcmF0ZUxpbWl0VHJhY2tlcik7XG4gICAgdGhpcy5jb2xsZWN0aW9uSW5kZXhDYWNoZSA9IG5ldyBDb2xsZWN0aW9uSW5kZXhDYWNoZSh0aGlzLmdpdGh1YkNsaWVudCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIGFuZCBjYWNoaW5nXG4gICAgdGhpcy5wZXJmb3JtYW5jZU1vbml0b3IgPSBQZXJmb3JtYW5jZU1vbml0b3IuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLnBlcmZvcm1hbmNlTW9uaXRvci5zdGFydE1vbml0b3JpbmcoKTtcbiAgICBcbiAgICB0aGlzLnJlc3VsdENhY2hlID0gQ2FjaGVGYWN0b3J5LmNyZWF0ZVNlYXJjaFJlc3VsdENhY2hlKHtcbiAgICAgIG1heFNpemU6IDIwMCxcbiAgICAgIG1heE1lbW9yeU1COiAxNSxcbiAgICAgIHR0bE1zOiA1ICogNjAgKiAxMDAwLCAvLyA1IG1pbnV0ZXNcbiAgICAgIG9uRXZpY3Rpb246IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2VhcmNoIHJlc3VsdCBjYWNoZSBldmljdGlvbicsIHsga2V5LCByZXN1bHRDb3VudDogdmFsdWUubGVuZ3RoIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuaW5kZXhDYWNoZSA9IENhY2hlRmFjdG9yeS5jcmVhdGVJbmRleENhY2hlKHtcbiAgICAgIG1heFNpemU6IDEwMCxcbiAgICAgIG1heE1lbW9yeU1COiAyMCxcbiAgICAgIHR0bE1zOiAxNSAqIDYwICogMTAwMCwgLy8gMTUgbWludXRlc1xuICAgICAgb25FdmljdGlvbjogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbmRleCBjYWNoZSBldmljdGlvbicsIHsga2V5IH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGxvZ2dlci5kZWJ1ZygnVW5pZmllZEluZGV4TWFuYWdlciBjcmVhdGVkIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uJyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFVuaWZpZWRJbmRleE1hbmFnZXIge1xuICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBVbmlmaWVkSW5kZXhNYW5hZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuaGFuY2VkIHNlYXJjaCBhY3Jvc3MgbG9jYWwsIEdpdEh1YiwgYW5kIGNvbGxlY3Rpb24gcG9ydGZvbGlvcyB3aXRoIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlYXJjaChzZWFyY2hPcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBtZW1vcnlCZWZvcmUgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQ7XG4gICAgY29uc3QgeyBxdWVyeSwgaW5jbHVkZUxvY2FsID0gdHJ1ZSwgaW5jbHVkZUdpdEh1YiA9IHRydWUsIGluY2x1ZGVDb2xsZWN0aW9uID0gZmFsc2UgfSA9IHNlYXJjaE9wdGlvbnM7XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIHF1ZXJ5IHRvIHByZXZlbnQgVW5pY29kZS1iYXNlZCBhdHRhY2tzXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHF1ZXJ5KTtcbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSB2YWxpZGF0aW9uUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIFVzZSBub3JtYWxpemVkIHF1ZXJ5IGluIGFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnNcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoT3B0aW9ucyA9IHtcbiAgICAgIC4uLnNlYXJjaE9wdGlvbnMsXG4gICAgICBxdWVyeTogbm9ybWFsaXplZFF1ZXJ5XG4gICAgfTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggKERNQ1AtU0VDLTAwNik6IEFkZCBhdWRpdCBsb2dnaW5nIGZvciBzZWN1cml0eSBtb25pdG9yaW5nXG4gICAgLy8gTG9nIHVuaWZpZWQgc2VhcmNoIG9wZXJhdGlvbnMgZm9yIHNlY3VyaXR5IGF1ZGl0IHRyYWlsXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1BPUlRGT0xJT19GRVRDSF9TVUNDRVNTJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1VuaWZpZWRJbmRleE1hbmFnZXIuc2VhcmNoJyxcbiAgICAgIGRldGFpbHM6IGBVbmlmaWVkIHNlYXJjaCBwZXJmb3JtZWQgd2l0aCBxdWVyeSBsZW5ndGg6ICR7bm9ybWFsaXplZFF1ZXJ5Lmxlbmd0aH0sIHNvdXJjZXM6ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBsb2NhbDogaW5jbHVkZUxvY2FsLFxuICAgICAgICBnaXRodWI6IGluY2x1ZGVHaXRIdWIsXG4gICAgICAgIGNvbGxlY3Rpb246IGluY2x1ZGVDb2xsZWN0aW9uXG4gICAgICB9KX1gXG4gICAgfSk7XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBvcHRpbWl6ZWQgdW5pZmllZCBwb3J0Zm9saW8gc2VhcmNoJywgbm9ybWFsaXplZFNlYXJjaE9wdGlvbnMpO1xuICAgIFxuICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0ICh1c2Ugbm9ybWFsaXplZCBzZWFyY2ggb3B0aW9ucylcbiAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuY3JlYXRlQ2FjaGVLZXkobm9ybWFsaXplZFNlYXJjaE9wdGlvbnMpO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmVzdWx0Q2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICB0aGlzLnJlY29yZFNlYXJjaE1ldHJpY3Moe1xuICAgICAgICBxdWVyeTogbm9ybWFsaXplZFF1ZXJ5LFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgcmVzdWx0Q291bnQ6IGNhY2hlZC5sZW5ndGgsXG4gICAgICAgIHNvdXJjZXM6IHRoaXMuZ2V0RW5hYmxlZFNvdXJjZXMobm9ybWFsaXplZFNlYXJjaE9wdGlvbnMpLFxuICAgICAgICBjYWNoZUhpdDogdHJ1ZSxcbiAgICAgICAgbWVtb3J5QmVmb3JlLFxuICAgICAgICBtZW1vcnlBZnRlcjogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKClcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdVc2luZyBjYWNoZWQgc2VhcmNoIHJlc3VsdHMnLCB7IHJlc3VsdENvdW50OiBjYWNoZWQubGVuZ3RoIH0pO1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBzdHJlYW1pbmcgc2VhcmNoIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBsYXJnZSByZXN1bHQgc2V0c1xuICAgICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2hPcHRpb25zLnN0cmVhbVJlc3VsdHMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RyZWFtU2VhcmNoKG5vcm1hbGl6ZWRTZWFyY2hPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTGF6eSBsb2FkaW5nOiBPbmx5IGxvYWQgaW5kaWNlcyB3aGVuIG5lZWRlZFxuICAgICAgY29uc3Qgc2VhcmNoUHJvbWlzZXM6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPltdID0gW107XG4gICAgICBjb25zdCBlbmFibGVkU291cmNlcyA9IHRoaXMuZ2V0RW5hYmxlZFNvdXJjZXMobm9ybWFsaXplZFNlYXJjaE9wdGlvbnMpO1xuICAgICAgXG4gICAgICAvLyBMaW1pdCBjb25jdXJyZW50IHNvdXJjZSBzZWFyY2hlcyBmb3IgbWVtb3J5IGVmZmljaWVuY3lcbiAgICAgIGNvbnN0IGNvbmN1cnJlbnRMaW1pdCA9IE1hdGgubWluKHRoaXMuTUFYX0NPTkNVUlJFTlRfU09VUkNFUywgZW5hYmxlZFNvdXJjZXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHNvdXJjZUJhdGNoZXMgPSB0aGlzLmJhdGNoU291cmNlcyhlbmFibGVkU291cmNlcywgY29uY3VycmVudExpbWl0KTtcbiAgICAgIFxuICAgICAgY29uc3QgYWxsUmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdID0gW107XG4gICAgICBjb25zdCBzb3VyY2VDb3VudCA9IHsgbG9jYWw6IDAsIGdpdGh1YjogMCwgY29sbGVjdGlvbjogMCB9O1xuICAgICAgXG4gICAgICAvLyBQcm9jZXNzIHNvdXJjZXMgaW4gYmF0Y2hlcyB0byBjb250cm9sIG1lbW9yeSB1c2FnZVxuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzb3VyY2VCYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IGJhdGNoUHJvbWlzZXMgPSBiYXRjaC5tYXAoc291cmNlID0+IFxuICAgICAgICAgIHRoaXMuc2VhcmNoV2l0aEZhbGxiYWNrKHNvdXJjZSBhcyAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbicsIG5vcm1hbGl6ZWRRdWVyeSwgbm9ybWFsaXplZFNlYXJjaE9wdGlvbnMpXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYmF0Y2hQcm9taXNlcyk7XG4gICAgICAgIFxuICAgICAgICBiYXRjaFJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNvdXJjZU5hbWUgPSBiYXRjaFtpbmRleF0gYXMgJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nO1xuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgICAgICAgc291cmNlQ291bnRbc291cmNlTmFtZV0gKz0gcmVzdWx0LnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGFsbFJlc3VsdHMucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgU2VhcmNoIGZhaWxlZCBmb3Igc291cmNlICR7c291cmNlTmFtZX1gLCB7XG4gICAgICAgICAgICAgIGVycm9yOiByZXN1bHQucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZXN1bHQucmVhc29uLm1lc3NhZ2UgOiBTdHJpbmcocmVzdWx0LnJlYXNvbilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBNZW1vcnkgY2hlY2sgYmV0d2VlbiBiYXRjaGVzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRNZW1vcnkgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQgLyAoMTAyNCAqIDEwMjQpO1xuICAgICAgICBpZiAoY3VycmVudE1lbW9yeSA+IDIwMCkgeyAvLyAyMDBNQiB0aHJlc2hvbGRcbiAgICAgICAgICBsb2dnZXIud2FybignSGlnaCBtZW1vcnkgdXNhZ2UgZHVyaW5nIHNlYXJjaCwgdHJpZ2dlcmluZyBjbGVhbnVwJywge1xuICAgICAgICAgICAgbWVtb3J5TUI6IGN1cnJlbnRNZW1vcnlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJNZW1vcnlDbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQXBwbHkgYWR2YW5jZWQgcHJvY2Vzc2luZyB3aXRoIG1lbW9yeS1lZmZpY2llbnQgYmF0Y2hpbmdcbiAgICAgIGNvbnN0IHByb2Nlc3NlZFJlc3VsdHMgPSBhd2FpdCB0aGlzLnByb2Nlc3NTZWFyY2hSZXN1bHRzT3B0aW1pemVkKGFsbFJlc3VsdHMsIG5vcm1hbGl6ZWRTZWFyY2hPcHRpb25zKTtcbiAgICAgIFxuICAgICAgLy8gQXBwbHkgcGFnaW5hdGlvblxuICAgICAgY29uc3QgcGFnaW5hdGVkUmVzdWx0cyA9IHRoaXMuYXBwbHlQYWdpbmF0aW9uKHByb2Nlc3NlZFJlc3VsdHMsIG5vcm1hbGl6ZWRTZWFyY2hPcHRpb25zKTtcbiAgICAgIFxuICAgICAgLy8gQ2FjaGUgcmVzdWx0cyB3aXRoIG1lbW9yeSBsaW1pdCBjaGVja1xuICAgICAgaWYgKHBhZ2luYXRlZFJlc3VsdHMubGVuZ3RoIDwgMTAwMCkgeyAvLyBEb24ndCBjYWNoZSB2ZXJ5IGxhcmdlIHJlc3VsdCBzZXRzXG4gICAgICAgIHRoaXMucmVzdWx0Q2FjaGUuc2V0KGNhY2hlS2V5LCBwYWdpbmF0ZWRSZXN1bHRzKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgY29uc3QgbWVtb3J5QWZ0ZXIgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQ7XG4gICAgICBcbiAgICAgIHRoaXMucmVjb3JkU2VhcmNoTWV0cmljcyh7XG4gICAgICAgIHF1ZXJ5OiBub3JtYWxpemVkUXVlcnksXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICByZXN1bHRDb3VudDogcGFnaW5hdGVkUmVzdWx0cy5sZW5ndGgsXG4gICAgICAgIHNvdXJjZXM6IGVuYWJsZWRTb3VyY2VzLFxuICAgICAgICBjYWNoZUhpdDogZmFsc2UsXG4gICAgICAgIG1lbW9yeUJlZm9yZSxcbiAgICAgICAgbWVtb3J5QWZ0ZXIsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKCdPcHRpbWl6ZWQgdW5pZmllZCBwb3J0Zm9saW8gc2VhcmNoIGNvbXBsZXRlZCcsIHtcbiAgICAgICAgcXVlcnk6IG5vcm1hbGl6ZWRRdWVyeS5zdWJzdHJpbmcoMCwgNTApLFxuICAgICAgICBzb3VyY2VzOiB7IC4uLnNvdXJjZUNvdW50LCB0b3RhbDogYWxsUmVzdWx0cy5sZW5ndGggfSxcbiAgICAgICAgZmluYWxSZXN1bHRzOiBwYWdpbmF0ZWRSZXN1bHRzLmxlbmd0aCxcbiAgICAgICAgZHVyYXRpb246IGAke2R1cmF0aW9ufW1zYCxcbiAgICAgICAgbWVtb3J5VXNhZ2VNQjogKG1lbW9yeUFmdGVyIC0gbWVtb3J5QmVmb3JlKSAvICgxMDI0ICogMTAyNClcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gcGFnaW5hdGVkUmVzdWx0cztcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1VuaWZpZWRJbmRleE1hbmFnZXIuc2VhcmNoJywgZXJyb3IsIHsgcXVlcnk6IG5vcm1hbGl6ZWRTZWFyY2hPcHRpb25zLCBkdXJhdGlvbiB9KTtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci53cmFwRXJyb3IoZXJyb3IsICdGYWlsZWQgdG8gcGVyZm9ybSB1bmlmaWVkIHBvcnRmb2xpbyBzZWFyY2gnLCBFcnJvckNhdGVnb3J5LlNZU1RFTV9FUlJPUik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgZWxlbWVudCBieSBuYW1lIGFjcm9zcyBhbGwgcG9ydGZvbGlvc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nLCBvcHRpb25zOiBQYXJ0aWFsPFVuaWZpZWRTZWFyY2hPcHRpb25zPiA9IHt9KTogUHJvbWlzZTxVbmlmaWVkSW5kZXhFbnRyeSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VhcmNoT3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMgPSB7XG4gICAgICAgIHF1ZXJ5OiBuYW1lLFxuICAgICAgICBpbmNsdWRlTG9jYWw6IG9wdGlvbnMuaW5jbHVkZUxvY2FsID8/IHRydWUsXG4gICAgICAgIGluY2x1ZGVHaXRIdWI6IG9wdGlvbnMuaW5jbHVkZUdpdEh1YiA/PyB0cnVlLFxuICAgICAgICBpbmNsdWRlQ29sbGVjdGlvbjogb3B0aW9ucy5pbmNsdWRlQ29sbGVjdGlvbiA/PyBmYWxzZSxcbiAgICAgICAgcGFnZVNpemU6IDEsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlYXJjaChzZWFyY2hPcHRpb25zKTtcbiAgICAgIFxuICAgICAgLy8gUmV0dXJuIGV4YWN0IG5hbWUgbWF0Y2ggZmlyc3QsIHRoZW4gYmVzdCBtYXRjaFxuICAgICAgY29uc3QgZXhhY3RNYXRjaCA9IHJlc3VsdHMuZmluZChyZXN1bHQgPT4gXG4gICAgICAgIHJlc3VsdC5lbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGV4YWN0TWF0Y2g/LmVudHJ5IHx8IHJlc3VsdHNbMF0/LmVudHJ5IHx8IG51bGw7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdVbmlmaWVkSW5kZXhNYW5hZ2VyLmZpbmRCeU5hbWUnLCBlcnJvciwgeyBuYW1lIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbGVtZW50cyBieSB0eXBlIGZyb20gYWxsIHBvcnRmb2xpb3NcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRFbGVtZW50c0J5VHlwZShlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsIG9wdGlvbnM6IFBhcnRpYWw8VW5pZmllZFNlYXJjaE9wdGlvbnM+ID0ge30pOiBQcm9taXNlPFVuaWZpZWRJbmRleEVudHJ5W10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VhcmNoT3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMgPSB7XG4gICAgICAgIHF1ZXJ5OiAnJywgLy8gRW1wdHkgcXVlcnkgdG8gZ2V0IGFsbCBlbGVtZW50c1xuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgaW5jbHVkZUxvY2FsOiBvcHRpb25zLmluY2x1ZGVMb2NhbCA/PyB0cnVlLFxuICAgICAgICBpbmNsdWRlR2l0SHViOiBvcHRpb25zLmluY2x1ZGVHaXRIdWIgPz8gdHJ1ZSxcbiAgICAgICAgaW5jbHVkZUNvbGxlY3Rpb246IG9wdGlvbnMuaW5jbHVkZUNvbGxlY3Rpb24gPz8gZmFsc2UsXG4gICAgICAgIHBhZ2VTaXplOiAxMDAwLCAvLyBMYXJnZSBwYWdlIHNpemUgdG8gZ2V0IGFsbFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9O1xuICAgICAgXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5nZXRBbGxFbGVtZW50c0J5VHlwZShlbGVtZW50VHlwZSwgc2VhcmNoT3B0aW9ucyk7XG4gICAgICBcbiAgICAgIHJldHVybiB0aGlzLmRlZHVwbGljYXRlRW50cmllcyhyZXN1bHRzLm1hcChyID0+IHIuZW50cnkpKTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1VuaWZpZWRJbmRleE1hbmFnZXIuZ2V0RWxlbWVudHNCeVR5cGUnLCBlcnJvciwgeyBlbGVtZW50VHlwZSB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBmb3IgZHVwbGljYXRlcyBhY3Jvc3MgYWxsIHNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGVja0R1cGxpY2F0ZXMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxEdXBsaWNhdGVJbmZvW10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VhcmNoT3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMgPSB7XG4gICAgICAgIHF1ZXJ5OiBuYW1lLFxuICAgICAgICBpbmNsdWRlTG9jYWw6IHRydWUsXG4gICAgICAgIGluY2x1ZGVHaXRIdWI6IHRydWUsXG4gICAgICAgIGluY2x1ZGVDb2xsZWN0aW9uOiB0cnVlLFxuICAgICAgICBwYWdlU2l6ZTogMTAwXG4gICAgICB9O1xuICAgICAgXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5zZWFyY2goc2VhcmNoT3B0aW9ucyk7XG4gICAgICBjb25zdCBkdXBsaWNhdGVNYXAgPSBuZXcgTWFwPHN0cmluZywgRHVwbGljYXRlSW5mbz4oKTtcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBjb25zdCBrZXkgPSBgJHtyZXN1bHQuZW50cnkuZWxlbWVudFR5cGV9OiR7cmVzdWx0LmVudHJ5Lm5hbWUudG9Mb3dlckNhc2UoKX1gO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFkdXBsaWNhdGVNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICBkdXBsaWNhdGVNYXAuc2V0KGtleSwge1xuICAgICAgICAgICAgbmFtZTogcmVzdWx0LmVudHJ5Lm5hbWUsXG4gICAgICAgICAgICBlbGVtZW50VHlwZTogcmVzdWx0LmVudHJ5LmVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgc291cmNlczogW10sXG4gICAgICAgICAgICBoYXNWZXJzaW9uQ29uZmxpY3Q6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGR1cGxpY2F0ZU1hcC5nZXQoa2V5KSE7XG4gICAgICAgIGR1cGxpY2F0ZS5zb3VyY2VzLnB1c2goe1xuICAgICAgICAgIHNvdXJjZTogcmVzdWx0LnNvdXJjZSxcbiAgICAgICAgICB2ZXJzaW9uOiByZXN1bHQuZW50cnkudmVyc2lvbixcbiAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHJlc3VsdC5lbnRyeS5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgcGF0aDogdGhpcy5nZXRQYXRoRnJvbUVudHJ5KHJlc3VsdC5lbnRyeSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZpbHRlciB0byBvbmx5IGl0ZW1zIHdpdGggbXVsdGlwbGUgc291cmNlcyBhbmQgY2hlY2sgdmVyc2lvbiBjb25mbGljdHNcbiAgICAgIGNvbnN0IGFjdHVhbER1cGxpY2F0ZXMgPSBBcnJheS5mcm9tKGR1cGxpY2F0ZU1hcC52YWx1ZXMoKSlcbiAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0uc291cmNlcy5sZW5ndGggPiAxKVxuICAgICAgICAubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25Db25mbGljdCA9IHRoaXMuZGV0ZWN0VmVyc2lvbkNvbmZsaWN0KGl0ZW0uc291cmNlcyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICBoYXNWZXJzaW9uQ29uZmxpY3Q6ICEhdmVyc2lvbkNvbmZsaWN0LFxuICAgICAgICAgICAgdmVyc2lvbkNvbmZsaWN0XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBhY3R1YWxEdXBsaWNhdGVzO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignVW5pZmllZEluZGV4TWFuYWdlci5jaGVja0R1cGxpY2F0ZXMnLCBlcnJvciwgeyBuYW1lIH0pO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB2ZXJzaW9uIGNvbXBhcmlzb24gYWNyb3NzIGFsbCBzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0VmVyc2lvbkNvbXBhcmlzb24obmFtZTogc3RyaW5nKTogUHJvbWlzZTxWZXJzaW9uSW5mbyB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZHVwbGljYXRlcyA9IGF3YWl0IHRoaXMuY2hlY2tEdXBsaWNhdGVzKG5hbWUpO1xuICAgICAgXG4gICAgICBpZiAoZHVwbGljYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGR1cGxpY2F0ZXNbMF07XG4gICAgICBjb25zdCB2ZXJzaW9uczogVmVyc2lvbkluZm9bJ3ZlcnNpb25zJ10gPSB7fTtcbiAgICAgIFxuICAgICAgLy8gQnVpbGQgdmVyc2lvbiBpbmZvXG4gICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBkdXBsaWNhdGUuc291cmNlcykge1xuICAgICAgICBpZiAoc291cmNlLnNvdXJjZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICAgIHZlcnNpb25zLmxvY2FsID0ge1xuICAgICAgICAgICAgdmVyc2lvbjogc291cmNlLnZlcnNpb24gfHwgJ3Vua25vd24nLFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBzb3VyY2UubGFzdE1vZGlmaWVkLFxuICAgICAgICAgICAgcGF0aDogc291cmNlLnBhdGggfHwgJ3Vua25vd24nXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2Uuc291cmNlID09PSAnZ2l0aHViJykge1xuICAgICAgICAgIHZlcnNpb25zLmdpdGh1YiA9IHtcbiAgICAgICAgICAgIHZlcnNpb246IHNvdXJjZS52ZXJzaW9uIHx8ICd1bmtub3duJyxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDogc291cmNlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgIHBhdGg6IHNvdXJjZS5wYXRoIHx8ICd1bmtub3duJ1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoc291cmNlLnNvdXJjZSA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgICAgICAgdmVyc2lvbnMuY29sbGVjdGlvbiA9IHtcbiAgICAgICAgICAgIHZlcnNpb246IHNvdXJjZS52ZXJzaW9uIHx8ICd1bmtub3duJyxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDogc291cmNlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgIHBhdGg6IHNvdXJjZS5wYXRoIHx8ICd1bmtub3duJ1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGV0ZXJtaW5lIHJlY29tbWVuZGF0aW9uXG4gICAgICBjb25zdCByZWNvbW1lbmRhdGlvbiA9IHRoaXMuZGV0ZXJtaW5lVmVyc2lvblJlY29tbWVuZGF0aW9uKHZlcnNpb25zKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZHVwbGljYXRlLm5hbWUsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBkdXBsaWNhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHZlcnNpb25zLFxuICAgICAgICByZWNvbW1lbmRlZDogcmVjb21tZW5kYXRpb24sXG4gICAgICAgIHVwZGF0ZUF2YWlsYWJsZTogcmVjb21tZW5kYXRpb24uc291cmNlICE9PSAnbG9jYWwnICYmICEhdmVyc2lvbnMubG9jYWwsXG4gICAgICAgIHVwZGF0ZUZyb206IHJlY29tbWVuZGF0aW9uLnNvdXJjZSAhPT0gJ2xvY2FsJyA/IHJlY29tbWVuZGF0aW9uLnNvdXJjZSA6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1VuaWZpZWRJbmRleE1hbmFnZXIuZ2V0VmVyc2lvbkNvbXBhcmlzb24nLCBlcnJvciwgeyBuYW1lIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb21wcmVoZW5zaXZlIHN0YXRpc3RpY3MgYWNyb3NzIGFsbCBzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3RhdHMoKTogUHJvbWlzZTxVbmlmaWVkSW5kZXhTdGF0cz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBbbG9jYWxTdGF0cywgZ2l0aHViU3RhdHMsIGNvbGxlY3Rpb25TdGF0c10gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICB0aGlzLmdldExvY2FsU3RhdHMoKSxcbiAgICAgICAgdGhpcy5nZXRHaXRIdWJTdGF0cygpLFxuICAgICAgICB0aGlzLmdldENvbGxlY3Rpb25TdGF0cygpXG4gICAgICBdKTtcbiAgICAgIFxuICAgICAgY29uc3QgbG9jYWwgPSBsb2NhbFN0YXRzLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgPyBsb2NhbFN0YXRzLnZhbHVlIDoge1xuICAgICAgICB0b3RhbEVsZW1lbnRzOiAwLFxuICAgICAgICBlbGVtZW50c0J5VHlwZToge30gYXMgUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+LFxuICAgICAgICBsYXN0QnVpbHQ6IG51bGwsXG4gICAgICAgIGlzU3RhbGU6IHRydWVcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IGdpdGh1YiA9IGdpdGh1YlN0YXRzLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgPyBnaXRodWJTdGF0cy52YWx1ZSA6IHtcbiAgICAgICAgdG90YWxFbGVtZW50czogMCxcbiAgICAgICAgZWxlbWVudHNCeVR5cGU6IHt9IGFzIFJlY29yZDxFbGVtZW50VHlwZSwgbnVtYmVyPixcbiAgICAgICAgbGFzdEZldGNoZWQ6IG51bGwsXG4gICAgICAgIGlzU3RhbGU6IHRydWVcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uU3RhdHMuc3RhdHVzID09PSAnZnVsZmlsbGVkJyA/IGNvbGxlY3Rpb25TdGF0cy52YWx1ZSA6IHtcbiAgICAgICAgdG90YWxFbGVtZW50czogMCxcbiAgICAgICAgZWxlbWVudHNCeVR5cGU6IHt9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gICAgICAgIGxhc3RGZXRjaGVkOiBudWxsLFxuICAgICAgICBpc1N0YWxlOiB0cnVlXG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBDYWxjdWxhdGUgY29tYmluZWQgc3RhdGlzdGljc1xuICAgICAgY29uc3QgdG90YWxFbGVtZW50cyA9IGxvY2FsLnRvdGFsRWxlbWVudHMgKyBnaXRodWIudG90YWxFbGVtZW50cyArIGNvbGxlY3Rpb24udG90YWxFbGVtZW50cztcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZXNDb3VudCA9IGF3YWl0IHRoaXMuY2FsY3VsYXRlRHVwbGljYXRlc0NvdW50KCk7XG4gICAgICBjb25zdCB1bmlxdWVFbGVtZW50cyA9IHRvdGFsRWxlbWVudHMgLSBkdXBsaWNhdGVzQ291bnQ7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvY2FsLFxuICAgICAgICBnaXRodWIsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIGNvbWJpbmVkOiB7XG4gICAgICAgICAgdG90YWxFbGVtZW50cyxcbiAgICAgICAgICB1bmlxdWVFbGVtZW50cyxcbiAgICAgICAgICBkdXBsaWNhdGVzOiBkdXBsaWNhdGVzQ291bnRcbiAgICAgICAgfSxcbiAgICAgICAgcGVyZm9ybWFuY2U6IHtcbiAgICAgICAgICBhdmVyYWdlU2VhcmNoVGltZTogdGhpcy5nZXRQZXJmb3JtYW5jZVN0YXRzKCkuc2VhcmNoU3RhdHMuYXZlcmFnZVRpbWUgfHwgMCxcbiAgICAgICAgICBjYWNoZUhpdFJhdGU6IHRoaXMuZ2V0UGVyZm9ybWFuY2VTdGF0cygpLnNlYXJjaFN0YXRzLmNhY2hlSGl0UmF0ZSB8fCAwLFxuICAgICAgICAgIGxhc3RPcHRpbWl6ZWQ6IG51bGxcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1VuaWZpZWRJbmRleE1hbmFnZXIuZ2V0U3RhdHMnLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZSBjYWNoZXMgYWZ0ZXIgdXNlciBhY3Rpb25zIHdpdGggcGVyZm9ybWFuY2UgbW9uaXRvcmluZ1xuICAgKi9cbiAgcHVibGljIGludmFsaWRhdGVBZnRlckFjdGlvbihhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKCdJbnZhbGlkYXRpbmcgdW5pZmllZCBwb3J0Zm9saW8gY2FjaGVzIGFmdGVyIHVzZXIgYWN0aW9uJywgeyBhY3Rpb24gfSk7XG4gICAgXG4gICAgLy8gQ2xlYXIgcmVzdWx0IGFuZCBpbmRleCBjYWNoZXNcbiAgICB0aGlzLnJlc3VsdENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5pbmRleENhY2hlLmNsZWFyKCk7XG4gICAgXG4gICAgLy8gSW52YWxpZGF0ZSBsb2NhbCBjYWNoZVxuICAgIHRoaXMubG9jYWxJbmRleE1hbmFnZXIucmVidWlsZEluZGV4KCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byByZWJ1aWxkIGxvY2FsIGluZGV4IGFmdGVyIGFjdGlvbicsIHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBJbnZhbGlkYXRlIEdpdEh1YiBjYWNoZVxuICAgIHRoaXMuZ2l0aHViSW5kZXhlci5pbnZhbGlkYXRlQWZ0ZXJBY3Rpb24oYWN0aW9uKTtcbiAgICBcbiAgICAvLyBJbnZhbGlkYXRlIGNvbGxlY3Rpb24gY2FjaGVcbiAgICB0aGlzLmNvbGxlY3Rpb25JbmRleENhY2hlLmNsZWFyQ2FjaGUoKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGNsZWFyIGNvbGxlY3Rpb24gY2FjaGUgYWZ0ZXIgYWN0aW9uJywge1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIFRyaWdnZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIGlmIG1lbW9yeSB1c2FnZSBpcyBoaWdoXG4gICAgdGhpcy50cmlnZ2VyTWVtb3J5Q2xlYW51cCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIHJlYnVpbGQgb2YgYWxsIGluZGV4ZXMgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWJ1aWxkQWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgbG9nZ2VyLmluZm8oJ1JlYnVpbGRpbmcgYWxsIHBvcnRmb2xpbyBpbmRleGVzIHdpdGggb3B0aW1pemF0aW9uLi4uJyk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIENsZWFyIGFsbCBjYWNoZXNcbiAgICAgIHRoaXMucmVzdWx0Q2FjaGUuY2xlYXIoKTtcbiAgICAgIHRoaXMuaW5kZXhDYWNoZS5jbGVhcigpO1xuICAgICAgXG4gICAgICAvLyBSZXNldCBwZXJmb3JtYW5jZSBjb3VudGVyc1xuICAgICAgdGhpcy5wZXJmb3JtYW5jZU1vbml0b3IucmVzZXQoKTtcbiAgICAgIFxuICAgICAgLy8gUmVidWlsZCBpbiBwYXJhbGxlbCB3aXRoIG1lbW9yeSBtb25pdG9yaW5nXG4gICAgICBjb25zdCByZWJ1aWxkUHJvbWlzZXMgPSBbXG4gICAgICAgIHRoaXMubG9jYWxJbmRleE1hbmFnZXIucmVidWlsZEluZGV4KCksXG4gICAgICAgIHRoaXMuZ2l0aHViSW5kZXhlci5jbGVhckNhY2hlKCksXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbkluZGV4Q2FjaGUuY2xlYXJDYWNoZSgpXG4gICAgICBdO1xuICAgICAgXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChyZWJ1aWxkUHJvbWlzZXMpO1xuICAgICAgXG4gICAgICAvLyBUcmlnZ2VyIGNsZWFudXBcbiAgICAgIHRoaXMudHJpZ2dlck1lbW9yeUNsZWFudXAoKTtcbiAgICAgIFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oJ0FsbCBwb3J0Zm9saW8gaW5kZXhlcyByZWJ1aWx0IHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgZHVyYXRpb246IGAke2R1cmF0aW9ufW1zYCxcbiAgICAgICAgbWVtb3J5VXNhZ2VNQjogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkIC8gKDEwMjQgKiAxMDI0KVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignVW5pZmllZEluZGV4TWFuYWdlci5yZWJ1aWxkQWxsJywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBIRUxQRVIgTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBcbiAgLyoqXG4gICAqIFNlYXJjaCB3aXRoIGZhbGxiYWNrIHN0cmF0ZWdpZXMgZm9yIHJlc2lsaWVudCBvcGVyYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoV2l0aEZhbGxiYWNrKHNvdXJjZTogJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nLCBxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSA9IFtdO1xuICAgICAgXG4gICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICBjYXNlICdsb2NhbCc6XG4gICAgICAgICAgcmVzdWx0cyA9IGF3YWl0IHRoaXMuc2VhcmNoTG9jYWwocXVlcnksIG9wdGlvbnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdnaXRodWInOlxuICAgICAgICAgIHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlYXJjaEdpdEh1YihxdWVyeSwgb3B0aW9ucyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICAgIHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlYXJjaENvbGxlY3Rpb24ocXVlcnksIG9wdGlvbnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoYCR7c291cmNlfSBzZWFyY2ggY29tcGxldGVkIGluICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tcyB3aXRoICR7cmVzdWx0cy5sZW5ndGh9IHJlc3VsdHNgKTtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgJHtzb3VyY2V9IHNlYXJjaCBmYWlsZWQsIGF0dGVtcHRpbmcgZmFsbGJhY2tgLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBGYWxsYmFjayBzdHJhdGVnaWVzXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVTZWFyY2hGYWxsYmFjayhzb3VyY2UsIHF1ZXJ5LCBvcHRpb25zLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHNlYXJjaCBmYWxsYmFjayBzdHJhdGVnaWVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlYXJjaEZhbGxiYWNrKHNvdXJjZTogJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nLCBxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucywgb3JpZ2luYWxFcnJvcjogYW55KTogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+IHtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgY2FzZSAnbG9jYWwnOlxuICAgICAgICAgIC8vIFRyeSB0byB1c2Ugc3RhbGUgbG9jYWwgaW5kZXhcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ0F0dGVtcHRpbmcgdG8gdXNlIHN0YWxlIGxvY2FsIGluZGV4Jyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VhcmNoTG9jYWxTdGFsZShxdWVyeSwgb3B0aW9ucyk7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ2dpdGh1Yic6XG4gICAgICAgICAgLy8gVHJ5IGNhY2hlZCBHaXRIdWIgZGF0YVxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQXR0ZW1wdGluZyB0byB1c2UgY2FjaGVkIEdpdEh1YiBkYXRhJyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VhcmNoR2l0SHViQ2FjaGVkKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgICAgLy8gVHJ5IGNhY2hlZCBjb2xsZWN0aW9uIGRhdGFcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ0F0dGVtcHRpbmcgdG8gdXNlIGNhY2hlZCBjb2xsZWN0aW9uIGRhdGEnKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZWFyY2hDb2xsZWN0aW9uQ2FjaGVkKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZmFsbGJhY2tFcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oYEFsbCBmYWxsYmFjayBzdHJhdGVnaWVzIGZhaWxlZCBmb3IgJHtzb3VyY2V9YCwge1xuICAgICAgICBvcmlnaW5hbEVycm9yOiBvcmlnaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBvcmlnaW5hbEVycm9yLm1lc3NhZ2UgOiBTdHJpbmcob3JpZ2luYWxFcnJvciksXG4gICAgICAgIGZhbGxiYWNrRXJyb3I6IGZhbGxiYWNrRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGZhbGxiYWNrRXJyb3IubWVzc2FnZSA6IFN0cmluZyhmYWxsYmFja0Vycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU2VhcmNoIGxvY2FsIHBvcnRmb2xpb1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZWFyY2hMb2NhbChxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgY29uc3QgbG9jYWxPcHRpb25zID0gdGhpcy5jb252ZXJ0VG9Mb2NhbE9wdGlvbnMob3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMubG9jYWxJbmRleE1hbmFnZXIuc2VhcmNoKHF1ZXJ5LCBsb2NhbE9wdGlvbnMpO1xuICAgIFxuICAgIHJldHVybiByZXN1bHRzLm1hcChyZXN1bHQgPT4gKHtcbiAgICAgIHNvdXJjZTogJ2xvY2FsJyBhcyBjb25zdCxcbiAgICAgIGVudHJ5OiB0aGlzLmNvbnZlcnRMb2NhbEVudHJ5KHJlc3VsdC5lbnRyeSksXG4gICAgICBtYXRjaFR5cGU6IHJlc3VsdC5tYXRjaFR5cGUsXG4gICAgICBzY29yZTogcmVzdWx0LnNjb3JlLFxuICAgICAgdmVyc2lvbjogcmVzdWx0LmVudHJ5Lm1ldGFkYXRhLnZlcnNpb25cbiAgICB9KSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggbG9jYWwgd2l0aCBzdGFsZSBkYXRhIGZhbGxiYWNrXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlYXJjaExvY2FsU3RhbGUocXVlcnk6IHN0cmluZywgb3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFVuaWZpZWRTZWFyY2hSZXN1bHRbXT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gZ2V0IGFueSBsb2NhbCBkYXRhLCBldmVuIHN0YWxlXG4gICAgICBjb25zdCBsb2NhbE9wdGlvbnMgPSB0aGlzLmNvbnZlcnRUb0xvY2FsT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmxvY2FsSW5kZXhNYW5hZ2VyLnNlYXJjaChxdWVyeSwgbG9jYWxPcHRpb25zKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKHJlc3VsdCA9PiAoe1xuICAgICAgICBzb3VyY2U6ICdsb2NhbCcgYXMgY29uc3QsXG4gICAgICAgIGVudHJ5OiB0aGlzLmNvbnZlcnRMb2NhbEVudHJ5KHJlc3VsdC5lbnRyeSksXG4gICAgICAgIG1hdGNoVHlwZTogcmVzdWx0Lm1hdGNoVHlwZSxcbiAgICAgICAgc2NvcmU6IHJlc3VsdC5zY29yZSAqIDAuOCwgLy8gUmVkdWNlIHNjb3JlIGZvciBzdGFsZSBkYXRhXG4gICAgICAgIHZlcnNpb246IHJlc3VsdC5lbnRyeS5tZXRhZGF0YS52ZXJzaW9uXG4gICAgICB9KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBHaXRIdWIgcG9ydGZvbGlvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlYXJjaEdpdEh1YihxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdpdGh1YkluZGV4ID0gYXdhaXQgdGhpcy5naXRodWJJbmRleGVyLmdldEluZGV4KCk7XG4gICAgICBjb25zdCByZXN1bHRzOiBVbmlmaWVkU2VhcmNoUmVzdWx0W10gPSBbXTtcbiAgICAgIFxuICAgICAgY29uc3QgcXVlcnlMb3dlciA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBxdWVyeVRva2VucyA9IHF1ZXJ5TG93ZXIuc3BsaXQoL1xccysvKS5maWx0ZXIodG9rZW4gPT4gdG9rZW4ubGVuZ3RoID4gMCk7XG4gICAgICBcbiAgICAgIGlmIChxdWVyeVRva2Vucy5sZW5ndGggPT09IDAgJiYgcXVlcnkudHJpbSgpICE9PSAnJykge1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2VhcmNoIGFjcm9zcyBhbGwgR2l0SHViIGVsZW1lbnRzXG4gICAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgZW50cmllc10gb2YgZ2l0aHViSW5kZXguZWxlbWVudHMpIHtcbiAgICAgICAgLy8gRmlsdGVyIGJ5IGVsZW1lbnQgdHlwZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKG9wdGlvbnMuZWxlbWVudFR5cGUgJiYgZWxlbWVudFR5cGUgIT09IG9wdGlvbnMuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcmUgPSB0aGlzLmNhbGN1bGF0ZUdpdEh1Yk1hdGNoU2NvcmUoZW50cnksIHF1ZXJ5VG9rZW5zLCBxdWVyeSk7XG4gICAgICAgICAgaWYgKHNjb3JlID4gMCB8fCBxdWVyeS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICBzb3VyY2U6ICdnaXRodWInIGFzIGNvbnN0LFxuICAgICAgICAgICAgICBlbnRyeTogdGhpcy5jb252ZXJ0R2l0SHViRW50cnkoZW50cnkpLFxuICAgICAgICAgICAgICBtYXRjaFR5cGU6IHRoaXMuZGV0ZXJtaW5lTWF0Y2hUeXBlKGVudHJ5LCBxdWVyeVRva2VucyksXG4gICAgICAgICAgICAgIHNjb3JlOiBxdWVyeS50cmltKCkgPT09ICcnID8gMSA6IHNjb3JlLCAvLyBEZWZhdWx0IHNjb3JlIGZvciBlbXB0eSBxdWVyeVxuICAgICAgICAgICAgICB2ZXJzaW9uOiBlbnRyeS52ZXJzaW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHJlc3VsdHMuc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnR2l0SHViIHNlYXJjaCBmYWlsZWQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHRvIHRyaWdnZXIgZmFsbGJhY2tcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggR2l0SHViIHdpdGggY2FjaGVkIGRhdGEgZmFsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoR2l0SHViQ2FjaGVkKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIHVzZSBzdGFsZSBHaXRIdWIgZGF0YVxuICAgICAgY29uc3QgY2FjaGVTdGF0cyA9IHRoaXMuZ2l0aHViSW5kZXhlci5nZXRDYWNoZVN0YXRzKCk7XG4gICAgICBpZiAoIWNhY2hlU3RhdHMuaXNTdGFsZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZWFyY2hHaXRIdWIocXVlcnksIG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVc2Ugc3RhbGUgZGF0YSB3aXRoIHJlZHVjZWQgc2NvcmVzXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5zZWFyY2hHaXRIdWIocXVlcnksIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKHJlc3VsdCA9PiAoe1xuICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgIHNjb3JlOiByZXN1bHQuc2NvcmUgKiAwLjcgLy8gUmVkdWNlIHNjb3JlIGZvciBzdGFsZSBkYXRhXG4gICAgICB9KSk7XG4gICAgICBcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggY29sbGVjdGlvbiBwb3J0Zm9saW9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoQ29sbGVjdGlvbihxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25JbmRleCA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbkluZGV4Q2FjaGUuZ2V0SW5kZXgoKTtcbiAgICAgIGNvbnN0IHJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSA9IFtdO1xuICAgICAgXG4gICAgICBjb25zdCBxdWVyeUxvd2VyID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHF1ZXJ5VG9rZW5zID0gcXVlcnlMb3dlci5zcGxpdCgvXFxzKy8pLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5sZW5ndGggPiAwKTtcbiAgICAgIFxuICAgICAgaWYgKHF1ZXJ5VG9rZW5zLmxlbmd0aCA9PT0gMCAmJiBxdWVyeS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTZWFyY2ggYWNyb3NzIGFsbCBjb2xsZWN0aW9uIGVsZW1lbnRzXG4gICAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMoY29sbGVjdGlvbkluZGV4LmluZGV4KSkge1xuICAgICAgICAvLyBGaWx0ZXIgYnkgZWxlbWVudCB0eXBlIGlmIHNwZWNpZmllZFxuICAgICAgICBpZiAob3B0aW9ucy5lbGVtZW50VHlwZSAmJiBlbGVtZW50VHlwZSAhPT0gb3B0aW9ucy5lbGVtZW50VHlwZS50b1N0cmluZygpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgIGNvbnN0IHNjb3JlID0gdGhpcy5jYWxjdWxhdGVDb2xsZWN0aW9uTWF0Y2hTY29yZShlbnRyeSwgcXVlcnlUb2tlbnMsIHF1ZXJ5KTtcbiAgICAgICAgICBpZiAoc2NvcmUgPiAwIHx8IHF1ZXJ5LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgIHNvdXJjZTogJ2NvbGxlY3Rpb24nIGFzIGNvbnN0LFxuICAgICAgICAgICAgICBlbnRyeTogdGhpcy5jb252ZXJ0Q29sbGVjdGlvbkVudHJ5KGVudHJ5LCBlbGVtZW50VHlwZSksXG4gICAgICAgICAgICAgIG1hdGNoVHlwZTogdGhpcy5kZXRlcm1pbmVDb2xsZWN0aW9uTWF0Y2hUeXBlKGVudHJ5LCBxdWVyeVRva2VucyksXG4gICAgICAgICAgICAgIHNjb3JlOiBxdWVyeS50cmltKCkgPT09ICcnID8gMSA6IHNjb3JlLCAvLyBEZWZhdWx0IHNjb3JlIGZvciBlbXB0eSBxdWVyeVxuICAgICAgICAgICAgICB2ZXJzaW9uOiBlbnRyeS52ZXJzaW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHJlc3VsdHMuc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnQ29sbGVjdGlvbiBzZWFyY2ggZmFpbGVkJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yOyAvLyBSZS10aHJvdyB0byB0cmlnZ2VyIGZhbGxiYWNrXG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU2VhcmNoIGNvbGxlY3Rpb24gd2l0aCBjYWNoZWQgZGF0YSBmYWxsYmFja1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZWFyY2hDb2xsZWN0aW9uQ2FjaGVkKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIHVzZSBzdGFsZSBjb2xsZWN0aW9uIGRhdGFcbiAgICAgIGNvbnN0IGNhY2hlU3RhdHMgPSB0aGlzLmNvbGxlY3Rpb25JbmRleENhY2hlLmdldENhY2hlU3RhdHMoKTtcbiAgICAgIGlmIChjYWNoZVN0YXRzLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VhcmNoQ29sbGVjdGlvbihxdWVyeSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVzZSBzdGFsZSBkYXRhIHdpdGggcmVkdWNlZCBzY29yZXNcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlYXJjaENvbGxlY3Rpb24ocXVlcnksIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKHJlc3VsdCA9PiAoe1xuICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgIHNjb3JlOiByZXN1bHQuc2NvcmUgKiAwLjYgLy8gUmVkdWNlIHNjb3JlIGZvciBzdGFsZSBjb2xsZWN0aW9uIGRhdGFcbiAgICAgIH0pKTtcbiAgICAgIFxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHNlYXJjaCByZXN1bHRzIHdpdGggYWR2YW5jZWQgZmVhdHVyZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1NlYXJjaFJlc3VsdHMocmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgLy8gQXBwbHkgc21hcnQgcmFua2luZ1xuICAgIGNvbnN0IHJhbmtlZFJlc3VsdHMgPSB0aGlzLmFwcGx5U21hcnRSYW5raW5nKHJlc3VsdHMsIG9wdGlvbnMpO1xuICAgIFxuICAgIC8vIERldGVjdCBkdXBsaWNhdGVzIGFuZCB2ZXJzaW9uIGNvbmZsaWN0c1xuICAgIGNvbnN0IHByb2Nlc3NlZFJlc3VsdHMgPSBhd2FpdCB0aGlzLmRldGVjdER1cGxpY2F0ZXNBbmRDb25mbGljdHMocmFua2VkUmVzdWx0cyk7XG4gICAgXG4gICAgLy8gQXBwbHkgc29ydGluZ1xuICAgIGNvbnN0IHNvcnRlZFJlc3VsdHMgPSB0aGlzLmFwcGx5U29ydGluZyhwcm9jZXNzZWRSZXN1bHRzLCBvcHRpb25zLnNvcnRCeSB8fCAncmVsZXZhbmNlJywgb3B0aW9ucy5xdWVyeSk7XG4gICAgXG4gICAgcmV0dXJuIHNvcnRlZFJlc3VsdHM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBBcHBseSBzbWFydCByZXN1bHQgcmFua2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVNtYXJ0UmFua2luZyhyZXN1bHRzOiBVbmlmaWVkU2VhcmNoUmVzdWx0W10sIG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogVW5pZmllZFNlYXJjaFJlc3VsdFtdIHtcbiAgICByZXR1cm4gcmVzdWx0cy5tYXAocmVzdWx0ID0+IHtcbiAgICAgIGxldCBhZGp1c3RlZFNjb3JlID0gcmVzdWx0LnNjb3JlO1xuICAgICAgXG4gICAgICAvLyBObyBsb2NhdGlvbi1iYXNlZCBzY29yaW5nIC0gc2NvcmUgc2hvdWxkIGJlIGJhc2VkIG9uIHJlbGV2YW5jZSBvbmx5XG4gICAgICAvLyBTb3VyY2UgbG9jYXRpb24gZG9lc24ndCBhZmZlY3QgdGhlIGludHJpbnNpYyB2YWx1ZSBvZiBhbiBlbGVtZW50XG4gICAgICBcbiAgICAgIC8vIENvbnNpZGVyIHZlcnNpb24gZnJlc2huZXNzIChuZXdlciB2ZXJzaW9ucyBnZXQgc21hbGwgYm9udXMpXG4gICAgICBpZiAocmVzdWx0LnZlcnNpb24gJiYgcmVzdWx0LnZlcnNpb24gIT09ICd1bmtub3duJykge1xuICAgICAgICBjb25zdCB2ZXJzaW9uUGFydHMgPSByZXN1bHQudmVyc2lvbi5zcGxpdCgnLicpO1xuICAgICAgICBpZiAodmVyc2lvblBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgY29uc3QgbWFqb3IgPSBwYXJzZUludCh2ZXJzaW9uUGFydHNbMF0pIHx8IDA7XG4gICAgICAgICAgY29uc3QgbWlub3IgPSBwYXJzZUludCh2ZXJzaW9uUGFydHNbMV0pIHx8IDA7XG4gICAgICAgICAgYWRqdXN0ZWRTY29yZSArPSAobWFqb3IgKiAwLjEpICsgKG1pbm9yICogMC4wMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQm9vc3QgZXhhY3QgbWF0Y2hlc1xuICAgICAgaWYgKHJlc3VsdC5lbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IG9wdGlvbnMucXVlcnkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBhZGp1c3RlZFNjb3JlICo9IDIuMDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICBzY29yZTogYWRqdXN0ZWRTY29yZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERldGVjdCBkdXBsaWNhdGVzIGFuZCB2ZXJzaW9uIGNvbmZsaWN0c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXRlY3REdXBsaWNhdGVzQW5kQ29uZmxpY3RzKHJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgY29uc3QgbmFtZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBVbmlmaWVkU2VhcmNoUmVzdWx0W10+KCk7XG4gICAgXG4gICAgLy8gR3JvdXAgYnkgbmFtZSBhbmQgZWxlbWVudCB0eXBlXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgY29uc3Qga2V5ID0gYCR7cmVzdWx0LmVudHJ5LmVsZW1lbnRUeXBlfToke3Jlc3VsdC5lbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCl9YDtcbiAgICAgIGlmICghbmFtZU1hcC5oYXMoa2V5KSkge1xuICAgICAgICBuYW1lTWFwLnNldChrZXksIFtdKTtcbiAgICAgIH1cbiAgICAgIG5hbWVNYXAuZ2V0KGtleSkhLnB1c2gocmVzdWx0KTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcHJvY2Vzc2VkUmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdID0gW107XG4gICAgXG4gICAgLy8gUHJvY2VzcyBlYWNoIGdyb3VwXG4gICAgZm9yIChjb25zdCBba2V5LCBncm91cFJlc3VsdHNdIG9mIG5hbWVNYXApIHtcbiAgICAgIGlmIChncm91cFJlc3VsdHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIE5vIGR1cGxpY2F0ZXNcbiAgICAgICAgcHJvY2Vzc2VkUmVzdWx0cy5wdXNoKGdyb3VwUmVzdWx0c1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYXMgZHVwbGljYXRlcyAtIGRldGVjdCB2ZXJzaW9uIGNvbmZsaWN0c1xuICAgICAgICBjb25zdCB2ZXJzaW9uQ29uZmxpY3QgPSB0aGlzLmRldGVjdFZlcnNpb25Db25mbGljdEZyb21SZXN1bHRzKGdyb3VwUmVzdWx0cyk7XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIGFsbCByZXN1bHRzIGFzIGR1cGxpY2F0ZXMgYW5kIGFkZCBjb25mbGljdCBpbmZvXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGdyb3VwUmVzdWx0cykge1xuICAgICAgICAgIHByb2Nlc3NlZFJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICBpc0R1cGxpY2F0ZTogdHJ1ZSxcbiAgICAgICAgICAgIHZlcnNpb25Db25mbGljdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBwcm9jZXNzZWRSZXN1bHRzO1xuICB9XG4gIFxuICAvKipcbiAgICogQXBwbHkgcGFnaW5hdGlvbiB0byByZXN1bHRzXG4gICAqL1xuICBwcml2YXRlIGFwcGx5UGFnaW5hdGlvbihyZXN1bHRzOiBVbmlmaWVkU2VhcmNoUmVzdWx0W10sIG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogVW5pZmllZFNlYXJjaFJlc3VsdFtdIHtcbiAgICBjb25zdCBwYWdlID0gb3B0aW9ucy5wYWdlIHx8IDE7XG4gICAgY29uc3QgcGFnZVNpemUgPSBvcHRpb25zLnBhZ2VTaXplIHx8IDIwO1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAocGFnZSAtIDEpICogcGFnZVNpemU7XG4gICAgY29uc3QgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgcGFnZVNpemU7XG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdHMuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICB9XG4gIFxuICAvKipcbiAgICogQXBwbHkgc29ydGluZyB0byByZXN1bHRzXG4gICAqL1xuICBwcml2YXRlIGFwcGx5U29ydGluZyhyZXN1bHRzOiBVbmlmaWVkU2VhcmNoUmVzdWx0W10sIHNvcnRCeTogJ3JlbGV2YW5jZScgfCAnc291cmNlJyB8ICduYW1lJyB8ICd2ZXJzaW9uJywgcXVlcnk6IHN0cmluZyk6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSB7XG4gICAgY29uc3Qgc29ydGVkID0gWy4uLnJlc3VsdHNdO1xuICAgIFxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlICduYW1lJzpcbiAgICAgICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IGEuZW50cnkubmFtZS5sb2NhbGVDb21wYXJlKGIuZW50cnkubmFtZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAgIHNvcnRlZC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSB7ICdsb2NhbCc6IDAsICdnaXRodWInOiAxLCAnY29sbGVjdGlvbic6IDIgfTtcbiAgICAgICAgICByZXR1cm4gc291cmNlT3JkZXJbYS5zb3VyY2VdIC0gc291cmNlT3JkZXJbYi5zb3VyY2VdO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd2ZXJzaW9uJzpcbiAgICAgICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IHRoaXMuY29tcGFyZVZlcnNpb25zKGIudmVyc2lvbiB8fCAnMCcsIGEudmVyc2lvbiB8fCAnMCcpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWxldmFuY2UnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzb3J0ZWQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgbWF0Y2ggc2NvcmUgZm9yIEdpdEh1YiBlbnRyaWVzXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUdpdEh1Yk1hdGNoU2NvcmUoZW50cnk6IEdpdEh1YkluZGV4RW50cnksIHF1ZXJ5VG9rZW5zOiBzdHJpbmdbXSwgcXVlcnk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKHF1ZXJ5VG9rZW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDE7IC8vIERlZmF1bHQgc2NvcmUgZm9yIGVtcHR5IHF1ZXJ5XG4gICAgXG4gICAgbGV0IHNjb3JlID0gMDtcbiAgICBcbiAgICBjb25zdCBuYW1lID0gZW50cnkubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGVudHJ5LmRlc2NyaXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHBhdGggPSAoZW50cnkucGF0aCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICAvLyBDaGVjayBuYW1lIG1hdGNoZXNcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHF1ZXJ5VG9rZW5zKSB7XG4gICAgICBpZiAobmFtZS5pbmNsdWRlcyh0b2tlbikpIHtcbiAgICAgICAgc2NvcmUgKz0gbmFtZSA9PT0gdG9rZW4gPyAxMCA6IChuYW1lLnN0YXJ0c1dpdGgodG9rZW4pID8gNSA6IDIpO1xuICAgICAgfVxuICAgICAgaWYgKGRlc2NyaXB0aW9uLmluY2x1ZGVzKHRva2VuKSkge1xuICAgICAgICBzY29yZSArPSAzO1xuICAgICAgfVxuICAgICAgaWYgKHBhdGguaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHNjb3JlICs9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEV4YWN0IHF1ZXJ5IG1hdGNoIGJvbnVzXG4gICAgaWYgKG5hbWUuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIHNjb3JlICs9IHF1ZXJ5Lmxlbmd0aCA+IDMgPyAxNSA6IDEwO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc2NvcmU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgbWF0Y2ggc2NvcmUgZm9yIGNvbGxlY3Rpb24gZW50cmllc1xuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDb2xsZWN0aW9uTWF0Y2hTY29yZShlbnRyeTogQ29sbGVjdGlvbkluZGV4RW50cnksIHF1ZXJ5VG9rZW5zOiBzdHJpbmdbXSwgcXVlcnk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKHF1ZXJ5VG9rZW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDE7IC8vIERlZmF1bHQgc2NvcmUgZm9yIGVtcHR5IHF1ZXJ5XG4gICAgXG4gICAgbGV0IHNjb3JlID0gMDtcbiAgICBcbiAgICBjb25zdCBuYW1lID0gZW50cnkubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGVudHJ5LmRlc2NyaXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHBhdGggPSAoZW50cnkucGF0aCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB0YWdzID0gZW50cnkudGFncy5tYXAodGFnID0+IHRhZy50b0xvd2VyQ2FzZSgpKS5qb2luKCcgJyk7XG4gICAgXG4gICAgLy8gQ2hlY2sgbWF0Y2hlcyBhY3Jvc3MgYWxsIGZpZWxkc1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcXVlcnlUb2tlbnMpIHtcbiAgICAgIGlmIChuYW1lLmluY2x1ZGVzKHRva2VuKSkge1xuICAgICAgICBzY29yZSArPSBuYW1lID09PSB0b2tlbiA/IDEwIDogKG5hbWUuc3RhcnRzV2l0aCh0b2tlbikgPyA1IDogMik7XG4gICAgICB9XG4gICAgICBpZiAoZGVzY3JpcHRpb24uaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHNjb3JlICs9IDM7XG4gICAgICB9XG4gICAgICBpZiAocGF0aC5pbmNsdWRlcyh0b2tlbikpIHtcbiAgICAgICAgc2NvcmUgKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmICh0YWdzLmluY2x1ZGVzKHRva2VuKSkge1xuICAgICAgICBzY29yZSArPSA0O1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBFeGFjdCBxdWVyeSBtYXRjaCBib251c1xuICAgIGlmIChuYW1lLmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICBzY29yZSArPSBxdWVyeS5sZW5ndGggPiAzID8gMTUgOiAxMDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNjb3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZWxlbWVudHMgYnkgdHlwZSBhY3Jvc3Mgc291cmNlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRBbGxFbGVtZW50c0J5VHlwZShlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsIG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+IHtcbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+W10gPSBbXTtcbiAgICBcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlTG9jYWwpIHtcbiAgICAgIHByb21pc2VzLnB1c2godGhpcy5nZXRMb2NhbEVsZW1lbnRzQnlUeXBlKGVsZW1lbnRUeXBlKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmluY2x1ZGVHaXRIdWIpIHtcbiAgICAgIHByb21pc2VzLnB1c2godGhpcy5nZXRHaXRIdWJFbGVtZW50c0J5VHlwZShlbGVtZW50VHlwZSkpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlQ29sbGVjdGlvbikge1xuICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmdldENvbGxlY3Rpb25FbGVtZW50c0J5VHlwZShlbGVtZW50VHlwZSkpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgICBjb25zdCBhbGxSZXN1bHRzOiBVbmlmaWVkU2VhcmNoUmVzdWx0W10gPSBbXTtcbiAgICBcbiAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgICBhbGxSZXN1bHRzLnB1c2goLi4ucmVzdWx0LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gYWxsUmVzdWx0cztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBsb2NhbCBlbGVtZW50cyBieSB0eXBlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldExvY2FsRWxlbWVudHNCeVR5cGUoZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxvY2FsSW5kZXhNYW5hZ2VyLmdldEVsZW1lbnRzQnlUeXBlKGVsZW1lbnRUeXBlKTtcbiAgICAgIHJldHVybiBlbGVtZW50cy5tYXAoZW50cnkgPT4gKHtcbiAgICAgICAgc291cmNlOiAnbG9jYWwnIGFzIGNvbnN0LFxuICAgICAgICBlbnRyeTogdGhpcy5jb252ZXJ0TG9jYWxFbnRyeShlbnRyeSksXG4gICAgICAgIG1hdGNoVHlwZTogJ3R5cGUnLFxuICAgICAgICBzY29yZTogMSxcbiAgICAgICAgdmVyc2lvbjogZW50cnkubWV0YWRhdGEudmVyc2lvblxuICAgICAgfSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgZWxlbWVudHMgYnkgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRHaXRIdWJFbGVtZW50c0J5VHlwZShlbGVtZW50VHlwZTogRWxlbWVudFR5cGUpOiBQcm9taXNlPFVuaWZpZWRTZWFyY2hSZXN1bHRbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBnaXRodWJJbmRleCA9IGF3YWl0IHRoaXMuZ2l0aHViSW5kZXhlci5nZXRJbmRleCgpO1xuICAgICAgY29uc3QgZW50cmllcyA9IGdpdGh1YkluZGV4LmVsZW1lbnRzLmdldChlbGVtZW50VHlwZSkgfHwgW107XG4gICAgICBcbiAgICAgIHJldHVybiBlbnRyaWVzLm1hcChlbnRyeSA9PiAoe1xuICAgICAgICBzb3VyY2U6ICdnaXRodWInIGFzIGNvbnN0LFxuICAgICAgICBlbnRyeTogdGhpcy5jb252ZXJ0R2l0SHViRW50cnkoZW50cnkpLFxuICAgICAgICBtYXRjaFR5cGU6ICd0eXBlJyxcbiAgICAgICAgc2NvcmU6IDEsXG4gICAgICAgIHZlcnNpb246IGVudHJ5LnZlcnNpb25cbiAgICAgIH0pKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY29sbGVjdGlvbiBlbGVtZW50cyBieSB0eXBlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldENvbGxlY3Rpb25FbGVtZW50c0J5VHlwZShlbGVtZW50VHlwZTogRWxlbWVudFR5cGUpOiBQcm9taXNlPFVuaWZpZWRTZWFyY2hSZXN1bHRbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uSW5kZXggPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25JbmRleENhY2hlLmdldEluZGV4KCk7XG4gICAgICBjb25zdCBlbnRyaWVzID0gY29sbGVjdGlvbkluZGV4LmluZGV4W2VsZW1lbnRUeXBlLnRvU3RyaW5nKCldIHx8IFtdO1xuICAgICAgXG4gICAgICByZXR1cm4gZW50cmllcy5tYXAoZW50cnkgPT4gKHtcbiAgICAgICAgc291cmNlOiAnY29sbGVjdGlvbicgYXMgY29uc3QsXG4gICAgICAgIGVudHJ5OiB0aGlzLmNvbnZlcnRDb2xsZWN0aW9uRW50cnkoZW50cnksIGVsZW1lbnRUeXBlLnRvU3RyaW5nKCkpLFxuICAgICAgICBtYXRjaFR5cGU6ICd0eXBlJyxcbiAgICAgICAgc2NvcmU6IDEsXG4gICAgICAgIHZlcnNpb246IGVudHJ5LnZlcnNpb25cbiAgICAgIH0pKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxvY2FsIHBvcnRmb2xpbyBzdGF0aXN0aWNzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldExvY2FsU3RhdHMoKTogUHJvbWlzZTxVbmlmaWVkSW5kZXhTdGF0c1snbG9jYWwnXT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmxvY2FsSW5kZXhNYW5hZ2VyLmdldFN0YXRzKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgR2l0SHViIHBvcnRmb2xpbyBzdGF0aXN0aWNzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEdpdEh1YlN0YXRzKCk6IFByb21pc2U8VW5pZmllZEluZGV4U3RhdHNbJ2dpdGh1YiddPiB7XG4gICAgY29uc3QgY2FjaGVTdGF0cyA9IHRoaXMuZ2l0aHViSW5kZXhlci5nZXRDYWNoZVN0YXRzKCk7XG4gICAgY29uc3QgZ2l0aHViSW5kZXggPSBhd2FpdCB0aGlzLmdpdGh1YkluZGV4ZXIuZ2V0SW5kZXgoKTtcbiAgICBcbiAgICBjb25zdCBlbGVtZW50c0J5VHlwZTogUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+ID0ge30gYXMgUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+O1xuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIGVsZW1lbnRzQnlUeXBlW2VsZW1lbnRUeXBlXSA9IChnaXRodWJJbmRleC5lbGVtZW50cy5nZXQoZWxlbWVudFR5cGUpIHx8IFtdKS5sZW5ndGg7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbEVsZW1lbnRzOiBnaXRodWJJbmRleC50b3RhbEVsZW1lbnRzLFxuICAgICAgZWxlbWVudHNCeVR5cGUsXG4gICAgICBsYXN0RmV0Y2hlZDogY2FjaGVTdGF0cy5sYXN0RmV0Y2gsXG4gICAgICBpc1N0YWxlOiBjYWNoZVN0YXRzLmlzU3RhbGUsXG4gICAgICB1c2VybmFtZTogZ2l0aHViSW5kZXgudXNlcm5hbWUsXG4gICAgICByZXBvc2l0b3J5OiBnaXRodWJJbmRleC5yZXBvc2l0b3J5XG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBjb2xsZWN0aW9uIHBvcnRmb2xpbyBzdGF0aXN0aWNzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldENvbGxlY3Rpb25TdGF0cygpOiBQcm9taXNlPFVuaWZpZWRJbmRleFN0YXRzWydjb2xsZWN0aW9uJ10+IHtcbiAgICBjb25zdCBjYWNoZVN0YXRzID0gdGhpcy5jb2xsZWN0aW9uSW5kZXhDYWNoZS5nZXRDYWNoZVN0YXRzKCk7XG4gICAgY29uc3QgY29sbGVjdGlvbkluZGV4ID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uSW5kZXhDYWNoZS5nZXRJbmRleCgpO1xuICAgIFxuICAgIGNvbnN0IGVsZW1lbnRzQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgZm9yIChjb25zdCBbZWxlbWVudFR5cGUsIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbGxlY3Rpb25JbmRleC5pbmRleCkpIHtcbiAgICAgIGVsZW1lbnRzQnlUeXBlW2VsZW1lbnRUeXBlXSA9IGVudHJpZXMubGVuZ3RoO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxFbGVtZW50czogY29sbGVjdGlvbkluZGV4LnRvdGFsX2VsZW1lbnRzLFxuICAgICAgZWxlbWVudHNCeVR5cGUsXG4gICAgICBsYXN0RmV0Y2hlZDogY2FjaGVTdGF0cy5oYXNDYWNoZSA/IG5ldyBEYXRlKERhdGUubm93KCkgLSBjYWNoZVN0YXRzLmFnZSkgOiBudWxsLFxuICAgICAgaXNTdGFsZTogIWNhY2hlU3RhdHMuaXNWYWxpZCxcbiAgICAgIHZlcnNpb246IGNvbGxlY3Rpb25JbmRleC52ZXJzaW9uXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBkdXBsaWNhdGVzIGNvdW50IGFjcm9zcyBhbGwgc291cmNlc1xuICAgKlxuICAgKiBJZGVudGlmaWVzIGVsZW1lbnRzIHRoYXQgZXhpc3QgaW4gbXVsdGlwbGUgc291cmNlcyAobG9jYWwsIEdpdEh1YiwgY29sbGVjdGlvbilcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2FsY3VsYXRlRHVwbGljYXRlc0NvdW50KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgLy8gVHJhY2sgZHVwbGljYXRlcyB1c2luZyBhIG1hcCBvZiBlbGVtZW50IG5hbWVzIHRvIHNvdXJjZXNcbiAgICBjb25zdCBlbGVtZW50U291cmNlcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBsb2NhbCBpbmRleFxuICAgICAgY29uc3QgbG9jYWxJbmRleCA9IGF3YWl0IHRoaXMubG9jYWxJbmRleE1hbmFnZXIuZ2V0SW5kZXgoKTtcbiAgICAgIGlmIChsb2NhbEluZGV4Py5ieU5hbWUpIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZV0gb2YgbG9jYWxJbmRleC5ieU5hbWUpIHtcbiAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50U291cmNlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgZWxlbWVudFNvdXJjZXMuc2V0KG5hbWUsIG5ldyBTZXQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50U291cmNlcy5nZXQobmFtZSkhLmFkZCgnbG9jYWwnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgR2l0SHViIGluZGV4XG4gICAgICBjb25zdCBnaXRodWJJbmRleCA9IGF3YWl0IHRoaXMuZ2l0aHViSW5kZXhlci5nZXRJbmRleCgpO1xuICAgICAgaWYgKGdpdGh1YkluZGV4Py5lbGVtZW50cykge1xuICAgICAgICBmb3IgKGNvbnN0IFssIGVudHJpZXNdIG9mIGdpdGh1YkluZGV4LmVsZW1lbnRzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gZW50cnkubmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgIGlmICghZWxlbWVudFNvdXJjZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudFNvdXJjZXMuc2V0KG5hbWUsIG5ldyBTZXQoKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxlbWVudFNvdXJjZXMuZ2V0KG5hbWUpIS5hZGQoJ2dpdGh1YicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBjb2xsZWN0aW9uIGluZGV4XG4gICAgICBjb25zdCBjb2xsZWN0aW9uSW5kZXggPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25JbmRleENhY2hlLmdldEluZGV4KCk7XG4gICAgICBpZiAoY29sbGVjdGlvbkluZGV4Py5pbmRleCkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIGluIGNvbGxlY3Rpb25JbmRleC5pbmRleCkge1xuICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBjb2xsZWN0aW9uSW5kZXguaW5kZXhbZWxlbWVudFR5cGVdO1xuICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVudHJ5Lm5hbWU7XG4gICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRTb3VyY2VzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRTb3VyY2VzLnNldChuYW1lLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsZW1lbnRTb3VyY2VzLmdldChuYW1lKSEuYWRkKCdjb2xsZWN0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBlcnJvciBidXQgZG9uJ3QgZmFpbFxuICAgICAgbG9nZ2VyLmRlYnVnKCdFcnJvciBjYWxjdWxhdGluZyBkdXBsaWNhdGVzIGNvdW50JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gQ291bnQgZWxlbWVudHMgdGhhdCBhcHBlYXIgaW4gbW9yZSB0aGFuIG9uZSBzb3VyY2VcbiAgICBsZXQgZHVwbGljYXRlQ291bnQgPSAwO1xuICAgIGZvciAoY29uc3Qgc291cmNlcyBvZiBlbGVtZW50U291cmNlcy52YWx1ZXMoKSkge1xuICAgICAgaWYgKHNvdXJjZXMuc2l6ZSA+IDEpIHtcbiAgICAgICAgZHVwbGljYXRlQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZHVwbGljYXRlQ291bnQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBsb2NhbCBpbmRleCBlbnRyeSB0byB1bmlmaWVkIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0TG9jYWxFbnRyeShlbnRyeTogSW5kZXhFbnRyeSk6IFVuaWZpZWRJbmRleEVudHJ5IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZW50cnkubWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBlbnRyeS5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIHZlcnNpb246IGVudHJ5Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICBhdXRob3I6IGVudHJ5Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgIGVsZW1lbnRUeXBlOiBlbnRyeS5lbGVtZW50VHlwZSxcbiAgICAgIGxhc3RNb2RpZmllZDogZW50cnkubGFzdE1vZGlmaWVkLFxuICAgICAgc291cmNlOiAnbG9jYWwnLFxuICAgICAgbG9jYWxGaWxlUGF0aDogZW50cnkuZmlsZVBhdGgsXG4gICAgICBmaWxlbmFtZTogZW50cnkuZmlsZW5hbWUsXG4gICAgICB0YWdzOiBlbnRyeS5tZXRhZGF0YS50YWdzLFxuICAgICAga2V5d29yZHM6IGVudHJ5Lm1ldGFkYXRhLmtleXdvcmRzLFxuICAgICAgdHJpZ2dlcnM6IGVudHJ5Lm1ldGFkYXRhLnRyaWdnZXJzLFxuICAgICAgY2F0ZWdvcnk6IGVudHJ5Lm1ldGFkYXRhLmNhdGVnb3J5XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IEdpdEh1YiBpbmRleCBlbnRyeSB0byB1bmlmaWVkIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0R2l0SHViRW50cnkoZW50cnk6IEdpdEh1YkluZGV4RW50cnkpOiBVbmlmaWVkSW5kZXhFbnRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZW50cnkuZGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBlbnRyeS52ZXJzaW9uLFxuICAgICAgYXV0aG9yOiBlbnRyeS5hdXRob3IsXG4gICAgICBlbGVtZW50VHlwZTogZW50cnkuZWxlbWVudFR5cGUsXG4gICAgICBsYXN0TW9kaWZpZWQ6IGVudHJ5Lmxhc3RNb2RpZmllZCxcbiAgICAgIHNvdXJjZTogJ2dpdGh1YicsXG4gICAgICBnaXRodWJQYXRoOiBlbnRyeS5wYXRoLFxuICAgICAgZ2l0aHViU2hhOiBlbnRyeS5zaGEsXG4gICAgICBnaXRodWJIdG1sVXJsOiBlbnRyeS5odG1sVXJsLFxuICAgICAgZ2l0aHViRG93bmxvYWRVcmw6IGVudHJ5LmRvd25sb2FkVXJsLFxuICAgICAgZ2l0aHViU2l6ZTogZW50cnkuc2l6ZVxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb252ZXJ0IGNvbGxlY3Rpb24gaW5kZXggZW50cnkgdG8gdW5pZmllZCBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgY29udmVydENvbGxlY3Rpb25FbnRyeShlbnRyeTogQ29sbGVjdGlvbkluZGV4RW50cnksIGVsZW1lbnRUeXBlOiBzdHJpbmcpOiBVbmlmaWVkSW5kZXhFbnRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZW50cnkuZGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBlbnRyeS52ZXJzaW9uLFxuICAgICAgYXV0aG9yOiBlbnRyeS5hdXRob3IsXG4gICAgICBlbGVtZW50VHlwZTogdGhpcy5tYXBTdHJpbmdUb0VsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSxcbiAgICAgIGxhc3RNb2RpZmllZDogbmV3IERhdGUoZW50cnkuY3JlYXRlZCksXG4gICAgICBzb3VyY2U6ICdjb2xsZWN0aW9uJyxcbiAgICAgIGNvbGxlY3Rpb25QYXRoOiBlbnRyeS5wYXRoLFxuICAgICAgY29sbGVjdGlvblNoYTogZW50cnkuc2hhLFxuICAgICAgY29sbGVjdGlvblRhZ3M6IGVudHJ5LnRhZ3MsXG4gICAgICBjb2xsZWN0aW9uQ2F0ZWdvcnk6IGVudHJ5LmNhdGVnb3J5LFxuICAgICAgY29sbGVjdGlvbkxpY2Vuc2U6IGVudHJ5LmxpY2Vuc2VcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogTWFwIHN0cmluZyB0byBFbGVtZW50VHlwZSBlbnVtXG4gICAqL1xuICBwcml2YXRlIG1hcFN0cmluZ1RvRWxlbWVudFR5cGUoZWxlbWVudFR5cGU6IHN0cmluZyk6IEVsZW1lbnRUeXBlIHtcbiAgICAvLyBIYW5kbGUgbWFwcGluZyBmcm9tIGNvbGxlY3Rpb24gZWxlbWVudCB0eXBlcyB0byBvdXIgRWxlbWVudFR5cGUgZW51bVxuICAgIHN3aXRjaCAoZWxlbWVudFR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAncGVyc29uYXMnOlxuICAgICAgICByZXR1cm4gRWxlbWVudFR5cGUuUEVSU09OQTtcbiAgICAgIGNhc2UgJ3NraWxscyc6XG4gICAgICAgIHJldHVybiBFbGVtZW50VHlwZS5TS0lMTDtcbiAgICAgIGNhc2UgJ2FnZW50cyc6XG4gICAgICAgIHJldHVybiBFbGVtZW50VHlwZS5BR0VOVDtcbiAgICAgIGNhc2UgJ3Byb21wdHMnOlxuICAgICAgY2FzZSAndGVtcGxhdGVzJzpcbiAgICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlLlRFTVBMQVRFOyAvLyBNYXAgcHJvbXB0cyBhbmQgdGVtcGxhdGVzIHRvIFRFTVBMQVRFXG4gICAgICBjYXNlICd0b29scyc6XG4gICAgICAgIHJldHVybiBFbGVtZW50VHlwZS5TS0lMTDsgLy8gTWFwIHRvb2xzIHRvIFNLSUxMIGFzIGZhbGxiYWNrXG4gICAgICBjYXNlICdlbnNlbWJsZXMnOlxuICAgICAgICByZXR1cm4gRWxlbWVudFR5cGUuRU5TRU1CTEU7XG4gICAgICBjYXNlICdtZW1vcmllcyc6XG4gICAgICAgIHJldHVybiBFbGVtZW50VHlwZS5NRU1PUlk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gRWxlbWVudFR5cGUuU0tJTEw7IC8vIERlZmF1bHQgZmFsbGJhY2tcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb252ZXJ0IHVuaWZpZWQgc2VhcmNoIG9wdGlvbnMgdG8gbG9jYWwgc2VhcmNoIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgY29udmVydFRvTG9jYWxPcHRpb25zKG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogU2VhcmNoT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRUeXBlOiBvcHRpb25zLmVsZW1lbnRUeXBlLFxuICAgICAgbWF4UmVzdWx0czogb3B0aW9ucy5wYWdlU2l6ZSB8fCAyMFxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgbWF0Y2ggdHlwZSBmb3IgR2l0SHViIGVudHJpZXNcbiAgICovXG4gIHByaXZhdGUgZGV0ZXJtaW5lTWF0Y2hUeXBlKGVudHJ5OiBHaXRIdWJJbmRleEVudHJ5LCBxdWVyeVRva2Vuczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBlbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoZW50cnkuZGVzY3JpcHRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgXG4gICAgLy8gQ2hlY2sgd2hhdCBtYXRjaGVkXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBxdWVyeVRva2Vucykge1xuICAgICAgaWYgKG5hbWUuaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHJldHVybiBuYW1lID09PSB0b2tlbiA/ICdleGFjdF9uYW1lJyA6ICduYW1lJztcbiAgICAgIH1cbiAgICAgIGlmIChkZXNjcmlwdGlvbi5pbmNsdWRlcyh0b2tlbikpIHtcbiAgICAgICAgcmV0dXJuICdkZXNjcmlwdGlvbic7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiAnY29udGVudCc7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgbWF0Y2ggdHlwZSBmb3IgY29sbGVjdGlvbiBlbnRyaWVzXG4gICAqL1xuICBwcml2YXRlIGRldGVybWluZUNvbGxlY3Rpb25NYXRjaFR5cGUoZW50cnk6IENvbGxlY3Rpb25JbmRleEVudHJ5LCBxdWVyeVRva2Vuczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBlbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoZW50cnkuZGVzY3JpcHRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdGFncyA9IGVudHJ5LnRhZ3MubWFwKHRhZyA9PiB0YWcudG9Mb3dlckNhc2UoKSkuam9pbignICcpO1xuICAgIFxuICAgIC8vIENoZWNrIHdoYXQgbWF0Y2hlZFxuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcXVlcnlUb2tlbnMpIHtcbiAgICAgIGlmIChuYW1lLmluY2x1ZGVzKHRva2VuKSkge1xuICAgICAgICByZXR1cm4gbmFtZSA9PT0gdG9rZW4gPyAnZXhhY3RfbmFtZScgOiAnbmFtZSc7XG4gICAgICB9XG4gICAgICBpZiAoZGVzY3JpcHRpb24uaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHJldHVybiAnZGVzY3JpcHRpb24nO1xuICAgICAgfVxuICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHJldHVybiAndGFnJztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuICdjb250ZW50JztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBwYXRoIGZyb20gdW5pZmllZCBlbnRyeVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQYXRoRnJvbUVudHJ5KGVudHJ5OiBVbmlmaWVkSW5kZXhFbnRyeSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChlbnRyeS5zb3VyY2UpIHtcbiAgICAgIGNhc2UgJ2xvY2FsJzpcbiAgICAgICAgcmV0dXJuIGVudHJ5LmxvY2FsRmlsZVBhdGggfHwgZW50cnkuZmlsZW5hbWUgfHwgJ3Vua25vd24nO1xuICAgICAgY2FzZSAnZ2l0aHViJzpcbiAgICAgICAgcmV0dXJuIGVudHJ5LmdpdGh1YlBhdGggfHwgJ3Vua25vd24nO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBlbnRyeS5jb2xsZWN0aW9uUGF0aCB8fCAndW5rbm93bic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIERldGVjdCB2ZXJzaW9uIGNvbmZsaWN0IGZyb20gc291cmNlc1xuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RWZXJzaW9uQ29uZmxpY3Qoc291cmNlczogRHVwbGljYXRlSW5mb1snc291cmNlcyddKTogVmVyc2lvbkNvbmZsaWN0IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2ZXJzaW9ucyA9IG5ldyBNYXA8c3RyaW5nLCAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbic+KCk7XG4gICAgXG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgaWYgKHNvdXJjZS52ZXJzaW9uICYmIHNvdXJjZS52ZXJzaW9uICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgdmVyc2lvbnMuc2V0KHNvdXJjZS52ZXJzaW9uLCBzb3VyY2Uuc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKHZlcnNpb25zLnNpemUgPD0gMSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gTm8gY29uZmxpY3QgaWYgYWxsIHZlcnNpb25zIGFyZSB0aGUgc2FtZSBvciBtaXNzaW5nXG4gICAgfVxuICAgIFxuICAgIC8vIEJ1aWxkIHZlcnNpb24gY29uZmxpY3QgaW5mb1xuICAgIGNvbnN0IHZlcnNpb25Db25mbGljdDogVmVyc2lvbkNvbmZsaWN0ID0ge1xuICAgICAgcmVjb21tZW5kZWQ6ICdsb2NhbCcsXG4gICAgICByZWFzb246ICdNdWx0aXBsZSB2ZXJzaW9ucyBkZXRlY3RlZCdcbiAgICB9O1xuICAgIFxuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgIGlmIChzb3VyY2UudmVyc2lvbikge1xuICAgICAgICB2ZXJzaW9uQ29uZmxpY3Rbc291cmNlLnNvdXJjZV0gPSBzb3VyY2UudmVyc2lvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRGV0ZXJtaW5lIHJlY29tbWVuZGF0aW9uXG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSB0aGlzLmRldGVybWluZVZlcnNpb25SZWNvbW1lbmRhdGlvbkZyb21Tb3VyY2VzKHNvdXJjZXMpO1xuICAgIHZlcnNpb25Db25mbGljdC5yZWNvbW1lbmRlZCA9IHJlY29tbWVuZGF0aW9uLnNvdXJjZTtcbiAgICB2ZXJzaW9uQ29uZmxpY3QucmVhc29uID0gcmVjb21tZW5kYXRpb24ucmVhc29uO1xuICAgIFxuICAgIHJldHVybiB2ZXJzaW9uQ29uZmxpY3Q7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZXRlY3QgdmVyc2lvbiBjb25mbGljdCBmcm9tIHNlYXJjaCByZXN1bHRzXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFZlcnNpb25Db25mbGljdEZyb21SZXN1bHRzKHJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSk6IFZlcnNpb25Db25mbGljdCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc291cmNlcyA9IHJlc3VsdHMubWFwKHJlc3VsdCA9PiAoe1xuICAgICAgc291cmNlOiByZXN1bHQuc291cmNlLFxuICAgICAgdmVyc2lvbjogcmVzdWx0LnZlcnNpb24sXG4gICAgICBsYXN0TW9kaWZpZWQ6IHJlc3VsdC5lbnRyeS5sYXN0TW9kaWZpZWQsXG4gICAgICBwYXRoOiB0aGlzLmdldFBhdGhGcm9tRW50cnkocmVzdWx0LmVudHJ5KVxuICAgIH0pKTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5kZXRlY3RWZXJzaW9uQ29uZmxpY3Qoc291cmNlcyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgdmVyc2lvbiByZWNvbW1lbmRhdGlvbiBmcm9tIHZlcnNpb24gaW5mb1xuICAgKi9cbiAgcHJpdmF0ZSBkZXRlcm1pbmVWZXJzaW9uUmVjb21tZW5kYXRpb24odmVyc2lvbnM6IFZlcnNpb25JbmZvWyd2ZXJzaW9ucyddKTogeyBzb3VyY2U6ICdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJzsgcmVhc29uOiBzdHJpbmcgfSB7XG4gICAgLy8gUHJlZmVyIGxvY2FsIGlmIGF2YWlsYWJsZSBhbmQgbm90IHRvbyBvbGRcbiAgICBpZiAodmVyc2lvbnMubG9jYWwpIHtcbiAgICAgIGNvbnN0IGxvY2FsQWdlID0gRGF0ZS5ub3coKSAtIHZlcnNpb25zLmxvY2FsLmxhc3RNb2RpZmllZC5nZXRUaW1lKCk7XG4gICAgICBjb25zdCBzZXZlbkRheXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAgIFxuICAgICAgaWYgKGxvY2FsQWdlIDwgc2V2ZW5EYXlzKSB7XG4gICAgICAgIHJldHVybiB7IHNvdXJjZTogJ2xvY2FsJywgcmVhc29uOiAnTG9jYWwgdmVyc2lvbiBpcyByZWNlbnQgYW5kIGF1dGhvcml0YXRpdmUnIH07XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENvbXBhcmUgdmVyc2lvbnMgaWYgYXZhaWxhYmxlXG4gICAgY29uc3QgdmVyc2lvbkVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2ZXJzaW9ucykuZmlsdGVyKChbXywgaW5mb10pID0+IGluZm8/LnZlcnNpb24pO1xuICAgIFxuICAgIGlmICh2ZXJzaW9uRW50cmllcy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBGaW5kIGhpZ2hlc3QgdmVyc2lvblxuICAgICAgbGV0IGhpZ2hlc3Q6IHsgc291cmNlOiAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbic7IHZlcnNpb246IHN0cmluZyB9ID0ge1xuICAgICAgICBzb3VyY2U6ICdsb2NhbCcsXG4gICAgICAgIHZlcnNpb246ICcwLjAuMCdcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGZvciAoY29uc3QgW3NvdXJjZSwgaW5mb10gb2YgdmVyc2lvbkVudHJpZXMpIHtcbiAgICAgICAgaWYgKGluZm8gJiYgdGhpcy5jb21wYXJlVmVyc2lvbnMoaW5mby52ZXJzaW9uLCBoaWdoZXN0LnZlcnNpb24pID4gMCkge1xuICAgICAgICAgIGhpZ2hlc3QgPSB7XG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSBhcyAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbicsXG4gICAgICAgICAgICB2ZXJzaW9uOiBpbmZvLnZlcnNpb25cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB7IHNvdXJjZTogaGlnaGVzdC5zb3VyY2UsIHJlYXNvbjogYEhpZ2hlc3QgdmVyc2lvbiAoJHtoaWdoZXN0LnZlcnNpb259KWAgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gRmFsbGJhY2sgdG8gbW9zdCByZWNlbnRcbiAgICBsZXQgbW9zdFJlY2VudDogeyBzb3VyY2U6ICdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJzsgZGF0ZTogRGF0ZSB9ID0ge1xuICAgICAgc291cmNlOiAnbG9jYWwnLFxuICAgICAgZGF0ZTogbmV3IERhdGUoMClcbiAgICB9O1xuICAgIFxuICAgIGZvciAoY29uc3QgW3NvdXJjZSwgaW5mb10gb2YgT2JqZWN0LmVudHJpZXModmVyc2lvbnMpKSB7XG4gICAgICBpZiAoaW5mbyAmJiBpbmZvLmxhc3RNb2RpZmllZCA+IG1vc3RSZWNlbnQuZGF0ZSkge1xuICAgICAgICBtb3N0UmVjZW50ID0ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlIGFzICdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgICBkYXRlOiBpbmZvLmxhc3RNb2RpZmllZFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4geyBzb3VyY2U6IG1vc3RSZWNlbnQuc291cmNlLCByZWFzb246ICdNb3N0IHJlY2VudGx5IG1vZGlmaWVkJyB9O1xuICB9XG4gIFxuICAvKipcbiAgICogRGV0ZXJtaW5lIHZlcnNpb24gcmVjb21tZW5kYXRpb24gZnJvbSBzb3VyY2VzXG4gICAqL1xuICBwcml2YXRlIGRldGVybWluZVZlcnNpb25SZWNvbW1lbmRhdGlvbkZyb21Tb3VyY2VzKHNvdXJjZXM6IER1cGxpY2F0ZUluZm9bJ3NvdXJjZXMnXSk6IHsgc291cmNlOiAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbic7IHJlYXNvbjogc3RyaW5nIH0ge1xuICAgIC8vIENvbnZlcnQgc291cmNlcyB0byB2ZXJzaW9ucyBmb3JtYXRcbiAgICBjb25zdCB2ZXJzaW9uczogVmVyc2lvbkluZm9bJ3ZlcnNpb25zJ10gPSB7fTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICBpZiAoc291cmNlLnNvdXJjZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICB2ZXJzaW9ucy5sb2NhbCA9IHtcbiAgICAgICAgICB2ZXJzaW9uOiBzb3VyY2UudmVyc2lvbiB8fCAndW5rbm93bicsXG4gICAgICAgICAgbGFzdE1vZGlmaWVkOiBzb3VyY2UubGFzdE1vZGlmaWVkLFxuICAgICAgICAgIHBhdGg6IHNvdXJjZS5wYXRoIHx8ICd1bmtub3duJ1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChzb3VyY2Uuc291cmNlID09PSAnZ2l0aHViJykge1xuICAgICAgICB2ZXJzaW9ucy5naXRodWIgPSB7XG4gICAgICAgICAgdmVyc2lvbjogc291cmNlLnZlcnNpb24gfHwgJ3Vua25vd24nLFxuICAgICAgICAgIGxhc3RNb2RpZmllZDogc291cmNlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgICBwYXRoOiBzb3VyY2UucGF0aCB8fCAndW5rbm93bidcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoc291cmNlLnNvdXJjZSA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgICAgIHZlcnNpb25zLmNvbGxlY3Rpb24gPSB7XG4gICAgICAgICAgdmVyc2lvbjogc291cmNlLnZlcnNpb24gfHwgJ3Vua25vd24nLFxuICAgICAgICAgIGxhc3RNb2RpZmllZDogc291cmNlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgICBwYXRoOiBzb3VyY2UucGF0aCB8fCAndW5rbm93bidcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuZGV0ZXJtaW5lVmVyc2lvblJlY29tbWVuZGF0aW9uKHZlcnNpb25zKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENvbXBhcmUgc2VtYW50aWMgdmVyc2lvbnNcbiAgICovXG4gIHByaXZhdGUgY29tcGFyZVZlcnNpb25zKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYXJzZVZlcnNpb24gPSAodmVyc2lvbjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHZlcnNpb24uc3BsaXQoJy4nKS5tYXAocGFydCA9PiBwYXJzZUludChwYXJ0KSB8fCAwKTtcbiAgICAgIHJldHVybiBbcGFydHNbMF0gfHwgMCwgcGFydHNbMV0gfHwgMCwgcGFydHNbMl0gfHwgMF07XG4gICAgfTtcbiAgICBcbiAgICBjb25zdCBbYU1ham9yLCBhTWlub3IsIGFQYXRjaF0gPSBwYXJzZVZlcnNpb24oYSk7XG4gICAgY29uc3QgW2JNYWpvciwgYk1pbm9yLCBiUGF0Y2hdID0gcGFyc2VWZXJzaW9uKGIpO1xuICAgIFxuICAgIGlmIChhTWFqb3IgIT09IGJNYWpvcikgcmV0dXJuIGFNYWpvciAtIGJNYWpvcjtcbiAgICBpZiAoYU1pbm9yICE9PSBiTWlub3IpIHJldHVybiBhTWlub3IgLSBiTWlub3I7XG4gICAgcmV0dXJuIGFQYXRjaCAtIGJQYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZHVwbGljYXRlIHJlc3VsdHMgYmFzZWQgb24gbmFtZSBhbmQgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBkZWR1cGxpY2F0ZVJlc3VsdHMocmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdKTogVW5pZmllZFNlYXJjaFJlc3VsdFtdIHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgZGVkdXBsaWNhdGVkOiBVbmlmaWVkU2VhcmNoUmVzdWx0W10gPSBbXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtyZXN1bHQuZW50cnkuZWxlbWVudFR5cGV9OiR7cmVzdWx0LmVudHJ5Lm5hbWUudG9Mb3dlckNhc2UoKX1gO1xuICAgICAgaWYgKCFzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIGRlZHVwbGljYXRlZC5wdXNoKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkZWR1cGxpY2F0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzIGJhc2VkIG9uIG5hbWUgYW5kIHR5cGVcbiAgICovXG4gIHByaXZhdGUgZGVkdXBsaWNhdGVFbnRyaWVzKGVudHJpZXM6IFVuaWZpZWRJbmRleEVudHJ5W10pOiBVbmlmaWVkSW5kZXhFbnRyeVtdIHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgZGVkdXBsaWNhdGVkOiBVbmlmaWVkSW5kZXhFbnRyeVtdID0gW107XG4gICAgXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtlbnRyeS5lbGVtZW50VHlwZX06JHtlbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCl9YDtcbiAgICAgIGlmICghc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICBkZWR1cGxpY2F0ZWQucHVzaChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkZWR1cGxpY2F0ZWQ7XG4gIH1cbiAgXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBFUkZPUk1BTkNFIE1PTklUT1JJTkcgQU5EIE9QVElNSVpBVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBcbiAgLyoqXG4gICAqIFN0cmVhbSBzZWFyY2ggcmVzdWx0cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIHdpdGggbGFyZ2UgZGF0YXNldHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3RyZWFtU2VhcmNoKG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+IHtcbiAgICBjb25zdCB7IHF1ZXJ5LCBjdXJzb3IsIG1heFJlc3VsdHMgPSAxMDAwIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBzdHJlYW1pbmcgc2VhcmNoJywgeyBxdWVyeTogcXVlcnkuc3Vic3RyaW5nKDAsIDUwKSwgY3Vyc29yLCBtYXhSZXN1bHRzIH0pO1xuICAgIFxuICAgIGNvbnN0IHJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSA9IFtdO1xuICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLmdldEVuYWJsZWRTb3VyY2VzKG9wdGlvbnMpO1xuICAgIFxuICAgIC8vIFByb2Nlc3Mgc291cmNlcyBpbiBzZXF1ZW5jZSBmb3IgbWVtb3J5IGVmZmljaWVuY3lcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPj0gbWF4UmVzdWx0cykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc291cmNlUmVzdWx0cyA9IGF3YWl0IHRoaXMuc2VhcmNoV2l0aEZhbGxiYWNrKHNvdXJjZSwgcXVlcnksIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIHBhZ2VTaXplOiBNYXRoLm1pbih0aGlzLkJBVENIX1NJWkUsIG1heFJlc3VsdHMgLSByZXN1bHRzLmxlbmd0aClcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXN1bHRzLnB1c2goLi4uc291cmNlUmVzdWx0cyk7XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgY3Vyc29yIGluZm9ybWF0aW9uIGZvciBwYWdpbmF0aW9uXG4gICAgICAgIHNvdXJjZVJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpbmRleCkgPT4ge1xuICAgICAgICAgIHJlc3VsdC5jdXJzb3IgPSB0aGlzLmdlbmVyYXRlQ3Vyc29yKHNvdXJjZSwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgU3RyZWFtaW5nIHNlYXJjaCBmYWlsZWQgZm9yIHNvdXJjZSAke3NvdXJjZX1gLCB7XG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKCdTdHJlYW1pbmcgc2VhcmNoIGNvbXBsZXRlZCcsIHtcbiAgICAgIHJlc3VsdENvdW50OiByZXN1bHRzLmxlbmd0aCxcbiAgICAgIGR1cmF0aW9uOiBgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfW1zYFxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIFxuICAvKipcbiAgICogUHJvY2VzcyBzZWFyY2ggcmVzdWx0cyB3aXRoIG1lbW9yeS1lZmZpY2llbnQgYmF0Y2hpbmdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1NlYXJjaFJlc3VsdHNPcHRpbWl6ZWQocmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgXG4gICAgLy8gUHJvY2VzcyBpbiBiYXRjaGVzIHRvIGF2b2lkIG1lbW9yeSBzcGlrZXMgd2l0aCBsYXJnZSByZXN1bHQgc2V0c1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IE1hdGgubWluKHRoaXMuQkFUQ0hfU0laRSwgcmVzdWx0cy5sZW5ndGgpO1xuICAgIGNvbnN0IHByb2Nlc3NlZFJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSA9IFtdO1xuICAgIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IHJlc3VsdHMuc2xpY2UoaSwgaSArIGJhdGNoU2l6ZSk7XG4gICAgICBcbiAgICAgIC8vIEFwcGx5IHNtYXJ0IHJhbmtpbmdcbiAgICAgIGNvbnN0IHJhbmtlZEJhdGNoID0gdGhpcy5hcHBseVNtYXJ0UmFua2luZyhiYXRjaCwgb3B0aW9ucyk7XG4gICAgICBcbiAgICAgIC8vIERldGVjdCBkdXBsaWNhdGVzIGFuZCBjb25mbGljdHNcbiAgICAgIGNvbnN0IHByb2Nlc3NlZEJhdGNoID0gYXdhaXQgdGhpcy5kZXRlY3REdXBsaWNhdGVzQW5kQ29uZmxpY3RzKHJhbmtlZEJhdGNoKTtcbiAgICAgIFxuICAgICAgcHJvY2Vzc2VkUmVzdWx0cy5wdXNoKC4uLnByb2Nlc3NlZEJhdGNoKTtcbiAgICAgIFxuICAgICAgLy8gWWllbGQgY29udHJvbCB0byBwcmV2ZW50IGJsb2NraW5nXG4gICAgICBpZiAoaSAlIChiYXRjaFNpemUgKiA0KSA9PT0gMCkge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGx5IGZpbmFsIHNvcnRpbmdcbiAgICByZXR1cm4gdGhpcy5hcHBseVNvcnRpbmcocHJvY2Vzc2VkUmVzdWx0cywgb3B0aW9ucy5zb3J0QnkgfHwgJ3JlbGV2YW5jZScsIG9wdGlvbnMucXVlcnkpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGVuYWJsZWQgc2VhcmNoIHNvdXJjZXNcbiAgICovXG4gIHByaXZhdGUgZ2V0RW5hYmxlZFNvdXJjZXMob3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMpOiAoJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nKVtdIHtcbiAgICBjb25zdCBzb3VyY2VzOiAoJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nKVtdID0gW107XG4gICAgXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZUxvY2FsICE9PSBmYWxzZSkgc291cmNlcy5wdXNoKCdsb2NhbCcpO1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVHaXRIdWIgIT09IGZhbHNlKSBzb3VyY2VzLnB1c2goJ2dpdGh1YicpO1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVDb2xsZWN0aW9uID09PSB0cnVlKSBzb3VyY2VzLnB1c2goJ2NvbGxlY3Rpb24nKTtcbiAgICBcbiAgICByZXR1cm4gc291cmNlcztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEJhdGNoIHNvdXJjZXMgZm9yIGNvbmN1cnJlbnQgcHJvY2Vzc2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBiYXRjaFNvdXJjZXMoc291cmNlczogKCdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJylbXSwgYmF0Y2hTaXplOiBudW1iZXIpOiAoJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nKVtdW10ge1xuICAgIGNvbnN0IGJhdGNoZXM6ICgnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbicpW11bXSA9IFtdO1xuICAgIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlcy5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICBiYXRjaGVzLnB1c2goc291cmNlcy5zbGljZShpLCBpICsgYmF0Y2hTaXplKSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBiYXRjaGVzO1xuICB9XG4gIFxuICAvKipcbiAgICogR2VuZXJhdGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlQ3Vyc29yKHNvdXJjZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShgJHtzb3VyY2V9OiR7aW5kZXh9OiR7dGltZXN0YW1wfWApLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFRyaWdnZXIgbWVtb3J5IGNsZWFudXAgd2hlbiB1c2FnZSBpcyBoaWdoXG4gICAqL1xuICBwcml2YXRlIHRyaWdnZXJNZW1vcnlDbGVhbnVwKCk6IHZvaWQge1xuICAgIC8vIEZvcmNlIGNhY2hlIGNsZWFudXBcbiAgICB0aGlzLnJlc3VsdENhY2hlLmNsZWFudXAoKTtcbiAgICB0aGlzLmluZGV4Q2FjaGUuY2xlYW51cCgpO1xuICAgIFxuICAgIC8vIFN1Z2dlc3QgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gICAgaWYgKGdsb2JhbC5nYykge1xuICAgICAgZ2xvYmFsLmdjKCk7XG4gICAgICBsb2dnZXIuZGVidWcoJ1RyaWdnZXJlZCBnYXJiYWdlIGNvbGxlY3Rpb24nKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBSZWNvcmQgc2VhcmNoIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICovXG4gIHByaXZhdGUgcmVjb3JkU2VhcmNoTWV0cmljcyhtZXRyaWNzOiBTZWFyY2hNZXRyaWNzKTogdm9pZCB7XG4gICAgdGhpcy5wZXJmb3JtYW5jZU1vbml0b3IucmVjb3JkU2VhcmNoKG1ldHJpY3MpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBjYWNoZSBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAgY29uc3QgY2FjaGVTdGF0cyA9IHRoaXMucmVzdWx0Q2FjaGUuZ2V0U3RhdHMoKTtcbiAgICB0aGlzLnBlcmZvcm1hbmNlTW9uaXRvci5yZWNvcmRDYWNoZVBlcmZvcm1hbmNlKCdzZWFyY2hSZXN1bHRzJywge1xuICAgICAgaGl0UmF0ZTogY2FjaGVTdGF0cy5oaXRSYXRlLFxuICAgICAgYXZnSGl0VGltZTogMSwgLy8gUGxhY2Vob2xkZXJcbiAgICAgIGF2Z01pc3NUaW1lOiA1LCAvLyBQbGFjZWhvbGRlclxuICAgICAgdG90YWxIaXRzOiBjYWNoZVN0YXRzLmhpdENvdW50LFxuICAgICAgdG90YWxNaXNzZXM6IGNhY2hlU3RhdHMubWlzc0NvdW50LFxuICAgICAgZXZpY3Rpb25zOiBjYWNoZVN0YXRzLmV2aWN0aW9uQ291bnRcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENyZWF0ZSBjYWNoZSBrZXkgZm9yIHNlYXJjaCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNhY2hlS2V5KG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcXVlcnk6IG9wdGlvbnMucXVlcnksXG4gICAgICBpbmNsdWRlTG9jYWw6IG9wdGlvbnMuaW5jbHVkZUxvY2FsLFxuICAgICAgaW5jbHVkZUdpdEh1Yjogb3B0aW9ucy5pbmNsdWRlR2l0SHViLFxuICAgICAgaW5jbHVkZUNvbGxlY3Rpb246IG9wdGlvbnMuaW5jbHVkZUNvbGxlY3Rpb24sXG4gICAgICBlbGVtZW50VHlwZTogb3B0aW9ucy5lbGVtZW50VHlwZSxcbiAgICAgIHBhZ2U6IG9wdGlvbnMucGFnZSxcbiAgICAgIHBhZ2VTaXplOiBvcHRpb25zLnBhZ2VTaXplLFxuICAgICAgc29ydEJ5OiBvcHRpb25zLnNvcnRCeSxcbiAgICAgIGxhenlMb2FkOiBvcHRpb25zLmxhenlMb2FkXG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgcGVyZm9ybWFuY2Ugc3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIGdldFBlcmZvcm1hbmNlU3RhdHMoKToge1xuICAgIHNlYXJjaFN0YXRzOiBhbnk7XG4gICAgbWVtb3J5U3RhdHM6IGFueTtcbiAgICBjYWNoZVN0YXRzOiBhbnk7XG4gICAgdHJlbmRzOiBhbnk7XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBzZWFyY2hTdGF0czogdGhpcy5wZXJmb3JtYW5jZU1vbml0b3IuZ2V0U2VhcmNoU3RhdHMoKSxcbiAgICAgIG1lbW9yeVN0YXRzOiB0aGlzLnBlcmZvcm1hbmNlTW9uaXRvci5nZXRNZW1vcnlTdGF0cygpLFxuICAgICAgY2FjaGVTdGF0czoge1xuICAgICAgICBzZWFyY2hSZXN1bHRzOiB0aGlzLnJlc3VsdENhY2hlLmdldFN0YXRzKCksXG4gICAgICAgIGluZGV4Q2FjaGU6IHRoaXMuaW5kZXhDYWNoZS5nZXRTdGF0cygpXG4gICAgICB9LFxuICAgICAgdHJlbmRzOiB0aGlzLnBlcmZvcm1hbmNlTW9uaXRvci5hbmFseXplVHJlbmRzKClcbiAgICB9O1xuICB9XG59Il19
1488
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pZmllZEluZGV4TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vVW5pZmllZEluZGV4TWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxxQkFBcUIsRUFBMkMsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RyxPQUFPLEVBQUUsc0JBQXNCLEVBQTBDLE1BQU0sNkJBQTZCLENBQUM7QUFDN0csT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBWSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQWlCLE1BQU0sZ0NBQWdDLENBQUM7QUFFbkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBOElqRSxNQUFNLE9BQU8sbUJBQW1CO0lBQ3RCLE1BQU0sQ0FBQyxRQUFRLEdBQStCLElBQUksQ0FBQztJQUVuRCxpQkFBaUIsQ0FBd0I7SUFDekMsYUFBYSxDQUF5QjtJQUN0QyxvQkFBb0IsQ0FBdUI7SUFDM0MsWUFBWSxDQUFlO0lBRW5DLHFDQUFxQztJQUM3QixrQkFBa0IsQ0FBcUI7SUFDdkMsV0FBVyxDQUFrQztJQUM3QyxVQUFVLENBQWdCO0lBQ2pC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LGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRTtnQkFDMUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO2FBQ3ZDO1lBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUU7U0FDaEQsQ0FBQztJQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVuaWZpZWQgSW5kZXggTWFuYWdlciAtIENvbWJpbmVzIGxvY2FsLCBHaXRIdWIsIGFuZCBjb2xsZWN0aW9uIHBvcnRmb2xpbyBpbmRleGluZ1xuICogXG4gKiBGZWF0dXJlczpcbiAqIC0gVW5pZmllZCBzZWFyY2ggYWNyb3NzIGxvY2FsLCBHaXRIdWIsIGFuZCBjb2xsZWN0aW9uIHBvcnRmb2xpb3NcbiAqIC0gSW50ZWxsaWdlbnQgcmVzdWx0IG1lcmdpbmcgYW5kIGRlZHVwbGljYXRpb25cbiAqIC0gVmVyc2lvbiBjb25mbGljdCBkZXRlY3Rpb24gYW5kIHJlc29sdXRpb25cbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHdpdGggcGFyYWxsZWwgaW5kZXhpbmdcbiAqIC0gQWR2YW5jZWQgZmFsbGJhY2sgc3RyYXRlZ2llcyBmb3IgcmVzaWxpZW50IG9wZXJhdGlvblxuICogLSBDb21wcmVoZW5zaXZlIHNlYXJjaCBjYXBhYmlsaXRpZXMgd2l0aCBwYWdpbmF0aW9uXG4gKiAtIFNtYXJ0IHJlc3VsdCByYW5raW5nIGFuZCBkdXBsaWNhdGUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLCBJbmRleEVudHJ5LCBTZWFyY2hSZXN1bHQsIFNlYXJjaE9wdGlvbnMgfSBmcm9tICcuL1BvcnRmb2xpb0luZGV4TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBHaXRIdWJQb3J0Zm9saW9JbmRleGVyLCBHaXRIdWJJbmRleEVudHJ5LCBHaXRIdWJQb3J0Zm9saW9JbmRleCB9IGZyb20gJy4vR2l0SHViUG9ydGZvbGlvSW5kZXhlci5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uSW5kZXhDYWNoZSB9IGZyb20gJy4uL2NhY2hlL0NvbGxlY3Rpb25JbmRleENhY2hlLmpzJztcbmltcG9ydCB7IEdpdEh1YkNsaWVudCB9IGZyb20gJy4uL2NvbGxlY3Rpb24vR2l0SHViQ2xpZW50LmpzJztcbmltcG9ydCB7IEFQSUNhY2hlIH0gZnJvbSAnLi4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgTFJVQ2FjaGUsIENhY2hlRmFjdG9yeSB9IGZyb20gJy4uL2NhY2hlL0xSVUNhY2hlLmpzJztcbmltcG9ydCB7IFBlcmZvcm1hbmNlTW9uaXRvciwgU2VhcmNoTWV0cmljcyB9IGZyb20gJy4uL3V0aWxzL1BlcmZvcm1hbmNlTW9uaXRvci5qcyc7XG5pbXBvcnQgeyBJbmRleEVudHJ5IGFzIENvbGxlY3Rpb25JbmRleEVudHJ5LCBDb2xsZWN0aW9uSW5kZXggfSBmcm9tICcuLi90eXBlcy9jb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBVbmlmaWVkU2VhcmNoT3B0aW9ucyB7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIGluY2x1ZGVMb2NhbD86IGJvb2xlYW47ICAgICAvLyBkZWZhdWx0IHRydWVcbiAgaW5jbHVkZUdpdEh1Yj86IGJvb2xlYW47ICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICBpbmNsdWRlQ29sbGVjdGlvbj86IGJvb2xlYW47IC8vIGRlZmF1bHQgZmFsc2VcbiAgZWxlbWVudFR5cGU/OiBFbGVtZW50VHlwZTtcbiAgcGFnZT86IG51bWJlcjtcbiAgcGFnZVNpemU/OiBudW1iZXI7XG4gIHNvcnRCeT86ICdyZWxldmFuY2UnIHwgJ3NvdXJjZScgfCAnbmFtZScgfCAndmVyc2lvbic7XG4gIHN0cmVhbVJlc3VsdHM/OiBib29sZWFuOyAvLyBFbmFibGUgcmVzdWx0IHN0cmVhbWluZ1xuICBjdXJzb3I/OiBzdHJpbmc7IC8vIEZvciBwYWdpbmF0aW9uIGN1cnNvclxuICBtYXhSZXN1bHRzPzogbnVtYmVyOyAvLyBIYXJkIGxpbWl0IG9uIHJlc3VsdHNcbiAgbGF6eUxvYWQ/OiBib29sZWFuOyAvLyBFbmFibGUgbGF6eSBsb2FkaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbkNvbmZsaWN0IHtcbiAgbG9jYWw/OiBzdHJpbmc7XG4gIGdpdGh1Yj86IHN0cmluZztcbiAgY29sbGVjdGlvbj86IHN0cmluZztcbiAgcmVjb21tZW5kZWQ6ICdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJztcbiAgcmVhc29uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHVwbGljYXRlSW5mbyB7XG4gIG5hbWU6IHN0cmluZztcbiAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBzb3VyY2VzOiBBcnJheTx7XG4gICAgc291cmNlOiAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbic7XG4gICAgdmVyc2lvbj86IHN0cmluZztcbiAgICBsYXN0TW9kaWZpZWQ6IERhdGU7XG4gICAgcGF0aD86IHN0cmluZztcbiAgfT47XG4gIGhhc1ZlcnNpb25Db25mbGljdDogYm9vbGVhbjtcbiAgdmVyc2lvbkNvbmZsaWN0PzogVmVyc2lvbkNvbmZsaWN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25JbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gIHZlcnNpb25zOiB7XG4gICAgbG9jYWw/OiB7IHZlcnNpb246IHN0cmluZzsgbGFzdE1vZGlmaWVkOiBEYXRlOyBwYXRoOiBzdHJpbmcgfTtcbiAgICBnaXRodWI/OiB7IHZlcnNpb246IHN0cmluZzsgbGFzdE1vZGlmaWVkOiBEYXRlOyBwYXRoOiBzdHJpbmcgfTtcbiAgICBjb2xsZWN0aW9uPzogeyB2ZXJzaW9uOiBzdHJpbmc7IGxhc3RNb2RpZmllZDogRGF0ZTsgcGF0aDogc3RyaW5nIH07XG4gIH07XG4gIHJlY29tbWVuZGVkOiB7XG4gICAgc291cmNlOiAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbic7XG4gICAgcmVhc29uOiBzdHJpbmc7XG4gIH07XG4gIHVwZGF0ZUF2YWlsYWJsZTogYm9vbGVhbjtcbiAgdXBkYXRlRnJvbT86ICdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVbmlmaWVkSW5kZXhFbnRyeSB7XG4gIC8vIENvbW1vbiBwcm9wZXJ0aWVzXG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGF1dGhvcj86IHN0cmluZztcbiAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBsYXN0TW9kaWZpZWQ6IERhdGU7XG4gIFxuICAvLyBTb3VyY2UgaW5mb3JtYXRpb25cbiAgc291cmNlOiAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbic7XG4gIFxuICAvLyBMb2NhbCBwcm9wZXJ0aWVzICh3aGVuIHNvdXJjZSA9PT0gJ2xvY2FsJylcbiAgbG9jYWxGaWxlUGF0aD86IHN0cmluZztcbiAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAga2V5d29yZHM/OiBzdHJpbmdbXTtcbiAgdHJpZ2dlcnM/OiBzdHJpbmdbXTtcbiAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIFxuICAvLyBHaXRIdWIgcHJvcGVydGllcyAod2hlbiBzb3VyY2UgPT09ICdnaXRodWInKVxuICBnaXRodWJQYXRoPzogc3RyaW5nO1xuICBnaXRodWJTaGE/OiBzdHJpbmc7XG4gIGdpdGh1Ykh0bWxVcmw/OiBzdHJpbmc7XG4gIGdpdGh1YkRvd25sb2FkVXJsPzogc3RyaW5nO1xuICBnaXRodWJTaXplPzogbnVtYmVyO1xuICBcbiAgLy8gQ29sbGVjdGlvbiBwcm9wZXJ0aWVzICh3aGVuIHNvdXJjZSA9PT0gJ2NvbGxlY3Rpb24nKVxuICBjb2xsZWN0aW9uUGF0aD86IHN0cmluZztcbiAgY29sbGVjdGlvblNoYT86IHN0cmluZztcbiAgY29sbGVjdGlvblRhZ3M/OiBzdHJpbmdbXTtcbiAgY29sbGVjdGlvbkNhdGVnb3J5Pzogc3RyaW5nO1xuICBjb2xsZWN0aW9uTGljZW5zZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVbmlmaWVkU2VhcmNoUmVzdWx0IHtcbiAgc291cmNlOiAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbic7XG4gIGVudHJ5OiBVbmlmaWVkSW5kZXhFbnRyeTtcbiAgbWF0Y2hUeXBlOiBzdHJpbmc7XG4gIHNjb3JlOiBudW1iZXI7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGlzRHVwbGljYXRlPzogYm9vbGVhbjtcbiAgdmVyc2lvbkNvbmZsaWN0PzogVmVyc2lvbkNvbmZsaWN0O1xuICBjdXJzb3I/OiBzdHJpbmc7IC8vIEZvciBzdHJlYW1pbmcgcGFnaW5hdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbWVkU2VhcmNoUmVzdWx0IHtcbiAgcmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdO1xuICBoYXNNb3JlOiBib29sZWFuO1xuICBuZXh0Q3Vyc29yPzogc3RyaW5nO1xuICB0b3RhbEVzdGltYXRlPzogbnVtYmVyO1xuICBwcm9jZXNzaW5nVGltZU1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVW5pZmllZEluZGV4U3RhdHMge1xuICBsb2NhbDoge1xuICAgIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgICBlbGVtZW50c0J5VHlwZTogUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+O1xuICAgIGxhc3RCdWlsdDogRGF0ZSB8IG51bGw7XG4gICAgaXNTdGFsZTogYm9vbGVhbjtcbiAgfTtcbiAgZ2l0aHViOiB7XG4gICAgdG90YWxFbGVtZW50czogbnVtYmVyO1xuICAgIGVsZW1lbnRzQnlUeXBlOiBSZWNvcmQ8RWxlbWVudFR5cGUsIG51bWJlcj47XG4gICAgbGFzdEZldGNoZWQ6IERhdGUgfCBudWxsO1xuICAgIGlzU3RhbGU6IGJvb2xlYW47XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgfTtcbiAgY29sbGVjdGlvbjoge1xuICAgIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgICBlbGVtZW50c0J5VHlwZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICBsYXN0RmV0Y2hlZDogRGF0ZSB8IG51bGw7XG4gICAgaXNTdGFsZTogYm9vbGVhbjtcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICB9O1xuICBjb21iaW5lZDoge1xuICAgIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgICB1bmlxdWVFbGVtZW50czogbnVtYmVyO1xuICAgIGR1cGxpY2F0ZXM6IG51bWJlcjtcbiAgfTtcbiAgcGVyZm9ybWFuY2U6IHtcbiAgICBhdmVyYWdlU2VhcmNoVGltZTogbnVtYmVyO1xuICAgIGNhY2hlSGl0UmF0ZTogbnVtYmVyO1xuICAgIGxhc3RPcHRpbWl6ZWQ6IERhdGUgfCBudWxsO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgVW5pZmllZEluZGV4TWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBVbmlmaWVkSW5kZXhNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIFxuICBwcml2YXRlIGxvY2FsSW5kZXhNYW5hZ2VyOiBQb3J0Zm9saW9JbmRleE1hbmFnZXI7XG4gIHByaXZhdGUgZ2l0aHViSW5kZXhlcjogR2l0SHViUG9ydGZvbGlvSW5kZXhlcjtcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uSW5kZXhDYWNoZTogQ29sbGVjdGlvbkluZGV4Q2FjaGU7XG4gIHByaXZhdGUgZ2l0aHViQ2xpZW50OiBHaXRIdWJDbGllbnQ7XG4gIFxuICAvLyBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGFuZCBjYWNoaW5nXG4gIHByaXZhdGUgcGVyZm9ybWFuY2VNb25pdG9yOiBQZXJmb3JtYW5jZU1vbml0b3I7XG4gIHByaXZhdGUgcmVzdWx0Q2FjaGU6IExSVUNhY2hlPFVuaWZpZWRTZWFyY2hSZXN1bHRbXT47XG4gIHByaXZhdGUgaW5kZXhDYWNoZTogTFJVQ2FjaGU8YW55PjtcbiAgcHJpdmF0ZSByZWFkb25seSBCQVRDSF9TSVpFID0gNTA7IC8vIEZvciBzdHJlYW1pbmcgcmVzdWx0c1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9DT05DVVJSRU5UX1NPVVJDRVMgPSAzO1xuICBcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmxvY2FsSW5kZXhNYW5hZ2VyID0gUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgdGhpcy5naXRodWJJbmRleGVyID0gR2l0SHViUG9ydGZvbGlvSW5kZXhlci5nZXRJbnN0YW5jZSgpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgR2l0SHViQ2xpZW50IHdpdGggcmVxdWlyZWQgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgYXBpQ2FjaGUgPSBuZXcgQVBJQ2FjaGUoKTtcbiAgICBjb25zdCByYXRlTGltaXRUcmFja2VyID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICAgIHRoaXMuZ2l0aHViQ2xpZW50ID0gbmV3IEdpdEh1YkNsaWVudChhcGlDYWNoZSwgcmF0ZUxpbWl0VHJhY2tlcik7XG4gICAgdGhpcy5jb2xsZWN0aW9uSW5kZXhDYWNoZSA9IG5ldyBDb2xsZWN0aW9uSW5kZXhDYWNoZSh0aGlzLmdpdGh1YkNsaWVudCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIGFuZCBjYWNoaW5nXG4gICAgdGhpcy5wZXJmb3JtYW5jZU1vbml0b3IgPSBQZXJmb3JtYW5jZU1vbml0b3IuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLnBlcmZvcm1hbmNlTW9uaXRvci5zdGFydE1vbml0b3JpbmcoKTtcbiAgICBcbiAgICB0aGlzLnJlc3VsdENhY2hlID0gQ2FjaGVGYWN0b3J5LmNyZWF0ZVNlYXJjaFJlc3VsdENhY2hlKHtcbiAgICAgIG1heFNpemU6IDIwMCxcbiAgICAgIG1heE1lbW9yeU1COiAxNSxcbiAgICAgIHR0bE1zOiA1ICogNjAgKiAxMDAwLCAvLyA1IG1pbnV0ZXNcbiAgICAgIG9uRXZpY3Rpb246IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2VhcmNoIHJlc3VsdCBjYWNoZSBldmljdGlvbicsIHsga2V5LCByZXN1bHRDb3VudDogdmFsdWUubGVuZ3RoIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuaW5kZXhDYWNoZSA9IENhY2hlRmFjdG9yeS5jcmVhdGVJbmRleENhY2hlKHtcbiAgICAgIG1heFNpemU6IDEwMCxcbiAgICAgIG1heE1lbW9yeU1COiAyMCxcbiAgICAgIHR0bE1zOiAxNSAqIDYwICogMTAwMCwgLy8gMTUgbWludXRlc1xuICAgICAgb25FdmljdGlvbjogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbmRleCBjYWNoZSBldmljdGlvbicsIHsga2V5IH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGxvZ2dlci5kZWJ1ZygnVW5pZmllZEluZGV4TWFuYWdlciBjcmVhdGVkIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uJyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFVuaWZpZWRJbmRleE1hbmFnZXIge1xuICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBVbmlmaWVkSW5kZXhNYW5hZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuaGFuY2VkIHNlYXJjaCBhY3Jvc3MgbG9jYWwsIEdpdEh1YiwgYW5kIGNvbGxlY3Rpb24gcG9ydGZvbGlvcyB3aXRoIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlYXJjaChzZWFyY2hPcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBtZW1vcnlCZWZvcmUgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQ7XG4gICAgY29uc3QgeyBxdWVyeSwgaW5jbHVkZUxvY2FsID0gdHJ1ZSwgaW5jbHVkZUdpdEh1YiA9IHRydWUsIGluY2x1ZGVDb2xsZWN0aW9uID0gZmFsc2UgfSA9IHNlYXJjaE9wdGlvbnM7XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIHF1ZXJ5IHRvIHByZXZlbnQgVW5pY29kZS1iYXNlZCBhdHRhY2tzXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHF1ZXJ5KTtcbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSB2YWxpZGF0aW9uUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIFVzZSBub3JtYWxpemVkIHF1ZXJ5IGluIGFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnNcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoT3B0aW9ucyA9IHtcbiAgICAgIC4uLnNlYXJjaE9wdGlvbnMsXG4gICAgICBxdWVyeTogbm9ybWFsaXplZFF1ZXJ5XG4gICAgfTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggKERNQ1AtU0VDLTAwNik6IEFkZCBhdWRpdCBsb2dnaW5nIGZvciBzZWN1cml0eSBtb25pdG9yaW5nXG4gICAgLy8gTG9nIHVuaWZpZWQgc2VhcmNoIG9wZXJhdGlvbnMgZm9yIHNlY3VyaXR5IGF1ZGl0IHRyYWlsXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1BPUlRGT0xJT19GRVRDSF9TVUNDRVNTJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1VuaWZpZWRJbmRleE1hbmFnZXIuc2VhcmNoJyxcbiAgICAgIGRldGFpbHM6IGBVbmlmaWVkIHNlYXJjaCBwZXJmb3JtZWQgd2l0aCBxdWVyeSBsZW5ndGg6ICR7bm9ybWFsaXplZFF1ZXJ5Lmxlbmd0aH0sIHNvdXJjZXM6ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBsb2NhbDogaW5jbHVkZUxvY2FsLFxuICAgICAgICBnaXRodWI6IGluY2x1ZGVHaXRIdWIsXG4gICAgICAgIGNvbGxlY3Rpb246IGluY2x1ZGVDb2xsZWN0aW9uXG4gICAgICB9KX1gXG4gICAgfSk7XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBvcHRpbWl6ZWQgdW5pZmllZCBwb3J0Zm9saW8gc2VhcmNoJywgbm9ybWFsaXplZFNlYXJjaE9wdGlvbnMpO1xuICAgIFxuICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0ICh1c2Ugbm9ybWFsaXplZCBzZWFyY2ggb3B0aW9ucylcbiAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuY3JlYXRlQ2FjaGVLZXkobm9ybWFsaXplZFNlYXJjaE9wdGlvbnMpO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmVzdWx0Q2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICB0aGlzLnJlY29yZFNlYXJjaE1ldHJpY3Moe1xuICAgICAgICBxdWVyeTogbm9ybWFsaXplZFF1ZXJ5LFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgcmVzdWx0Q291bnQ6IGNhY2hlZC5sZW5ndGgsXG4gICAgICAgIHNvdXJjZXM6IHRoaXMuZ2V0RW5hYmxlZFNvdXJjZXMobm9ybWFsaXplZFNlYXJjaE9wdGlvbnMpLFxuICAgICAgICBjYWNoZUhpdDogdHJ1ZSxcbiAgICAgICAgbWVtb3J5QmVmb3JlLFxuICAgICAgICBtZW1vcnlBZnRlcjogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKClcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdVc2luZyBjYWNoZWQgc2VhcmNoIHJlc3VsdHMnLCB7IHJlc3VsdENvdW50OiBjYWNoZWQubGVuZ3RoIH0pO1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBzdHJlYW1pbmcgc2VhcmNoIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBsYXJnZSByZXN1bHQgc2V0c1xuICAgICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2hPcHRpb25zLnN0cmVhbVJlc3VsdHMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RyZWFtU2VhcmNoKG5vcm1hbGl6ZWRTZWFyY2hPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTGF6eSBsb2FkaW5nOiBPbmx5IGxvYWQgaW5kaWNlcyB3aGVuIG5lZWRlZFxuICAgICAgY29uc3Qgc2VhcmNoUHJvbWlzZXM6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPltdID0gW107XG4gICAgICBjb25zdCBlbmFibGVkU291cmNlcyA9IHRoaXMuZ2V0RW5hYmxlZFNvdXJjZXMobm9ybWFsaXplZFNlYXJjaE9wdGlvbnMpO1xuICAgICAgXG4gICAgICAvLyBMaW1pdCBjb25jdXJyZW50IHNvdXJjZSBzZWFyY2hlcyBmb3IgbWVtb3J5IGVmZmljaWVuY3lcbiAgICAgIGNvbnN0IGNvbmN1cnJlbnRMaW1pdCA9IE1hdGgubWluKHRoaXMuTUFYX0NPTkNVUlJFTlRfU09VUkNFUywgZW5hYmxlZFNvdXJjZXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHNvdXJjZUJhdGNoZXMgPSB0aGlzLmJhdGNoU291cmNlcyhlbmFibGVkU291cmNlcywgY29uY3VycmVudExpbWl0KTtcbiAgICAgIFxuICAgICAgY29uc3QgYWxsUmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdID0gW107XG4gICAgICBjb25zdCBzb3VyY2VDb3VudCA9IHsgbG9jYWw6IDAsIGdpdGh1YjogMCwgY29sbGVjdGlvbjogMCB9O1xuICAgICAgXG4gICAgICAvLyBQcm9jZXNzIHNvdXJjZXMgaW4gYmF0Y2hlcyB0byBjb250cm9sIG1lbW9yeSB1c2FnZVxuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzb3VyY2VCYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IGJhdGNoUHJvbWlzZXMgPSBiYXRjaC5tYXAoc291cmNlID0+IFxuICAgICAgICAgIHRoaXMuc2VhcmNoV2l0aEZhbGxiYWNrKHNvdXJjZSBhcyAnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbicsIG5vcm1hbGl6ZWRRdWVyeSwgbm9ybWFsaXplZFNlYXJjaE9wdGlvbnMpXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYmF0Y2hQcm9taXNlcyk7XG4gICAgICAgIFxuICAgICAgICBiYXRjaFJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNvdXJjZU5hbWUgPSBiYXRjaFtpbmRleF0gYXMgJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nO1xuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgICAgICAgc291cmNlQ291bnRbc291cmNlTmFtZV0gKz0gcmVzdWx0LnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGFsbFJlc3VsdHMucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgU2VhcmNoIGZhaWxlZCBmb3Igc291cmNlICR7c291cmNlTmFtZX1gLCB7XG4gICAgICAgICAgICAgIGVycm9yOiByZXN1bHQucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZXN1bHQucmVhc29uLm1lc3NhZ2UgOiBTdHJpbmcocmVzdWx0LnJlYXNvbilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBNZW1vcnkgY2hlY2sgYmV0d2VlbiBiYXRjaGVzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRNZW1vcnkgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQgLyAoMTAyNCAqIDEwMjQpO1xuICAgICAgICBpZiAoY3VycmVudE1lbW9yeSA+IDIwMCkgeyAvLyAyMDBNQiB0aHJlc2hvbGRcbiAgICAgICAgICBsb2dnZXIud2FybignSGlnaCBtZW1vcnkgdXNhZ2UgZHVyaW5nIHNlYXJjaCwgdHJpZ2dlcmluZyBjbGVhbnVwJywge1xuICAgICAgICAgICAgbWVtb3J5TUI6IGN1cnJlbnRNZW1vcnlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJNZW1vcnlDbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQXBwbHkgYWR2YW5jZWQgcHJvY2Vzc2luZyB3aXRoIG1lbW9yeS1lZmZpY2llbnQgYmF0Y2hpbmdcbiAgICAgIGNvbnN0IHByb2Nlc3NlZFJlc3VsdHMgPSBhd2FpdCB0aGlzLnByb2Nlc3NTZWFyY2hSZXN1bHRzT3B0aW1pemVkKGFsbFJlc3VsdHMsIG5vcm1hbGl6ZWRTZWFyY2hPcHRpb25zKTtcbiAgICAgIFxuICAgICAgLy8gQXBwbHkgcGFnaW5hdGlvblxuICAgICAgY29uc3QgcGFnaW5hdGVkUmVzdWx0cyA9IHRoaXMuYXBwbHlQYWdpbmF0aW9uKHByb2Nlc3NlZFJlc3VsdHMsIG5vcm1hbGl6ZWRTZWFyY2hPcHRpb25zKTtcbiAgICAgIFxuICAgICAgLy8gQ2FjaGUgcmVzdWx0cyB3aXRoIG1lbW9yeSBsaW1pdCBjaGVja1xuICAgICAgaWYgKHBhZ2luYXRlZFJlc3VsdHMubGVuZ3RoIDwgMTAwMCkgeyAvLyBEb24ndCBjYWNoZSB2ZXJ5IGxhcmdlIHJlc3VsdCBzZXRzXG4gICAgICAgIHRoaXMucmVzdWx0Q2FjaGUuc2V0KGNhY2hlS2V5LCBwYWdpbmF0ZWRSZXN1bHRzKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgY29uc3QgbWVtb3J5QWZ0ZXIgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQ7XG4gICAgICBcbiAgICAgIHRoaXMucmVjb3JkU2VhcmNoTWV0cmljcyh7XG4gICAgICAgIHF1ZXJ5OiBub3JtYWxpemVkUXVlcnksXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICByZXN1bHRDb3VudDogcGFnaW5hdGVkUmVzdWx0cy5sZW5ndGgsXG4gICAgICAgIHNvdXJjZXM6IGVuYWJsZWRTb3VyY2VzLFxuICAgICAgICBjYWNoZUhpdDogZmFsc2UsXG4gICAgICAgIG1lbW9yeUJlZm9yZSxcbiAgICAgICAgbWVtb3J5QWZ0ZXIsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKCdPcHRpbWl6ZWQgdW5pZmllZCBwb3J0Zm9saW8gc2VhcmNoIGNvbXBsZXRlZCcsIHtcbiAgICAgICAgcXVlcnk6IG5vcm1hbGl6ZWRRdWVyeS5zdWJzdHJpbmcoMCwgNTApLFxuICAgICAgICBzb3VyY2VzOiB7IC4uLnNvdXJjZUNvdW50LCB0b3RhbDogYWxsUmVzdWx0cy5sZW5ndGggfSxcbiAgICAgICAgZmluYWxSZXN1bHRzOiBwYWdpbmF0ZWRSZXN1bHRzLmxlbmd0aCxcbiAgICAgICAgZHVyYXRpb246IGAke2R1cmF0aW9ufW1zYCxcbiAgICAgICAgbWVtb3J5VXNhZ2VNQjogKG1lbW9yeUFmdGVyIC0gbWVtb3J5QmVmb3JlKSAvICgxMDI0ICogMTAyNClcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gcGFnaW5hdGVkUmVzdWx0cztcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1VuaWZpZWRJbmRleE1hbmFnZXIuc2VhcmNoJywgZXJyb3IsIHsgcXVlcnk6IG5vcm1hbGl6ZWRTZWFyY2hPcHRpb25zLCBkdXJhdGlvbiB9KTtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci53cmFwRXJyb3IoZXJyb3IsICdGYWlsZWQgdG8gcGVyZm9ybSB1bmlmaWVkIHBvcnRmb2xpbyBzZWFyY2gnLCBFcnJvckNhdGVnb3J5LlNZU1RFTV9FUlJPUik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgZWxlbWVudCBieSBuYW1lIGFjcm9zcyBhbGwgcG9ydGZvbGlvc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nLCBvcHRpb25zOiBQYXJ0aWFsPFVuaWZpZWRTZWFyY2hPcHRpb25zPiA9IHt9KTogUHJvbWlzZTxVbmlmaWVkSW5kZXhFbnRyeSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VhcmNoT3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMgPSB7XG4gICAgICAgIHF1ZXJ5OiBuYW1lLFxuICAgICAgICBpbmNsdWRlTG9jYWw6IG9wdGlvbnMuaW5jbHVkZUxvY2FsID8/IHRydWUsXG4gICAgICAgIGluY2x1ZGVHaXRIdWI6IG9wdGlvbnMuaW5jbHVkZUdpdEh1YiA/PyB0cnVlLFxuICAgICAgICBpbmNsdWRlQ29sbGVjdGlvbjogb3B0aW9ucy5pbmNsdWRlQ29sbGVjdGlvbiA/PyBmYWxzZSxcbiAgICAgICAgcGFnZVNpemU6IDEsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlYXJjaChzZWFyY2hPcHRpb25zKTtcbiAgICAgIFxuICAgICAgLy8gUmV0dXJuIGV4YWN0IG5hbWUgbWF0Y2ggZmlyc3QsIHRoZW4gYmVzdCBtYXRjaFxuICAgICAgY29uc3QgZXhhY3RNYXRjaCA9IHJlc3VsdHMuZmluZChyZXN1bHQgPT4gXG4gICAgICAgIHJlc3VsdC5lbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGV4YWN0TWF0Y2g/LmVudHJ5IHx8IHJlc3VsdHNbMF0/LmVudHJ5IHx8IG51bGw7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdVbmlmaWVkSW5kZXhNYW5hZ2VyLmZpbmRCeU5hbWUnLCBlcnJvciwgeyBuYW1lIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbGVtZW50cyBieSB0eXBlIGZyb20gYWxsIHBvcnRmb2xpb3NcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRFbGVtZW50c0J5VHlwZShlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsIG9wdGlvbnM6IFBhcnRpYWw8VW5pZmllZFNlYXJjaE9wdGlvbnM+ID0ge30pOiBQcm9taXNlPFVuaWZpZWRJbmRleEVudHJ5W10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VhcmNoT3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMgPSB7XG4gICAgICAgIHF1ZXJ5OiAnJywgLy8gRW1wdHkgcXVlcnkgdG8gZ2V0IGFsbCBlbGVtZW50c1xuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgaW5jbHVkZUxvY2FsOiBvcHRpb25zLmluY2x1ZGVMb2NhbCA/PyB0cnVlLFxuICAgICAgICBpbmNsdWRlR2l0SHViOiBvcHRpb25zLmluY2x1ZGVHaXRIdWIgPz8gdHJ1ZSxcbiAgICAgICAgaW5jbHVkZUNvbGxlY3Rpb246IG9wdGlvbnMuaW5jbHVkZUNvbGxlY3Rpb24gPz8gZmFsc2UsXG4gICAgICAgIHBhZ2VTaXplOiAxMDAwLCAvLyBMYXJnZSBwYWdlIHNpemUgdG8gZ2V0IGFsbFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9O1xuICAgICAgXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5nZXRBbGxFbGVtZW50c0J5VHlwZShlbGVtZW50VHlwZSwgc2VhcmNoT3B0aW9ucyk7XG4gICAgICBcbiAgICAgIHJldHVybiB0aGlzLmRlZHVwbGljYXRlRW50cmllcyhyZXN1bHRzLm1hcChyID0+IHIuZW50cnkpKTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1VuaWZpZWRJbmRleE1hbmFnZXIuZ2V0RWxlbWVudHNCeVR5cGUnLCBlcnJvciwgeyBlbGVtZW50VHlwZSB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBmb3IgZHVwbGljYXRlcyBhY3Jvc3MgYWxsIHNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGVja0R1cGxpY2F0ZXMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxEdXBsaWNhdGVJbmZvW10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VhcmNoT3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMgPSB7XG4gICAgICAgIHF1ZXJ5OiBuYW1lLFxuICAgICAgICBpbmNsdWRlTG9jYWw6IHRydWUsXG4gICAgICAgIGluY2x1ZGVHaXRIdWI6IHRydWUsXG4gICAgICAgIGluY2x1ZGVDb2xsZWN0aW9uOiB0cnVlLFxuICAgICAgICBwYWdlU2l6ZTogMTAwXG4gICAgICB9O1xuICAgICAgXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5zZWFyY2goc2VhcmNoT3B0aW9ucyk7XG4gICAgICBjb25zdCBkdXBsaWNhdGVNYXAgPSBuZXcgTWFwPHN0cmluZywgRHVwbGljYXRlSW5mbz4oKTtcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBjb25zdCBrZXkgPSBgJHtyZXN1bHQuZW50cnkuZWxlbWVudFR5cGV9OiR7cmVzdWx0LmVudHJ5Lm5hbWUudG9Mb3dlckNhc2UoKX1gO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFkdXBsaWNhdGVNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICBkdXBsaWNhdGVNYXAuc2V0KGtleSwge1xuICAgICAgICAgICAgbmFtZTogcmVzdWx0LmVudHJ5Lm5hbWUsXG4gICAgICAgICAgICBlbGVtZW50VHlwZTogcmVzdWx0LmVudHJ5LmVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgc291cmNlczogW10sXG4gICAgICAgICAgICBoYXNWZXJzaW9uQ29uZmxpY3Q6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGR1cGxpY2F0ZU1hcC5nZXQoa2V5KSE7XG4gICAgICAgIGR1cGxpY2F0ZS5zb3VyY2VzLnB1c2goe1xuICAgICAgICAgIHNvdXJjZTogcmVzdWx0LnNvdXJjZSxcbiAgICAgICAgICB2ZXJzaW9uOiByZXN1bHQuZW50cnkudmVyc2lvbixcbiAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHJlc3VsdC5lbnRyeS5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgcGF0aDogdGhpcy5nZXRQYXRoRnJvbUVudHJ5KHJlc3VsdC5lbnRyeSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZpbHRlciB0byBvbmx5IGl0ZW1zIHdpdGggbXVsdGlwbGUgc291cmNlcyBhbmQgY2hlY2sgdmVyc2lvbiBjb25mbGljdHNcbiAgICAgIGNvbnN0IGFjdHVhbER1cGxpY2F0ZXMgPSBBcnJheS5mcm9tKGR1cGxpY2F0ZU1hcC52YWx1ZXMoKSlcbiAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0uc291cmNlcy5sZW5ndGggPiAxKVxuICAgICAgICAubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25Db25mbGljdCA9IHRoaXMuZGV0ZWN0VmVyc2lvbkNvbmZsaWN0KGl0ZW0uc291cmNlcyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICBoYXNWZXJzaW9uQ29uZmxpY3Q6ICEhdmVyc2lvbkNvbmZsaWN0LFxuICAgICAgICAgICAgdmVyc2lvbkNvbmZsaWN0XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBhY3R1YWxEdXBsaWNhdGVzO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignVW5pZmllZEluZGV4TWFuYWdlci5jaGVja0R1cGxpY2F0ZXMnLCBlcnJvciwgeyBuYW1lIH0pO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB2ZXJzaW9uIGNvbXBhcmlzb24gYWNyb3NzIGFsbCBzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0VmVyc2lvbkNvbXBhcmlzb24obmFtZTogc3RyaW5nKTogUHJvbWlzZTxWZXJzaW9uSW5mbyB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZHVwbGljYXRlcyA9IGF3YWl0IHRoaXMuY2hlY2tEdXBsaWNhdGVzKG5hbWUpO1xuICAgICAgXG4gICAgICBpZiAoZHVwbGljYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGR1cGxpY2F0ZXNbMF07XG4gICAgICBjb25zdCB2ZXJzaW9uczogVmVyc2lvbkluZm9bJ3ZlcnNpb25zJ10gPSB7fTtcbiAgICAgIFxuICAgICAgLy8gQnVpbGQgdmVyc2lvbiBpbmZvXG4gICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBkdXBsaWNhdGUuc291cmNlcykge1xuICAgICAgICBpZiAoc291cmNlLnNvdXJjZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICAgIHZlcnNpb25zLmxvY2FsID0ge1xuICAgICAgICAgICAgdmVyc2lvbjogc291cmNlLnZlcnNpb24gfHwgJ3Vua25vd24nLFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBzb3VyY2UubGFzdE1vZGlmaWVkLFxuICAgICAgICAgICAgcGF0aDogc291cmNlLnBhdGggfHwgJ3Vua25vd24nXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2Uuc291cmNlID09PSAnZ2l0aHViJykge1xuICAgICAgICAgIHZlcnNpb25zLmdpdGh1YiA9IHtcbiAgICAgICAgICAgIHZlcnNpb246IHNvdXJjZS52ZXJzaW9uIHx8ICd1bmtub3duJyxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDogc291cmNlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgIHBhdGg6IHNvdXJjZS5wYXRoIHx8ICd1bmtub3duJ1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoc291cmNlLnNvdXJjZSA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgICAgICAgdmVyc2lvbnMuY29sbGVjdGlvbiA9IHtcbiAgICAgICAgICAgIHZlcnNpb246IHNvdXJjZS52ZXJzaW9uIHx8ICd1bmtub3duJyxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDogc291cmNlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgIHBhdGg6IHNvdXJjZS5wYXRoIHx8ICd1bmtub3duJ1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGV0ZXJtaW5lIHJlY29tbWVuZGF0aW9uXG4gICAgICBjb25zdCByZWNvbW1lbmRhdGlvbiA9IHRoaXMuZGV0ZXJtaW5lVmVyc2lvblJlY29tbWVuZGF0aW9uKHZlcnNpb25zKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZHVwbGljYXRlLm5hbWUsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBkdXBsaWNhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHZlcnNpb25zLFxuICAgICAgICByZWNvbW1lbmRlZDogcmVjb21tZW5kYXRpb24sXG4gICAgICAgIHVwZGF0ZUF2YWlsYWJsZTogcmVjb21tZW5kYXRpb24uc291cmNlICE9PSAnbG9jYWwnICYmICEhdmVyc2lvbnMubG9jYWwsXG4gICAgICAgIHVwZGF0ZUZyb206IHJlY29tbWVuZGF0aW9uLnNvdXJjZSAhPT0gJ2xvY2FsJyA/IHJlY29tbWVuZGF0aW9uLnNvdXJjZSA6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1VuaWZpZWRJbmRleE1hbmFnZXIuZ2V0VmVyc2lvbkNvbXBhcmlzb24nLCBlcnJvciwgeyBuYW1lIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb21wcmVoZW5zaXZlIHN0YXRpc3RpY3MgYWNyb3NzIGFsbCBzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3RhdHMoKTogUHJvbWlzZTxVbmlmaWVkSW5kZXhTdGF0cz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBbbG9jYWxTdGF0cywgZ2l0aHViU3RhdHMsIGNvbGxlY3Rpb25TdGF0c10gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICB0aGlzLmdldExvY2FsU3RhdHMoKSxcbiAgICAgICAgdGhpcy5nZXRHaXRIdWJTdGF0cygpLFxuICAgICAgICB0aGlzLmdldENvbGxlY3Rpb25TdGF0cygpXG4gICAgICBdKTtcbiAgICAgIFxuICAgICAgY29uc3QgbG9jYWwgPSBsb2NhbFN0YXRzLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgPyBsb2NhbFN0YXRzLnZhbHVlIDoge1xuICAgICAgICB0b3RhbEVsZW1lbnRzOiAwLFxuICAgICAgICBlbGVtZW50c0J5VHlwZToge30gYXMgUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+LFxuICAgICAgICBsYXN0QnVpbHQ6IG51bGwsXG4gICAgICAgIGlzU3RhbGU6IHRydWVcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IGdpdGh1YiA9IGdpdGh1YlN0YXRzLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgPyBnaXRodWJTdGF0cy52YWx1ZSA6IHtcbiAgICAgICAgdG90YWxFbGVtZW50czogMCxcbiAgICAgICAgZWxlbWVudHNCeVR5cGU6IHt9IGFzIFJlY29yZDxFbGVtZW50VHlwZSwgbnVtYmVyPixcbiAgICAgICAgbGFzdEZldGNoZWQ6IG51bGwsXG4gICAgICAgIGlzU3RhbGU6IHRydWVcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uU3RhdHMuc3RhdHVzID09PSAnZnVsZmlsbGVkJyA/IGNvbGxlY3Rpb25TdGF0cy52YWx1ZSA6IHtcbiAgICAgICAgdG90YWxFbGVtZW50czogMCxcbiAgICAgICAgZWxlbWVudHNCeVR5cGU6IHt9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gICAgICAgIGxhc3RGZXRjaGVkOiBudWxsLFxuICAgICAgICBpc1N0YWxlOiB0cnVlXG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBDYWxjdWxhdGUgY29tYmluZWQgc3RhdGlzdGljc1xuICAgICAgY29uc3QgdG90YWxFbGVtZW50cyA9IGxvY2FsLnRvdGFsRWxlbWVudHMgKyBnaXRodWIudG90YWxFbGVtZW50cyArIGNvbGxlY3Rpb24udG90YWxFbGVtZW50cztcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZXNDb3VudCA9IGF3YWl0IHRoaXMuY2FsY3VsYXRlRHVwbGljYXRlc0NvdW50KCk7XG4gICAgICBjb25zdCB1bmlxdWVFbGVtZW50cyA9IHRvdGFsRWxlbWVudHMgLSBkdXBsaWNhdGVzQ291bnQ7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvY2FsLFxuICAgICAgICBnaXRodWIsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIGNvbWJpbmVkOiB7XG4gICAgICAgICAgdG90YWxFbGVtZW50cyxcbiAgICAgICAgICB1bmlxdWVFbGVtZW50cyxcbiAgICAgICAgICBkdXBsaWNhdGVzOiBkdXBsaWNhdGVzQ291bnRcbiAgICAgICAgfSxcbiAgICAgICAgcGVyZm9ybWFuY2U6IHtcbiAgICAgICAgICBhdmVyYWdlU2VhcmNoVGltZTogdGhpcy5nZXRQZXJmb3JtYW5jZVN0YXRzKCkuc2VhcmNoU3RhdHMuYXZlcmFnZVRpbWUgfHwgMCxcbiAgICAgICAgICBjYWNoZUhpdFJhdGU6IHRoaXMuZ2V0UGVyZm9ybWFuY2VTdGF0cygpLnNlYXJjaFN0YXRzLmNhY2hlSGl0UmF0ZSB8fCAwLFxuICAgICAgICAgIGxhc3RPcHRpbWl6ZWQ6IG51bGxcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1VuaWZpZWRJbmRleE1hbmFnZXIuZ2V0U3RhdHMnLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZSBjYWNoZXMgYWZ0ZXIgdXNlciBhY3Rpb25zIHdpdGggcGVyZm9ybWFuY2UgbW9uaXRvcmluZ1xuICAgKi9cbiAgcHVibGljIGludmFsaWRhdGVBZnRlckFjdGlvbihhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKCdJbnZhbGlkYXRpbmcgdW5pZmllZCBwb3J0Zm9saW8gY2FjaGVzIGFmdGVyIHVzZXIgYWN0aW9uJywgeyBhY3Rpb24gfSk7XG4gICAgXG4gICAgLy8gQ2xlYXIgcmVzdWx0IGFuZCBpbmRleCBjYWNoZXNcbiAgICB0aGlzLnJlc3VsdENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5pbmRleENhY2hlLmNsZWFyKCk7XG4gICAgXG4gICAgLy8gSW52YWxpZGF0ZSBsb2NhbCBjYWNoZVxuICAgIHRoaXMubG9jYWxJbmRleE1hbmFnZXIucmVidWlsZEluZGV4KCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byByZWJ1aWxkIGxvY2FsIGluZGV4IGFmdGVyIGFjdGlvbicsIHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBJbnZhbGlkYXRlIEdpdEh1YiBjYWNoZVxuICAgIHRoaXMuZ2l0aHViSW5kZXhlci5pbnZhbGlkYXRlQWZ0ZXJBY3Rpb24oYWN0aW9uKTtcbiAgICBcbiAgICAvLyBJbnZhbGlkYXRlIGNvbGxlY3Rpb24gY2FjaGVcbiAgICB0aGlzLmNvbGxlY3Rpb25JbmRleENhY2hlLmNsZWFyQ2FjaGUoKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGNsZWFyIGNvbGxlY3Rpb24gY2FjaGUgYWZ0ZXIgYWN0aW9uJywge1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIFRyaWdnZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIGlmIG1lbW9yeSB1c2FnZSBpcyBoaWdoXG4gICAgdGhpcy50cmlnZ2VyTWVtb3J5Q2xlYW51cCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIHJlYnVpbGQgb2YgYWxsIGluZGV4ZXMgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWJ1aWxkQWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgbG9nZ2VyLmluZm8oJ1JlYnVpbGRpbmcgYWxsIHBvcnRmb2xpbyBpbmRleGVzIHdpdGggb3B0aW1pemF0aW9uLi4uJyk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIENsZWFyIGFsbCBjYWNoZXNcbiAgICAgIHRoaXMucmVzdWx0Q2FjaGUuY2xlYXIoKTtcbiAgICAgIHRoaXMuaW5kZXhDYWNoZS5jbGVhcigpO1xuICAgICAgXG4gICAgICAvLyBSZXNldCBwZXJmb3JtYW5jZSBjb3VudGVyc1xuICAgICAgdGhpcy5wZXJmb3JtYW5jZU1vbml0b3IucmVzZXQoKTtcbiAgICAgIFxuICAgICAgLy8gUmVidWlsZCBpbiBwYXJhbGxlbCB3aXRoIG1lbW9yeSBtb25pdG9yaW5nXG4gICAgICBjb25zdCByZWJ1aWxkUHJvbWlzZXMgPSBbXG4gICAgICAgIHRoaXMubG9jYWxJbmRleE1hbmFnZXIucmVidWlsZEluZGV4KCksXG4gICAgICAgIHRoaXMuZ2l0aHViSW5kZXhlci5jbGVhckNhY2hlKCksXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbkluZGV4Q2FjaGUuY2xlYXJDYWNoZSgpXG4gICAgICBdO1xuICAgICAgXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChyZWJ1aWxkUHJvbWlzZXMpO1xuICAgICAgXG4gICAgICAvLyBUcmlnZ2VyIGNsZWFudXBcbiAgICAgIHRoaXMudHJpZ2dlck1lbW9yeUNsZWFudXAoKTtcbiAgICAgIFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oJ0FsbCBwb3J0Zm9saW8gaW5kZXhlcyByZWJ1aWx0IHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgZHVyYXRpb246IGAke2R1cmF0aW9ufW1zYCxcbiAgICAgICAgbWVtb3J5VXNhZ2VNQjogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkIC8gKDEwMjQgKiAxMDI0KVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignVW5pZmllZEluZGV4TWFuYWdlci5yZWJ1aWxkQWxsJywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBIRUxQRVIgTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBcbiAgLyoqXG4gICAqIFNlYXJjaCB3aXRoIGZhbGxiYWNrIHN0cmF0ZWdpZXMgZm9yIHJlc2lsaWVudCBvcGVyYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoV2l0aEZhbGxiYWNrKHNvdXJjZTogJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nLCBxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSA9IFtdO1xuICAgICAgXG4gICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICBjYXNlICdsb2NhbCc6XG4gICAgICAgICAgcmVzdWx0cyA9IGF3YWl0IHRoaXMuc2VhcmNoTG9jYWwocXVlcnksIG9wdGlvbnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdnaXRodWInOlxuICAgICAgICAgIHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlYXJjaEdpdEh1YihxdWVyeSwgb3B0aW9ucyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICAgIHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlYXJjaENvbGxlY3Rpb24ocXVlcnksIG9wdGlvbnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoYCR7c291cmNlfSBzZWFyY2ggY29tcGxldGVkIGluICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tcyB3aXRoICR7cmVzdWx0cy5sZW5ndGh9IHJlc3VsdHNgKTtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgJHtzb3VyY2V9IHNlYXJjaCBmYWlsZWQsIGF0dGVtcHRpbmcgZmFsbGJhY2tgLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBGYWxsYmFjayBzdHJhdGVnaWVzXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVTZWFyY2hGYWxsYmFjayhzb3VyY2UsIHF1ZXJ5LCBvcHRpb25zLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHNlYXJjaCBmYWxsYmFjayBzdHJhdGVnaWVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlYXJjaEZhbGxiYWNrKHNvdXJjZTogJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nLCBxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucywgb3JpZ2luYWxFcnJvcjogYW55KTogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+IHtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgY2FzZSAnbG9jYWwnOlxuICAgICAgICAgIC8vIFRyeSB0byB1c2Ugc3RhbGUgbG9jYWwgaW5kZXhcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ0F0dGVtcHRpbmcgdG8gdXNlIHN0YWxlIGxvY2FsIGluZGV4Jyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VhcmNoTG9jYWxTdGFsZShxdWVyeSwgb3B0aW9ucyk7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ2dpdGh1Yic6XG4gICAgICAgICAgLy8gVHJ5IGNhY2hlZCBHaXRIdWIgZGF0YVxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQXR0ZW1wdGluZyB0byB1c2UgY2FjaGVkIEdpdEh1YiBkYXRhJyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VhcmNoR2l0SHViQ2FjaGVkKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgICAgLy8gVHJ5IGNhY2hlZCBjb2xsZWN0aW9uIGRhdGFcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ0F0dGVtcHRpbmcgdG8gdXNlIGNhY2hlZCBjb2xsZWN0aW9uIGRhdGEnKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZWFyY2hDb2xsZWN0aW9uQ2FjaGVkKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZmFsbGJhY2tFcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oYEFsbCBmYWxsYmFjayBzdHJhdGVnaWVzIGZhaWxlZCBmb3IgJHtzb3VyY2V9YCwge1xuICAgICAgICBvcmlnaW5hbEVycm9yOiBvcmlnaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBvcmlnaW5hbEVycm9yLm1lc3NhZ2UgOiBTdHJpbmcob3JpZ2luYWxFcnJvciksXG4gICAgICAgIGZhbGxiYWNrRXJyb3I6IGZhbGxiYWNrRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGZhbGxiYWNrRXJyb3IubWVzc2FnZSA6IFN0cmluZyhmYWxsYmFja0Vycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU2VhcmNoIGxvY2FsIHBvcnRmb2xpb1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZWFyY2hMb2NhbChxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgY29uc3QgbG9jYWxPcHRpb25zID0gdGhpcy5jb252ZXJ0VG9Mb2NhbE9wdGlvbnMob3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMubG9jYWxJbmRleE1hbmFnZXIuc2VhcmNoKHF1ZXJ5LCBsb2NhbE9wdGlvbnMpO1xuICAgIFxuICAgIHJldHVybiByZXN1bHRzLm1hcChyZXN1bHQgPT4gKHtcbiAgICAgIHNvdXJjZTogJ2xvY2FsJyBhcyBjb25zdCxcbiAgICAgIGVudHJ5OiB0aGlzLmNvbnZlcnRMb2NhbEVudHJ5KHJlc3VsdC5lbnRyeSksXG4gICAgICBtYXRjaFR5cGU6IHJlc3VsdC5tYXRjaFR5cGUsXG4gICAgICBzY29yZTogcmVzdWx0LnNjb3JlLFxuICAgICAgdmVyc2lvbjogcmVzdWx0LmVudHJ5Lm1ldGFkYXRhLnZlcnNpb25cbiAgICB9KSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggbG9jYWwgd2l0aCBzdGFsZSBkYXRhIGZhbGxiYWNrXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlYXJjaExvY2FsU3RhbGUocXVlcnk6IHN0cmluZywgb3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFVuaWZpZWRTZWFyY2hSZXN1bHRbXT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gZ2V0IGFueSBsb2NhbCBkYXRhLCBldmVuIHN0YWxlXG4gICAgICBjb25zdCBsb2NhbE9wdGlvbnMgPSB0aGlzLmNvbnZlcnRUb0xvY2FsT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmxvY2FsSW5kZXhNYW5hZ2VyLnNlYXJjaChxdWVyeSwgbG9jYWxPcHRpb25zKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKHJlc3VsdCA9PiAoe1xuICAgICAgICBzb3VyY2U6ICdsb2NhbCcgYXMgY29uc3QsXG4gICAgICAgIGVudHJ5OiB0aGlzLmNvbnZlcnRMb2NhbEVudHJ5KHJlc3VsdC5lbnRyeSksXG4gICAgICAgIG1hdGNoVHlwZTogcmVzdWx0Lm1hdGNoVHlwZSxcbiAgICAgICAgc2NvcmU6IHJlc3VsdC5zY29yZSAqIDAuOCwgLy8gUmVkdWNlIHNjb3JlIGZvciBzdGFsZSBkYXRhXG4gICAgICAgIHZlcnNpb246IHJlc3VsdC5lbnRyeS5tZXRhZGF0YS52ZXJzaW9uXG4gICAgICB9KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBHaXRIdWIgcG9ydGZvbGlvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlYXJjaEdpdEh1YihxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdpdGh1YkluZGV4ID0gYXdhaXQgdGhpcy5naXRodWJJbmRleGVyLmdldEluZGV4KCk7XG4gICAgICBjb25zdCByZXN1bHRzOiBVbmlmaWVkU2VhcmNoUmVzdWx0W10gPSBbXTtcbiAgICAgIFxuICAgICAgY29uc3QgcXVlcnlMb3dlciA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBxdWVyeVRva2VucyA9IHF1ZXJ5TG93ZXIuc3BsaXQoL1xccysvKS5maWx0ZXIodG9rZW4gPT4gdG9rZW4ubGVuZ3RoID4gMCk7XG4gICAgICBcbiAgICAgIGlmIChxdWVyeVRva2Vucy5sZW5ndGggPT09IDAgJiYgcXVlcnkudHJpbSgpICE9PSAnJykge1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2VhcmNoIGFjcm9zcyBhbGwgR2l0SHViIGVsZW1lbnRzXG4gICAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgZW50cmllc10gb2YgZ2l0aHViSW5kZXguZWxlbWVudHMpIHtcbiAgICAgICAgLy8gRmlsdGVyIGJ5IGVsZW1lbnQgdHlwZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKG9wdGlvbnMuZWxlbWVudFR5cGUgJiYgZWxlbWVudFR5cGUgIT09IG9wdGlvbnMuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcmUgPSB0aGlzLmNhbGN1bGF0ZUdpdEh1Yk1hdGNoU2NvcmUoZW50cnksIHF1ZXJ5VG9rZW5zLCBxdWVyeSk7XG4gICAgICAgICAgaWYgKHNjb3JlID4gMCB8fCBxdWVyeS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICBzb3VyY2U6ICdnaXRodWInIGFzIGNvbnN0LFxuICAgICAgICAgICAgICBlbnRyeTogdGhpcy5jb252ZXJ0R2l0SHViRW50cnkoZW50cnkpLFxuICAgICAgICAgICAgICBtYXRjaFR5cGU6IHRoaXMuZGV0ZXJtaW5lTWF0Y2hUeXBlKGVudHJ5LCBxdWVyeVRva2VucyksXG4gICAgICAgICAgICAgIHNjb3JlOiBxdWVyeS50cmltKCkgPT09ICcnID8gMSA6IHNjb3JlLCAvLyBEZWZhdWx0IHNjb3JlIGZvciBlbXB0eSBxdWVyeVxuICAgICAgICAgICAgICB2ZXJzaW9uOiBlbnRyeS52ZXJzaW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHJlc3VsdHMuc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnR2l0SHViIHNlYXJjaCBmYWlsZWQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHRvIHRyaWdnZXIgZmFsbGJhY2tcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggR2l0SHViIHdpdGggY2FjaGVkIGRhdGEgZmFsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoR2l0SHViQ2FjaGVkKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIHVzZSBzdGFsZSBHaXRIdWIgZGF0YVxuICAgICAgY29uc3QgY2FjaGVTdGF0cyA9IHRoaXMuZ2l0aHViSW5kZXhlci5nZXRDYWNoZVN0YXRzKCk7XG4gICAgICBpZiAoIWNhY2hlU3RhdHMuaXNTdGFsZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZWFyY2hHaXRIdWIocXVlcnksIG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVc2Ugc3RhbGUgZGF0YSB3aXRoIHJlZHVjZWQgc2NvcmVzXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5zZWFyY2hHaXRIdWIocXVlcnksIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKHJlc3VsdCA9PiAoe1xuICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgIHNjb3JlOiByZXN1bHQuc2NvcmUgKiAwLjcgLy8gUmVkdWNlIHNjb3JlIGZvciBzdGFsZSBkYXRhXG4gICAgICB9KSk7XG4gICAgICBcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggY29sbGVjdGlvbiBwb3J0Zm9saW9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoQ29sbGVjdGlvbihxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25JbmRleCA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbkluZGV4Q2FjaGUuZ2V0SW5kZXgoKTtcbiAgICAgIGNvbnN0IHJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSA9IFtdO1xuICAgICAgXG4gICAgICBjb25zdCBxdWVyeUxvd2VyID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHF1ZXJ5VG9rZW5zID0gcXVlcnlMb3dlci5zcGxpdCgvXFxzKy8pLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5sZW5ndGggPiAwKTtcbiAgICAgIFxuICAgICAgaWYgKHF1ZXJ5VG9rZW5zLmxlbmd0aCA9PT0gMCAmJiBxdWVyeS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTZWFyY2ggYWNyb3NzIGFsbCBjb2xsZWN0aW9uIGVsZW1lbnRzXG4gICAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMoY29sbGVjdGlvbkluZGV4LmluZGV4KSkge1xuICAgICAgICAvLyBGaWx0ZXIgYnkgZWxlbWVudCB0eXBlIGlmIHNwZWNpZmllZFxuICAgICAgICBpZiAob3B0aW9ucy5lbGVtZW50VHlwZSAmJiBlbGVtZW50VHlwZSAhPT0gb3B0aW9ucy5lbGVtZW50VHlwZS50b1N0cmluZygpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgIGNvbnN0IHNjb3JlID0gdGhpcy5jYWxjdWxhdGVDb2xsZWN0aW9uTWF0Y2hTY29yZShlbnRyeSwgcXVlcnlUb2tlbnMsIHF1ZXJ5KTtcbiAgICAgICAgICBpZiAoc2NvcmUgPiAwIHx8IHF1ZXJ5LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgIHNvdXJjZTogJ2NvbGxlY3Rpb24nIGFzIGNvbnN0LFxuICAgICAgICAgICAgICBlbnRyeTogdGhpcy5jb252ZXJ0Q29sbGVjdGlvbkVudHJ5KGVudHJ5LCBlbGVtZW50VHlwZSksXG4gICAgICAgICAgICAgIG1hdGNoVHlwZTogdGhpcy5kZXRlcm1pbmVDb2xsZWN0aW9uTWF0Y2hUeXBlKGVudHJ5LCBxdWVyeVRva2VucyksXG4gICAgICAgICAgICAgIHNjb3JlOiBxdWVyeS50cmltKCkgPT09ICcnID8gMSA6IHNjb3JlLCAvLyBEZWZhdWx0IHNjb3JlIGZvciBlbXB0eSBxdWVyeVxuICAgICAgICAgICAgICB2ZXJzaW9uOiBlbnRyeS52ZXJzaW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHJlc3VsdHMuc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnQ29sbGVjdGlvbiBzZWFyY2ggZmFpbGVkJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yOyAvLyBSZS10aHJvdyB0byB0cmlnZ2VyIGZhbGxiYWNrXG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU2VhcmNoIGNvbGxlY3Rpb24gd2l0aCBjYWNoZWQgZGF0YSBmYWxsYmFja1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZWFyY2hDb2xsZWN0aW9uQ2FjaGVkKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIHVzZSBzdGFsZSBjb2xsZWN0aW9uIGRhdGFcbiAgICAgIGNvbnN0IGNhY2hlU3RhdHMgPSB0aGlzLmNvbGxlY3Rpb25JbmRleENhY2hlLmdldENhY2hlU3RhdHMoKTtcbiAgICAgIGlmIChjYWNoZVN0YXRzLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VhcmNoQ29sbGVjdGlvbihxdWVyeSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVzZSBzdGFsZSBkYXRhIHdpdGggcmVkdWNlZCBzY29yZXNcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlYXJjaENvbGxlY3Rpb24ocXVlcnksIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKHJlc3VsdCA9PiAoe1xuICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgIHNjb3JlOiByZXN1bHQuc2NvcmUgKiAwLjYgLy8gUmVkdWNlIHNjb3JlIGZvciBzdGFsZSBjb2xsZWN0aW9uIGRhdGFcbiAgICAgIH0pKTtcbiAgICAgIFxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHNlYXJjaCByZXN1bHRzIHdpdGggYWR2YW5jZWQgZmVhdHVyZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1NlYXJjaFJlc3VsdHMocmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgLy8gQXBwbHkgc21hcnQgcmFua2luZ1xuICAgIGNvbnN0IHJhbmtlZFJlc3VsdHMgPSB0aGlzLmFwcGx5U21hcnRSYW5raW5nKHJlc3VsdHMsIG9wdGlvbnMpO1xuICAgIFxuICAgIC8vIERldGVjdCBkdXBsaWNhdGVzIGFuZCB2ZXJzaW9uIGNvbmZsaWN0c1xuICAgIGNvbnN0IHByb2Nlc3NlZFJlc3VsdHMgPSBhd2FpdCB0aGlzLmRldGVjdER1cGxpY2F0ZXNBbmRDb25mbGljdHMocmFua2VkUmVzdWx0cyk7XG4gICAgXG4gICAgLy8gQXBwbHkgc29ydGluZ1xuICAgIGNvbnN0IHNvcnRlZFJlc3VsdHMgPSB0aGlzLmFwcGx5U29ydGluZyhwcm9jZXNzZWRSZXN1bHRzLCBvcHRpb25zLnNvcnRCeSB8fCAncmVsZXZhbmNlJywgb3B0aW9ucy5xdWVyeSk7XG4gICAgXG4gICAgcmV0dXJuIHNvcnRlZFJlc3VsdHM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBBcHBseSBzbWFydCByZXN1bHQgcmFua2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVNtYXJ0UmFua2luZyhyZXN1bHRzOiBVbmlmaWVkU2VhcmNoUmVzdWx0W10sIG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogVW5pZmllZFNlYXJjaFJlc3VsdFtdIHtcbiAgICByZXR1cm4gcmVzdWx0cy5tYXAocmVzdWx0ID0+IHtcbiAgICAgIGxldCBhZGp1c3RlZFNjb3JlID0gcmVzdWx0LnNjb3JlO1xuICAgICAgXG4gICAgICAvLyBObyBsb2NhdGlvbi1iYXNlZCBzY29yaW5nIC0gc2NvcmUgc2hvdWxkIGJlIGJhc2VkIG9uIHJlbGV2YW5jZSBvbmx5XG4gICAgICAvLyBTb3VyY2UgbG9jYXRpb24gZG9lc24ndCBhZmZlY3QgdGhlIGludHJpbnNpYyB2YWx1ZSBvZiBhbiBlbGVtZW50XG4gICAgICBcbiAgICAgIC8vIENvbnNpZGVyIHZlcnNpb24gZnJlc2huZXNzIChuZXdlciB2ZXJzaW9ucyBnZXQgc21hbGwgYm9udXMpXG4gICAgICBpZiAocmVzdWx0LnZlcnNpb24gJiYgcmVzdWx0LnZlcnNpb24gIT09ICd1bmtub3duJykge1xuICAgICAgICBjb25zdCB2ZXJzaW9uUGFydHMgPSByZXN1bHQudmVyc2lvbi5zcGxpdCgnLicpO1xuICAgICAgICBpZiAodmVyc2lvblBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgY29uc3QgbWFqb3IgPSBOdW1iZXIucGFyc2VJbnQodmVyc2lvblBhcnRzWzBdKSB8fCAwO1xuICAgICAgICAgIGNvbnN0IG1pbm9yID0gTnVtYmVyLnBhcnNlSW50KHZlcnNpb25QYXJ0c1sxXSkgfHwgMDtcbiAgICAgICAgICBhZGp1c3RlZFNjb3JlICs9IChtYWpvciAqIDAuMSkgKyAobWlub3IgKiAwLjAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBCb29zdCBleGFjdCBtYXRjaGVzXG4gICAgICBpZiAocmVzdWx0LmVudHJ5Lm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gb3B0aW9ucy5xdWVyeS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGFkanVzdGVkU2NvcmUgKj0gMi4wO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgIHNjb3JlOiBhZGp1c3RlZFNjb3JlXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogRGV0ZWN0IGR1cGxpY2F0ZXMgYW5kIHZlcnNpb24gY29uZmxpY3RzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRldGVjdER1cGxpY2F0ZXNBbmRDb25mbGljdHMocmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdKTogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+IHtcbiAgICBjb25zdCBuYW1lTWFwID0gbmV3IE1hcDxzdHJpbmcsIFVuaWZpZWRTZWFyY2hSZXN1bHRbXT4oKTtcbiAgICBcbiAgICAvLyBHcm91cCBieSBuYW1lIGFuZCBlbGVtZW50IHR5cGVcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtyZXN1bHQuZW50cnkuZWxlbWVudFR5cGV9OiR7cmVzdWx0LmVudHJ5Lm5hbWUudG9Mb3dlckNhc2UoKX1gO1xuICAgICAgaWYgKCFuYW1lTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgIG5hbWVNYXAuc2V0KGtleSwgW10pO1xuICAgICAgfVxuICAgICAgbmFtZU1hcC5nZXQoa2V5KSEucHVzaChyZXN1bHQpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBwcm9jZXNzZWRSZXN1bHRzOiBVbmlmaWVkU2VhcmNoUmVzdWx0W10gPSBbXTtcbiAgICBcbiAgICAvLyBQcm9jZXNzIGVhY2ggZ3JvdXBcbiAgICBmb3IgKGNvbnN0IFtrZXksIGdyb3VwUmVzdWx0c10gb2YgbmFtZU1hcCkge1xuICAgICAgaWYgKGdyb3VwUmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gTm8gZHVwbGljYXRlc1xuICAgICAgICBwcm9jZXNzZWRSZXN1bHRzLnB1c2goZ3JvdXBSZXN1bHRzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhcyBkdXBsaWNhdGVzIC0gZGV0ZWN0IHZlcnNpb24gY29uZmxpY3RzXG4gICAgICAgIGNvbnN0IHZlcnNpb25Db25mbGljdCA9IHRoaXMuZGV0ZWN0VmVyc2lvbkNvbmZsaWN0RnJvbVJlc3VsdHMoZ3JvdXBSZXN1bHRzKTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgYWxsIHJlc3VsdHMgYXMgZHVwbGljYXRlcyBhbmQgYWRkIGNvbmZsaWN0IGluZm9cbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgZ3JvdXBSZXN1bHRzKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgIGlzRHVwbGljYXRlOiB0cnVlLFxuICAgICAgICAgICAgdmVyc2lvbkNvbmZsaWN0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHByb2Nlc3NlZFJlc3VsdHM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBBcHBseSBwYWdpbmF0aW9uIHRvIHJlc3VsdHNcbiAgICovXG4gIHByaXZhdGUgYXBwbHlQYWdpbmF0aW9uKHJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSwgb3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMpOiBVbmlmaWVkU2VhcmNoUmVzdWx0W10ge1xuICAgIGNvbnN0IHBhZ2UgPSBvcHRpb25zLnBhZ2UgfHwgMTtcbiAgICBjb25zdCBwYWdlU2l6ZSA9IG9wdGlvbnMucGFnZVNpemUgfHwgMjA7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IChwYWdlIC0gMSkgKiBwYWdlU2l6ZTtcbiAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBwYWdlU2l6ZTtcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0cy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBBcHBseSBzb3J0aW5nIHRvIHJlc3VsdHNcbiAgICovXG4gIHByaXZhdGUgYXBwbHlTb3J0aW5nKHJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSwgc29ydEJ5OiAncmVsZXZhbmNlJyB8ICdzb3VyY2UnIHwgJ25hbWUnIHwgJ3ZlcnNpb24nLCBxdWVyeTogc3RyaW5nKTogVW5pZmllZFNlYXJjaFJlc3VsdFtdIHtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4ucmVzdWx0c107XG4gICAgXG4gICAgc3dpdGNoIChzb3J0QnkpIHtcbiAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gYS5lbnRyeS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5lbnRyeS5uYW1lKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc291cmNlJzpcbiAgICAgICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VPcmRlciA9IHsgJ2xvY2FsJzogMCwgJ2dpdGh1Yic6IDEsICdjb2xsZWN0aW9uJzogMiB9O1xuICAgICAgICAgIHJldHVybiBzb3VyY2VPcmRlclthLnNvdXJjZV0gLSBzb3VyY2VPcmRlcltiLnNvdXJjZV07XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ZlcnNpb24nOlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gdGhpcy5jb21wYXJlVmVyc2lvbnMoYi52ZXJzaW9uIHx8ICcwJywgYS52ZXJzaW9uIHx8ICcwJykpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlbGV2YW5jZSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNvcnRlZDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBtYXRjaCBzY29yZSBmb3IgR2l0SHViIGVudHJpZXNcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlR2l0SHViTWF0Y2hTY29yZShlbnRyeTogR2l0SHViSW5kZXhFbnRyeSwgcXVlcnlUb2tlbnM6IHN0cmluZ1tdLCBxdWVyeTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAocXVlcnlUb2tlbnMubGVuZ3RoID09PSAwKSByZXR1cm4gMTsgLy8gRGVmYXVsdCBzY29yZSBmb3IgZW1wdHkgcXVlcnlcbiAgICBcbiAgICBsZXQgc2NvcmUgPSAwO1xuICAgIFxuICAgIGNvbnN0IG5hbWUgPSBlbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoZW50cnkuZGVzY3JpcHRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgcGF0aCA9IChlbnRyeS5wYXRoIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIFxuICAgIC8vIENoZWNrIG5hbWUgbWF0Y2hlc1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcXVlcnlUb2tlbnMpIHtcbiAgICAgIGlmIChuYW1lLmluY2x1ZGVzKHRva2VuKSkge1xuICAgICAgICBzY29yZSArPSBuYW1lID09PSB0b2tlbiA/IDEwIDogKG5hbWUuc3RhcnRzV2l0aCh0b2tlbikgPyA1IDogMik7XG4gICAgICB9XG4gICAgICBpZiAoZGVzY3JpcHRpb24uaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHNjb3JlICs9IDM7XG4gICAgICB9XG4gICAgICBpZiAocGF0aC5pbmNsdWRlcyh0b2tlbikpIHtcbiAgICAgICAgc2NvcmUgKz0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRXhhY3QgcXVlcnkgbWF0Y2ggYm9udXNcbiAgICBpZiAobmFtZS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgc2NvcmUgKz0gcXVlcnkubGVuZ3RoID4gMyA/IDE1IDogMTA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzY29yZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBtYXRjaCBzY29yZSBmb3IgY29sbGVjdGlvbiBlbnRyaWVzXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUNvbGxlY3Rpb25NYXRjaFNjb3JlKGVudHJ5OiBDb2xsZWN0aW9uSW5kZXhFbnRyeSwgcXVlcnlUb2tlbnM6IHN0cmluZ1tdLCBxdWVyeTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAocXVlcnlUb2tlbnMubGVuZ3RoID09PSAwKSByZXR1cm4gMTsgLy8gRGVmYXVsdCBzY29yZSBmb3IgZW1wdHkgcXVlcnlcbiAgICBcbiAgICBsZXQgc2NvcmUgPSAwO1xuICAgIFxuICAgIGNvbnN0IG5hbWUgPSBlbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoZW50cnkuZGVzY3JpcHRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgcGF0aCA9IChlbnRyeS5wYXRoIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHRhZ3MgPSBlbnRyeS50YWdzLm1hcCh0YWcgPT4gdGFnLnRvTG93ZXJDYXNlKCkpLmpvaW4oJyAnKTtcbiAgICBcbiAgICAvLyBDaGVjayBtYXRjaGVzIGFjcm9zcyBhbGwgZmllbGRzXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBxdWVyeVRva2Vucykge1xuICAgICAgaWYgKG5hbWUuaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHNjb3JlICs9IG5hbWUgPT09IHRva2VuID8gMTAgOiAobmFtZS5zdGFydHNXaXRoKHRva2VuKSA/IDUgOiAyKTtcbiAgICAgIH1cbiAgICAgIGlmIChkZXNjcmlwdGlvbi5pbmNsdWRlcyh0b2tlbikpIHtcbiAgICAgICAgc2NvcmUgKz0gMztcbiAgICAgIH1cbiAgICAgIGlmIChwYXRoLmluY2x1ZGVzKHRva2VuKSkge1xuICAgICAgICBzY29yZSArPSAxO1xuICAgICAgfVxuICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHNjb3JlICs9IDQ7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEV4YWN0IHF1ZXJ5IG1hdGNoIGJvbnVzXG4gICAgaWYgKG5hbWUuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIHNjb3JlICs9IHF1ZXJ5Lmxlbmd0aCA+IDMgPyAxNSA6IDEwO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc2NvcmU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbGVtZW50cyBieSB0eXBlIGFjcm9zcyBzb3VyY2VzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEFsbEVsZW1lbnRzQnlUeXBlKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSwgb3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFVuaWZpZWRTZWFyY2hSZXN1bHRbXT4ge1xuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPFVuaWZpZWRTZWFyY2hSZXN1bHRbXT5bXSA9IFtdO1xuICAgIFxuICAgIGlmIChvcHRpb25zLmluY2x1ZGVMb2NhbCkge1xuICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmdldExvY2FsRWxlbWVudHNCeVR5cGUoZWxlbWVudFR5cGUpKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZUdpdEh1Yikge1xuICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmdldEdpdEh1YkVsZW1lbnRzQnlUeXBlKGVsZW1lbnRUeXBlKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmluY2x1ZGVDb2xsZWN0aW9uKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHRoaXMuZ2V0Q29sbGVjdGlvbkVsZW1lbnRzQnlUeXBlKGVsZW1lbnRUeXBlKSk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpO1xuICAgIGNvbnN0IGFsbFJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSA9IFtdO1xuICAgIFxuICAgIHJlc3VsdHMuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgIGFsbFJlc3VsdHMucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBhbGxSZXN1bHRzO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGxvY2FsIGVsZW1lbnRzIGJ5IHR5cGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0TG9jYWxFbGVtZW50c0J5VHlwZShlbGVtZW50VHlwZTogRWxlbWVudFR5cGUpOiBQcm9taXNlPFVuaWZpZWRTZWFyY2hSZXN1bHRbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubG9jYWxJbmRleE1hbmFnZXIuZ2V0RWxlbWVudHNCeVR5cGUoZWxlbWVudFR5cGUpO1xuICAgICAgcmV0dXJuIGVsZW1lbnRzLm1hcChlbnRyeSA9PiAoe1xuICAgICAgICBzb3VyY2U6ICdsb2NhbCcgYXMgY29uc3QsXG4gICAgICAgIGVudHJ5OiB0aGlzLmNvbnZlcnRMb2NhbEVudHJ5KGVudHJ5KSxcbiAgICAgICAgbWF0Y2hUeXBlOiAndHlwZScsXG4gICAgICAgIHNjb3JlOiAxLFxuICAgICAgICB2ZXJzaW9uOiBlbnRyeS5tZXRhZGF0YS52ZXJzaW9uXG4gICAgICB9KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IEdpdEh1YiBlbGVtZW50cyBieSB0eXBlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEdpdEh1YkVsZW1lbnRzQnlUeXBlKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdpdGh1YkluZGV4ID0gYXdhaXQgdGhpcy5naXRodWJJbmRleGVyLmdldEluZGV4KCk7XG4gICAgICBjb25zdCBlbnRyaWVzID0gZ2l0aHViSW5kZXguZWxlbWVudHMuZ2V0KGVsZW1lbnRUeXBlKSB8fCBbXTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGVudHJpZXMubWFwKGVudHJ5ID0+ICh7XG4gICAgICAgIHNvdXJjZTogJ2dpdGh1YicgYXMgY29uc3QsXG4gICAgICAgIGVudHJ5OiB0aGlzLmNvbnZlcnRHaXRIdWJFbnRyeShlbnRyeSksXG4gICAgICAgIG1hdGNoVHlwZTogJ3R5cGUnLFxuICAgICAgICBzY29yZTogMSxcbiAgICAgICAgdmVyc2lvbjogZW50cnkudmVyc2lvblxuICAgICAgfSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBjb2xsZWN0aW9uIGVsZW1lbnRzIGJ5IHR5cGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29sbGVjdGlvbkVsZW1lbnRzQnlUeXBlKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25JbmRleCA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbkluZGV4Q2FjaGUuZ2V0SW5kZXgoKTtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBjb2xsZWN0aW9uSW5kZXguaW5kZXhbZWxlbWVudFR5cGUudG9TdHJpbmcoKV0gfHwgW107XG4gICAgICBcbiAgICAgIHJldHVybiBlbnRyaWVzLm1hcChlbnRyeSA9PiAoe1xuICAgICAgICBzb3VyY2U6ICdjb2xsZWN0aW9uJyBhcyBjb25zdCxcbiAgICAgICAgZW50cnk6IHRoaXMuY29udmVydENvbGxlY3Rpb25FbnRyeShlbnRyeSwgZWxlbWVudFR5cGUudG9TdHJpbmcoKSksXG4gICAgICAgIG1hdGNoVHlwZTogJ3R5cGUnLFxuICAgICAgICBzY29yZTogMSxcbiAgICAgICAgdmVyc2lvbjogZW50cnkudmVyc2lvblxuICAgICAgfSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbG9jYWwgcG9ydGZvbGlvIHN0YXRpc3RpY3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0TG9jYWxTdGF0cygpOiBQcm9taXNlPFVuaWZpZWRJbmRleFN0YXRzWydsb2NhbCddPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubG9jYWxJbmRleE1hbmFnZXIuZ2V0U3RhdHMoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgcG9ydGZvbGlvIHN0YXRpc3RpY3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0R2l0SHViU3RhdHMoKTogUHJvbWlzZTxVbmlmaWVkSW5kZXhTdGF0c1snZ2l0aHViJ10+IHtcbiAgICBjb25zdCBjYWNoZVN0YXRzID0gdGhpcy5naXRodWJJbmRleGVyLmdldENhY2hlU3RhdHMoKTtcbiAgICBjb25zdCBnaXRodWJJbmRleCA9IGF3YWl0IHRoaXMuZ2l0aHViSW5kZXhlci5nZXRJbmRleCgpO1xuICAgIFxuICAgIGNvbnN0IGVsZW1lbnRzQnlUeXBlOiBSZWNvcmQ8RWxlbWVudFR5cGUsIG51bWJlcj4gPSB7fSBhcyBSZWNvcmQ8RWxlbWVudFR5cGUsIG51bWJlcj47XG4gICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgZWxlbWVudHNCeVR5cGVbZWxlbWVudFR5cGVdID0gKGdpdGh1YkluZGV4LmVsZW1lbnRzLmdldChlbGVtZW50VHlwZSkgfHwgW10pLmxlbmd0aDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsRWxlbWVudHM6IGdpdGh1YkluZGV4LnRvdGFsRWxlbWVudHMsXG4gICAgICBlbGVtZW50c0J5VHlwZSxcbiAgICAgIGxhc3RGZXRjaGVkOiBjYWNoZVN0YXRzLmxhc3RGZXRjaCxcbiAgICAgIGlzU3RhbGU6IGNhY2hlU3RhdHMuaXNTdGFsZSxcbiAgICAgIHVzZXJuYW1lOiBnaXRodWJJbmRleC51c2VybmFtZSxcbiAgICAgIHJlcG9zaXRvcnk6IGdpdGh1YkluZGV4LnJlcG9zaXRvcnlcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGNvbGxlY3Rpb24gcG9ydGZvbGlvIHN0YXRpc3RpY3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29sbGVjdGlvblN0YXRzKCk6IFByb21pc2U8VW5pZmllZEluZGV4U3RhdHNbJ2NvbGxlY3Rpb24nXT4ge1xuICAgIGNvbnN0IGNhY2hlU3RhdHMgPSB0aGlzLmNvbGxlY3Rpb25JbmRleENhY2hlLmdldENhY2hlU3RhdHMoKTtcbiAgICBjb25zdCBjb2xsZWN0aW9uSW5kZXggPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25JbmRleENhY2hlLmdldEluZGV4KCk7XG4gICAgXG4gICAgY29uc3QgZWxlbWVudHNCeVR5cGU6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMoY29sbGVjdGlvbkluZGV4LmluZGV4KSkge1xuICAgICAgZWxlbWVudHNCeVR5cGVbZWxlbWVudFR5cGVdID0gZW50cmllcy5sZW5ndGg7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbEVsZW1lbnRzOiBjb2xsZWN0aW9uSW5kZXgudG90YWxfZWxlbWVudHMsXG4gICAgICBlbGVtZW50c0J5VHlwZSxcbiAgICAgIGxhc3RGZXRjaGVkOiBjYWNoZVN0YXRzLmhhc0NhY2hlID8gbmV3IERhdGUoRGF0ZS5ub3coKSAtIGNhY2hlU3RhdHMuYWdlKSA6IG51bGwsXG4gICAgICBpc1N0YWxlOiAhY2FjaGVTdGF0cy5pc1ZhbGlkLFxuICAgICAgdmVyc2lvbjogY29sbGVjdGlvbkluZGV4LnZlcnNpb25cbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogQ2FsY3VsYXRlIGR1cGxpY2F0ZXMgY291bnQgYWNyb3NzIGFsbCBzb3VyY2VzXG4gICAqXG4gICAqIElkZW50aWZpZXMgZWxlbWVudHMgdGhhdCBleGlzdCBpbiBtdWx0aXBsZSBzb3VyY2VzIChsb2NhbCwgR2l0SHViLCBjb2xsZWN0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjYWxjdWxhdGVEdXBsaWNhdGVzQ291bnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAvLyBUcmFjayBkdXBsaWNhdGVzIHVzaW5nIGEgbWFwIG9mIGVsZW1lbnQgbmFtZXMgdG8gc291cmNlc1xuICAgIGNvbnN0IGVsZW1lbnRTb3VyY2VzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGxvY2FsIGluZGV4XG4gICAgICBjb25zdCBsb2NhbEluZGV4ID0gYXdhaXQgdGhpcy5sb2NhbEluZGV4TWFuYWdlci5nZXRJbmRleCgpO1xuICAgICAgaWYgKGxvY2FsSW5kZXg/LmJ5TmFtZSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lXSBvZiBsb2NhbEluZGV4LmJ5TmFtZSkge1xuICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnRTb3VyY2VzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgICBlbGVtZW50U291cmNlcy5zZXQobmFtZSwgbmV3IFNldCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnRTb3VyY2VzLmdldChuYW1lKSEuYWRkKCdsb2NhbCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBHaXRIdWIgaW5kZXhcbiAgICAgIGNvbnN0IGdpdGh1YkluZGV4ID0gYXdhaXQgdGhpcy5naXRodWJJbmRleGVyLmdldEluZGV4KCk7XG4gICAgICBpZiAoZ2l0aHViSW5kZXg/LmVsZW1lbnRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgWywgZW50cmllc10gb2YgZ2l0aHViSW5kZXguZWxlbWVudHMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbnRyeS5uYW1lO1xuICAgICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50U291cmNlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50U291cmNlcy5zZXQobmFtZSwgbmV3IFNldCgpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbGVtZW50U291cmNlcy5nZXQobmFtZSkhLmFkZCgnZ2l0aHViJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGNvbGxlY3Rpb24gaW5kZXhcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25JbmRleCA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbkluZGV4Q2FjaGUuZ2V0SW5kZXgoKTtcbiAgICAgIGlmIChjb2xsZWN0aW9uSW5kZXg/LmluZGV4KSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgaW4gY29sbGVjdGlvbkluZGV4LmluZGV4KSB7XG4gICAgICAgICAgY29uc3QgZW50cmllcyA9IGNvbGxlY3Rpb25JbmRleC5pbmRleFtlbGVtZW50VHlwZV07XG4gICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gZW50cnkubmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgIGlmICghZWxlbWVudFNvdXJjZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudFNvdXJjZXMuc2V0KG5hbWUsIG5ldyBTZXQoKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxlbWVudFNvdXJjZXMuZ2V0KG5hbWUpIS5hZGQoJ2NvbGxlY3Rpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGVycm9yIGJ1dCBkb24ndCBmYWlsXG4gICAgICBsb2dnZXIuZGVidWcoJ0Vycm9yIGNhbGN1bGF0aW5nIGR1cGxpY2F0ZXMgY291bnQnLCBlcnJvcik7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBDb3VudCBlbGVtZW50cyB0aGF0IGFwcGVhciBpbiBtb3JlIHRoYW4gb25lIHNvdXJjZVxuICAgIGxldCBkdXBsaWNhdGVDb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBzb3VyY2VzIG9mIGVsZW1lbnRTb3VyY2VzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoc291cmNlcy5zaXplID4gMSkge1xuICAgICAgICBkdXBsaWNhdGVDb3VudCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkdXBsaWNhdGVDb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGxvY2FsIGluZGV4IGVudHJ5IHRvIHVuaWZpZWQgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRMb2NhbEVudHJ5KGVudHJ5OiBJbmRleEVudHJ5KTogVW5pZmllZEluZGV4RW50cnkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBlbnRyeS5tZXRhZGF0YS5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGVudHJ5Lm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogZW50cnkubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogZW50cnkubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgZWxlbWVudFR5cGU6IGVudHJ5LmVsZW1lbnRUeXBlLFxuICAgICAgbGFzdE1vZGlmaWVkOiBlbnRyeS5sYXN0TW9kaWZpZWQsXG4gICAgICBzb3VyY2U6ICdsb2NhbCcsXG4gICAgICBsb2NhbEZpbGVQYXRoOiBlbnRyeS5maWxlUGF0aCxcbiAgICAgIGZpbGVuYW1lOiBlbnRyeS5maWxlbmFtZSxcbiAgICAgIHRhZ3M6IGVudHJ5Lm1ldGFkYXRhLnRhZ3MsXG4gICAgICBrZXl3b3JkczogZW50cnkubWV0YWRhdGEua2V5d29yZHMsXG4gICAgICB0cmlnZ2VyczogZW50cnkubWV0YWRhdGEudHJpZ2dlcnMsXG4gICAgICBjYXRlZ29yeTogZW50cnkubWV0YWRhdGEuY2F0ZWdvcnlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgR2l0SHViIGluZGV4IGVudHJ5IHRvIHVuaWZpZWQgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRHaXRIdWJFbnRyeShlbnRyeTogR2l0SHViSW5kZXhFbnRyeSk6IFVuaWZpZWRJbmRleEVudHJ5IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBlbnRyeS5kZXNjcmlwdGlvbixcbiAgICAgIHZlcnNpb246IGVudHJ5LnZlcnNpb24sXG4gICAgICBhdXRob3I6IGVudHJ5LmF1dGhvcixcbiAgICAgIGVsZW1lbnRUeXBlOiBlbnRyeS5lbGVtZW50VHlwZSxcbiAgICAgIGxhc3RNb2RpZmllZDogZW50cnkubGFzdE1vZGlmaWVkLFxuICAgICAgc291cmNlOiAnZ2l0aHViJyxcbiAgICAgIGdpdGh1YlBhdGg6IGVudHJ5LnBhdGgsXG4gICAgICBnaXRodWJTaGE6IGVudHJ5LnNoYSxcbiAgICAgIGdpdGh1Ykh0bWxVcmw6IGVudHJ5Lmh0bWxVcmwsXG4gICAgICBnaXRodWJEb3dubG9hZFVybDogZW50cnkuZG93bmxvYWRVcmwsXG4gICAgICBnaXRodWJTaXplOiBlbnRyeS5zaXplXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENvbnZlcnQgY29sbGVjdGlvbiBpbmRleCBlbnRyeSB0byB1bmlmaWVkIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0Q29sbGVjdGlvbkVudHJ5KGVudHJ5OiBDb2xsZWN0aW9uSW5kZXhFbnRyeSwgZWxlbWVudFR5cGU6IHN0cmluZyk6IFVuaWZpZWRJbmRleEVudHJ5IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBlbnRyeS5kZXNjcmlwdGlvbixcbiAgICAgIHZlcnNpb246IGVudHJ5LnZlcnNpb24sXG4gICAgICBhdXRob3I6IGVudHJ5LmF1dGhvcixcbiAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLm1hcFN0cmluZ1RvRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpLFxuICAgICAgbGFzdE1vZGlmaWVkOiBuZXcgRGF0ZShlbnRyeS5jcmVhdGVkKSxcbiAgICAgIHNvdXJjZTogJ2NvbGxlY3Rpb24nLFxuICAgICAgY29sbGVjdGlvblBhdGg6IGVudHJ5LnBhdGgsXG4gICAgICBjb2xsZWN0aW9uU2hhOiBlbnRyeS5zaGEsXG4gICAgICBjb2xsZWN0aW9uVGFnczogZW50cnkudGFncyxcbiAgICAgIGNvbGxlY3Rpb25DYXRlZ29yeTogZW50cnkuY2F0ZWdvcnksXG4gICAgICBjb2xsZWN0aW9uTGljZW5zZTogZW50cnkubGljZW5zZVxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBNYXAgc3RyaW5nIHRvIEVsZW1lbnRUeXBlIGVudW1cbiAgICovXG4gIHByaXZhdGUgbWFwU3RyaW5nVG9FbGVtZW50VHlwZShlbGVtZW50VHlwZTogc3RyaW5nKTogRWxlbWVudFR5cGUge1xuICAgIC8vIEhhbmRsZSBtYXBwaW5nIGZyb20gY29sbGVjdGlvbiBlbGVtZW50IHR5cGVzIHRvIG91ciBFbGVtZW50VHlwZSBlbnVtXG4gICAgc3dpdGNoIChlbGVtZW50VHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgIHJldHVybiBFbGVtZW50VHlwZS5QRVJTT05BO1xuICAgICAgY2FzZSAnc2tpbGxzJzpcbiAgICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlLlNLSUxMO1xuICAgICAgY2FzZSAnYWdlbnRzJzpcbiAgICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlLkFHRU5UO1xuICAgICAgY2FzZSAncHJvbXB0cyc6XG4gICAgICBjYXNlICd0ZW1wbGF0ZXMnOlxuICAgICAgICByZXR1cm4gRWxlbWVudFR5cGUuVEVNUExBVEU7IC8vIE1hcCBwcm9tcHRzIGFuZCB0ZW1wbGF0ZXMgdG8gVEVNUExBVEVcbiAgICAgIGNhc2UgJ3Rvb2xzJzpcbiAgICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlLlNLSUxMOyAvLyBNYXAgdG9vbHMgdG8gU0tJTEwgYXMgZmFsbGJhY2tcbiAgICAgIGNhc2UgJ2Vuc2VtYmxlcyc6XG4gICAgICAgIHJldHVybiBFbGVtZW50VHlwZS5FTlNFTUJMRTtcbiAgICAgIGNhc2UgJ21lbW9yaWVzJzpcbiAgICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlLk1FTU9SWTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBFbGVtZW50VHlwZS5TS0lMTDsgLy8gRGVmYXVsdCBmYWxsYmFja1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENvbnZlcnQgdW5pZmllZCBzZWFyY2ggb3B0aW9ucyB0byBsb2NhbCBzZWFyY2ggb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0VG9Mb2NhbE9wdGlvbnMob3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMpOiBTZWFyY2hPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudFR5cGU6IG9wdGlvbnMuZWxlbWVudFR5cGUsXG4gICAgICBtYXhSZXN1bHRzOiBvcHRpb25zLnBhZ2VTaXplIHx8IDIwXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERldGVybWluZSBtYXRjaCB0eXBlIGZvciBHaXRIdWIgZW50cmllc1xuICAgKi9cbiAgcHJpdmF0ZSBkZXRlcm1pbmVNYXRjaFR5cGUoZW50cnk6IEdpdEh1YkluZGV4RW50cnksIHF1ZXJ5VG9rZW5zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IGVudHJ5Lm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChlbnRyeS5kZXNjcmlwdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICAvLyBDaGVjayB3aGF0IG1hdGNoZWRcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHF1ZXJ5VG9rZW5zKSB7XG4gICAgICBpZiAobmFtZS5pbmNsdWRlcyh0b2tlbikpIHtcbiAgICAgICAgcmV0dXJuIG5hbWUgPT09IHRva2VuID8gJ2V4YWN0X25hbWUnIDogJ25hbWUnO1xuICAgICAgfVxuICAgICAgaWYgKGRlc2NyaXB0aW9uLmluY2x1ZGVzKHRva2VuKSkge1xuICAgICAgICByZXR1cm4gJ2Rlc2NyaXB0aW9uJztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuICdjb250ZW50JztcbiAgfVxuICBcbiAgLyoqXG4gICAqIERldGVybWluZSBtYXRjaCB0eXBlIGZvciBjb2xsZWN0aW9uIGVudHJpZXNcbiAgICovXG4gIHByaXZhdGUgZGV0ZXJtaW5lQ29sbGVjdGlvbk1hdGNoVHlwZShlbnRyeTogQ29sbGVjdGlvbkluZGV4RW50cnksIHF1ZXJ5VG9rZW5zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IGVudHJ5Lm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChlbnRyeS5kZXNjcmlwdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB0YWdzID0gZW50cnkudGFncy5tYXAodGFnID0+IHRhZy50b0xvd2VyQ2FzZSgpKS5qb2luKCcgJyk7XG4gICAgXG4gICAgLy8gQ2hlY2sgd2hhdCBtYXRjaGVkXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBxdWVyeVRva2Vucykge1xuICAgICAgaWYgKG5hbWUuaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHJldHVybiBuYW1lID09PSB0b2tlbiA/ICdleGFjdF9uYW1lJyA6ICduYW1lJztcbiAgICAgIH1cbiAgICAgIGlmIChkZXNjcmlwdGlvbi5pbmNsdWRlcyh0b2tlbikpIHtcbiAgICAgICAgcmV0dXJuICdkZXNjcmlwdGlvbic7XG4gICAgICB9XG4gICAgICBpZiAodGFncy5pbmNsdWRlcyh0b2tlbikpIHtcbiAgICAgICAgcmV0dXJuICd0YWcnO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gJ2NvbnRlbnQnO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHBhdGggZnJvbSB1bmlmaWVkIGVudHJ5XG4gICAqL1xuICBwcml2YXRlIGdldFBhdGhGcm9tRW50cnkoZW50cnk6IFVuaWZpZWRJbmRleEVudHJ5KTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKGVudHJ5LnNvdXJjZSkge1xuICAgICAgY2FzZSAnbG9jYWwnOlxuICAgICAgICByZXR1cm4gZW50cnkubG9jYWxGaWxlUGF0aCB8fCBlbnRyeS5maWxlbmFtZSB8fCAndW5rbm93bic7XG4gICAgICBjYXNlICdnaXRodWInOlxuICAgICAgICByZXR1cm4gZW50cnkuZ2l0aHViUGF0aCB8fCAndW5rbm93bic7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIGVudHJ5LmNvbGxlY3Rpb25QYXRoIHx8ICd1bmtub3duJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAndW5rbm93bic7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRGV0ZWN0IHZlcnNpb24gY29uZmxpY3QgZnJvbSBzb3VyY2VzXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFZlcnNpb25Db25mbGljdChzb3VyY2VzOiBEdXBsaWNhdGVJbmZvWydzb3VyY2VzJ10pOiBWZXJzaW9uQ29uZmxpY3QgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZlcnNpb25zID0gbmV3IE1hcDxzdHJpbmcsICdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJz4oKTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICBpZiAoc291cmNlLnZlcnNpb24gJiYgc291cmNlLnZlcnNpb24gIT09ICd1bmtub3duJykge1xuICAgICAgICB2ZXJzaW9ucy5zZXQoc291cmNlLnZlcnNpb24sIHNvdXJjZS5zb3VyY2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAodmVyc2lvbnMuc2l6ZSA8PSAxKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBObyBjb25mbGljdCBpZiBhbGwgdmVyc2lvbnMgYXJlIHRoZSBzYW1lIG9yIG1pc3NpbmdcbiAgICB9XG4gICAgXG4gICAgLy8gQnVpbGQgdmVyc2lvbiBjb25mbGljdCBpbmZvXG4gICAgY29uc3QgdmVyc2lvbkNvbmZsaWN0OiBWZXJzaW9uQ29uZmxpY3QgPSB7XG4gICAgICByZWNvbW1lbmRlZDogJ2xvY2FsJyxcbiAgICAgIHJlYXNvbjogJ011bHRpcGxlIHZlcnNpb25zIGRldGVjdGVkJ1xuICAgIH07XG4gICAgXG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgaWYgKHNvdXJjZS52ZXJzaW9uKSB7XG4gICAgICAgIHZlcnNpb25Db25mbGljdFtzb3VyY2Uuc291cmNlXSA9IHNvdXJjZS52ZXJzaW9uO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBEZXRlcm1pbmUgcmVjb21tZW5kYXRpb25cbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbiA9IHRoaXMuZGV0ZXJtaW5lVmVyc2lvblJlY29tbWVuZGF0aW9uRnJvbVNvdXJjZXMoc291cmNlcyk7XG4gICAgdmVyc2lvbkNvbmZsaWN0LnJlY29tbWVuZGVkID0gcmVjb21tZW5kYXRpb24uc291cmNlO1xuICAgIHZlcnNpb25Db25mbGljdC5yZWFzb24gPSByZWNvbW1lbmRhdGlvbi5yZWFzb247XG4gICAgXG4gICAgcmV0dXJuIHZlcnNpb25Db25mbGljdDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERldGVjdCB2ZXJzaW9uIGNvbmZsaWN0IGZyb20gc2VhcmNoIHJlc3VsdHNcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0VmVyc2lvbkNvbmZsaWN0RnJvbVJlc3VsdHMocmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdKTogVmVyc2lvbkNvbmZsaWN0IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzb3VyY2VzID0gcmVzdWx0cy5tYXAocmVzdWx0ID0+ICh7XG4gICAgICBzb3VyY2U6IHJlc3VsdC5zb3VyY2UsXG4gICAgICB2ZXJzaW9uOiByZXN1bHQudmVyc2lvbixcbiAgICAgIGxhc3RNb2RpZmllZDogcmVzdWx0LmVudHJ5Lmxhc3RNb2RpZmllZCxcbiAgICAgIHBhdGg6IHRoaXMuZ2V0UGF0aEZyb21FbnRyeShyZXN1bHQuZW50cnkpXG4gICAgfSkpO1xuICAgIFxuICAgIHJldHVybiB0aGlzLmRldGVjdFZlcnNpb25Db25mbGljdChzb3VyY2VzKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERldGVybWluZSB2ZXJzaW9uIHJlY29tbWVuZGF0aW9uIGZyb20gdmVyc2lvbiBpbmZvXG4gICAqL1xuICBwcml2YXRlIGRldGVybWluZVZlcnNpb25SZWNvbW1lbmRhdGlvbih2ZXJzaW9uczogVmVyc2lvbkluZm9bJ3ZlcnNpb25zJ10pOiB7IHNvdXJjZTogJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nOyByZWFzb246IHN0cmluZyB9IHtcbiAgICAvLyBQcmVmZXIgbG9jYWwgaWYgYXZhaWxhYmxlIGFuZCBub3QgdG9vIG9sZFxuICAgIGlmICh2ZXJzaW9ucy5sb2NhbCkge1xuICAgICAgY29uc3QgbG9jYWxBZ2UgPSBEYXRlLm5vdygpIC0gdmVyc2lvbnMubG9jYWwubGFzdE1vZGlmaWVkLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IHNldmVuRGF5cyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgICAgXG4gICAgICBpZiAobG9jYWxBZ2UgPCBzZXZlbkRheXMpIHtcbiAgICAgICAgcmV0dXJuIHsgc291cmNlOiAnbG9jYWwnLCByZWFzb246ICdMb2NhbCB2ZXJzaW9uIGlzIHJlY2VudCBhbmQgYXV0aG9yaXRhdGl2ZScgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ29tcGFyZSB2ZXJzaW9ucyBpZiBhdmFpbGFibGVcbiAgICBjb25zdCB2ZXJzaW9uRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHZlcnNpb25zKS5maWx0ZXIoKFtfLCBpbmZvXSkgPT4gaW5mbz8udmVyc2lvbik7XG4gICAgXG4gICAgaWYgKHZlcnNpb25FbnRyaWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIEZpbmQgaGlnaGVzdCB2ZXJzaW9uXG4gICAgICBsZXQgaGlnaGVzdDogeyBzb3VyY2U6ICdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJzsgdmVyc2lvbjogc3RyaW5nIH0gPSB7XG4gICAgICAgIHNvdXJjZTogJ2xvY2FsJyxcbiAgICAgICAgdmVyc2lvbjogJzAuMC4wJ1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBbc291cmNlLCBpbmZvXSBvZiB2ZXJzaW9uRW50cmllcykge1xuICAgICAgICBpZiAoaW5mbyAmJiB0aGlzLmNvbXBhcmVWZXJzaW9ucyhpbmZvLnZlcnNpb24sIGhpZ2hlc3QudmVyc2lvbikgPiAwKSB7XG4gICAgICAgICAgaGlnaGVzdCA9IHtcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlIGFzICdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIHZlcnNpb246IGluZm8udmVyc2lvblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHsgc291cmNlOiBoaWdoZXN0LnNvdXJjZSwgcmVhc29uOiBgSGlnaGVzdCB2ZXJzaW9uICgke2hpZ2hlc3QudmVyc2lvbn0pYCB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBGYWxsYmFjayB0byBtb3N0IHJlY2VudFxuICAgIGxldCBtb3N0UmVjZW50OiB7IHNvdXJjZTogJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nOyBkYXRlOiBEYXRlIH0gPSB7XG4gICAgICBzb3VyY2U6ICdsb2NhbCcsXG4gICAgICBkYXRlOiBuZXcgRGF0ZSgwKVxuICAgIH07XG4gICAgXG4gICAgZm9yIChjb25zdCBbc291cmNlLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyh2ZXJzaW9ucykpIHtcbiAgICAgIGlmIChpbmZvICYmIGluZm8ubGFzdE1vZGlmaWVkID4gbW9zdFJlY2VudC5kYXRlKSB7XG4gICAgICAgIG1vc3RSZWNlbnQgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UgYXMgJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nLFxuICAgICAgICAgIGRhdGU6IGluZm8ubGFzdE1vZGlmaWVkXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7IHNvdXJjZTogbW9zdFJlY2VudC5zb3VyY2UsIHJlYXNvbjogJ01vc3QgcmVjZW50bHkgbW9kaWZpZWQnIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgdmVyc2lvbiByZWNvbW1lbmRhdGlvbiBmcm9tIHNvdXJjZXNcbiAgICovXG4gIHByaXZhdGUgZGV0ZXJtaW5lVmVyc2lvblJlY29tbWVuZGF0aW9uRnJvbVNvdXJjZXMoc291cmNlczogRHVwbGljYXRlSW5mb1snc291cmNlcyddKTogeyBzb3VyY2U6ICdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJzsgcmVhc29uOiBzdHJpbmcgfSB7XG4gICAgLy8gQ29udmVydCBzb3VyY2VzIHRvIHZlcnNpb25zIGZvcm1hdFxuICAgIGNvbnN0IHZlcnNpb25zOiBWZXJzaW9uSW5mb1sndmVyc2lvbnMnXSA9IHt9O1xuICAgIFxuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgIGlmIChzb3VyY2Uuc291cmNlID09PSAnbG9jYWwnKSB7XG4gICAgICAgIHZlcnNpb25zLmxvY2FsID0ge1xuICAgICAgICAgIHZlcnNpb246IHNvdXJjZS52ZXJzaW9uIHx8ICd1bmtub3duJyxcbiAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHNvdXJjZS5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgcGF0aDogc291cmNlLnBhdGggfHwgJ3Vua25vd24nXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZS5zb3VyY2UgPT09ICdnaXRodWInKSB7XG4gICAgICAgIHZlcnNpb25zLmdpdGh1YiA9IHtcbiAgICAgICAgICB2ZXJzaW9uOiBzb3VyY2UudmVyc2lvbiB8fCAndW5rbm93bicsXG4gICAgICAgICAgbGFzdE1vZGlmaWVkOiBzb3VyY2UubGFzdE1vZGlmaWVkLFxuICAgICAgICAgIHBhdGg6IHNvdXJjZS5wYXRoIHx8ICd1bmtub3duJ1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChzb3VyY2Uuc291cmNlID09PSAnY29sbGVjdGlvbicpIHtcbiAgICAgICAgdmVyc2lvbnMuY29sbGVjdGlvbiA9IHtcbiAgICAgICAgICB2ZXJzaW9uOiBzb3VyY2UudmVyc2lvbiB8fCAndW5rbm93bicsXG4gICAgICAgICAgbGFzdE1vZGlmaWVkOiBzb3VyY2UubGFzdE1vZGlmaWVkLFxuICAgICAgICAgIHBhdGg6IHNvdXJjZS5wYXRoIHx8ICd1bmtub3duJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5kZXRlcm1pbmVWZXJzaW9uUmVjb21tZW5kYXRpb24odmVyc2lvbnMpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ29tcGFyZSBzZW1hbnRpYyB2ZXJzaW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBjb21wYXJlVmVyc2lvbnMoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHBhcnNlVmVyc2lvbiA9ICh2ZXJzaW9uOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdmVyc2lvbi5zcGxpdCgnLicpLm1hcChwYXJ0ID0+IE51bWJlci5wYXJzZUludChwYXJ0KSB8fCAwKTtcbiAgICAgIHJldHVybiBbcGFydHNbMF0gfHwgMCwgcGFydHNbMV0gfHwgMCwgcGFydHNbMl0gfHwgMF07XG4gICAgfTtcbiAgICBcbiAgICBjb25zdCBbYU1ham9yLCBhTWlub3IsIGFQYXRjaF0gPSBwYXJzZVZlcnNpb24oYSk7XG4gICAgY29uc3QgW2JNYWpvciwgYk1pbm9yLCBiUGF0Y2hdID0gcGFyc2VWZXJzaW9uKGIpO1xuICAgIFxuICAgIGlmIChhTWFqb3IgIT09IGJNYWpvcikgcmV0dXJuIGFNYWpvciAtIGJNYWpvcjtcbiAgICBpZiAoYU1pbm9yICE9PSBiTWlub3IpIHJldHVybiBhTWlub3IgLSBiTWlub3I7XG4gICAgcmV0dXJuIGFQYXRjaCAtIGJQYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZHVwbGljYXRlIHJlc3VsdHMgYmFzZWQgb24gbmFtZSBhbmQgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBkZWR1cGxpY2F0ZVJlc3VsdHMocmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdKTogVW5pZmllZFNlYXJjaFJlc3VsdFtdIHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgZGVkdXBsaWNhdGVkOiBVbmlmaWVkU2VhcmNoUmVzdWx0W10gPSBbXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtyZXN1bHQuZW50cnkuZWxlbWVudFR5cGV9OiR7cmVzdWx0LmVudHJ5Lm5hbWUudG9Mb3dlckNhc2UoKX1gO1xuICAgICAgaWYgKCFzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIGRlZHVwbGljYXRlZC5wdXNoKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkZWR1cGxpY2F0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzIGJhc2VkIG9uIG5hbWUgYW5kIHR5cGVcbiAgICovXG4gIHByaXZhdGUgZGVkdXBsaWNhdGVFbnRyaWVzKGVudHJpZXM6IFVuaWZpZWRJbmRleEVudHJ5W10pOiBVbmlmaWVkSW5kZXhFbnRyeVtdIHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgZGVkdXBsaWNhdGVkOiBVbmlmaWVkSW5kZXhFbnRyeVtdID0gW107XG4gICAgXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtlbnRyeS5lbGVtZW50VHlwZX06JHtlbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCl9YDtcbiAgICAgIGlmICghc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICBkZWR1cGxpY2F0ZWQucHVzaChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkZWR1cGxpY2F0ZWQ7XG4gIH1cbiAgXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBFUkZPUk1BTkNFIE1PTklUT1JJTkcgQU5EIE9QVElNSVpBVElPTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBcbiAgLyoqXG4gICAqIFN0cmVhbSBzZWFyY2ggcmVzdWx0cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIHdpdGggbGFyZ2UgZGF0YXNldHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3RyZWFtU2VhcmNoKG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxVbmlmaWVkU2VhcmNoUmVzdWx0W10+IHtcbiAgICBjb25zdCB7IHF1ZXJ5LCBjdXJzb3IsIG1heFJlc3VsdHMgPSAxMDAwIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBzdHJlYW1pbmcgc2VhcmNoJywgeyBxdWVyeTogcXVlcnkuc3Vic3RyaW5nKDAsIDUwKSwgY3Vyc29yLCBtYXhSZXN1bHRzIH0pO1xuICAgIFxuICAgIGNvbnN0IHJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSA9IFtdO1xuICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLmdldEVuYWJsZWRTb3VyY2VzKG9wdGlvbnMpO1xuICAgIFxuICAgIC8vIFByb2Nlc3Mgc291cmNlcyBpbiBzZXF1ZW5jZSBmb3IgbWVtb3J5IGVmZmljaWVuY3lcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPj0gbWF4UmVzdWx0cykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc291cmNlUmVzdWx0cyA9IGF3YWl0IHRoaXMuc2VhcmNoV2l0aEZhbGxiYWNrKHNvdXJjZSwgcXVlcnksIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIHBhZ2VTaXplOiBNYXRoLm1pbih0aGlzLkJBVENIX1NJWkUsIG1heFJlc3VsdHMgLSByZXN1bHRzLmxlbmd0aClcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXN1bHRzLnB1c2goLi4uc291cmNlUmVzdWx0cyk7XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgY3Vyc29yIGluZm9ybWF0aW9uIGZvciBwYWdpbmF0aW9uXG4gICAgICAgIHNvdXJjZVJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpbmRleCkgPT4ge1xuICAgICAgICAgIHJlc3VsdC5jdXJzb3IgPSB0aGlzLmdlbmVyYXRlQ3Vyc29yKHNvdXJjZSwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihgU3RyZWFtaW5nIHNlYXJjaCBmYWlsZWQgZm9yIHNvdXJjZSAke3NvdXJjZX1gLCB7XG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKCdTdHJlYW1pbmcgc2VhcmNoIGNvbXBsZXRlZCcsIHtcbiAgICAgIHJlc3VsdENvdW50OiByZXN1bHRzLmxlbmd0aCxcbiAgICAgIGR1cmF0aW9uOiBgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfW1zYFxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIFxuICAvKipcbiAgICogUHJvY2VzcyBzZWFyY2ggcmVzdWx0cyB3aXRoIG1lbW9yeS1lZmZpY2llbnQgYmF0Y2hpbmdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1NlYXJjaFJlc3VsdHNPcHRpbWl6ZWQocmVzdWx0czogVW5pZmllZFNlYXJjaFJlc3VsdFtdLCBvcHRpb25zOiBVbmlmaWVkU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgXG4gICAgLy8gUHJvY2VzcyBpbiBiYXRjaGVzIHRvIGF2b2lkIG1lbW9yeSBzcGlrZXMgd2l0aCBsYXJnZSByZXN1bHQgc2V0c1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IE1hdGgubWluKHRoaXMuQkFUQ0hfU0laRSwgcmVzdWx0cy5sZW5ndGgpO1xuICAgIGNvbnN0IHByb2Nlc3NlZFJlc3VsdHM6IFVuaWZpZWRTZWFyY2hSZXN1bHRbXSA9IFtdO1xuICAgIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IHJlc3VsdHMuc2xpY2UoaSwgaSArIGJhdGNoU2l6ZSk7XG4gICAgICBcbiAgICAgIC8vIEFwcGx5IHNtYXJ0IHJhbmtpbmdcbiAgICAgIGNvbnN0IHJhbmtlZEJhdGNoID0gdGhpcy5hcHBseVNtYXJ0UmFua2luZyhiYXRjaCwgb3B0aW9ucyk7XG4gICAgICBcbiAgICAgIC8vIERldGVjdCBkdXBsaWNhdGVzIGFuZCBjb25mbGljdHNcbiAgICAgIGNvbnN0IHByb2Nlc3NlZEJhdGNoID0gYXdhaXQgdGhpcy5kZXRlY3REdXBsaWNhdGVzQW5kQ29uZmxpY3RzKHJhbmtlZEJhdGNoKTtcbiAgICAgIFxuICAgICAgcHJvY2Vzc2VkUmVzdWx0cy5wdXNoKC4uLnByb2Nlc3NlZEJhdGNoKTtcbiAgICAgIFxuICAgICAgLy8gWWllbGQgY29udHJvbCB0byBwcmV2ZW50IGJsb2NraW5nXG4gICAgICBpZiAoaSAlIChiYXRjaFNpemUgKiA0KSA9PT0gMCkge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGx5IGZpbmFsIHNvcnRpbmdcbiAgICByZXR1cm4gdGhpcy5hcHBseVNvcnRpbmcocHJvY2Vzc2VkUmVzdWx0cywgb3B0aW9ucy5zb3J0QnkgfHwgJ3JlbGV2YW5jZScsIG9wdGlvbnMucXVlcnkpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGVuYWJsZWQgc2VhcmNoIHNvdXJjZXNcbiAgICovXG4gIHByaXZhdGUgZ2V0RW5hYmxlZFNvdXJjZXMob3B0aW9uczogVW5pZmllZFNlYXJjaE9wdGlvbnMpOiAoJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nKVtdIHtcbiAgICBjb25zdCBzb3VyY2VzOiAoJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nKVtdID0gW107XG4gICAgXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZUxvY2FsICE9PSBmYWxzZSkgc291cmNlcy5wdXNoKCdsb2NhbCcpO1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVHaXRIdWIgIT09IGZhbHNlKSBzb3VyY2VzLnB1c2goJ2dpdGh1YicpO1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVDb2xsZWN0aW9uID09PSB0cnVlKSBzb3VyY2VzLnB1c2goJ2NvbGxlY3Rpb24nKTtcbiAgICBcbiAgICByZXR1cm4gc291cmNlcztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEJhdGNoIHNvdXJjZXMgZm9yIGNvbmN1cnJlbnQgcHJvY2Vzc2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBiYXRjaFNvdXJjZXMoc291cmNlczogKCdsb2NhbCcgfCAnZ2l0aHViJyB8ICdjb2xsZWN0aW9uJylbXSwgYmF0Y2hTaXplOiBudW1iZXIpOiAoJ2xvY2FsJyB8ICdnaXRodWInIHwgJ2NvbGxlY3Rpb24nKVtdW10ge1xuICAgIGNvbnN0IGJhdGNoZXM6ICgnbG9jYWwnIHwgJ2dpdGh1YicgfCAnY29sbGVjdGlvbicpW11bXSA9IFtdO1xuICAgIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlcy5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICBiYXRjaGVzLnB1c2goc291cmNlcy5zbGljZShpLCBpICsgYmF0Y2hTaXplKSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBiYXRjaGVzO1xuICB9XG4gIFxuICAvKipcbiAgICogR2VuZXJhdGUgY3Vyc29yIGZvciBwYWdpbmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlQ3Vyc29yKHNvdXJjZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShgJHtzb3VyY2V9OiR7aW5kZXh9OiR7dGltZXN0YW1wfWApLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFRyaWdnZXIgbWVtb3J5IGNsZWFudXAgd2hlbiB1c2FnZSBpcyBoaWdoXG4gICAqL1xuICBwcml2YXRlIHRyaWdnZXJNZW1vcnlDbGVhbnVwKCk6IHZvaWQge1xuICAgIC8vIEZvcmNlIGNhY2hlIGNsZWFudXBcbiAgICB0aGlzLnJlc3VsdENhY2hlLmNsZWFudXAoKTtcbiAgICB0aGlzLmluZGV4Q2FjaGUuY2xlYW51cCgpO1xuICAgIFxuICAgIC8vIFN1Z2dlc3QgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gICAgaWYgKGdsb2JhbC5nYykge1xuICAgICAgZ2xvYmFsLmdjKCk7XG4gICAgICBsb2dnZXIuZGVidWcoJ1RyaWdnZXJlZCBnYXJiYWdlIGNvbGxlY3Rpb24nKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBSZWNvcmQgc2VhcmNoIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICovXG4gIHByaXZhdGUgcmVjb3JkU2VhcmNoTWV0cmljcyhtZXRyaWNzOiBTZWFyY2hNZXRyaWNzKTogdm9pZCB7XG4gICAgdGhpcy5wZXJmb3JtYW5jZU1vbml0b3IucmVjb3JkU2VhcmNoKG1ldHJpY3MpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBjYWNoZSBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAgY29uc3QgY2FjaGVTdGF0cyA9IHRoaXMucmVzdWx0Q2FjaGUuZ2V0U3RhdHMoKTtcbiAgICB0aGlzLnBlcmZvcm1hbmNlTW9uaXRvci5yZWNvcmRDYWNoZVBlcmZvcm1hbmNlKCdzZWFyY2hSZXN1bHRzJywge1xuICAgICAgaGl0UmF0ZTogY2FjaGVTdGF0cy5oaXRSYXRlLFxuICAgICAgYXZnSGl0VGltZTogMSwgLy8gUGxhY2Vob2xkZXJcbiAgICAgIGF2Z01pc3NUaW1lOiA1LCAvLyBQbGFjZWhvbGRlclxuICAgICAgdG90YWxIaXRzOiBjYWNoZVN0YXRzLmhpdENvdW50LFxuICAgICAgdG90YWxNaXNzZXM6IGNhY2hlU3RhdHMubWlzc0NvdW50LFxuICAgICAgZXZpY3Rpb25zOiBjYWNoZVN0YXRzLmV2aWN0aW9uQ291bnRcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENyZWF0ZSBjYWNoZSBrZXkgZm9yIHNlYXJjaCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNhY2hlS2V5KG9wdGlvbnM6IFVuaWZpZWRTZWFyY2hPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcXVlcnk6IG9wdGlvbnMucXVlcnksXG4gICAgICBpbmNsdWRlTG9jYWw6IG9wdGlvbnMuaW5jbHVkZUxvY2FsLFxuICAgICAgaW5jbHVkZUdpdEh1Yjogb3B0aW9ucy5pbmNsdWRlR2l0SHViLFxuICAgICAgaW5jbHVkZUNvbGxlY3Rpb246IG9wdGlvbnMuaW5jbHVkZUNvbGxlY3Rpb24sXG4gICAgICBlbGVtZW50VHlwZTogb3B0aW9ucy5lbGVtZW50VHlwZSxcbiAgICAgIHBhZ2U6IG9wdGlvbnMucGFnZSxcbiAgICAgIHBhZ2VTaXplOiBvcHRpb25zLnBhZ2VTaXplLFxuICAgICAgc29ydEJ5OiBvcHRpb25zLnNvcnRCeSxcbiAgICAgIGxhenlMb2FkOiBvcHRpb25zLmxhenlMb2FkXG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgcGVyZm9ybWFuY2Ugc3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIGdldFBlcmZvcm1hbmNlU3RhdHMoKToge1xuICAgIHNlYXJjaFN0YXRzOiBhbnk7XG4gICAgbWVtb3J5U3RhdHM6IGFueTtcbiAgICBjYWNoZVN0YXRzOiBhbnk7XG4gICAgdHJlbmRzOiBhbnk7XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBzZWFyY2hTdGF0czogdGhpcy5wZXJmb3JtYW5jZU1vbml0b3IuZ2V0U2VhcmNoU3RhdHMoKSxcbiAgICAgIG1lbW9yeVN0YXRzOiB0aGlzLnBlcmZvcm1hbmNlTW9uaXRvci5nZXRNZW1vcnlTdGF0cygpLFxuICAgICAgY2FjaGVTdGF0czoge1xuICAgICAgICBzZWFyY2hSZXN1bHRzOiB0aGlzLnJlc3VsdENhY2hlLmdldFN0YXRzKCksXG4gICAgICAgIGluZGV4Q2FjaGU6IHRoaXMuaW5kZXhDYWNoZS5nZXRTdGF0cygpXG4gICAgICB9LFxuICAgICAgdHJlbmRzOiB0aGlzLnBlcmZvcm1hbmNlTW9uaXRvci5hbmFseXplVHJlbmRzKClcbiAgICB9O1xuICB9XG59Il19