@dollhousemcp/mcp-server 2.0.32 → 2.0.35

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 (33) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cli/convert.js +9 -8
  3. package/dist/converters/DollhouseToAnthropicConverter.js +8 -8
  4. package/dist/elements/agents/AgentManager.js +2 -2
  5. package/dist/elements/skills/Skill.d.ts.map +1 -1
  6. package/dist/elements/skills/Skill.js +2 -2
  7. package/dist/elements/templates/Template.d.ts.map +1 -1
  8. package/dist/elements/templates/Template.js +15 -2
  9. package/dist/elements/templates/TemplateManager.js +3 -3
  10. package/dist/generated/version.d.ts +2 -2
  11. package/dist/generated/version.js +3 -3
  12. package/dist/handlers/element-crud/createElement.d.ts.map +1 -1
  13. package/dist/handlers/element-crud/createElement.js +10 -2
  14. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  15. package/dist/handlers/element-crud/editElement.js +61 -5
  16. package/dist/security/constants.d.ts +1 -0
  17. package/dist/security/constants.d.ts.map +1 -1
  18. package/dist/security/constants.js +2 -1
  19. package/dist/security/secureYamlParser.js +2 -2
  20. package/dist/services/validation/AgentElementValidator.d.ts.map +1 -1
  21. package/dist/services/validation/AgentElementValidator.js +3 -2
  22. package/dist/services/validation/GenericElementValidator.d.ts +1 -0
  23. package/dist/services/validation/GenericElementValidator.d.ts.map +1 -1
  24. package/dist/services/validation/GenericElementValidator.js +14 -6
  25. package/dist/utils/pathSecurity.d.ts +7 -0
  26. package/dist/utils/pathSecurity.d.ts.map +1 -0
  27. package/dist/utils/pathSecurity.js +30 -0
  28. package/dist/web/public/index.html +1 -1
  29. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  30. package/dist/web/routes/permissionRoutes.js +48 -11
  31. package/package.json +21 -5
  32. package/scripts/pretooluse-dollhouse.sh +23 -4
  33. package/server.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.0.35] - 2026-06-23
4
+
5
+ - Harden converter and CLI output path handling to keep generated files inside their intended output directories.
6
+ - Restore SonarCloud main quality gate health with path traversal coverage, accessibility, and reliability fixes.
7
+ - Update MCP registry publisher workflow verification for the current publisher release and OIDC audience.
8
+
9
+ ## [2.0.34] - 2026-06-23
10
+
11
+ - Preserve dependency and security hardening while rolling back the accidental 2.0.33 main merge state.
12
+ - Fix nested documentation description handling so agent goal parameters, template variables, and template examples can keep substantive descriptions beyond the top-level element summary limit.
13
+ - Restore permission audit metadata and Codex permission allow-response handling from the develop hardening work.
14
+ - Keep release metadata aligned across package, lockfile, manifest, MCP server metadata, and generated version surfaces.
15
+
3
16
  ## [2.0.32] - 2026-04-23
4
17
 
5
18
  - Restore the management console's stronger responsive header behavior, including cleaner tab overflow handling and keyboard-accessible menu navigation.
@@ -37,6 +37,7 @@ import extract from 'extract-zip';
37
37
  import { DollhouseToAnthropicConverter, AnthropicToDollhouseConverter } from '../converters/index.js';
38
38
  import { SecurityMonitor } from '../security/securityMonitor.js';
39
39
  import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
40
+ import { resolvePathWithinBase } from '../utils/pathSecurity.js';
40
41
  const program = new Command();
41
42
  /**
42
43
  * Maximum ZIP file size (100MB) - prevents DoS attacks and system resource exhaustion
@@ -269,7 +270,7 @@ async function convertToAnthropic(input, options) {
269
270
  const structure = await converter.convertSkill(inputContent);
270
271
  logConversionSteps(structure, operationsLog, options.verbose);
271
272
  // Determine output directory
272
- const outputDir = path.join(options.output || './anthropic-skills', skillName);
273
+ const outputDir = resolvePathWithinBase(options.output || './anthropic-skills', skillName);
273
274
  if (options.dryRun) {
274
275
  console.log(chalk.yellow('\n[DRY RUN] Would create:'));
275
276
  console.log(chalk.gray(` Output directory: ${outputDir}`));
@@ -294,7 +295,7 @@ async function convertToAnthropic(input, options) {
294
295
  operationsPerformed: operationsLog,
295
296
  success: true
296
297
  });
297
- const reportPath = path.join(outputDir, '.conversion-report.md');
298
+ const reportPath = resolvePathWithinBase(outputDir, '.conversion-report.md');
298
299
  fs.writeFileSync(reportPath, report);
299
300
  if (options.verbose) {
300
301
  console.log(chalk.gray(`\nConversion report: ${reportPath}`));
@@ -366,8 +367,8 @@ async function convertFromAnthropic(input, options) {
366
367
  const dollhouseSkill = await converter.convertSkill(actualInput);
367
368
  logReverseConversionSteps(actualInput, operationsLog, options.verbose);
368
369
  // Determine output file
369
- const outputDir = options.output || getDefaultSkillsDirectory();
370
- const outputFile = path.join(outputDir, `${skillName}.md`);
370
+ const outputDir = path.resolve(options.output || getDefaultSkillsDirectory());
371
+ const outputFile = resolvePathWithinBase(outputDir, `${skillName}.md`);
371
372
  if (options.dryRun) {
372
373
  console.log(chalk.yellow('\n[DRY RUN] Would create:'));
373
374
  console.log(chalk.gray(` Output file: ${outputFile}`));
@@ -393,7 +394,7 @@ async function convertFromAnthropic(input, options) {
393
394
  operationsPerformed: operationsLog,
394
395
  success: true
395
396
  });
396
- const reportPath = path.join(outputDir, `${skillName}-conversion-report.md`);
397
+ const reportPath = resolvePathWithinBase(outputDir, `${skillName}-conversion-report.md`);
397
398
  fs.writeFileSync(reportPath, report);
398
399
  if (options.verbose) {
399
400
  console.log(chalk.gray(`\nConversion report: ${reportPath}`));
@@ -598,8 +599,8 @@ function getCreatedFiles(structure, outputDir) {
598
599
  const files = [];
599
600
  iterateStructureFiles(structure, (dirName, filename) => {
600
601
  const filePath = dirName
601
- ? path.join(outputDir, dirName, filename)
602
- : path.join(outputDir, filename);
602
+ ? resolvePathWithinBase(outputDir, dirName, filename)
603
+ : resolvePathWithinBase(outputDir, filename);
603
604
  files.push(filePath);
604
605
  });
605
606
  return files;
@@ -633,4 +634,4 @@ function generateReport(data) {
633
634
  }
634
635
  // Parse command line arguments
635
636
  program.parse(process.argv);
636
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvY29udmVydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLE9BQU8sTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUNILDZCQUE2QixFQUM3Qiw2QkFBNkIsRUFFaEMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFOUUsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUU5Qjs7R0FFRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxRQUFRO0FBRXREOztHQUVHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLFFBQVE7QUFFNUQ7O0dBRUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTztBQUUxRDs7Ozs7R0FLRztBQUNILFNBQVMseUJBQXlCO0lBQzlCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUV2Qyw0RkFBNEY7SUFDNUYsSUFBSSxjQUFjLEdBQUcsRUFB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QUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztJQUUvRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELCtCQUErQjtBQUMvQixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuLyoqXG4gKiBDTEkgY29tbWFuZCBmb3IgY29udmVydGluZyBiZXR3ZWVuIEFudGhyb3BpYyBTa2lsbHMgYW5kIERvbGxob3VzZU1DUCBTa2lsbHNcbiAqXG4gKiBVc2FnZTpcbiAqICAgZG9sbGhvdXNlIGNvbnZlcnQgdG8tYW50aHJvcGljIDxpbnB1dD4gW29wdGlvbnNdXG4gKiAgIGRvbGxob3VzZSBjb252ZXJ0IGZyb20tYW50aHJvcGljIDxpbnB1dD4gW29wdGlvbnNdXG4gKlxuICogSW5wdXQgZm9ybWF0czpcbiAqICAgdG8tYW50aHJvcGljOiAgIERvbGxob3VzZU1DUCBza2lsbCBmaWxlICgubWQpXG4gKiAgIGZyb20tYW50aHJvcGljOiBBbnRocm9waWMgc2tpbGwgZGlyZWN0b3J5IG9yIFpJUCBmaWxlXG4gKlxuICogT3B0aW9uczpcbiAqICAgLW8sIC0tb3V0cHV0IDxkaXI+ICAgICAgT3V0cHV0IGRpcmVjdG9yeVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGZvciBmcm9tLWFudGhyb3BpYzogfi8uZG9sbGhvdXNlL3BvcnRmb2xpby9za2lsbHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBmb3IgdG8tYW50aHJvcGljOiAuL2FudGhyb3BpYy1za2lsbHNcbiAqICAgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgU2hvdyBkZXRhaWxlZCBjb252ZXJzaW9uIHN0ZXBzXG4gKiAgIC1yLCAtLXJlcG9ydCAgICAgICAgICAgIEdlbmVyYXRlIGNvbnZlcnNpb24gcmVwb3J0XG4gKiAgIC0tZHJ5LXJ1biAgICAgICAgICAgICAgIFByZXZpZXcgY29udmVyc2lvbiB3aXRob3V0IGV4ZWN1dGluZ1xuICpcbiAqIEV4YW1wbGVzOlxuICogICAjIENvbnZlcnQgZG93bmxvYWRlZCBaSVAgZmlsZSBmcm9tIENsYXVkZS5haVxuICogICBkb2xsaG91c2UgY29udmVydCBmcm9tLWFudGhyb3BpYyB+L0Rvd25sb2Fkcy9teS1za2lsbC56aXBcbiAqXG4gKiAgICMgQ29udmVydCBBbnRocm9waWMgc2tpbGwgZGlyZWN0b3J5XG4gKiAgIGRvbGxob3VzZSBjb252ZXJ0IGZyb20tYW50aHJvcGljIH4vRG93bmxvYWRzL215LXNraWxsLWZvbGRlclxuICpcbiAqICAgIyBFeHBvcnQgRG9sbGhvdXNlTUNQIHNraWxsIHRvIHNoYXJlXG4gKiAgIGRvbGxob3VzZSBjb252ZXJ0IHRvLWFudGhyb3BpYyB+Ly5kb2xsaG91c2UvcG9ydGZvbGlvL3NraWxscy9teS1za2lsbC5tZCAtbyAuL2V4cG9ydGVkXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBleHRyYWN0IGZyb20gJ2V4dHJhY3QtemlwJztcbmltcG9ydCB7XG4gICAgRG9sbGhvdXNlVG9BbnRocm9waWNDb252ZXJ0ZXIsXG4gICAgQW50aHJvcGljVG9Eb2xsaG91c2VDb252ZXJ0ZXIsXG4gICAgdHlwZSBBbnRocm9waWNTa2lsbFN0cnVjdHVyZVxufSBmcm9tICcuLi9jb252ZXJ0ZXJzL2luZGV4LmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbi8qKlxuICogTWF4aW11bSBaSVAgZmlsZSBzaXplICgxMDBNQikgLSBwcmV2ZW50cyBEb1MgYXR0YWNrcyBhbmQgc3lzdGVtIHJlc291cmNlIGV4aGF1c3Rpb25cbiAqL1xuY29uc3QgTUFYX1pJUF9TSVpFX0JZVEVTID0gMTAwICogMTAyNCAqIDEwMjQ7IC8vIDEwME1CXG5cbi8qKlxuICogTWF4aW11bSBleHRyYWN0ZWQgc2l6ZSAoNTAwTUIpIC0gcHJldmVudHMgemlwIGJvbWIgYXR0YWNrc1xuICovXG5jb25zdCBNQVhfRVhUUkFDVEVEX1NJWkVfQllURVMgPSA1MDAgKiAxMDI0ICogMTAyNDsgLy8gNTAwTUJcblxuLyoqXG4gKiBQcm9ncmVzcyBpbmRpY2F0b3IgdGhyZXNob2xkICgxME1CKSAtIHNob3cgcHJvZ3Jlc3MgbWVzc2FnZSBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gdGhpc1xuICovXG5jb25zdCBQUk9HUkVTU19USFJFU0hPTERfQllURVMgPSAxMCAqIDEwMjQgKiAxMDI0OyAvLyAxME1CXG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IERvbGxob3VzZU1DUCBwb3J0Zm9saW8gc2tpbGxzIGRpcmVjdG9yeVxuICogU0VDVVJJVFkgRklYIChETUNQLVNFQy0wMDQpOiBOb3JtYWxpemUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwcmV2ZW50IFVuaWNvZGUgYXR0YWNrc1xuICogUHJldmlvdXNseTogVXNlZCBwcm9jZXNzLmVudi5IT01FIGRpcmVjdGx5IHdpdGhvdXQgbm9ybWFsaXphdGlvblxuICogTm93OiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIGFsbCBwYXRoIGNvbXBvbmVudHMgaW5jbHVkaW5nIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0U2tpbGxzRGlyZWN0b3J5KCk6IHN0cmluZyB7XG4gICAgY29uc3QgaG9tZURpciA9IHByb2Nlc3MuZW52LkhPTUUgfHwgJyc7XG5cbiAgICAvLyBOb3JtYWxpemUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwcmV2ZW50IGhvbW9ncmFwaCBhdHRhY2tzIHZpYSBsb29rYWxpa2UgY2hhcmFjdGVyc1xuICAgIGxldCBub3JtYWxpemVkSG9tZSA9ICcnO1xuICAgIGlmIChob21lRGlyKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6YXRpb25SZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShob21lRGlyKTtcbiAgICAgICAgbm9ybWFsaXplZEhvbWUgPSBub3JtYWxpemF0aW9uUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuXG4gICAgICAgIC8vIFtTRUNVUklUWSBXQVJOSU5HXSBMb2cgaWYgbm9ybWFsaXphdGlvbiBjaGFuZ2VkIHRoZSBIT01FIHBhdGhcbiAgICAgICAgLy8gVGhpcyBjb3VsZCBpbmRpY2F0ZSBhIHNlY3VyaXR5IGlzc3VlIG9yIG1pc2NvbmZpZ3VyYXRpb25cbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRIb21lICE9PSBob21lRGlyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgICAgICBgW1dBUk5JTkddIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2FzIG1vZGlmaWVkIGR1cmluZyBVbmljb2RlIG5vcm1hbGl6YXRpb24uXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBPcmlnaW5hbDogXCIke2hvbWVEaXJ9XCJcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYE5vcm1hbGl6ZWQ6IFwiJHtub3JtYWxpemVkSG9tZX1cIlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgVGhpcyBtYXkgaW5kaWNhdGUgYSBzZWN1cml0eSBpc3N1ZSBvciBtaXNjb25maWd1cmF0aW9uLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGguam9pbihub3JtYWxpemVkSG9tZSwgJy5kb2xsaG91c2UnLCAncG9ydGZvbGlvJywgJ3NraWxscycpO1xufVxuXG4vKipcbiAqIEZvcm1hdCBieXRlcyB0byBodW1hbi1yZWFkYWJsZSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQnl0ZXMnO1xuICAgIGNvbnN0IGsgPSAxMDI0O1xuICAgIGNvbnN0IHNpemVzID0gWydCeXRlcycsICdLQicsICdNQicsICdHQiddO1xuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkgKiAxMDApIC8gMTAwICsgJyAnICsgc2l6ZXNbaV07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRvdGFsIHNpemUgb2YgZXh0cmFjdGVkIGZpbGVzXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZUV4dHJhY3RlZFNpemUoZGlyZWN0b3J5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGxldCB0b3RhbFNpemUgPSAwO1xuXG4gICAgZnVuY3Rpb24gd2Fsa0RpcihkaXI6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgd2Fsa0RpcihmdWxsUGF0aCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgdG90YWxTaXplICs9IGZzLnN0YXRTeW5jKGZ1bGxQYXRoKS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2Fsa0RpcihkaXJlY3RvcnkpO1xuICAgIHJldHVybiB0b3RhbFNpemU7XG59XG5cbi8qKlxuICogRXh0cmFjdCBhIFpJUCBmaWxlIHRvIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHNpemUgbGltaXRzIGFuZCBwcm9ncmVzcyBpbmRpY2F0aW9uXG4gKiBAcmV0dXJucyBQYXRoIHRvIGV4dHJhY3RlZCBkaXJlY3RvcnlcbiAqIEB0aHJvd3MgRXJyb3IgaWYgWklQIGV4Y2VlZHMgc2l6ZSBsaW1pdHNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFppcEZpbGUoemlwUGF0aDogc3RyaW5nLCB2ZXJib3NlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBGSVg6IFZhbGlkYXRlIFpJUCBmaWxlIHNpemUgQkVGT1JFIGV4dHJhY3Rpb24gdG8gcHJldmVudCBEb1MgYXR0YWNrc1xuICAgIC8vIFByZXZpb3VzbHk6IE5vIHNpemUgdmFsaWRhdGlvbiwgYWxsb3dpbmcgZXh0cmFjdGlvbiBvZiBhcmJpdHJhcmlseSBsYXJnZSBmaWxlc1xuICAgIC8vIE5vdzogRW5mb3JjZSAxMDBNQiBaSVAgc2l6ZSBsaW1pdCBhbmQgNTAwTUIgZXh0cmFjdGVkIHNpemUgbGltaXRcbiAgICBjb25zdCB6aXBTdGF0cyA9IGZzLnN0YXRTeW5jKHppcFBhdGgpO1xuICAgIGNvbnN0IHppcFNpemUgPSB6aXBTdGF0cy5zaXplO1xuXG4gICAgLy8gU0VDVVJJVFkgQ0hFQ0sgKHR5cGVzY3JpcHQ6UzUwNDIpOiBWYWxpZGF0ZSBaSVAgc2l6ZSBiZWZvcmUgZXh0cmFjdGlvblxuICAgIGlmICh6aXBTaXplID4gTUFYX1pJUF9TSVpFX0JZVEVTKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBaSVAgZmlsZSB0b28gbGFyZ2U6ICR7Zm9ybWF0Qnl0ZXMoemlwU2l6ZSl9LiBNYXhpbXVtIGFsbG93ZWQ6ICR7Zm9ybWF0Qnl0ZXMoTUFYX1pJUF9TSVpFX0JZVEVTKX0uIGAgK1xuICAgICAgICAgICAgYFRoaXMgbGltaXQgcHJldmVudHMgRG9TIGF0dGFja3MgYW5kIHN5c3RlbSByZXNvdXJjZSBleGhhdXN0aW9uLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wRGlyID0gcGF0aC5qb2luKG9zLnRtcGRpcigpLCBgZG9sbGhvdXNlLWV4dHJhY3QtJHtEYXRlLm5vdygpfWApO1xuXG4gICAgLy8gRklYOiBBZGQgc2VjdXJpdHkgYXVkaXQgbG9nZ2luZyBmb3IgWklQIG9wZXJhdGlvbnNcbiAgICAvLyBQcmV2aW91c2x5OiBObyBsb2dnaW5nIG9mIFpJUCBleHRyYWN0aW9uIG9wZXJhdGlvbnNcbiAgICAvLyBOb3c6IExvZyBhbGwgWklQIG9wZXJhdGlvbnMgZm9yIHNlY3VyaXR5IGF1ZGl0IHRyYWlsXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ2NvbnZlcnQgQ0xJJyxcbiAgICAgICAgZGV0YWlsczogYFpJUCBleHRyYWN0aW9uOiAke3ppcFBhdGh9ICgke2Zvcm1hdEJ5dGVzKHppcFNpemUpfSkgLT4gJHt0ZW1wRGlyfWBcbiAgICB9KTtcblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoJ1xcbkV4dHJhY3RpbmcgWklQIGZpbGUuLi4nKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgWklQOiAke3ppcFBhdGh9YCkpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIFNpemU6ICR7Zm9ybWF0Qnl0ZXMoemlwU2l6ZSl9YCkpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIFRlbXAgZGlyOiAke3RlbXBEaXJ9YCkpO1xuICAgIH1cblxuICAgIC8vIEZJWDogQWRkIHByb2dyZXNzIGluZGljYXRvciBmb3IgbGFyZ2UgWklQIGV4dHJhY3Rpb25zXG4gICAgLy8gUHJldmlvdXNseTogTm8gZmVlZGJhY2sgZHVyaW5nIGV4dHJhY3Rpb24sIHBvb3IgVVggZm9yIGxhcmdlIGZpbGVzXG4gICAgLy8gTm93OiBTaG93IHByb2dyZXNzIG1lc3NhZ2UgZm9yIGJldHRlciB1c2VyIGV4cGVyaWVuY2VcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHByb2dyZXNzTWVzc2FnZSA9IHppcFNpemUgPiBQUk9HUkVTU19USFJFU0hPTERfQllURVMgPyAnRXh0cmFjdGluZyAodGhpcyBtYXkgdGFrZSBhIG1vbWVudCkuLi4nIDogJ0V4dHJhY3RpbmcuLi4nO1xuICAgIGlmICh2ZXJib3NlIHx8IHppcFNpemUgPiBQUk9HUkVTU19USFJFU0hPTERfQllURVMpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgICAke3Byb2dyZXNzTWVzc2FnZX1gKSk7XG4gICAgfVxuXG4gICAgLy8gU09OQVJDTE9VRCBGSVggKHR5cGVzY3JpcHQ6UzUwNDIpOiBBcmNoaXZlIGV4dHJhY3Rpb24gaXMgc2FmZSBoZXJlXG4gICAgLy8gLSBaSVAgc2l6ZSB2YWxpZGF0ZWQgKG1heCAxMDBNQikgYXQgbGluZXMgMTEwLTExNCB0byBwcmV2ZW50IERvU1xuICAgIC8vIC0gRXh0cmFjdGVkIHNpemUgdmFsaWRhdGVkIChtYXggNTAwTUIpIGF0IGxpbmVzIDE1MS0xNTcgdG8gcHJldmVudCB6aXAgYm9tYnNcbiAgICAvLyAtIEV4dHJhY3Rpb24gdG8gaXNvbGF0ZWQgdGVtcCBkaXJlY3RvcnkgKG5vIHBhdGggdHJhdmVyc2FsIHJpc2spXG4gICAgLy8gLSBGdWxsIGNsZWFudXAgaW4gZmluYWxseSBibG9jayBwcmV2ZW50cyByZXNvdXJjZSBsZWFrc1xuICAgIGF3YWl0IGV4dHJhY3QoemlwUGF0aCwgeyBkaXI6IHRlbXBEaXIgfSk7XG5cbiAgICBjb25zdCBleHRyYWN0VGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBFeHRyYWN0ZWQgaW4gJHtleHRyYWN0VGltZX1tc2ApKTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWSBDSEVDSyAodHlwZXNjcmlwdDpTNTA0Mik6IFZhbGlkYXRlIGV4dHJhY3RlZCBzaXplIHRvIHByZXZlbnQgemlwIGJvbWIgYXR0YWNrc1xuICAgIC8vIFppcCBib21icyBhcmUgbWFsaWNpb3VzIGFyY2hpdmVzIHRoYXQgZXhwYW5kIHRvIGVub3Jtb3VzIHNpemVzIChlLmcuLCA0MktCIOKGkiA0LjVQQilcbiAgICAvLyBUaGlzIGNoZWNrIHByZXZlbnRzIHN5c3RlbSByZXNvdXJjZSBleGhhdXN0aW9uIGZyb20gbWFsaWNpb3VzbHkgY29tcHJlc3NlZCBmaWxlc1xuICAgIGNvbnN0IGV4dHJhY3RlZFNpemUgPSBjYWxjdWxhdGVFeHRyYWN0ZWRTaXplKHRlbXBEaXIpO1xuICAgIGlmIChleHRyYWN0ZWRTaXplID4gTUFYX0VYVFJBQ1RFRF9TSVpFX0JZVEVTKSB7XG4gICAgICAgIC8vIENsZWFudXAgYmVmb3JlIHRocm93aW5nIGVycm9yIHRvIHByZXZlbnQgdGVtcCBmaWxlIGFjY3VtdWxhdGlvblxuICAgICAgICBmcy5ybVN5bmModGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXh0cmFjdGVkIGNvbnRlbnQgdG9vIGxhcmdlOiAke2Zvcm1hdEJ5dGVzKGV4dHJhY3RlZFNpemUpfS4gTWF4aW11bSBhbGxvd2VkOiAke2Zvcm1hdEJ5dGVzKE1BWF9FWFRSQUNURURfU0laRV9CWVRFUyl9LiBUaGlzIG1heSBiZSBhIHppcCBib21iIGF0dGFjay5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBFeHRyYWN0ZWQgc2l6ZTogJHtmb3JtYXRCeXRlcyhleHRyYWN0ZWRTaXplKX1gKSk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgc2tpbGwgZGlyZWN0b3J5IChzaG91bGQgYmUgdGhlIG9ubHkgdG9wLWxldmVsIGRpcmVjdG9yeSlcbiAgICBjb25zdCBjb250ZW50cyA9IGZzLnJlYWRkaXJTeW5jKHRlbXBEaXIpO1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gY29udGVudHMuZmlsdGVyKGl0ZW0gPT5cbiAgICAgICAgZnMuc3RhdFN5bmMocGF0aC5qb2luKHRlbXBEaXIsIGl0ZW0pKS5pc0RpcmVjdG9yeSgpXG4gICAgKTtcblxuICAgIGlmIChkaXJlY3Rvcmllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBza2lsbCBkaXJlY3RvcnkgcGF0aFxuICAgICAgICByZXR1cm4gcGF0aC5qb2luKHRlbXBEaXIsIGRpcmVjdG9yaWVzWzBdKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gSWYgbXVsdGlwbGUgaXRlbXMgb3Igbm8gZGlyZWN0b3J5LCByZXR1cm4gdGVtcCBkaXIgaXRzZWxmXG4gICAgICAgIHJldHVybiB0ZW1wRGlyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWklQIGZpbGUgYXBwZWFycyB0byBiZSBlbXB0eScpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGZpbGUgaXMgYSBaSVAgZmlsZSBiYXNlZCBvbiBleHRlbnNpb25cbiAqL1xuZnVuY3Rpb24gaXNaaXBGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpID09PSAnLnppcCc7XG59XG5cbi8qKlxuICogUHJlcGFyZSBpbnB1dCBmb3IgY29udmVyc2lvbiAoaGFuZGxlcyBib3RoIGRpcmVjdG9yaWVzIGFuZCBaSVAgZmlsZXMpXG4gKiBAcmV0dXJucyB7YWN0dWFsSW5wdXQsIHRlbXBEaXJ9IC0gYWN0dWFsSW5wdXQgaXMgdGhlIGRpcmVjdG9yeSB0byBjb252ZXJ0LCB0ZW1wRGlyIGlzIHRoZSB0ZW1wIGRpciB0byBjbGVhbnVwIChvciBudWxsKVxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlQ29udmVyc2lvbklucHV0KFxuICAgIGlucHV0OiBzdHJpbmcsXG4gICAgdmVyYm9zZTogYm9vbGVhblxuKTogUHJvbWlzZTx7IGFjdHVhbElucHV0OiBzdHJpbmc7IHRlbXBEaXI6IHN0cmluZyB8IG51bGwgfT4ge1xuICAgIC8vIFZlcmlmeSBpbnB1dCBleGlzdHNcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoaW5wdXQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBJbnB1dCBub3QgZm91bmQ6ICR7aW5wdXR9YCkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIFpJUCBmaWxlc1xuICAgIGlmIChpc1ppcEZpbGUoaW5wdXQpKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbElucHV0ID0gYXdhaXQgZXh0cmFjdFppcEZpbGUoaW5wdXQsIHZlcmJvc2UpO1xuICAgICAgICBjb25zdCB0ZW1wRGlyID0gcGF0aC5kaXJuYW1lKGFjdHVhbElucHV0KTtcbiAgICAgICAgcmV0dXJuIHsgYWN0dWFsSW5wdXQsIHRlbXBEaXIgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZGlyZWN0b3JpZXNcbiAgICBpZiAoIWZzLnN0YXRTeW5jKGlucHV0KS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBJbnB1dCBtdXN0IGJlIGEgZGlyZWN0b3J5IG9yIFpJUCBmaWxlOiAke2lucHV0fWApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGFjdHVhbElucHV0OiBpbnB1dCwgdGVtcERpcjogbnVsbCB9O1xufVxuXG5pbnRlcmZhY2UgQ29udmVydE9wdGlvbnMge1xuICAgIG91dHB1dD86IHN0cmluZztcbiAgICB2ZXJib3NlOiBib29sZWFuO1xuICAgIHJlcG9ydDogYm9vbGVhbjtcbiAgICBkcnlSdW46IGJvb2xlYW47XG4gICAgYmFja3VwOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ29udmVyc2lvblJlcG9ydCB7XG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgZGlyZWN0aW9uOiAndG8tYW50aHJvcGljJyB8ICdmcm9tLWFudGhyb3BpYyc7XG4gICAgaW5wdXQ6IHN0cmluZztcbiAgICBvdXRwdXQ6IHN0cmluZztcbiAgICBmaWxlc0NyZWF0ZWQ6IHN0cmluZ1tdO1xuICAgIG9wZXJhdGlvbnNQZXJmb3JtZWQ6IHN0cmluZ1tdO1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbnByb2dyYW1cbiAgICAubmFtZSgnY29udmVydCcpXG4gICAgLmRlc2NyaXB0aW9uKCdDb252ZXJ0IGJldHdlZW4gQW50aHJvcGljIFNraWxscyBhbmQgRG9sbGhvdXNlTUNQIFNraWxscyBmb3JtYXRzJylcbiAgICAuY29tbWFuZCgndG8tYW50aHJvcGljIDxpbnB1dD4nKVxuICAgIC5kZXNjcmlwdGlvbignQ29udmVydCBEb2xsaG91c2VNQ1Agc2tpbGwgdG8gQW50aHJvcGljIFNraWxscyBmb3JtYXQnKVxuICAgIC5vcHRpb24oJy1vLCAtLW91dHB1dCA8ZGlyPicsICdPdXRwdXQgZGlyZWN0b3J5JywgJy4vYW50aHJvcGljLXNraWxscycpXG4gICAgLm9wdGlvbignLXYsIC0tdmVyYm9zZScsICdTaG93IGRldGFpbGVkIGNvbnZlcnNpb24gc3RlcHMnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctciwgLS1yZXBvcnQnLCAnR2VuZXJhdGUgY29udmVyc2lvbiByZXBvcnQnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLWRyeS1ydW4nLCAnUHJldmlldyBjb252ZXJzaW9uIHdpdGhvdXQgZXhlY3V0aW5nJywgZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAoaW5wdXQ6IHN0cmluZywgb3B0aW9uczogQ29udmVydE9wdGlvbnMpID0+IHtcbiAgICAgICAgYXdhaXQgY29udmVydFRvQW50aHJvcGljKGlucHV0LCBvcHRpb25zKTtcbiAgICB9KTtcblxucHJvZ3JhbVxuICAgIC5jb21tYW5kKCdmcm9tLWFudGhyb3BpYyA8aW5wdXQ+JylcbiAgICAuZGVzY3JpcHRpb24oJ0NvbnZlcnQgQW50aHJvcGljIFNraWxscyB0byBEb2xsaG91c2VNQ1Agc2tpbGwgZm9ybWF0IChpbnB1dCBjYW4gYmUgYSBkaXJlY3Rvcnkgb3IgWklQIGZpbGUpJylcbiAgICAub3B0aW9uKCctbywgLS1vdXRwdXQgPGRpcj4nLCAnT3V0cHV0IGRpcmVjdG9yeScsIGdldERlZmF1bHRTa2lsbHNEaXJlY3RvcnkoKSlcbiAgICAub3B0aW9uKCctdiwgLS12ZXJib3NlJywgJ1Nob3cgZGV0YWlsZWQgY29udmVyc2lvbiBzdGVwcycsIGZhbHNlKVxuICAgIC5vcHRpb24oJy1yLCAtLXJlcG9ydCcsICdHZW5lcmF0ZSBjb252ZXJzaW9uIHJlcG9ydCcsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdQcmV2aWV3IGNvbnZlcnNpb24gd2l0aG91dCBleGVjdXRpbmcnLCBmYWxzZSlcbiAgICAuYWN0aW9uKGFzeW5jIChpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBDb252ZXJ0T3B0aW9ucykgPT4ge1xuICAgICAgICBhd2FpdCBjb252ZXJ0RnJvbUFudGhyb3BpYyhpbnB1dCwgb3B0aW9ucyk7XG4gICAgfSk7XG5cbi8qKlxuICogQ29udmVydCBEb2xsaG91c2VNQ1Agc2tpbGwgdG8gQW50aHJvcGljIGZvcm1hdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb252ZXJ0VG9BbnRocm9waWMoaW5wdXQ6IHN0cmluZywgb3B0aW9uczogQ29udmVydE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBTRUNVUklUWSBGSVggKERNQ1AtU0VDLTAwNCk6IFVzZSBVbmljb2RlVmFsaWRhdG9yIHRvIG5vcm1hbGl6ZSBhbGwgdXNlciBpbnB1dFxuICAgIC8vIFByZXZpb3VzbHk6IFVzZWQgYnVpbHQtaW4gbm9ybWFsaXplKCkgd2hpY2ggZG9lc24ndCBkZXRlY3QgaG9tb2dyYXBoIGF0dGFja3NcbiAgICAvLyBOb3c6IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKCkgZGV0ZWN0cyBhbmQgcHJldmVudHMgbG9va2FsaWtlIGNoYXJhY3RlciBhdHRhY2tzXG4gICAgY29uc3QgaW5wdXRWYWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoaW5wdXQpO1xuICAgIGlucHV0ID0gaW5wdXRWYWxpZGF0aW9uLm5vcm1hbGl6ZWRDb250ZW50O1xuXG4gICAgaWYgKG9wdGlvbnMub3V0cHV0KSB7XG4gICAgICAgIGNvbnN0IG91dHB1dFZhbGlkYXRpb24gPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShvcHRpb25zLm91dHB1dCk7XG4gICAgICAgIG9wdGlvbnMub3V0cHV0ID0gb3V0cHV0VmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBsb2dPcGVyYXRpb24oJ3RvLWFudGhyb3BpYycsIGlucHV0LCBvcHRpb25zKTtcblxuICAgICAgICAvLyBSZWFkIGlucHV0IGZpbGVcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGlucHV0KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYElucHV0IGZpbGUgbm90IGZvdW5kOiAke2lucHV0fWApKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0Q29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhpbnB1dCwgJ3V0Zi04Jyk7XG4gICAgICAgIGNvbnN0IHNraWxsTmFtZSA9IHBhdGguYmFzZW5hbWUoaW5wdXQsIHBhdGguZXh0bmFtZShpbnB1dCkpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoJ1xcblJlYWRpbmcgRG9sbGhvdXNlTUNQIHNraWxsLi4uJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBJbnB1dDogJHtpbnB1dH1gKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIFNpemU6ICR7aW5wdXRDb250ZW50Lmxlbmd0aH0gYnl0ZXNgKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0XG4gICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IG5ldyBEb2xsaG91c2VUb0FudGhyb3BpY0NvbnZlcnRlcigpO1xuICAgICAgICBjb25zdCBvcGVyYXRpb25zTG9nOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoJ1xcbkNvbnZlcnRpbmcgdG8gQW50aHJvcGljIFNraWxscyBmb3JtYXQuLi4nKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdHJ1Y3R1cmUgPSBhd2FpdCBjb252ZXJ0ZXIuY29udmVydFNraWxsKGlucHV0Q29udGVudCk7XG4gICAgICAgIGxvZ0NvbnZlcnNpb25TdGVwcyhzdHJ1Y3R1cmUsIG9wZXJhdGlvbnNMb2csIG9wdGlvbnMudmVyYm9zZSk7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG91dHB1dCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3Qgb3V0cHV0RGlyID0gcGF0aC5qb2luKG9wdGlvbnMub3V0cHV0IHx8ICcuL2FudGhyb3BpYy1za2lsbHMnLCBza2lsbE5hbWUpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdcXG5bRFJZIFJVTl0gV291bGQgY3JlYXRlOicpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgT3V0cHV0IGRpcmVjdG9yeTogJHtvdXRwdXREaXJ9YCkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBGaWxlczogJHtjb3VudEZpbGVzKHN0cnVjdHVyZSl9IGZpbGVzYCkpO1xuICAgICAgICAgICAgbGlzdEZpbGVzVG9DcmVhdGUoc3RydWN0dXJlKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIG91dHB1dFxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGBcXG5Xcml0aW5nIEFudGhyb3BpYyBza2lsbCB0bzogJHtvdXRwdXREaXJ9YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgY29udmVydGVyLndyaXRlVG9EaXJlY3Rvcnkoc3RydWN0dXJlLCBvdXRwdXREaXIpO1xuICAgICAgICBjb25zdCBmaWxlc0NyZWF0ZWQgPSBnZXRDcmVhdGVkRmlsZXMoc3RydWN0dXJlLCBvdXRwdXREaXIpO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIHJlcG9ydFxuICAgICAgICBpZiAob3B0aW9ucy5yZXBvcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydCA9IGdlbmVyYXRlUmVwb3J0KHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICd0by1hbnRocm9waWMnLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0RGlyLFxuICAgICAgICAgICAgICAgIGZpbGVzQ3JlYXRlZCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25zUGVyZm9ybWVkOiBvcGVyYXRpb25zTG9nLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXBvcnRQYXRoID0gcGF0aC5qb2luKG91dHB1dERpciwgJy5jb252ZXJzaW9uLXJlcG9ydC5tZCcpO1xuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXBvcnRQYXRoLCByZXBvcnQpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgXFxuQ29udmVyc2lvbiByZXBvcnQ6ICR7cmVwb3J0UGF0aH1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWNjZXNzXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCdcXG7inJMgQ29udmVyc2lvbiBjb21wbGV0ZScpKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBDcmVhdGVkICR7ZmlsZXNDcmVhdGVkLmxlbmd0aH0gZmlsZShzKSBpbjogJHtvdXRwdXREaXJ9YCkpO1xuXG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXFxu4pyXIENvbnZlcnNpb24gZmFpbGVkOicpLCBlcnJvcik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2xlYW51cCB0ZW1wb3JhcnkgZGlyZWN0b3J5IHNhZmVseVxuICogU09OQVJDTE9VRCBGSVggKHR5cGVzY3JpcHQ6UzM3NzYpOiBFeHRyYWN0ZWQgZnJvbSBjb252ZXJ0RnJvbUFudGhyb3BpYyB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAqIFByZXZpb3VzbHk6IElubGluZSBjbGVhbnVwIGxvZ2ljIGFkZGVkIG5lc3RlZCBjb25kaXRpb25zIGluY3JlYXNpbmcgY29tcGxleGl0eVxuICogTm93OiBTZXBhcmF0ZSBmdW5jdGlvbiBoYW5kbGVzIGNsZWFudXAgd2l0aCBwcm9wZXIgZXJyb3IgaGFuZGxpbmdcbiAqL1xuZnVuY3Rpb24gY2xlYW51cFRlbXBEaXJlY3RvcnkodGVtcERpcjogc3RyaW5nIHwgbnVsbCwgdmVyYm9zZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0ZW1wRGlyICYmIGZzLmV4aXN0c1N5bmModGVtcERpcikpIHtcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYFxcbkNsZWFuaW5nIHVwIHRlbXBvcmFyeSBmaWxlcy4uLmApKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZnMucm1TeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoY2xlYW51cEVycm9yKSB7XG4gICAgICAgICAgICAvLyBMb2cgZXJyb3IgZGV0YWlscyBidXQgZG9uJ3QgZmFpbCBvbiBjbGVhbnVwIGVycm9yc1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY2xlYW51cEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjbGVhbnVwRXJyb3IubWVzc2FnZSA6IFN0cmluZyhjbGVhbnVwRXJyb3IpO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgV2FybmluZzogRmFpbGVkIHRvIGNsZWFudXAgdGVtcCBkaXJlY3Rvcnk6ICR7dGVtcERpcn0gLSAke2Vycm9yTWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQ29udmVydCBBbnRocm9waWMgc2tpbGwgdG8gRG9sbGhvdXNlTUNQIGZvcm1hdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb252ZXJ0RnJvbUFudGhyb3BpYyhpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBDb252ZXJ0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAoRE1DUC1TRUMtMDA0KTogVXNlIFVuaWNvZGVWYWxpZGF0b3IgdG8gbm9ybWFsaXplIGFsbCB1c2VyIGlucHV0XG4gICAgLy8gUHJldmlvdXNseTogVXNlZCBidWlsdC1pbiBub3JtYWxpemUoKSB3aGljaCBkb2Vzbid0IGRldGVjdCBob21vZ3JhcGggYXR0YWNrc1xuICAgIC8vIE5vdzogVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoKSBkZXRlY3RzIGFuZCBwcmV2ZW50cyBsb29rYWxpa2UgY2hhcmFjdGVyIGF0dGFja3NcbiAgICAvLyBFeGFtcGxlOiBcImZpbGVcXHUwMDQxLnR4dFwiIHZzIFwiZmlsZVxcdTAzMDFBLnR4dFwiIGJvdGggbG9vayBsaWtlIFwiZmlsZUEudHh0XCIgYnV0IGFyZSBkaWZmZXJlbnRcbiAgICBjb25zdCBpbnB1dFZhbGlkYXRpb24gPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShpbnB1dCk7XG4gICAgaW5wdXQgPSBpbnB1dFZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG5cbiAgICBpZiAob3B0aW9ucy5vdXRwdXQpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0VmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG9wdGlvbnMub3V0cHV0KTtcbiAgICAgICAgb3B0aW9ucy5vdXRwdXQgPSBvdXRwdXRWYWxpZGF0aW9uLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIH1cblxuICAgIGxldCB0ZW1wRGlyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICAgIGxvZ09wZXJhdGlvbignZnJvbS1hbnRocm9waWMnLCBpbnB1dCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gUHJlcGFyZSBpbnB1dCAoaGFuZGxlcyBib3RoIGRpcmVjdG9yaWVzIGFuZCBaSVAgZmlsZXMpXG4gICAgICAgIGNvbnN0IHsgYWN0dWFsSW5wdXQsIHRlbXBEaXI6IGV4dHJhY3RlZFRlbXBEaXIgfSA9IGF3YWl0IHByZXBhcmVDb252ZXJzaW9uSW5wdXQoaW5wdXQsIG9wdGlvbnMudmVyYm9zZSk7XG4gICAgICAgIHRlbXBEaXIgPSBleHRyYWN0ZWRUZW1wRGlyO1xuXG4gICAgICAgIGNvbnN0IHNraWxsTmFtZSA9IHBhdGguYmFzZW5hbWUoYWN0dWFsSW5wdXQpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoJ1xcblJlYWRpbmcgQW50aHJvcGljIHNraWxsLi4uJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBJbnB1dDogJHthY3R1YWxJbnB1dH1gKSk7XG4gICAgICAgICAgICBsaXN0QW50aHJvcGljU3RydWN0dXJlKGFjdHVhbElucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnRcbiAgICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IEFudGhyb3BpY1RvRG9sbGhvdXNlQ29udmVydGVyKCk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbnNMb2c6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnXFxuQ29udmVydGluZyB0byBEb2xsaG91c2VNQ1AgU2tpbGxzIGZvcm1hdC4uLicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRvbGxob3VzZVNraWxsID0gYXdhaXQgY29udmVydGVyLmNvbnZlcnRTa2lsbChhY3R1YWxJbnB1dCk7XG4gICAgICAgIGxvZ1JldmVyc2VDb252ZXJzaW9uU3RlcHMoYWN0dWFsSW5wdXQsIG9wZXJhdGlvbnNMb2csIG9wdGlvbnMudmVyYm9zZSk7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG91dHB1dCBmaWxlXG4gICAgICAgIGNvbnN0IG91dHB1dERpciA9IG9wdGlvbnMub3V0cHV0IHx8IGdldERlZmF1bHRTa2lsbHNEaXJlY3RvcnkoKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0RmlsZSA9IHBhdGguam9pbihvdXRwdXREaXIsIGAke3NraWxsTmFtZX0ubWRgKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnXFxuW0RSWSBSVU5dIFdvdWxkIGNyZWF0ZTonKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIE91dHB1dCBmaWxlOiAke291dHB1dEZpbGV9YCkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBTaXplOiAke2RvbGxob3VzZVNraWxsLmxlbmd0aH0gYnl0ZXNgKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSBvdXRwdXRcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgXFxuV3JpdGluZyBEb2xsaG91c2VNQ1Agc2tpbGwgdG86ICR7b3V0cHV0RmlsZX1gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMob3V0cHV0RGlyKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKG91dHB1dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBjb252ZXJ0ZXIud3JpdGVUb0ZpbGUoZG9sbGhvdXNlU2tpbGwsIG91dHB1dEZpbGUpO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIHJlcG9ydFxuICAgICAgICBpZiAob3B0aW9ucy5yZXBvcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydCA9IGdlbmVyYXRlUmVwb3J0KHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdmcm9tLWFudGhyb3BpYycsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiBvdXRwdXRGaWxlLFxuICAgICAgICAgICAgICAgIGZpbGVzQ3JlYXRlZDogW291dHB1dEZpbGVdLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbnNQZXJmb3JtZWQ6IG9wZXJhdGlvbnNMb2csXG4gICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydFBhdGggPSBwYXRoLmpvaW4ob3V0cHV0RGlyLCBgJHtza2lsbE5hbWV9LWNvbnZlcnNpb24tcmVwb3J0Lm1kYCk7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHJlcG9ydFBhdGgsIHJlcG9ydCk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBcXG5Db252ZXJzaW9uIHJlcG9ydDogJHtyZXBvcnRQYXRofWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1Y2Nlc3NcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ1xcbuKckyBDb252ZXJzaW9uIGNvbXBsZXRlJykpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIENyZWF0ZWQ6ICR7b3V0cHV0RmlsZX1gKSk7XG5cbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdcXG7inJcgQ29udmVyc2lvbiBmYWlsZWQ6JyksIGVycm9yKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIFNPTkFSQ0xPVUQgRklYICh0eXBlc2NyaXB0OlMzNzc2KTogVXNlIGV4dHJhY3RlZCBjbGVhbnVwIGZ1bmN0aW9uIHRvIHJlZHVjZSBjb21wbGV4aXR5XG4gICAgICAgIC8vIEZJWDogRW5zdXJlIGNsZWFudXAgaGFwcGVucyBvbiBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmVcbiAgICAgICAgLy8gUHJldmlvdXNseTogQ2xlYW51cCBvbmx5IG9uIHN1Y2Nlc3MgcGF0aFxuICAgICAgICAvLyBOb3c6IENsZWFudXAgaW4gZmluYWxseSBibG9jayB0byBoYW5kbGUgYWxsIGVycm9yIHNjZW5hcmlvc1xuICAgICAgICBjbGVhbnVwVGVtcERpcmVjdG9yeSh0ZW1wRGlyLCBvcHRpb25zLnZlcmJvc2UpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBMb2cgY29udmVyc2lvbiBvcGVyYXRpb24gZm9yIHNlY3VyaXR5IGF1ZGl0XG4gKi9cbmZ1bmN0aW9uIGxvZ09wZXJhdGlvbihkaXJlY3Rpb246IHN0cmluZywgaW5wdXQ6IHN0cmluZywgb3B0aW9uczogQ29udmVydE9wdGlvbnMpOiB2b2lkIHtcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnY29udmVydCBDTEknLFxuICAgICAgICBkZXRhaWxzOiBgQ29udmVyc2lvbiAke2RpcmVjdGlvbn06ICR7aW5wdXR9IChkcnktcnVuOiAke29wdGlvbnMuZHJ5UnVufSlgXG4gICAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGxvZyBkaXJlY3Rvcnkgb3BlcmF0aW9ucyB3aXRoIG9wdGlvbmFsIGZpbGUgbGlzdGluZ1xuICovXG5mdW5jdGlvbiBsb2dEaXJlY3RvcnlPcGVyYXRpb24oXG4gICAgc3RydWN0dXJlOiBBbnRocm9waWNTa2lsbFN0cnVjdHVyZSxcbiAgICBvcHRpb25zOiB7XG4gICAgICAgIGRpcktleToga2V5b2YgQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmU7XG4gICAgICAgIGRpck5hbWU6IHN0cmluZztcbiAgICAgICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgICAgIGl0ZW1UeXBlOiBzdHJpbmc7XG4gICAgICAgIG9wZXJhdGlvbnNMb2c6IHN0cmluZ1tdO1xuICAgICAgICB2ZXJib3NlOiBib29sZWFuO1xuICAgICAgICBsaXN0RmlsZXM/OiBib29sZWFuO1xuICAgIH1cbik6IHZvaWQge1xuICAgIGNvbnN0IHsgZGlyS2V5LCBkaXJOYW1lLCBhY3Rpb24sIGl0ZW1UeXBlLCBvcGVyYXRpb25zTG9nLCB2ZXJib3NlLCBsaXN0RmlsZXMgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAgIGlmIChzdHJ1Y3R1cmVbZGlyS2V5XSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHN0cnVjdHVyZVtkaXJLZXldIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIGNvbnN0IGNvdW50ID0gT2JqZWN0LmtleXMoaXRlbXMpLmxlbmd0aDtcbiAgICAgICAgb3BlcmF0aW9uc0xvZy5wdXNoKGAke2FjdGlvbn0gJHtjb3VudH0gJHtpdGVtVHlwZX0ocykgdG8gJHtkaXJOYW1lfS9gKTtcblxuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICDinJMgJHthY3Rpb259ICR7Y291bnR9ICR7aXRlbVR5cGV9KHMpYCkpO1xuICAgICAgICAgICAgaWYgKGxpc3RGaWxlcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgT2JqZWN0LmtleXMoaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgICAtICR7ZGlyTmFtZX0vJHtmaWxlbmFtZX1gKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIExvZyBjb252ZXJzaW9uIHN0ZXBzIGR1cmluZyB0by1hbnRocm9waWMgY29udmVyc2lvblxuICovXG5mdW5jdGlvbiBsb2dDb252ZXJzaW9uU3RlcHMoXG4gICAgc3RydWN0dXJlOiBBbnRocm9waWNTa2lsbFN0cnVjdHVyZSxcbiAgICBvcGVyYXRpb25zTG9nOiBzdHJpbmdbXSxcbiAgICB2ZXJib3NlOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgICAvLyBMb2cgU0tJTEwubWRcbiAgICBvcGVyYXRpb25zTG9nLnB1c2goJ0NyZWF0ZWQgU0tJTEwubWQgd2l0aCBzaW1wbGlmaWVkIG1ldGFkYXRhJyk7XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICDinJMgQ3JlYXRlZCBTS0lMTC5tZCcpKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgZGlyZWN0b3J5IG9wZXJhdGlvbnNcbiAgICBsb2dEaXJlY3RvcnlPcGVyYXRpb24oc3RydWN0dXJlLCB7XG4gICAgICAgIGRpcktleTogJ3NjcmlwdHMvJyxcbiAgICAgICAgZGlyTmFtZTogJ3NjcmlwdHMnLFxuICAgICAgICBhY3Rpb246ICdFeHRyYWN0ZWQnLFxuICAgICAgICBpdGVtVHlwZTogJ3NjcmlwdCcsXG4gICAgICAgIG9wZXJhdGlvbnNMb2csXG4gICAgICAgIHZlcmJvc2UsXG4gICAgICAgIGxpc3RGaWxlczogdHJ1ZVxuICAgIH0pO1xuICAgIGxvZ0RpcmVjdG9yeU9wZXJhdGlvbihzdHJ1Y3R1cmUsIHtcbiAgICAgICAgZGlyS2V5OiAncmVmZXJlbmNlLycsXG4gICAgICAgIGRpck5hbWU6ICdyZWZlcmVuY2UnLFxuICAgICAgICBhY3Rpb246ICdFeHRyYWN0ZWQnLFxuICAgICAgICBpdGVtVHlwZTogJ3JlZmVyZW5jZSBkb2N1bWVudCcsXG4gICAgICAgIG9wZXJhdGlvbnNMb2csXG4gICAgICAgIHZlcmJvc2UsXG4gICAgICAgIGxpc3RGaWxlczogdHJ1ZVxuICAgIH0pO1xuICAgIGxvZ0RpcmVjdG9yeU9wZXJhdGlvbihzdHJ1Y3R1cmUsIHtcbiAgICAgICAgZGlyS2V5OiAnZXhhbXBsZXMvJyxcbiAgICAgICAgZGlyTmFtZTogJ2V4YW1wbGVzJyxcbiAgICAgICAgYWN0aW9uOiAnRXh0cmFjdGVkJyxcbiAgICAgICAgaXRlbVR5cGU6ICdleGFtcGxlJyxcbiAgICAgICAgb3BlcmF0aW9uc0xvZyxcbiAgICAgICAgdmVyYm9zZVxuICAgIH0pO1xuICAgIGxvZ0RpcmVjdG9yeU9wZXJhdGlvbihzdHJ1Y3R1cmUsIHtcbiAgICAgICAgZGlyS2V5OiAndGhlbWVzLycsXG4gICAgICAgIGRpck5hbWU6ICd0aGVtZXMnLFxuICAgICAgICBhY3Rpb246ICdFeHRyYWN0ZWQnLFxuICAgICAgICBpdGVtVHlwZTogJ3RlbXBsYXRlJyxcbiAgICAgICAgb3BlcmF0aW9uc0xvZyxcbiAgICAgICAgdmVyYm9zZVxuICAgIH0pO1xuXG4gICAgLy8gTG9nIG1ldGFkYXRhIHByZXNlcnZhdGlvblxuICAgIGlmIChzdHJ1Y3R1cmVbJ21ldGFkYXRhLyddKSB7XG4gICAgICAgIG9wZXJhdGlvbnNMb2cucHVzaCgnUHJlc2VydmVkIGZ1bGwgRG9sbGhvdXNlTUNQIG1ldGFkYXRhIHRvIG1ldGFkYXRhL2RvbGxob3VzZS55YW1sJyk7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIOKckyBQcmVzZXJ2ZWQgbWV0YWRhdGEgZm9yIHBlcmZlY3Qgcm91bmR0cmlwJykpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBsb2cgZGlyZWN0b3J5IG9wZXJhdGlvbnMgZm9yIHJldmVyc2UgY29udmVyc2lvbiAoZnJvbS1hbnRocm9waWMpXG4gKi9cbmZ1bmN0aW9uIGxvZ1JldmVyc2VEaXJlY3RvcnlPcGVyYXRpb24oXG4gICAgaW5wdXREaXI6IHN0cmluZyxcbiAgICBkaXJOYW1lOiBzdHJpbmcsXG4gICAgaXRlbVR5cGU6IHN0cmluZyxcbiAgICBvcGVyYXRpb25zTG9nOiBzdHJpbmdbXSxcbiAgICB2ZXJib3NlOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKGlucHV0RGlyLCBkaXJOYW1lKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgICBjb25zdCBjb3VudCA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgpLmxlbmd0aDtcbiAgICAgICAgb3BlcmF0aW9uc0xvZy5wdXNoKGBDb21iaW5lZCAke2NvdW50fSAke2l0ZW1UeXBlfShzKSR7aXRlbVR5cGUgPT09ICdzY3JpcHQnID8gJyBhcyBjb2RlIGJsb2NrcycgOiAnJ31gKTtcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAg4pyTIENvbWJpbmVkICR7Y291bnR9ICR7aXRlbVR5cGV9KHMpYCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIExvZyBjb252ZXJzaW9uIHN0ZXBzIGR1cmluZyBmcm9tLWFudGhyb3BpYyBjb252ZXJzaW9uXG4gKi9cbmZ1bmN0aW9uIGxvZ1JldmVyc2VDb252ZXJzaW9uU3RlcHMoXG4gICAgaW5wdXREaXI6IHN0cmluZyxcbiAgICBvcGVyYXRpb25zTG9nOiBzdHJpbmdbXSxcbiAgICB2ZXJib3NlOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgICBvcGVyYXRpb25zTG9nLnB1c2goJ1JlYWQgU0tJTEwubWQgbWV0YWRhdGEnLCAnRW5yaWNoZWQgbWV0YWRhdGEgd2l0aCBEb2xsaG91c2VNQ1AgZmllbGRzJyk7XG5cbiAgICAvLyBMb2cgZGlyZWN0b3J5IG9wZXJhdGlvbnMgdXNpbmcgaGVscGVyXG4gICAgbG9nUmV2ZXJzZURpcmVjdG9yeU9wZXJhdGlvbihpbnB1dERpciwgJ3NjcmlwdHMnLCAnc2NyaXB0Jywgb3BlcmF0aW9uc0xvZywgdmVyYm9zZSk7XG4gICAgbG9nUmV2ZXJzZURpcmVjdG9yeU9wZXJhdGlvbihpbnB1dERpciwgJ3JlZmVyZW5jZScsICdyZWZlcmVuY2UgZG9jdW1lbnQnLCBvcGVyYXRpb25zTG9nLCB2ZXJib3NlKTtcbiAgICBsb2dSZXZlcnNlRGlyZWN0b3J5T3BlcmF0aW9uKGlucHV0RGlyLCAnZXhhbXBsZXMnLCAnZXhhbXBsZScsIG9wZXJhdGlvbnNMb2csIHZlcmJvc2UpO1xuICAgIGxvZ1JldmVyc2VEaXJlY3RvcnlPcGVyYXRpb24oaW5wdXREaXIsICd0aGVtZXMnLCAndGVtcGxhdGUnLCBvcGVyYXRpb25zTG9nLCB2ZXJib3NlKTtcblxuICAgIC8vIEhhbmRsZSBtZXRhZGF0YSByZXN0b3JhdGlvblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihpbnB1dERpciwgJ21ldGFkYXRhJykpKSB7XG4gICAgICAgIG9wZXJhdGlvbnNMb2cucHVzaCgnUmVzdG9yZWQgb3JpZ2luYWwgRG9sbGhvdXNlTUNQIG1ldGFkYXRhIGZyb20gbWV0YWRhdGEvZG9sbGhvdXNlLnlhbWwnKTtcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAg4pyTIFJlc3RvcmVkIG9yaWdpbmFsIG1ldGFkYXRhIChwZXJmZWN0IHJvdW5kdHJpcCknKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogTGlzdCBBbnRocm9waWMgc2tpbGwgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICovXG5mdW5jdGlvbiBsaXN0QW50aHJvcGljU3RydWN0dXJlKGlucHV0RGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzdWJkaXJzID0gWydzY3JpcHRzJywgJ3JlZmVyZW5jZScsICdleGFtcGxlcycsICd0aGVtZXMnLCAnbWV0YWRhdGEnXTtcbiAgICBmb3IgKGNvbnN0IHN1YmRpciBvZiBzdWJkaXJzKSB7XG4gICAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4oaW5wdXREaXIsIHN1YmRpcik7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAke3N1YmRpcn0vOiAke2ZpbGVzLmxlbmd0aH0gZmlsZShzKWApKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBDb3VudCB0b3RhbCBmaWxlcyBpbiBBbnRocm9waWMgc3RydWN0dXJlXG4gKi9cbmZ1bmN0aW9uIGNvdW50RmlsZXMoc3RydWN0dXJlOiBBbnRocm9waWNTa2lsbFN0cnVjdHVyZSk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMTsgLy8gU0tJTEwubWRcblxuICAgIGlmIChzdHJ1Y3R1cmVbJ3NjcmlwdHMvJ10pIGNvdW50ICs9IE9iamVjdC5rZXlzKHN0cnVjdHVyZVsnc2NyaXB0cy8nXSkubGVuZ3RoO1xuICAgIGlmIChzdHJ1Y3R1cmVbJ3JlZmVyZW5jZS8nXSkgY291bnQgKz0gT2JqZWN0LmtleXMoc3RydWN0dXJlWydyZWZlcmVuY2UvJ10pLmxlbmd0aDtcbiAgICBpZiAoc3RydWN0dXJlWydleGFtcGxlcy8nXSkgY291bnQgKz0gT2JqZWN0LmtleXMoc3RydWN0dXJlWydleGFtcGxlcy8nXSkubGVuZ3RoO1xuICAgIGlmIChzdHJ1Y3R1cmVbJ3RoZW1lcy8nXSkgY291bnQgKz0gT2JqZWN0LmtleXMoc3RydWN0dXJlWyd0aGVtZXMvJ10pLmxlbmd0aDtcbiAgICBpZiAoc3RydWN0dXJlWydMSUNFTlNFLnR4dCddKSBjb3VudCArPSAxO1xuXG4gICAgcmV0dXJuIGNvdW50O1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgdGhyb3VnaCBhbGwgZmlsZXMgaW4gYW4gQW50aHJvcGljIHN0cnVjdHVyZVxuICogRXhlY3V0ZXMgYSBjYWxsYmFjayBmb3IgZWFjaCBmaWxlIGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGl0ZXJhdGVTdHJ1Y3R1cmVGaWxlcyhcbiAgICBzdHJ1Y3R1cmU6IEFudGhyb3BpY1NraWxsU3RydWN0dXJlLFxuICAgIGNhbGxiYWNrOiAoZGlyTmFtZTogc3RyaW5nIHwgbnVsbCwgZmlsZW5hbWU6IHN0cmluZykgPT4gdm9pZFxuKTogdm9pZCB7XG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgU0tJTEwubWRcbiAgICBjYWxsYmFjayhudWxsLCAnU0tJTEwubWQnKTtcblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBkaXJlY3Rvcmllc1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gWydzY3JpcHRzLycsICdyZWZlcmVuY2UvJywgJ2V4YW1wbGVzLycsICd0aGVtZXMvJywgJ21ldGFkYXRhLyddIGFzIGNvbnN0O1xuICAgIGZvciAoY29uc3QgZGlyIG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAgIGNvbnN0IGRpckNvbnRlbnQgPSBzdHJ1Y3R1cmVbZGlyXTtcbiAgICAgICAgaWYgKGRpckNvbnRlbnQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgT2JqZWN0LmtleXMoZGlyQ29udGVudCkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhkaXIuc2xpY2UoMCwgLTEpLCBmaWxlbmFtZSk7IC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIExJQ0VOU0UudHh0XG4gICAgaWYgKHN0cnVjdHVyZVsnTElDRU5TRS50eHQnXSkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCAnTElDRU5TRS50eHQnKTtcbiAgICB9XG59XG5cbi8qKlxuICogTGlzdCBmaWxlcyB0aGF0IHdvdWxkIGJlIGNyZWF0ZWQgKGRyeS1ydW4gbW9kZSlcbiAqL1xuZnVuY3Rpb24gbGlzdEZpbGVzVG9DcmVhdGUoc3RydWN0dXJlOiBBbnRocm9waWNTa2lsbFN0cnVjdHVyZSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgRmlsZXM6JykpO1xuICAgIGl0ZXJhdGVTdHJ1Y3R1cmVGaWxlcyhzdHJ1Y3R1cmUsIChkaXJOYW1lLCBmaWxlbmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGRpck5hbWUgPyBgJHtkaXJOYW1lfS8ke2ZpbGVuYW1lfWAgOiBmaWxlbmFtZTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAgIC0gJHtmaWxlUGF0aH1gKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogR2V0IGxpc3Qgb2YgY3JlYXRlZCBmaWxlc1xuICovXG5mdW5jdGlvbiBnZXRDcmVhdGVkRmlsZXMoc3RydWN0dXJlOiBBbnRocm9waWNTa2lsbFN0cnVjdHVyZSwgb3V0cHV0RGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgaXRlcmF0ZVN0cnVjdHVyZUZpbGVzKHN0cnVjdHVyZSwgKGRpck5hbWUsIGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gZGlyTmFtZVxuICAgICAgICAgICAgPyBwYXRoLmpvaW4ob3V0cHV0RGlyLCBkaXJOYW1lLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIDogcGF0aC5qb2luKG91dHB1dERpciwgZmlsZW5hbWUpO1xuICAgICAgICBmaWxlcy5wdXNoKGZpbGVQYXRoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsZXM7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgY29udmVyc2lvbiByZXBvcnRcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVSZXBvcnQoZGF0YTogQ29udmVyc2lvblJlcG9ydCk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAnIyBTa2lsbCBDb252ZXJzaW9uIFJlcG9ydCcsXG4gICAgICAgICcnLFxuICAgICAgICBgKipUaW1lc3RhbXAqKjogJHtkYXRhLnRpbWVzdGFtcH1gLFxuICAgICAgICBgKipEaXJlY3Rpb24qKjogJHtkYXRhLmRpcmVjdGlvbn1gLFxuICAgICAgICBgKipTdGF0dXMqKjogJHtkYXRhLnN1Y2Nlc3MgPyAn4pyTIFN1Y2Nlc3MnIDogJ+KclyBGYWlsZWQnfWAsXG4gICAgICAgICcnLFxuICAgICAgICAnIyMgSW5wdXQvT3V0cHV0JyxcbiAgICAgICAgJycsXG4gICAgICAgIGAqKklucHV0Kio6IFxcYCR7ZGF0YS5pbnB1dH1cXGBgLFxuICAgICAgICBgKipPdXRwdXQqKjogXFxgJHtkYXRhLm91dHB1dH1cXGBgLFxuICAgICAgICAnJ1xuICAgIF07XG5cbiAgICBpZiAoZGF0YS5maWxlc0NyZWF0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBsaW5lcy5wdXNoKCcjIyBGaWxlcyBDcmVhdGVkJywgJycsIC4uLmRhdGEuZmlsZXNDcmVhdGVkLm1hcChmaWxlID0+IGAtIFxcYCR7ZmlsZX1cXGBgKSwgJycpO1xuICAgIH1cblxuICAgIGxpbmVzLnB1c2goJyMjIE9wZXJhdGlvbnMgUGVyZm9ybWVkJywgJycsIC4uLmRhdGEub3BlcmF0aW9uc1BlcmZvcm1lZC5tYXAob3BlcmF0aW9uID0+IGAtICR7b3BlcmF0aW9ufWApLCAnJyk7XG5cbiAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgICBsaW5lcy5wdXNoKCcjIyBFcnJvcicsICcnLCAnYGBgJywgZGF0YS5lcnJvciwgJ2BgYCcsICcnKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKCctLS0nLCAnJywgJypHZW5lcmF0ZWQgYnkgRG9sbGhvdXNlTUNQIENvbnZlcnRlcionKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuLy8gUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xucHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpO1xuIl19
637
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvY29udmVydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLE9BQU8sTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUNILDZCQUE2QixFQUM3Qiw2QkFBNkIsRUFFaEMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUU5Qjs7R0FFRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxRQUFRO0FBRXREOztHQUVHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLFFBQVE7QUFFNUQ7O0dBRUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTztBQUUxRDs7Ozs7R0FLRztBQUNILFNBQVMseUJBQXlCO0lBQzlCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVB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Q0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLHVDQUF1QyxDQUFDLENBQUM7SUFFL0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCwrQkFBK0I7QUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qKlxuICogQ0xJIGNvbW1hbmQgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBBbnRocm9waWMgU2tpbGxzIGFuZCBEb2xsaG91c2VNQ1AgU2tpbGxzXG4gKlxuICogVXNhZ2U6XG4gKiAgIGRvbGxob3VzZSBjb252ZXJ0IHRvLWFudGhyb3BpYyA8aW5wdXQ+IFtvcHRpb25zXVxuICogICBkb2xsaG91c2UgY29udmVydCBmcm9tLWFudGhyb3BpYyA8aW5wdXQ+IFtvcHRpb25zXVxuICpcbiAqIElucHV0IGZvcm1hdHM6XG4gKiAgIHRvLWFudGhyb3BpYzogICBEb2xsaG91c2VNQ1Agc2tpbGwgZmlsZSAoLm1kKVxuICogICBmcm9tLWFudGhyb3BpYzogQW50aHJvcGljIHNraWxsIGRpcmVjdG9yeSBvciBaSVAgZmlsZVxuICpcbiAqIE9wdGlvbnM6XG4gKiAgIC1vLCAtLW91dHB1dCA8ZGlyPiAgICAgIE91dHB1dCBkaXJlY3RvcnlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBmb3IgZnJvbS1hbnRocm9waWM6IH4vLmRvbGxob3VzZS9wb3J0Zm9saW8vc2tpbGxzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgZm9yIHRvLWFudGhyb3BpYzogLi9hbnRocm9waWMtc2tpbGxzXG4gKiAgIC12LCAtLXZlcmJvc2UgICAgICAgICAgIFNob3cgZGV0YWlsZWQgY29udmVyc2lvbiBzdGVwc1xuICogICAtciwgLS1yZXBvcnQgICAgICAgICAgICBHZW5lcmF0ZSBjb252ZXJzaW9uIHJlcG9ydFxuICogICAtLWRyeS1ydW4gICAgICAgICAgICAgICBQcmV2aWV3IGNvbnZlcnNpb24gd2l0aG91dCBleGVjdXRpbmdcbiAqXG4gKiBFeGFtcGxlczpcbiAqICAgIyBDb252ZXJ0IGRvd25sb2FkZWQgWklQIGZpbGUgZnJvbSBDbGF1ZGUuYWlcbiAqICAgZG9sbGhvdXNlIGNvbnZlcnQgZnJvbS1hbnRocm9waWMgfi9Eb3dubG9hZHMvbXktc2tpbGwuemlwXG4gKlxuICogICAjIENvbnZlcnQgQW50aHJvcGljIHNraWxsIGRpcmVjdG9yeVxuICogICBkb2xsaG91c2UgY29udmVydCBmcm9tLWFudGhyb3BpYyB+L0Rvd25sb2Fkcy9teS1za2lsbC1mb2xkZXJcbiAqXG4gKiAgICMgRXhwb3J0IERvbGxob3VzZU1DUCBza2lsbCB0byBzaGFyZVxuICogICBkb2xsaG91c2UgY29udmVydCB0by1hbnRocm9waWMgfi8uZG9sbGhvdXNlL3BvcnRmb2xpby9za2lsbHMvbXktc2tpbGwubWQgLW8gLi9leHBvcnRlZFxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgZXh0cmFjdCBmcm9tICdleHRyYWN0LXppcCc7XG5pbXBvcnQge1xuICAgIERvbGxob3VzZVRvQW50aHJvcGljQ29udmVydGVyLFxuICAgIEFudGhyb3BpY1RvRG9sbGhvdXNlQ29udmVydGVyLFxuICAgIHR5cGUgQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmVcbn0gZnJvbSAnLi4vY29udmVydGVycy9pbmRleC5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUGF0aFdpdGhpbkJhc2UgfSBmcm9tICcuLi91dGlscy9wYXRoU2VjdXJpdHkuanMnO1xuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxuLyoqXG4gKiBNYXhpbXVtIFpJUCBmaWxlIHNpemUgKDEwME1CKSAtIHByZXZlbnRzIERvUyBhdHRhY2tzIGFuZCBzeXN0ZW0gcmVzb3VyY2UgZXhoYXVzdGlvblxuICovXG5jb25zdCBNQVhfWklQX1NJWkVfQllURVMgPSAxMDAgKiAxMDI0ICogMTAyNDsgLy8gMTAwTUJcblxuLyoqXG4gKiBNYXhpbXVtIGV4dHJhY3RlZCBzaXplICg1MDBNQikgLSBwcmV2ZW50cyB6aXAgYm9tYiBhdHRhY2tzXG4gKi9cbmNvbnN0IE1BWF9FWFRSQUNURURfU0laRV9CWVRFUyA9IDUwMCAqIDEwMjQgKiAxMDI0OyAvLyA1MDBNQlxuXG4vKipcbiAqIFByb2dyZXNzIGluZGljYXRvciB0aHJlc2hvbGQgKDEwTUIpIC0gc2hvdyBwcm9ncmVzcyBtZXNzYWdlIGZvciBmaWxlcyBsYXJnZXIgdGhhbiB0aGlzXG4gKi9cbmNvbnN0IFBST0dSRVNTX1RIUkVTSE9MRF9CWVRFUyA9IDEwICogMTAyNCAqIDEwMjQ7IC8vIDEwTUJcblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgRG9sbGhvdXNlTUNQIHBvcnRmb2xpbyBza2lsbHMgZGlyZWN0b3J5XG4gKiBTRUNVUklUWSBGSVggKERNQ1AtU0VDLTAwNCk6IE5vcm1hbGl6ZSBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHByZXZlbnQgVW5pY29kZSBhdHRhY2tzXG4gKiBQcmV2aW91c2x5OiBVc2VkIHByb2Nlc3MuZW52LkhPTUUgZGlyZWN0bHkgd2l0aG91dCBub3JtYWxpemF0aW9uXG4gKiBOb3c6IFZhbGlkYXRlIGFuZCBub3JtYWxpemUgYWxsIHBhdGggY29tcG9uZW50cyBpbmNsdWRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRTa2lsbHNEaXJlY3RvcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBob21lRGlyID0gcHJvY2Vzcy5lbnYuSE9NRSB8fCAnJztcblxuICAgIC8vIE5vcm1hbGl6ZSBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3MgdmlhIGxvb2thbGlrZSBjaGFyYWN0ZXJzXG4gICAgbGV0IG5vcm1hbGl6ZWRIb21lID0gJyc7XG4gICAgaWYgKGhvbWVEaXIpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXphdGlvblJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGhvbWVEaXIpO1xuICAgICAgICBub3JtYWxpemVkSG9tZSA9IG5vcm1hbGl6YXRpb25SZXN1bHQubm9ybWFsaXplZENvbnRlbnQ7XG5cbiAgICAgICAgLy8gW1NFQ1VSSVRZIFdBUk5JTkddIExvZyBpZiBub3JtYWxpemF0aW9uIGNoYW5nZWQgdGhlIEhPTUUgcGF0aFxuICAgICAgICAvLyBUaGlzIGNvdWxkIGluZGljYXRlIGEgc2VjdXJpdHkgaXNzdWUgb3IgbWlzY29uZmlndXJhdGlvblxuICAgICAgICBpZiAobm9ybWFsaXplZEhvbWUgIT09IGhvbWVEaXIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgICAgIGBbV0FSTklOR10gSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3YXMgbW9kaWZpZWQgZHVyaW5nIFVuaWNvZGUgbm9ybWFsaXphdGlvbi5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsOiBcIiR7aG9tZURpcn1cIlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgTm9ybWFsaXplZDogXCIke25vcm1hbGl6ZWRIb21lfVwiXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBUaGlzIG1heSBpbmRpY2F0ZSBhIHNlY3VyaXR5IGlzc3VlIG9yIG1pc2NvbmZpZ3VyYXRpb24uYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aC5qb2luKG5vcm1hbGl6ZWRIb21lLCAnLmRvbGxob3VzZScsICdwb3J0Zm9saW8nLCAnc2tpbGxzJyk7XG59XG5cbi8qKlxuICogRm9ybWF0IGJ5dGVzIHRvIGh1bWFuLXJlYWRhYmxlIHN0cmluZ1xuICovXG5mdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCeXRlcyc7XG4gICAgY29uc3QgayA9IDEwMjQ7XG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJ107XG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKChieXRlcyAvIE1hdGgucG93KGssIGkpKSAqIDEwMCkgLyAxMDAgKyAnICcgKyBzaXplc1tpXTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdG90YWwgc2l6ZSBvZiBleHRyYWN0ZWQgZmlsZXNcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlRXh0cmFjdGVkU2l6ZShkaXJlY3Rvcnk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG5cbiAgICBmdW5jdGlvbiB3YWxrRGlyKGRpcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICB3YWxrRGlyKGZ1bGxQYXRoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3YWxrRGlyKGRpcmVjdG9yeSk7XG4gICAgcmV0dXJuIHRvdGFsU2l6ZTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGEgWklQIGZpbGUgdG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggc2l6ZSBsaW1pdHMgYW5kIHByb2dyZXNzIGluZGljYXRpb25cbiAqIEByZXR1cm5zIFBhdGggdG8gZXh0cmFjdGVkIGRpcmVjdG9yeVxuICogQHRocm93cyBFcnJvciBpZiBaSVAgZXhjZWVkcyBzaXplIGxpbWl0c1xuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0WmlwRmlsZSh6aXBQYXRoOiBzdHJpbmcsIHZlcmJvc2U6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIEZJWDogVmFsaWRhdGUgWklQIGZpbGUgc2l6ZSBCRUZPUkUgZXh0cmFjdGlvbiB0byBwcmV2ZW50IERvUyBhdHRhY2tzXG4gICAgLy8gUHJldmlvdXNseTogTm8gc2l6ZSB2YWxpZGF0aW9uLCBhbGxvd2luZyBleHRyYWN0aW9uIG9mIGFyYml0cmFyaWx5IGxhcmdlIGZpbGVzXG4gICAgLy8gTm93OiBFbmZvcmNlIDEwME1CIFpJUCBzaXplIGxpbWl0IGFuZCA1MDBNQiBleHRyYWN0ZWQgc2l6ZSBsaW1pdFxuICAgIGNvbnN0IHppcFN0YXRzID0gZnMuc3RhdFN5bmMoemlwUGF0aCk7XG4gICAgY29uc3QgemlwU2l6ZSA9IHppcFN0YXRzLnNpemU7XG5cbiAgICAvLyBTRUNVUklUWSBDSEVDSyAodHlwZXNjcmlwdDpTNTA0Mik6IFZhbGlkYXRlIFpJUCBzaXplIGJlZm9yZSBleHRyYWN0aW9uXG4gICAgaWYgKHppcFNpemUgPiBNQVhfWklQX1NJWkVfQllURVMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFpJUCBmaWxlIHRvbyBsYXJnZTogJHtmb3JtYXRCeXRlcyh6aXBTaXplKX0uIE1heGltdW0gYWxsb3dlZDogJHtmb3JtYXRCeXRlcyhNQVhfWklQX1NJWkVfQllURVMpfS4gYCArXG4gICAgICAgICAgICBgVGhpcyBsaW1pdCBwcmV2ZW50cyBEb1MgYXR0YWNrcyBhbmQgc3lzdGVtIHJlc291cmNlIGV4aGF1c3Rpb24uYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksIGBkb2xsaG91c2UtZXh0cmFjdC0ke0RhdGUubm93KCl9YCk7XG5cbiAgICAvLyBGSVg6IEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBaSVAgb3BlcmF0aW9uc1xuICAgIC8vIFByZXZpb3VzbHk6IE5vIGxvZ2dpbmcgb2YgWklQIGV4dHJhY3Rpb24gb3BlcmF0aW9uc1xuICAgIC8vIE5vdzogTG9nIGFsbCBaSVAgb3BlcmF0aW9ucyBmb3Igc2VjdXJpdHkgYXVkaXQgdHJhaWxcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnY29udmVydCBDTEknLFxuICAgICAgICBkZXRhaWxzOiBgWklQIGV4dHJhY3Rpb246ICR7emlwUGF0aH0gKCR7Zm9ybWF0Qnl0ZXMoemlwU2l6ZSl9KSAtPiAke3RlbXBEaXJ9YFxuICAgIH0pO1xuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnXFxuRXh0cmFjdGluZyBaSVAgZmlsZS4uLicpKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBaSVA6ICR7emlwUGF0aH1gKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgU2l6ZTogJHtmb3JtYXRCeXRlcyh6aXBTaXplKX1gKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgVGVtcCBkaXI6ICR7dGVtcERpcn1gKSk7XG4gICAgfVxuXG4gICAgLy8gRklYOiBBZGQgcHJvZ3Jlc3MgaW5kaWNhdG9yIGZvciBsYXJnZSBaSVAgZXh0cmFjdGlvbnNcbiAgICAvLyBQcmV2aW91c2x5OiBObyBmZWVkYmFjayBkdXJpbmcgZXh0cmFjdGlvbiwgcG9vciBVWCBmb3IgbGFyZ2UgZmlsZXNcbiAgICAvLyBOb3c6IFNob3cgcHJvZ3Jlc3MgbWVzc2FnZSBmb3IgYmV0dGVyIHVzZXIgZXhwZXJpZW5jZVxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NNZXNzYWdlID0gemlwU2l6ZSA+IFBST0dSRVNTX1RIUkVTSE9MRF9CWVRFUyA/ICdFeHRyYWN0aW5nICh0aGlzIG1heSB0YWtlIGEgbW9tZW50KS4uLicgOiAnRXh0cmFjdGluZy4uLic7XG4gICAgaWYgKHZlcmJvc2UgfHwgemlwU2l6ZSA+IFBST0dSRVNTX1RIUkVTSE9MRF9CWVRFUykge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGAgICR7cHJvZ3Jlc3NNZXNzYWdlfWApKTtcbiAgICB9XG5cbiAgICAvLyBTT05BUkNMT1VEIEZJWCAodHlwZXNjcmlwdDpTNTA0Mik6IEFyY2hpdmUgZXh0cmFjdGlvbiBpcyBzYWZlIGhlcmVcbiAgICAvLyAtIFpJUCBzaXplIHZhbGlkYXRlZCAobWF4IDEwME1CKSBhdCBsaW5lcyAxMTAtMTE0IHRvIHByZXZlbnQgRG9TXG4gICAgLy8gLSBFeHRyYWN0ZWQgc2l6ZSB2YWxpZGF0ZWQgKG1heCA1MDBNQikgYXQgbGluZXMgMTUxLTE1NyB0byBwcmV2ZW50IHppcCBib21ic1xuICAgIC8vIC0gRXh0cmFjdGlvbiB0byBpc29sYXRlZCB0ZW1wIGRpcmVjdG9yeSAobm8gcGF0aCB0cmF2ZXJzYWwgcmlzaylcbiAgICAvLyAtIEZ1bGwgY2xlYW51cCBpbiBmaW5hbGx5IGJsb2NrIHByZXZlbnRzIHJlc291cmNlIGxlYWtzXG4gICAgYXdhaXQgZXh0cmFjdCh6aXBQYXRoLCB7IGRpcjogdGVtcERpciB9KTtcblxuICAgIGNvbnN0IGV4dHJhY3RUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIEV4dHJhY3RlZCBpbiAke2V4dHJhY3RUaW1lfW1zYCkpO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZIENIRUNLICh0eXBlc2NyaXB0OlM1MDQyKTogVmFsaWRhdGUgZXh0cmFjdGVkIHNpemUgdG8gcHJldmVudCB6aXAgYm9tYiBhdHRhY2tzXG4gICAgLy8gWmlwIGJvbWJzIGFyZSBtYWxpY2lvdXMgYXJjaGl2ZXMgdGhhdCBleHBhbmQgdG8gZW5vcm1vdXMgc2l6ZXMgKGUuZy4sIDQyS0Ig4oaSIDQuNVBCKVxuICAgIC8vIFRoaXMgY2hlY2sgcHJldmVudHMgc3lzdGVtIHJlc291cmNlIGV4aGF1c3Rpb24gZnJvbSBtYWxpY2lvdXNseSBjb21wcmVzc2VkIGZpbGVzXG4gICAgY29uc3QgZXh0cmFjdGVkU2l6ZSA9IGNhbGN1bGF0ZUV4dHJhY3RlZFNpemUodGVtcERpcik7XG4gICAgaWYgKGV4dHJhY3RlZFNpemUgPiBNQVhfRVhUUkFDVEVEX1NJWkVfQllURVMpIHtcbiAgICAgICAgLy8gQ2xlYW51cCBiZWZvcmUgdGhyb3dpbmcgZXJyb3IgdG8gcHJldmVudCB0ZW1wIGZpbGUgYWNjdW11bGF0aW9uXG4gICAgICAgIGZzLnJtU3luYyh0ZW1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHRyYWN0ZWQgY29udGVudCB0b28gbGFyZ2U6ICR7Zm9ybWF0Qnl0ZXMoZXh0cmFjdGVkU2l6ZSl9LiBNYXhpbXVtIGFsbG93ZWQ6ICR7Zm9ybWF0Qnl0ZXMoTUFYX0VYVFJBQ1RFRF9TSVpFX0JZVEVTKX0uIFRoaXMgbWF5IGJlIGEgemlwIGJvbWIgYXR0YWNrLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIEV4dHJhY3RlZCBzaXplOiAke2Zvcm1hdEJ5dGVzKGV4dHJhY3RlZFNpemUpfWApKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBza2lsbCBkaXJlY3RvcnkgKHNob3VsZCBiZSB0aGUgb25seSB0b3AtbGV2ZWwgZGlyZWN0b3J5KVxuICAgIGNvbnN0IGNvbnRlbnRzID0gZnMucmVhZGRpclN5bmModGVtcERpcik7XG4gICAgY29uc3QgZGlyZWN0b3JpZXMgPSBjb250ZW50cy5maWx0ZXIoaXRlbSA9PlxuICAgICAgICBmcy5zdGF0U3luYyhwYXRoLmpvaW4odGVtcERpciwgaXRlbSkpLmlzRGlyZWN0b3J5KClcbiAgICApO1xuXG4gICAgaWYgKGRpcmVjdG9yaWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHNraWxsIGRpcmVjdG9yeSBwYXRoXG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4odGVtcERpciwgZGlyZWN0b3JpZXNbMF0pO1xuICAgIH0gZWxzZSBpZiAoY29udGVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBJZiBtdWx0aXBsZSBpdGVtcyBvciBubyBkaXJlY3RvcnksIHJldHVybiB0ZW1wIGRpciBpdHNlbGZcbiAgICAgICAgcmV0dXJuIHRlbXBEaXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdaSVAgZmlsZSBhcHBlYXJzIHRvIGJlIGVtcHR5Jyk7XG4gICAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgZmlsZSBpcyBhIFpJUCBmaWxlIGJhc2VkIG9uIGV4dGVuc2lvblxuICovXG5mdW5jdGlvbiBpc1ppcEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnRvTG93ZXJDYXNlKCkgPT09ICcuemlwJztcbn1cblxuLyoqXG4gKiBQcmVwYXJlIGlucHV0IGZvciBjb252ZXJzaW9uIChoYW5kbGVzIGJvdGggZGlyZWN0b3JpZXMgYW5kIFpJUCBmaWxlcylcbiAqIEByZXR1cm5zIHthY3R1YWxJbnB1dCwgdGVtcERpcn0gLSBhY3R1YWxJbnB1dCBpcyB0aGUgZGlyZWN0b3J5IHRvIGNvbnZlcnQsIHRlbXBEaXIgaXMgdGhlIHRlbXAgZGlyIHRvIGNsZWFudXAgKG9yIG51bGwpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDb252ZXJzaW9uSW5wdXQoXG4gICAgaW5wdXQ6IHN0cmluZyxcbiAgICB2ZXJib3NlOiBib29sZWFuXG4pOiBQcm9taXNlPHsgYWN0dWFsSW5wdXQ6IHN0cmluZzsgdGVtcERpcjogc3RyaW5nIHwgbnVsbCB9PiB7XG4gICAgLy8gVmVyaWZ5IGlucHV0IGV4aXN0c1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhpbnB1dCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYElucHV0IG5vdCBmb3VuZDogJHtpbnB1dH1gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgWklQIGZpbGVzXG4gICAgaWYgKGlzWmlwRmlsZShpbnB1dCkpIHtcbiAgICAgICAgY29uc3QgYWN0dWFsSW5wdXQgPSBhd2FpdCBleHRyYWN0WmlwRmlsZShpbnB1dCwgdmVyYm9zZSk7XG4gICAgICAgIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmRpcm5hbWUoYWN0dWFsSW5wdXQpO1xuICAgICAgICByZXR1cm4geyBhY3R1YWxJbnB1dCwgdGVtcERpciB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkaXJlY3Rvcmllc1xuICAgIGlmICghZnMuc3RhdFN5bmMoaW5wdXQpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYElucHV0IG11c3QgYmUgYSBkaXJlY3Rvcnkgb3IgWklQIGZpbGU6ICR7aW5wdXR9YCkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWN0dWFsSW5wdXQ6IGlucHV0LCB0ZW1wRGlyOiBudWxsIH07XG59XG5cbmludGVyZmFjZSBDb252ZXJ0T3B0aW9ucyB7XG4gICAgb3V0cHV0Pzogc3RyaW5nO1xuICAgIHZlcmJvc2U6IGJvb2xlYW47XG4gICAgcmVwb3J0OiBib29sZWFuO1xuICAgIGRyeVJ1bjogYm9vbGVhbjtcbiAgICBiYWNrdXA6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDb252ZXJzaW9uUmVwb3J0IHtcbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICBkaXJlY3Rpb246ICd0by1hbnRocm9waWMnIHwgJ2Zyb20tYW50aHJvcGljJztcbiAgICBpbnB1dDogc3RyaW5nO1xuICAgIG91dHB1dDogc3RyaW5nO1xuICAgIGZpbGVzQ3JlYXRlZDogc3RyaW5nW107XG4gICAgb3BlcmF0aW9uc1BlcmZvcm1lZDogc3RyaW5nW107XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBlcnJvcj86IHN0cmluZztcbn1cblxucHJvZ3JhbVxuICAgIC5uYW1lKCdjb252ZXJ0JylcbiAgICAuZGVzY3JpcHRpb24oJ0NvbnZlcnQgYmV0d2VlbiBBbnRocm9waWMgU2tpbGxzIGFuZCBEb2xsaG91c2VNQ1AgU2tpbGxzIGZvcm1hdHMnKVxuICAgIC5jb21tYW5kKCd0by1hbnRocm9waWMgPGlucHV0PicpXG4gICAgLmRlc2NyaXB0aW9uKCdDb252ZXJ0IERvbGxob3VzZU1DUCBza2lsbCB0byBBbnRocm9waWMgU2tpbGxzIGZvcm1hdCcpXG4gICAgLm9wdGlvbignLW8sIC0tb3V0cHV0IDxkaXI+JywgJ091dHB1dCBkaXJlY3RvcnknLCAnLi9hbnRocm9waWMtc2tpbGxzJylcbiAgICAub3B0aW9uKCctdiwgLS12ZXJib3NlJywgJ1Nob3cgZGV0YWlsZWQgY29udmVyc2lvbiBzdGVwcycsIGZhbHNlKVxuICAgIC5vcHRpb24oJy1yLCAtLXJlcG9ydCcsICdHZW5lcmF0ZSBjb252ZXJzaW9uIHJlcG9ydCcsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdQcmV2aWV3IGNvbnZlcnNpb24gd2l0aG91dCBleGVjdXRpbmcnLCBmYWxzZSlcbiAgICAuYWN0aW9uKGFzeW5jIChpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBDb252ZXJ0T3B0aW9ucykgPT4ge1xuICAgICAgICBhd2FpdCBjb252ZXJ0VG9BbnRocm9waWMoaW5wdXQsIG9wdGlvbnMpO1xuICAgIH0pO1xuXG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2Zyb20tYW50aHJvcGljIDxpbnB1dD4nKVxuICAgIC5kZXNjcmlwdGlvbignQ29udmVydCBBbnRocm9waWMgU2tpbGxzIHRvIERvbGxob3VzZU1DUCBza2lsbCBmb3JtYXQgKGlucHV0IGNhbiBiZSBhIGRpcmVjdG9yeSBvciBaSVAgZmlsZSknKVxuICAgIC5vcHRpb24oJy1vLCAtLW91dHB1dCA8ZGlyPicsICdPdXRwdXQgZGlyZWN0b3J5JywgZ2V0RGVmYXVsdFNraWxsc0RpcmVjdG9yeSgpKVxuICAgIC5vcHRpb24oJy12LCAtLXZlcmJvc2UnLCAnU2hvdyBkZXRhaWxlZCBjb252ZXJzaW9uIHN0ZXBzJywgZmFsc2UpXG4gICAgLm9wdGlvbignLXIsIC0tcmVwb3J0JywgJ0dlbmVyYXRlIGNvbnZlcnNpb24gcmVwb3J0JywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1kcnktcnVuJywgJ1ByZXZpZXcgY29udmVyc2lvbiB3aXRob3V0IGV4ZWN1dGluZycsIGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM6IENvbnZlcnRPcHRpb25zKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnZlcnRGcm9tQW50aHJvcGljKGlucHV0LCBvcHRpb25zKTtcbiAgICB9KTtcblxuLyoqXG4gKiBDb252ZXJ0IERvbGxob3VzZU1DUCBza2lsbCB0byBBbnRocm9waWMgZm9ybWF0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRUb0FudGhyb3BpYyhpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBDb252ZXJ0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAoRE1DUC1TRUMtMDA0KTogVXNlIFVuaWNvZGVWYWxpZGF0b3IgdG8gbm9ybWFsaXplIGFsbCB1c2VyIGlucHV0XG4gICAgLy8gUHJldmlvdXNseTogVXNlZCBidWlsdC1pbiBub3JtYWxpemUoKSB3aGljaCBkb2Vzbid0IGRldGVjdCBob21vZ3JhcGggYXR0YWNrc1xuICAgIC8vIE5vdzogVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoKSBkZXRlY3RzIGFuZCBwcmV2ZW50cyBsb29rYWxpa2UgY2hhcmFjdGVyIGF0dGFja3NcbiAgICBjb25zdCBpbnB1dFZhbGlkYXRpb24gPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShpbnB1dCk7XG4gICAgaW5wdXQgPSBpbnB1dFZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG5cbiAgICBpZiAob3B0aW9ucy5vdXRwdXQpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0VmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG9wdGlvbnMub3V0cHV0KTtcbiAgICAgICAgb3B0aW9ucy5vdXRwdXQgPSBvdXRwdXRWYWxpZGF0aW9uLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGxvZ09wZXJhdGlvbigndG8tYW50aHJvcGljJywgaW5wdXQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFJlYWQgaW5wdXQgZmlsZVxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgSW5wdXQgZmlsZSBub3QgZm91bmQ6ICR7aW5wdXR9YCkpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXRDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGlucHV0LCAndXRmLTgnKTtcbiAgICAgICAgY29uc3Qgc2tpbGxOYW1lID0gcGF0aC5iYXNlbmFtZShpbnB1dCwgcGF0aC5leHRuYW1lKGlucHV0KSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnXFxuUmVhZGluZyBEb2xsaG91c2VNQ1Agc2tpbGwuLi4nKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIElucHV0OiAke2lucHV0fWApKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgU2l6ZTogJHtpbnB1dENvbnRlbnQubGVuZ3RofSBieXRlc2ApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnRcbiAgICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IERvbGxob3VzZVRvQW50aHJvcGljQ29udmVydGVyKCk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbnNMb2c6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnXFxuQ29udmVydGluZyB0byBBbnRocm9waWMgU2tpbGxzIGZvcm1hdC4uLicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cnVjdHVyZSA9IGF3YWl0IGNvbnZlcnRlci5jb252ZXJ0U2tpbGwoaW5wdXRDb250ZW50KTtcbiAgICAgICAgbG9nQ29udmVyc2lvblN0ZXBzKHN0cnVjdHVyZSwgb3BlcmF0aW9uc0xvZywgb3B0aW9ucy52ZXJib3NlKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgb3V0cHV0IGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBvdXRwdXREaXIgPSByZXNvbHZlUGF0aFdpdGhpbkJhc2Uob3B0aW9ucy5vdXRwdXQgfHwgJy4vYW50aHJvcGljLXNraWxscycsIHNraWxsTmFtZSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1xcbltEUlkgUlVOXSBXb3VsZCBjcmVhdGU6JykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBPdXRwdXQgZGlyZWN0b3J5OiAke291dHB1dERpcn1gKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIEZpbGVzOiAke2NvdW50RmlsZXMoc3RydWN0dXJlKX0gZmlsZXNgKSk7XG4gICAgICAgICAgICBsaXN0RmlsZXNUb0NyZWF0ZShzdHJ1Y3R1cmUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgb3V0cHV0XG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFxcbldyaXRpbmcgQW50aHJvcGljIHNraWxsIHRvOiAke291dHB1dERpcn1gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBjb252ZXJ0ZXIud3JpdGVUb0RpcmVjdG9yeShzdHJ1Y3R1cmUsIG91dHB1dERpcik7XG4gICAgICAgIGNvbnN0IGZpbGVzQ3JlYXRlZCA9IGdldENyZWF0ZWRGaWxlcyhzdHJ1Y3R1cmUsIG91dHB1dERpcik7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgcmVwb3J0XG4gICAgICAgIGlmIChvcHRpb25zLnJlcG9ydCkge1xuICAgICAgICAgICAgY29uc3QgcmVwb3J0ID0gZ2VuZXJhdGVSZXBvcnQoe1xuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ3RvLWFudGhyb3BpYycsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiBvdXRwdXREaXIsXG4gICAgICAgICAgICAgICAgZmlsZXNDcmVhdGVkLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbnNQZXJmb3JtZWQ6IG9wZXJhdGlvbnNMb2csXG4gICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydFBhdGggPSByZXNvbHZlUGF0aFdpdGhpbkJhc2Uob3V0cHV0RGlyLCAnLmNvbnZlcnNpb24tcmVwb3J0Lm1kJyk7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHJlcG9ydFBhdGgsIHJlcG9ydCk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBcXG5Db252ZXJzaW9uIHJlcG9ydDogJHtyZXBvcnRQYXRofWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1Y2Nlc3NcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ1xcbuKckyBDb252ZXJzaW9uIGNvbXBsZXRlJykpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIENyZWF0ZWQgJHtmaWxlc0NyZWF0ZWQubGVuZ3RofSBmaWxlKHMpIGluOiAke291dHB1dERpcn1gKSk7XG5cbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdcXG7inJcgQ29udmVyc2lvbiBmYWlsZWQ6JyksIGVycm9yKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDbGVhbnVwIHRlbXBvcmFyeSBkaXJlY3Rvcnkgc2FmZWx5XG4gKiBTT05BUkNMT1VEIEZJWCAodHlwZXNjcmlwdDpTMzc3Nik6IEV4dHJhY3RlZCBmcm9tIGNvbnZlcnRGcm9tQW50aHJvcGljIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICogUHJldmlvdXNseTogSW5saW5lIGNsZWFudXAgbG9naWMgYWRkZWQgbmVzdGVkIGNvbmRpdGlvbnMgaW5jcmVhc2luZyBjb21wbGV4aXR5XG4gKiBOb3c6IFNlcGFyYXRlIGZ1bmN0aW9uIGhhbmRsZXMgY2xlYW51cCB3aXRoIHByb3BlciBlcnJvciBoYW5kbGluZ1xuICovXG5mdW5jdGlvbiBjbGVhbnVwVGVtcERpcmVjdG9yeSh0ZW1wRGlyOiBzdHJpbmcgfCBudWxsLCB2ZXJib3NlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRlbXBEaXIgJiYgZnMuZXhpc3RzU3luYyh0ZW1wRGlyKSkge1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgXFxuQ2xlYW5pbmcgdXAgdGVtcG9yYXJ5IGZpbGVzLi4uYCkpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmcy5ybVN5bmModGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9IGNhdGNoIChjbGVhbnVwRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIExvZyBlcnJvciBkZXRhaWxzIGJ1dCBkb24ndCBmYWlsIG9uIGNsZWFudXAgZXJyb3JzXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBjbGVhbnVwRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNsZWFudXBFcnJvci5tZXNzYWdlIDogU3RyaW5nKGNsZWFudXBFcnJvcik7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBXYXJuaW5nOiBGYWlsZWQgdG8gY2xlYW51cCB0ZW1wIGRpcmVjdG9yeTogJHt0ZW1wRGlyfSAtICR7ZXJyb3JNZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IEFudGhyb3BpYyBza2lsbCB0byBEb2xsaG91c2VNQ1AgZm9ybWF0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRGcm9tQW50aHJvcGljKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM6IENvbnZlcnRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYIChETUNQLVNFQy0wMDQpOiBVc2UgVW5pY29kZVZhbGlkYXRvciB0byBub3JtYWxpemUgYWxsIHVzZXIgaW5wdXRcbiAgICAvLyBQcmV2aW91c2x5OiBVc2VkIGJ1aWx0LWluIG5vcm1hbGl6ZSgpIHdoaWNoIGRvZXNuJ3QgZGV0ZWN0IGhvbW9ncmFwaCBhdHRhY2tzXG4gICAgLy8gTm93OiBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSgpIGRldGVjdHMgYW5kIHByZXZlbnRzIGxvb2thbGlrZSBjaGFyYWN0ZXIgYXR0YWNrc1xuICAgIC8vIEV4YW1wbGU6IFwiZmlsZVxcdTAwNDEudHh0XCIgdnMgXCJmaWxlXFx1MDMwMUEudHh0XCIgYm90aCBsb29rIGxpa2UgXCJmaWxlQS50eHRcIiBidXQgYXJlIGRpZmZlcmVudFxuICAgIGNvbnN0IGlucHV0VmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGlucHV0KTtcbiAgICBpbnB1dCA9IGlucHV0VmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcblxuICAgIGlmIChvcHRpb25zLm91dHB1dCkge1xuICAgICAgICBjb25zdCBvdXRwdXRWYWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUob3B0aW9ucy5vdXRwdXQpO1xuICAgICAgICBvcHRpb25zLm91dHB1dCA9IG91dHB1dFZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgfVxuXG4gICAgbGV0IHRlbXBEaXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgbG9nT3BlcmF0aW9uKCdmcm9tLWFudGhyb3BpYycsIGlucHV0LCBvcHRpb25zKTtcblxuICAgICAgICAvLyBQcmVwYXJlIGlucHV0IChoYW5kbGVzIGJvdGggZGlyZWN0b3JpZXMgYW5kIFpJUCBmaWxlcylcbiAgICAgICAgY29uc3QgeyBhY3R1YWxJbnB1dCwgdGVtcERpcjogZXh0cmFjdGVkVGVtcERpciB9ID0gYXdhaXQgcHJlcGFyZUNvbnZlcnNpb25JbnB1dChpbnB1dCwgb3B0aW9ucy52ZXJib3NlKTtcbiAgICAgICAgdGVtcERpciA9IGV4dHJhY3RlZFRlbXBEaXI7XG5cbiAgICAgICAgY29uc3Qgc2tpbGxOYW1lID0gcGF0aC5iYXNlbmFtZShhY3R1YWxJbnB1dCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnXFxuUmVhZGluZyBBbnRocm9waWMgc2tpbGwuLi4nKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIElucHV0OiAke2FjdHVhbElucHV0fWApKTtcbiAgICAgICAgICAgIGxpc3RBbnRocm9waWNTdHJ1Y3R1cmUoYWN0dWFsSW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydFxuICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSBuZXcgQW50aHJvcGljVG9Eb2xsaG91c2VDb252ZXJ0ZXIoKTtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKCdcXG5Db252ZXJ0aW5nIHRvIERvbGxob3VzZU1DUCBTa2lsbHMgZm9ybWF0Li4uJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZG9sbGhvdXNlU2tpbGwgPSBhd2FpdCBjb252ZXJ0ZXIuY29udmVydFNraWxsKGFjdHVhbElucHV0KTtcbiAgICAgICAgbG9nUmV2ZXJzZUNvbnZlcnNpb25TdGVwcyhhY3R1YWxJbnB1dCwgb3BlcmF0aW9uc0xvZywgb3B0aW9ucy52ZXJib3NlKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgb3V0cHV0IGZpbGVcbiAgICAgICAgY29uc3Qgb3V0cHV0RGlyID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMub3V0cHV0IHx8IGdldERlZmF1bHRTa2lsbHNEaXJlY3RvcnkoKSk7XG4gICAgICAgIGNvbnN0IG91dHB1dEZpbGUgPSByZXNvbHZlUGF0aFdpdGhpbkJhc2Uob3V0cHV0RGlyLCBgJHtza2lsbE5hbWV9Lm1kYCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1xcbltEUlkgUlVOXSBXb3VsZCBjcmVhdGU6JykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBPdXRwdXQgZmlsZTogJHtvdXRwdXRGaWxlfWApKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgU2l6ZTogJHtkb2xsaG91c2VTa2lsbC5sZW5ndGh9IGJ5dGVzYCkpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgb3V0cHV0XG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFxcbldyaXRpbmcgRG9sbGhvdXNlTUNQIHNraWxsIHRvOiAke291dHB1dEZpbGV9YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dERpcikpIHtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgY29udmVydGVyLndyaXRlVG9GaWxlKGRvbGxob3VzZVNraWxsLCBvdXRwdXRGaWxlKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSByZXBvcnRcbiAgICAgICAgaWYgKG9wdGlvbnMucmVwb3J0KSB7XG4gICAgICAgICAgICBjb25zdCByZXBvcnQgPSBnZW5lcmF0ZVJlcG9ydCh7XG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnZnJvbS1hbnRocm9waWMnLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0RmlsZSxcbiAgICAgICAgICAgICAgICBmaWxlc0NyZWF0ZWQ6IFtvdXRwdXRGaWxlXSxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25zUGVyZm9ybWVkOiBvcGVyYXRpb25zTG9nLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXBvcnRQYXRoID0gcmVzb2x2ZVBhdGhXaXRoaW5CYXNlKG91dHB1dERpciwgYCR7c2tpbGxOYW1lfS1jb252ZXJzaW9uLXJlcG9ydC5tZGApO1xuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXBvcnRQYXRoLCByZXBvcnQpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgXFxuQ29udmVyc2lvbiByZXBvcnQ6ICR7cmVwb3J0UGF0aH1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWNjZXNzXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCdcXG7inJMgQ29udmVyc2lvbiBjb21wbGV0ZScpKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBDcmVhdGVkOiAke291dHB1dEZpbGV9YCkpO1xuXG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXFxu4pyXIENvbnZlcnNpb24gZmFpbGVkOicpLCBlcnJvcik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBTT05BUkNMT1VEIEZJWCAodHlwZXNjcmlwdDpTMzc3Nik6IFVzZSBleHRyYWN0ZWQgY2xlYW51cCBmdW5jdGlvbiB0byByZWR1Y2UgY29tcGxleGl0eVxuICAgICAgICAvLyBGSVg6IEVuc3VyZSBjbGVhbnVwIGhhcHBlbnMgb24gYm90aCBzdWNjZXNzIGFuZCBmYWlsdXJlXG4gICAgICAgIC8vIFByZXZpb3VzbHk6IENsZWFudXAgb25seSBvbiBzdWNjZXNzIHBhdGhcbiAgICAgICAgLy8gTm93OiBDbGVhbnVwIGluIGZpbmFsbHkgYmxvY2sgdG8gaGFuZGxlIGFsbCBlcnJvciBzY2VuYXJpb3NcbiAgICAgICAgY2xlYW51cFRlbXBEaXJlY3RvcnkodGVtcERpciwgb3B0aW9ucy52ZXJib3NlKTtcbiAgICB9XG59XG5cbi8qKlxuICogTG9nIGNvbnZlcnNpb24gb3BlcmF0aW9uIGZvciBzZWN1cml0eSBhdWRpdFxuICovXG5mdW5jdGlvbiBsb2dPcGVyYXRpb24oZGlyZWN0aW9uOiBzdHJpbmcsIGlucHV0OiBzdHJpbmcsIG9wdGlvbnM6IENvbnZlcnRPcHRpb25zKTogdm9pZCB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ2NvbnZlcnQgQ0xJJyxcbiAgICAgICAgZGV0YWlsczogYENvbnZlcnNpb24gJHtkaXJlY3Rpb259OiAke2lucHV0fSAoZHJ5LXJ1bjogJHtvcHRpb25zLmRyeVJ1bn0pYFxuICAgIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBsb2cgZGlyZWN0b3J5IG9wZXJhdGlvbnMgd2l0aCBvcHRpb25hbCBmaWxlIGxpc3RpbmdcbiAqL1xuZnVuY3Rpb24gbG9nRGlyZWN0b3J5T3BlcmF0aW9uKFxuICAgIHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUsXG4gICAgb3B0aW9uczoge1xuICAgICAgICBkaXJLZXk6IGtleW9mIEFudGhyb3BpY1NraWxsU3RydWN0dXJlO1xuICAgICAgICBkaXJOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICBpdGVtVHlwZTogc3RyaW5nO1xuICAgICAgICBvcGVyYXRpb25zTG9nOiBzdHJpbmdbXTtcbiAgICAgICAgdmVyYm9zZTogYm9vbGVhbjtcbiAgICAgICAgbGlzdEZpbGVzPzogYm9vbGVhbjtcbiAgICB9XG4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGRpcktleSwgZGlyTmFtZSwgYWN0aW9uLCBpdGVtVHlwZSwgb3BlcmF0aW9uc0xvZywgdmVyYm9zZSwgbGlzdEZpbGVzID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICBpZiAoc3RydWN0dXJlW2RpcktleV0pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzdHJ1Y3R1cmVbZGlyS2V5XSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGl0ZW1zKS5sZW5ndGg7XG4gICAgICAgIG9wZXJhdGlvbnNMb2cucHVzaChgJHthY3Rpb259ICR7Y291bnR9ICR7aXRlbVR5cGV9KHMpIHRvICR7ZGlyTmFtZX0vYCk7XG5cbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAg4pyTICR7YWN0aW9ufSAke2NvdW50fSAke2l0ZW1UeXBlfShzKWApKTtcbiAgICAgICAgICAgIGlmIChsaXN0RmlsZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIE9iamVjdC5rZXlzKGl0ZW1zKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgICAgLSAke2Rpck5hbWV9LyR7ZmlsZW5hbWV9YCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBMb2cgY29udmVyc2lvbiBzdGVwcyBkdXJpbmcgdG8tYW50aHJvcGljIGNvbnZlcnNpb25cbiAqL1xuZnVuY3Rpb24gbG9nQ29udmVyc2lvblN0ZXBzKFxuICAgIHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUsXG4gICAgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10sXG4gICAgdmVyYm9zZTogYm9vbGVhblxuKTogdm9pZCB7XG4gICAgLy8gTG9nIFNLSUxMLm1kXG4gICAgb3BlcmF0aW9uc0xvZy5wdXNoKCdDcmVhdGVkIFNLSUxMLm1kIHdpdGggc2ltcGxpZmllZCBtZXRhZGF0YScpO1xuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAg4pyTIENyZWF0ZWQgU0tJTEwubWQnKSk7XG4gICAgfVxuXG4gICAgLy8gTG9nIGRpcmVjdG9yeSBvcGVyYXRpb25zXG4gICAgbG9nRGlyZWN0b3J5T3BlcmF0aW9uKHN0cnVjdHVyZSwge1xuICAgICAgICBkaXJLZXk6ICdzY3JpcHRzLycsXG4gICAgICAgIGRpck5hbWU6ICdzY3JpcHRzJyxcbiAgICAgICAgYWN0aW9uOiAnRXh0cmFjdGVkJyxcbiAgICAgICAgaXRlbVR5cGU6ICdzY3JpcHQnLFxuICAgICAgICBvcGVyYXRpb25zTG9nLFxuICAgICAgICB2ZXJib3NlLFxuICAgICAgICBsaXN0RmlsZXM6IHRydWVcbiAgICB9KTtcbiAgICBsb2dEaXJlY3RvcnlPcGVyYXRpb24oc3RydWN0dXJlLCB7XG4gICAgICAgIGRpcktleTogJ3JlZmVyZW5jZS8nLFxuICAgICAgICBkaXJOYW1lOiAncmVmZXJlbmNlJyxcbiAgICAgICAgYWN0aW9uOiAnRXh0cmFjdGVkJyxcbiAgICAgICAgaXRlbVR5cGU6ICdyZWZlcmVuY2UgZG9jdW1lbnQnLFxuICAgICAgICBvcGVyYXRpb25zTG9nLFxuICAgICAgICB2ZXJib3NlLFxuICAgICAgICBsaXN0RmlsZXM6IHRydWVcbiAgICB9KTtcbiAgICBsb2dEaXJlY3RvcnlPcGVyYXRpb24oc3RydWN0dXJlLCB7XG4gICAgICAgIGRpcktleTogJ2V4YW1wbGVzLycsXG4gICAgICAgIGRpck5hbWU6ICdleGFtcGxlcycsXG4gICAgICAgIGFjdGlvbjogJ0V4dHJhY3RlZCcsXG4gICAgICAgIGl0ZW1UeXBlOiAnZXhhbXBsZScsXG4gICAgICAgIG9wZXJhdGlvbnNMb2csXG4gICAgICAgIHZlcmJvc2VcbiAgICB9KTtcbiAgICBsb2dEaXJlY3RvcnlPcGVyYXRpb24oc3RydWN0dXJlLCB7XG4gICAgICAgIGRpcktleTogJ3RoZW1lcy8nLFxuICAgICAgICBkaXJOYW1lOiAndGhlbWVzJyxcbiAgICAgICAgYWN0aW9uOiAnRXh0cmFjdGVkJyxcbiAgICAgICAgaXRlbVR5cGU6ICd0ZW1wbGF0ZScsXG4gICAgICAgIG9wZXJhdGlvbnNMb2csXG4gICAgICAgIHZlcmJvc2VcbiAgICB9KTtcblxuICAgIC8vIExvZyBtZXRhZGF0YSBwcmVzZXJ2YXRpb25cbiAgICBpZiAoc3RydWN0dXJlWydtZXRhZGF0YS8nXSkge1xuICAgICAgICBvcGVyYXRpb25zTG9nLnB1c2goJ1ByZXNlcnZlZCBmdWxsIERvbGxob3VzZU1DUCBtZXRhZGF0YSB0byBtZXRhZGF0YS9kb2xsaG91c2UueWFtbCcpO1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICDinJMgUHJlc2VydmVkIG1ldGFkYXRhIGZvciBwZXJmZWN0IHJvdW5kdHJpcCcpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gbG9nIGRpcmVjdG9yeSBvcGVyYXRpb25zIGZvciByZXZlcnNlIGNvbnZlcnNpb24gKGZyb20tYW50aHJvcGljKVxuICovXG5mdW5jdGlvbiBsb2dSZXZlcnNlRGlyZWN0b3J5T3BlcmF0aW9uKFxuICAgIGlucHV0RGlyOiBzdHJpbmcsXG4gICAgZGlyTmFtZTogc3RyaW5nLFxuICAgIGl0ZW1UeXBlOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10sXG4gICAgdmVyYm9zZTogYm9vbGVhblxuKTogdm9pZCB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihpbnB1dERpciwgZGlyTmFtZSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKS5sZW5ndGg7XG4gICAgICAgIG9wZXJhdGlvbnNMb2cucHVzaChgQ29tYmluZWQgJHtjb3VudH0gJHtpdGVtVHlwZX0ocykke2l0ZW1UeXBlID09PSAnc2NyaXB0JyA/ICcgYXMgY29kZSBibG9ja3MnIDogJyd9YCk7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIOKckyBDb21iaW5lZCAke2NvdW50fSAke2l0ZW1UeXBlfShzKWApKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBMb2cgY29udmVyc2lvbiBzdGVwcyBkdXJpbmcgZnJvbS1hbnRocm9waWMgY29udmVyc2lvblxuICovXG5mdW5jdGlvbiBsb2dSZXZlcnNlQ29udmVyc2lvblN0ZXBzKFxuICAgIGlucHV0RGlyOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10sXG4gICAgdmVyYm9zZTogYm9vbGVhblxuKTogdm9pZCB7XG4gICAgb3BlcmF0aW9uc0xvZy5wdXNoKCdSZWFkIFNLSUxMLm1kIG1ldGFkYXRhJywgJ0VucmljaGVkIG1ldGFkYXRhIHdpdGggRG9sbGhvdXNlTUNQIGZpZWxkcycpO1xuXG4gICAgLy8gTG9nIGRpcmVjdG9yeSBvcGVyYXRpb25zIHVzaW5nIGhlbHBlclxuICAgIGxvZ1JldmVyc2VEaXJlY3RvcnlPcGVyYXRpb24oaW5wdXREaXIsICdzY3JpcHRzJywgJ3NjcmlwdCcsIG9wZXJhdGlvbnNMb2csIHZlcmJvc2UpO1xuICAgIGxvZ1JldmVyc2VEaXJlY3RvcnlPcGVyYXRpb24oaW5wdXREaXIsICdyZWZlcmVuY2UnLCAncmVmZXJlbmNlIGRvY3VtZW50Jywgb3BlcmF0aW9uc0xvZywgdmVyYm9zZSk7XG4gICAgbG9nUmV2ZXJzZURpcmVjdG9yeU9wZXJhdGlvbihpbnB1dERpciwgJ2V4YW1wbGVzJywgJ2V4YW1wbGUnLCBvcGVyYXRpb25zTG9nLCB2ZXJib3NlKTtcbiAgICBsb2dSZXZlcnNlRGlyZWN0b3J5T3BlcmF0aW9uKGlucHV0RGlyLCAndGhlbWVzJywgJ3RlbXBsYXRlJywgb3BlcmF0aW9uc0xvZywgdmVyYm9zZSk7XG5cbiAgICAvLyBIYW5kbGUgbWV0YWRhdGEgcmVzdG9yYXRpb25cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oaW5wdXREaXIsICdtZXRhZGF0YScpKSkge1xuICAgICAgICBvcGVyYXRpb25zTG9nLnB1c2goJ1Jlc3RvcmVkIG9yaWdpbmFsIERvbGxob3VzZU1DUCBtZXRhZGF0YSBmcm9tIG1ldGFkYXRhL2RvbGxob3VzZS55YW1sJyk7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIOKckyBSZXN0b3JlZCBvcmlnaW5hbCBtZXRhZGF0YSAocGVyZmVjdCByb3VuZHRyaXApJykpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIExpc3QgQW50aHJvcGljIHNraWxsIGRpcmVjdG9yeSBzdHJ1Y3R1cmVcbiAqL1xuZnVuY3Rpb24gbGlzdEFudGhyb3BpY1N0cnVjdHVyZShpbnB1dERpcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc3ViZGlycyA9IFsnc2NyaXB0cycsICdyZWZlcmVuY2UnLCAnZXhhbXBsZXMnLCAndGhlbWVzJywgJ21ldGFkYXRhJ107XG4gICAgZm9yIChjb25zdCBzdWJkaXIgb2Ygc3ViZGlycykge1xuICAgICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKGlucHV0RGlyLCBzdWJkaXIpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgJHtzdWJkaXJ9LzogJHtmaWxlcy5sZW5ndGh9IGZpbGUocylgKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQ291bnQgdG90YWwgZmlsZXMgaW4gQW50aHJvcGljIHN0cnVjdHVyZVxuICovXG5mdW5jdGlvbiBjb3VudEZpbGVzKHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUpOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDE7IC8vIFNLSUxMLm1kXG5cbiAgICBpZiAoc3RydWN0dXJlWydzY3JpcHRzLyddKSBjb3VudCArPSBPYmplY3Qua2V5cyhzdHJ1Y3R1cmVbJ3NjcmlwdHMvJ10pLmxlbmd0aDtcbiAgICBpZiAoc3RydWN0dXJlWydyZWZlcmVuY2UvJ10pIGNvdW50ICs9IE9iamVjdC5rZXlzKHN0cnVjdHVyZVsncmVmZXJlbmNlLyddKS5sZW5ndGg7XG4gICAgaWYgKHN0cnVjdHVyZVsnZXhhbXBsZXMvJ10pIGNvdW50ICs9IE9iamVjdC5rZXlzKHN0cnVjdHVyZVsnZXhhbXBsZXMvJ10pLmxlbmd0aDtcbiAgICBpZiAoc3RydWN0dXJlWyd0aGVtZXMvJ10pIGNvdW50ICs9IE9iamVjdC5rZXlzKHN0cnVjdHVyZVsndGhlbWVzLyddKS5sZW5ndGg7XG4gICAgaWYgKHN0cnVjdHVyZVsnTElDRU5TRS50eHQnXSkgY291bnQgKz0gMTtcblxuICAgIHJldHVybiBjb3VudDtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIHRocm91Z2ggYWxsIGZpbGVzIGluIGFuIEFudGhyb3BpYyBzdHJ1Y3R1cmVcbiAqIEV4ZWN1dGVzIGEgY2FsbGJhY2sgZm9yIGVhY2ggZmlsZSBmb3VuZFxuICovXG5mdW5jdGlvbiBpdGVyYXRlU3RydWN0dXJlRmlsZXMoXG4gICAgc3RydWN0dXJlOiBBbnRocm9waWNTa2lsbFN0cnVjdHVyZSxcbiAgICBjYWxsYmFjazogKGRpck5hbWU6IHN0cmluZyB8IG51bGwsIGZpbGVuYW1lOiBzdHJpbmcpID0+IHZvaWRcbik6IHZvaWQge1xuICAgIC8vIEFsd2F5cyBpbmNsdWRlIFNLSUxMLm1kXG4gICAgY2FsbGJhY2sobnVsbCwgJ1NLSUxMLm1kJyk7XG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggZGlyZWN0b3JpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IFsnc2NyaXB0cy8nLCAncmVmZXJlbmNlLycsICdleGFtcGxlcy8nLCAndGhlbWVzLycsICdtZXRhZGF0YS8nXSBhcyBjb25zdDtcbiAgICBmb3IgKGNvbnN0IGRpciBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgICBjb25zdCBkaXJDb250ZW50ID0gc3RydWN0dXJlW2Rpcl07XG4gICAgICAgIGlmIChkaXJDb250ZW50KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIE9iamVjdC5rZXlzKGRpckNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZGlyLnNsaWNlKDAsIC0xKSwgZmlsZW5hbWUpOyAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBMSUNFTlNFLnR4dFxuICAgIGlmIChzdHJ1Y3R1cmVbJ0xJQ0VOU0UudHh0J10pIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgJ0xJQ0VOU0UudHh0Jyk7XG4gICAgfVxufVxuXG4vKipcbiAqIExpc3QgZmlsZXMgdGhhdCB3b3VsZCBiZSBjcmVhdGVkIChkcnktcnVuIG1vZGUpXG4gKi9cbmZ1bmN0aW9uIGxpc3RGaWxlc1RvQ3JlYXRlKHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIEZpbGVzOicpKTtcbiAgICBpdGVyYXRlU3RydWN0dXJlRmlsZXMoc3RydWN0dXJlLCAoZGlyTmFtZSwgZmlsZW5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBkaXJOYW1lID8gYCR7ZGlyTmFtZX0vJHtmaWxlbmFtZX1gIDogZmlsZW5hbWU7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgICAtICR7ZmlsZVBhdGh9YCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEdldCBsaXN0IG9mIGNyZWF0ZWQgZmlsZXNcbiAqL1xuZnVuY3Rpb24gZ2V0Q3JlYXRlZEZpbGVzKHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUsIG91dHB1dERpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGl0ZXJhdGVTdHJ1Y3R1cmVGaWxlcyhzdHJ1Y3R1cmUsIChkaXJOYW1lLCBmaWxlbmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGRpck5hbWVcbiAgICAgICAgICAgID8gcmVzb2x2ZVBhdGhXaXRoaW5CYXNlKG91dHB1dERpciwgZGlyTmFtZSwgZmlsZW5hbWUpXG4gICAgICAgICAgICA6IHJlc29sdmVQYXRoV2l0aGluQmFzZShvdXRwdXREaXIsIGZpbGVuYW1lKTtcbiAgICAgICAgZmlsZXMucHVzaChmaWxlUGF0aCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbGVzO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGNvbnZlcnNpb24gcmVwb3J0XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUmVwb3J0KGRhdGE6IENvbnZlcnNpb25SZXBvcnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJyMgU2tpbGwgQ29udmVyc2lvbiBSZXBvcnQnLFxuICAgICAgICAnJyxcbiAgICAgICAgYCoqVGltZXN0YW1wKio6ICR7ZGF0YS50aW1lc3RhbXB9YCxcbiAgICAgICAgYCoqRGlyZWN0aW9uKio6ICR7ZGF0YS5kaXJlY3Rpb259YCxcbiAgICAgICAgYCoqU3RhdHVzKio6ICR7ZGF0YS5zdWNjZXNzID8gJ+KckyBTdWNjZXNzJyA6ICfinJcgRmFpbGVkJ31gLFxuICAgICAgICAnJyxcbiAgICAgICAgJyMjIElucHV0L091dHB1dCcsXG4gICAgICAgICcnLFxuICAgICAgICBgKipJbnB1dCoqOiBcXGAke2RhdGEuaW5wdXR9XFxgYCxcbiAgICAgICAgYCoqT3V0cHV0Kio6IFxcYCR7ZGF0YS5vdXRwdXR9XFxgYCxcbiAgICAgICAgJydcbiAgICBdO1xuXG4gICAgaWYgKGRhdGEuZmlsZXNDcmVhdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGluZXMucHVzaCgnIyMgRmlsZXMgQ3JlYXRlZCcsICcnLCAuLi5kYXRhLmZpbGVzQ3JlYXRlZC5tYXAoZmlsZSA9PiBgLSBcXGAke2ZpbGV9XFxgYCksICcnKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKCcjIyBPcGVyYXRpb25zIFBlcmZvcm1lZCcsICcnLCAuLi5kYXRhLm9wZXJhdGlvbnNQZXJmb3JtZWQubWFwKG9wZXJhdGlvbiA9PiBgLSAke29wZXJhdGlvbn1gKSwgJycpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgbGluZXMucHVzaCgnIyMgRXJyb3InLCAnJywgJ2BgYCcsIGRhdGEuZXJyb3IsICdgYGAnLCAnJyk7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaCgnLS0tJywgJycsICcqR2VuZXJhdGVkIGJ5IERvbGxob3VzZU1DUCBDb252ZXJ0ZXIqJyk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcbnByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcbiJdfQ==
@@ -15,10 +15,10 @@
15
15
  * - Input skills should already be validated (they're from DollhouseMCP system)
16
16
  */
17
17
  import * as fs from 'node:fs';
18
- import * as path from 'node:path';
19
18
  import * as yaml from 'js-yaml';
20
19
  import { SchemaMapper } from './SchemaMapper.js';
21
20
  import { ContentExtractor } from './ContentExtractor.js';
21
+ import { resolvePathWithinBase } from '../utils/pathSecurity.js';
22
22
  export class DollhouseToAnthropicConverter {
23
23
  schemaMapper;
24
24
  contentExtractor;
@@ -114,7 +114,7 @@ export class DollhouseToAnthropicConverter {
114
114
  // Create output directory
115
115
  this.ensureDirectoryExists(outputDir);
116
116
  // Write SKILL.md
117
- fs.writeFileSync(path.join(outputDir, 'SKILL.md'), structure['SKILL.md']);
117
+ fs.writeFileSync(resolvePathWithinBase(outputDir, 'SKILL.md'), structure['SKILL.md']);
118
118
  // Write all component directories
119
119
  this.writeScriptsDirectory(structure, outputDir);
120
120
  this.writeFilesDirectory(structure['reference/'], outputDir, 'reference');
@@ -123,7 +123,7 @@ export class DollhouseToAnthropicConverter {
123
123
  this.writeFilesDirectory(structure['metadata/'], outputDir, 'metadata');
124
124
  // Write license file
125
125
  if (structure['LICENSE.txt']) {
126
- fs.writeFileSync(path.join(outputDir, 'LICENSE.txt'), structure['LICENSE.txt']);
126
+ fs.writeFileSync(resolvePathWithinBase(outputDir, 'LICENSE.txt'), structure['LICENSE.txt']);
127
127
  }
128
128
  }
129
129
  /**
@@ -142,10 +142,10 @@ export class DollhouseToAnthropicConverter {
142
142
  writeScriptsDirectory(structure, outputDir) {
143
143
  if (!structure['scripts/'])
144
144
  return;
145
- const scriptsDir = path.join(outputDir, 'scripts');
145
+ const scriptsDir = resolvePathWithinBase(outputDir, 'scripts');
146
146
  fs.mkdirSync(scriptsDir, { recursive: true });
147
147
  for (const [filename, content] of Object.entries(structure['scripts/'])) {
148
- fs.writeFileSync(path.join(scriptsDir, filename), content);
148
+ fs.writeFileSync(resolvePathWithinBase(scriptsDir, filename), content);
149
149
  // SECURITY (SonarCloud S2612): Do NOT auto-chmod scripts executable
150
150
  // - Scripts from DollhouseMCP are markdown code blocks, not executable files
151
151
  // - Format transformer shouldn't make security decisions (chmod = security decision)
@@ -160,10 +160,10 @@ export class DollhouseToAnthropicConverter {
160
160
  writeFilesDirectory(files, outputDir, dirName) {
161
161
  if (!files)
162
162
  return;
163
- const targetDir = path.join(outputDir, dirName);
163
+ const targetDir = resolvePathWithinBase(outputDir, dirName);
164
164
  fs.mkdirSync(targetDir, { recursive: true });
165
165
  for (const [filename, content] of Object.entries(files)) {
166
- fs.writeFileSync(path.join(targetDir, filename), content);
166
+ fs.writeFileSync(resolvePathWithinBase(targetDir, filename), content);
167
167
  }
168
168
  }
169
169
  /**
@@ -305,4 +305,4 @@ export class DollhouseToAnthropicConverter {
305
305
  return `${license}${authorSuffix}`;
306
306
  }
307
307
  }
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9sbGhvdXNlVG9BbnRocm9waWNDb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udmVydGVycy9Eb2xsaG91c2VUb0FudGhyb3BpY0NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUUsWUFBWSxFQUErRCxNQUFNLG1CQUFtQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQVloRixNQUFNLE9BQU8sNkJBQTZCO0lBQ3JCLFlBQVksQ0FBZTtJQUMzQixnQkFBZ0IsQ0FBbUI7SUFFcEQ7UUFDSSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFvQixFQUFFLE9BR3hDO1FBQ0csbUNBQW1DO1FBQ25DLDRGQUE0RjtRQUM1RixvRkFBb0Y7UUFDcEYsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFNUUsMkVBQTJFO1FBQzNFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckUsbUNBQW1DO1FBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFcEUs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QUM7YUFDL0IsVUFBVSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUIsQ0FBQyxPQUFlLEVBQUUsTUFBZTtRQUN0RCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEdBQUcsT0FBTyxHQUFHLFlBQVksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRG9sbGhvdXNlVG9BbnRocm9waWNDb252ZXJ0ZXIgLSBDb252ZXJ0cyBzaW5nbGUtZmlsZSBEb2xsaG91c2VNQ1Agc2tpbGxzIHRvIG11bHRpLWZpbGUgQW50aHJvcGljIFNraWxsc1xuICpcbiAqIEJhc2VkIG9uIHRoZSBleGFjdCBhbGdvcml0aG0gZG9jdW1lbnRlZCBpbjpcbiAqIGJ1c2luZXNzL2RvY3VtZW50cy9sZWdhbC9ldmlkZW5jZS9hbnRocm9waWMtc2tpbGxzLWRlY29tcG9zaXRpb24tYW5hbHlzaXMubWQgKGxpbmVzIDEwOC0xNjMpXG4gKlxuICogSW1wbGVtZW50cyB0aGUgbWVjaGFuaWNhbCB0cmFuc2Zvcm1hdGlvbjpcbiAqIERvbGxob3VzZU1DUCBTa2lsbCAoc2luZ2xlIC5tZCBmaWxlKSDihpIgQW50aHJvcGljIFNraWxsIChkaXJlY3Rvcnkgd2l0aCBzZXBhcmF0ZWQgY29tcG9uZW50cylcbiAqXG4gKiBTRUNVUklUWSBNT0RFTDpcbiAqIC0gVGhpcyBpcyBhIEZPUk1BVCBUUkFOU0ZPUk1FUiwgbm90IGEgc2VjdXJpdHkgYm91bmRhcnlcbiAqIC0gUHJlc2VydmVzIGNvbnRlbnQgZmlkZWxpdHkgLSBubyBtb2RpZmljYXRpb24sIHNhbml0aXphdGlvbiwgb3IgdmFsaWRhdGlvblxuICogLSBZQU1MIHBhcnNpbmcgdXNlcyBDT1JFX1NDSEVNQSB0byBwcmV2ZW50IGRlc2VyaWFsaXphdGlvbiBhdHRhY2tzIG9ubHlcbiAqIC0gU2VjdXJpdHkgdmFsaWRhdGlvbiBoYXBwZW5zIGF0IFNraWxsTWFuYWdlci5sb2FkKCkgdGltZSwgbm90IGNvbnZlcnNpb24gdGltZVxuICogLSBJbnB1dCBza2lsbHMgc2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkICh0aGV5J3JlIGZyb20gRG9sbGhvdXNlTUNQIHN5c3RlbSlcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBTY2hlbWFNYXBwZXIsIHR5cGUgRG9sbGhvdXNlTUNQU2tpbGxNZXRhZGF0YSwgdHlwZSBBbnRocm9waWNTa2lsbE1ldGFkYXRhIH0gZnJvbSAnLi9TY2hlbWFNYXBwZXIuanMnO1xuaW1wb3J0IHsgQ29udGVudEV4dHJhY3RvciwgdHlwZSBFeHRyYWN0ZWRTZWN0aW9uIH0gZnJvbSAnLi9Db250ZW50RXh0cmFjdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBBbnRocm9waWNTa2lsbFN0cnVjdHVyZSB7XG4gICAgJ1NLSUxMLm1kJzogc3RyaW5nO1xuICAgICdzY3JpcHRzLyc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICdyZWZlcmVuY2UvJz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgJ3RoZW1lcy8nPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAnZXhhbXBsZXMvJz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgJ21ldGFkYXRhLyc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICdMSUNFTlNFLnR4dCc/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBEb2xsaG91c2VUb0FudGhyb3BpY0NvbnZlcnRlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzY2hlbWFNYXBwZXI6IFNjaGVtYU1hcHBlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRlbnRFeHRyYWN0b3I6IENvbnRlbnRFeHRyYWN0b3I7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zY2hlbWFNYXBwZXIgPSBuZXcgU2NoZW1hTWFwcGVyKCk7XG4gICAgICAgIHRoaXMuY29udGVudEV4dHJhY3RvciA9IG5ldyBDb250ZW50RXh0cmFjdG9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIERvbGxob3VzZU1DUCBza2lsbCAoLm1kIGZpbGUpIHRvIEFudGhyb3BpYyBTa2lsbCBmb3JtYXQgKGRpcmVjdG9yeSBzdHJ1Y3R1cmUpXG4gICAgICpcbiAgICAgKiBFWEFDVCBBTEdPUklUSE0gZnJvbSBldmlkZW5jZS9hbnRocm9waWMtc2tpbGxzLWRlY29tcG9zaXRpb24tYW5hbHlzaXMubWQ6XG4gICAgICogMS4gRXh0cmFjdCBZQU1MIGZyb250bWF0dGVyXG4gICAgICogMi4gU2ltcGxpZnkgWUFNTCAoa2VlcCBvbmx5IG5hbWUgKyBkZXNjcmlwdGlvbilcbiAgICAgKiAzLiBFeHRyYWN0IG1haW4gaW5zdHJ1Y3Rpb25zXG4gICAgICogNC4gRXh0cmFjdCBlbWJlZGRlZCBjb2RlIGJsb2NrcyDihpIgc2NyaXB0cy9cbiAgICAgKiA1LiBFeHRyYWN0IHJlZmVyZW5jZSBzZWN0aW9ucyDihpIgcmVmZXJlbmNlL1xuICAgICAqIDYuIEV4dHJhY3QgdGVtcGxhdGVzIOKGkiB0aGVtZXMvIG9yIGV4YW1wbGVzL1xuICAgICAqIDcuIENyZWF0ZSBTS0lMTC5tZCB3aXRoIHJlZmVyZW5jZXNcbiAgICAgKiA4LiBSZXR1cm4gZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgICAqL1xuICAgIGFzeW5jIGNvbnZlcnRTa2lsbChza2lsbENvbnRlbnQ6IHN0cmluZywgb3B0aW9ucz86IHtcbiAgICAgICAgaW5jbHVkZWxpY2Vuc2U/OiBib29sZWFuO1xuICAgICAgICBwcmVzZXJ2ZUNvbW1lbnRzPzogYm9vbGVhbjtcbiAgICB9KTogUHJvbWlzZTxBbnRocm9waWNTa2lsbFN0cnVjdHVyZT4ge1xuICAgICAgICAvLyBTdGVwIDE6IEV4dHJhY3QgWUFNTCBmcm9udG1hdHRlclxuICAgICAgICAvLyBOT1RFOiBObyBVbmljb2RlIG5vcm1hbGl6YXRpb24gLSBwcmVzZXJ2ZXMgY29udGVudCBmaWRlbGl0eSBmb3IgbWVjaGFuaWNhbCB0cmFuc2Zvcm1hdGlvblxuICAgICAgICAvLyBTZWN1cml0eSB2YWxpZGF0aW9uIGhhcHBlbnMgd2hlbiBsb2FkaW5nIGNvbnZlcnRlZCBza2lsbHMgdmlhIFNraWxsTWFuYWdlci5sb2FkKClcbiAgICAgICAgY29uc3QgeyBtZXRhZGF0YSwgYm9keUNvbnRlbnQgfSA9IHRoaXMuZXh0cmFjdFlBTUxGcm9udG1hdHRlcihza2lsbENvbnRlbnQpO1xuXG4gICAgICAgIC8vIFN0ZXAgMjogU2ltcGxpZnkgWUFNTCAoa2VlcCBvbmx5IG5hbWUgKyBkZXNjcmlwdGlvbiwgb3B0aW9uYWxseSBsaWNlbnNlKVxuICAgICAgICBjb25zdCBtaW5pbWFsWUFNTCA9IHRoaXMuc2NoZW1hTWFwcGVyLmRvbGxob3VzZVRvQW50aHJvcGljKG1ldGFkYXRhKTtcblxuICAgICAgICAvLyBTdGVwIDMtNjogRXh0cmFjdCBhbGwgY29tcG9uZW50c1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IHRoaXMuY29udGVudEV4dHJhY3Rvci5leHRyYWN0U2VjdGlvbnMoYm9keUNvbnRlbnQpO1xuXG4gICAgICAgIC8vIE9yZ2FuaXplIGV4dHJhY3RlZCBzZWN0aW9ucyBieSB0eXBlXG4gICAgICAgIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IHRoZW1lczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBjb25zdCBleGFtcGxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgIGxldCBtYWluSW5zdHJ1Y3Rpb25zID0gJyc7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25SZWZlcmVuY2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIC8vIFN0ZXAgNDogRXh0cmFjdCBjb2RlIGJsb2NrcyDihpIgc2NyaXB0cy9cbiAgICAgICAgY29uc3QgY29kZUJsb2NrcyA9IHNlY3Rpb25zLmZpbHRlcihzID0+IHMudHlwZSA9PT0gJ2NvZGUnKTtcbiAgICAgICAgZm9yIChjb25zdCBibG9jayBvZiBjb2RlQmxvY2tzKSB7XG4gICAgICAgICAgICBpZiAoYmxvY2suZmlsZW5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGJsb2NrLmZpbGVuYW1lO1xuICAgICAgICAgICAgICAgIHNjcmlwdHNbZmlsZW5hbWVdID0gdGhpcy5mb3JtYXRTY3JpcHRGaWxlKGJsb2NrLmNvbnRlbnQsIGJsb2NrLmxhbmd1YWdlIHx8ICcnKTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uUmVmZXJlbmNlcy5wdXNoKGBTZWUgXFxgc2NyaXB0cy8ke2ZpbGVuYW1lfVxcYCBmb3IgJHtibG9jay50aXRsZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNTogRXh0cmFjdCBkb2N1bWVudGF0aW9uIHNlY3Rpb25zIOKGkiByZWZlcmVuY2UvXG4gICAgICAgIGNvbnN0IGRvY1NlY3Rpb25zID0gdGhpcy5leHRyYWN0RG9jdW1lbnRhdGlvblNlY3Rpb25zKGJvZHlDb250ZW50KTtcbiAgICAgICAgZm9yIChjb25zdCBbdGl0bGUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGRvY1NlY3Rpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLnNsdWdpZnkodGl0bGUpICsgJy5tZCc7XG4gICAgICAgICAgICByZWZlcmVuY2VbZmlsZW5hbWVdID0gY29udGVudDtcbiAgICAgICAgICAgIHNlY3Rpb25SZWZlcmVuY2VzLnB1c2goYFNlZSBcXGByZWZlcmVuY2UvJHtmaWxlbmFtZX1cXGAgZm9yICR7dGl0bGV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDY6IEV4dHJhY3QgZXhhbXBsZXNcbiAgICAgICAgY29uc3QgZXhhbXBsZVNlY3Rpb24gPSB0aGlzLmNvbnRlbnRFeHRyYWN0b3IuZXh0cmFjdERvY3VtZW50YXRpb25TZWN0aW9uKGJvZHlDb250ZW50LCAnZXhhbXBsZScpO1xuICAgICAgICBpZiAoZXhhbXBsZVNlY3Rpb24pIHtcbiAgICAgICAgICAgIGV4YW1wbGVzWydpbnN0YWxsYXRpb24tZXhhbXBsZS5tZCddID0gZXhhbXBsZVNlY3Rpb247XG4gICAgICAgICAgICBzZWN0aW9uUmVmZXJlbmNlcy5wdXNoKGBTZWUgXFxgZXhhbXBsZXMvaW5zdGFsbGF0aW9uLWV4YW1wbGUubWRcXGAgZm9yIGNvbXBsZXRlIHdhbGt0aHJvdWdoYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDM6IEV4dHJhY3QgbWFpbiBpbnN0cnVjdGlvbnMgKHByZXNlcnZlIHN0cnVjdHVyYWwgY29udGVudCwgcmVtb3ZlIGV4dHJhY3RlZCBzZWN0aW9ucylcbiAgICAgICAgbWFpbkluc3RydWN0aW9ucyA9IHRoaXMuZXh0cmFjdE1haW5JbnN0cnVjdGlvbnMoYm9keUNvbnRlbnQsIHNlY3Rpb25zKTtcblxuICAgICAgICAvLyBTdGVwIDc6IENyZWF0ZSBTS0lMTC5tZCB3aXRoIHJlZmVyZW5jZXMgdG8gc2VwYXJhdGVkIGZpbGVzXG4gICAgICAgIGNvbnN0IHNraWxsTUQgPSB0aGlzLmNyZWF0ZVNraWxsTUQobWluaW1hbFlBTUwsIG1haW5JbnN0cnVjdGlvbnMsIHNlY3Rpb25SZWZlcmVuY2VzKTtcblxuICAgICAgICAvLyBTdGVwIDg6IFJldHVybiBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUgPSB7XG4gICAgICAgICAgICAnU0tJTEwubWQnOiBza2lsbE1EXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNjcmlwdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdFsnc2NyaXB0cy8nXSA9IHNjcmlwdHM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVmZXJlbmNlKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHRbJ3JlZmVyZW5jZS8nXSA9IHJlZmVyZW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGVtZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdFsndGhlbWVzLyddID0gdGhlbWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGV4YW1wbGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHRbJ2V4YW1wbGVzLyddID0gZXhhbXBsZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaW5jbHVkZWxpY2Vuc2UgJiYgbWV0YWRhdGEubGljZW5zZSkge1xuICAgICAgICAgICAgcmVzdWx0WydMSUNFTlNFLnR4dCddID0gdGhpcy5jcmVhdGVMaWNlbnNlRmlsZShtZXRhZGF0YS5saWNlbnNlLCBtZXRhZGF0YS5hdXRob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWx3YXlzIHByZXNlcnZlIGZ1bGwgRG9sbGhvdXNlTUNQIG1ldGFkYXRhIGZvciBwZXJmZWN0IHJvdW5kdHJpcFxuICAgICAgICByZXN1bHRbJ21ldGFkYXRhLyddID0ge1xuICAgICAgICAgICAgJ2RvbGxob3VzZS55YW1sJzogeWFtbC5kdW1wKG1ldGFkYXRhKVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgdGhlIEFudGhyb3BpYyBza2lsbCBzdHJ1Y3R1cmUgdG8gZGlza1xuICAgICAqIFJFRkFDVE9SRUQ6IFNpbXBsaWZpZWQgYnkgZXh0cmFjdGluZyBkaXJlY3Rvcnkgd3JpdGluZyBsb2dpY1xuICAgICAqL1xuICAgIGFzeW5jIHdyaXRlVG9EaXJlY3Rvcnkoc3RydWN0dXJlOiBBbnRocm9waWNTa2lsbFN0cnVjdHVyZSwgb3V0cHV0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gQ3JlYXRlIG91dHB1dCBkaXJlY3RvcnlcbiAgICAgICAgdGhpcy5lbnN1cmVEaXJlY3RvcnlFeGlzdHMob3V0cHV0RGlyKTtcblxuICAgICAgICAvLyBXcml0ZSBTS0lMTC5tZFxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihvdXRwdXREaXIsICdTS0lMTC5tZCcpLCBzdHJ1Y3R1cmVbJ1NLSUxMLm1kJ10pO1xuXG4gICAgICAgIC8vIFdyaXRlIGFsbCBjb21wb25lbnQgZGlyZWN0b3JpZXNcbiAgICAgICAgdGhpcy53cml0ZVNjcmlwdHNEaXJlY3Rvcnkoc3RydWN0dXJlLCBvdXRwdXREaXIpO1xuICAgICAgICB0aGlzLndyaXRlRmlsZXNEaXJlY3Rvcnkoc3RydWN0dXJlWydyZWZlcmVuY2UvJ10sIG91dHB1dERpciwgJ3JlZmVyZW5jZScpO1xuICAgICAgICB0aGlzLndyaXRlRmlsZXNEaXJlY3Rvcnkoc3RydWN0dXJlWyd0aGVtZXMvJ10sIG91dHB1dERpciwgJ3RoZW1lcycpO1xuICAgICAgICB0aGlzLndyaXRlRmlsZXNEaXJlY3Rvcnkoc3RydWN0dXJlWydleGFtcGxlcy8nXSwgb3V0cHV0RGlyLCAnZXhhbXBsZXMnKTtcbiAgICAgICAgdGhpcy53cml0ZUZpbGVzRGlyZWN0b3J5KHN0cnVjdHVyZVsnbWV0YWRhdGEvJ10sIG91dHB1dERpciwgJ21ldGFkYXRhJyk7XG5cbiAgICAgICAgLy8gV3JpdGUgbGljZW5zZSBmaWxlXG4gICAgICAgIGlmIChzdHJ1Y3R1cmVbJ0xJQ0VOU0UudHh0J10pIHtcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKG91dHB1dERpciwgJ0xJQ0VOU0UudHh0JyksIHN0cnVjdHVyZVsnTElDRU5TRS50eHQnXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0cywgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5XG4gICAgICogUkVGQUNUT1JFRDogRXh0cmFjdGVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgICAqL1xuICAgIHByaXZhdGUgZW5zdXJlRGlyZWN0b3J5RXhpc3RzKGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlIHNjcmlwdHMgZGlyZWN0b3J5IHdpdGggc2VjdXJpdHkgY29uc2lkZXJhdGlvbnNcbiAgICAgKiBSRUZBQ1RPUkVEOiBFeHRyYWN0ZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAgICovXG4gICAgcHJpdmF0ZSB3cml0ZVNjcmlwdHNEaXJlY3Rvcnkoc3RydWN0dXJlOiBBbnRocm9waWNTa2lsbFN0cnVjdHVyZSwgb3V0cHV0RGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFzdHJ1Y3R1cmVbJ3NjcmlwdHMvJ10pIHJldHVybjtcblxuICAgICAgICBjb25zdCBzY3JpcHRzRGlyID0gcGF0aC5qb2luKG91dHB1dERpciwgJ3NjcmlwdHMnKTtcbiAgICAgICAgZnMubWtkaXJTeW5jKHNjcmlwdHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2ZpbGVuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzdHJ1Y3R1cmVbJ3NjcmlwdHMvJ10pKSB7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihzY3JpcHRzRGlyLCBmaWxlbmFtZSksIGNvbnRlbnQpO1xuICAgICAgICAgICAgLy8gU0VDVVJJVFkgKFNvbmFyQ2xvdWQgUzI2MTIpOiBEbyBOT1QgYXV0by1jaG1vZCBzY3JpcHRzIGV4ZWN1dGFibGVcbiAgICAgICAgICAgIC8vIC0gU2NyaXB0cyBmcm9tIERvbGxob3VzZU1DUCBhcmUgbWFya2Rvd24gY29kZSBibG9ja3MsIG5vdCBleGVjdXRhYmxlIGZpbGVzXG4gICAgICAgICAgICAvLyAtIEZvcm1hdCB0cmFuc2Zvcm1lciBzaG91bGRuJ3QgbWFrZSBzZWN1cml0eSBkZWNpc2lvbnMgKGNobW9kID0gc2VjdXJpdHkgZGVjaXNpb24pXG4gICAgICAgICAgICAvLyAtIFByaW5jaXBsZSBvZiBsZWFzdCBwcml2aWxlZ2U6IHVzZXIgY2FuIGNobW9kIGlmIG5lZWRlZFxuICAgICAgICAgICAgLy8gLSBQcmV2ZW50cyBhdXRvbWF0aWMgZXhlY3V0aW9uIG9mIHBvdGVudGlhbGx5IG1hbGljaW91cyBjb252ZXJ0ZWQgc2NyaXB0c1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgZ2VuZXJpYyBmaWxlcyBkaXJlY3RvcnkgKHJlZmVyZW5jZSwgdGhlbWVzLCBleGFtcGxlcywgbWV0YWRhdGEpXG4gICAgICogUkVGQUNUT1JFRDogRXh0cmFjdGVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eSBhbmQgcmV1c2UgY29kZVxuICAgICAqL1xuICAgIHByaXZhdGUgd3JpdGVGaWxlc0RpcmVjdG9yeShcbiAgICAgICAgZmlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQsXG4gICAgICAgIG91dHB1dERpcjogc3RyaW5nLFxuICAgICAgICBkaXJOYW1lOiBzdHJpbmdcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKCFmaWxlcykgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldERpciA9IHBhdGguam9pbihvdXRwdXREaXIsIGRpck5hbWUpO1xuICAgICAgICBmcy5ta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtmaWxlbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZmlsZXMpKSB7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbih0YXJnZXREaXIsIGZpbGVuYW1lKSwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IFlBTUwgZnJvbnRtYXR0ZXIgZnJvbSBtYXJrZG93blxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdFlBTUxGcm9udG1hdHRlcihjb250ZW50OiBzdHJpbmcpOiB7XG4gICAgICAgIG1ldGFkYXRhOiBEb2xsaG91c2VNQ1BTa2lsbE1ldGFkYXRhO1xuICAgICAgICBib2R5Q29udGVudDogc3RyaW5nO1xuICAgIH0ge1xuICAgICAgICBjb25zdCB5YW1sTWF0Y2ggPSAvXi0tLVxcbihbXFxzXFxTXSo/KVxcbi0tLVxcbihbXFxzXFxTXSopJC8uZXhlYyhjb250ZW50KTtcblxuICAgICAgICBpZiAoIXlhbWxNYXRjaCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBZQU1MIGZyb250bWF0dGVyIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGSVggKERNQ1AtU0VDLTAwNSk6IFVzZSBDT1JFX1NDSEVNQSB0byBwcmV2ZW50IFlBTUwgZGVzZXJpYWxpemF0aW9uIGF0dGFja3NcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB5YW1sLmxvYWQoeWFtbE1hdGNoWzFdLCB7IHNjaGVtYTogeWFtbC5DT1JFX1NDSEVNQSB9KSBhcyBEb2xsaG91c2VNQ1BTa2lsbE1ldGFkYXRhO1xuICAgICAgICBjb25zdCBib2R5Q29udGVudCA9IHlhbWxNYXRjaFsyXTtcblxuICAgICAgICByZXR1cm4geyBtZXRhZGF0YSwgYm9keUNvbnRlbnQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgU0tJTEwubWQgY29udGVudCB3aXRoIHNpbXBsaWZpZWQgbWV0YWRhdGEgYW5kIHJlZmVyZW5jZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVNraWxsTUQoXG4gICAgICAgIG1ldGFkYXRhOiBBbnRocm9waWNTa2lsbE1ldGFkYXRhLFxuICAgICAgICBtYWluSW5zdHJ1Y3Rpb25zOiBzdHJpbmcsXG4gICAgICAgIHJlZmVyZW5jZXM6IHN0cmluZ1tdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeWFtbFN0cmluZyA9IHlhbWwuZHVtcChtZXRhZGF0YSk7XG5cbiAgICAgICAgbGV0IHNraWxsTUQgPSBgLS0tXFxuJHt5YW1sU3RyaW5nfS0tLVxcblxcbiR7bWFpbkluc3RydWN0aW9uc31gO1xuXG4gICAgICAgIC8vIEFkZCByZWZlcmVuY2VzIHNlY3Rpb24gaWYgdGhlcmUgYXJlIGV4dHJhY3RlZCBjb21wb25lbnRzXG4gICAgICAgIGlmIChyZWZlcmVuY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNraWxsTUQgKz0gJ1xcblxcbiMjIEFkZGl0aW9uYWwgUmVzb3VyY2VzXFxuXFxuJztcbiAgICAgICAgICAgIHNraWxsTUQgKz0gcmVmZXJlbmNlcy5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBza2lsbE1EO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3QgbWFpbiBpbnN0cnVjdGlvbnMgKGNvbnRlbnQgYmVmb3JlIGNvZGUgYmxvY2tzIGFuZCBzcGVjaWFsIHNlY3Rpb25zKVxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdE1haW5JbnN0cnVjdGlvbnMoY29udGVudDogc3RyaW5nLCBleHRyYWN0ZWRTZWN0aW9uczogRXh0cmFjdGVkU2VjdGlvbltdKTogc3RyaW5nIHtcbiAgICAgICAgLy8gRm9yIG5vdywgcmV0dXJuIGNvbnRlbnQgdXAgdG8gZmlyc3QgY29kZSBibG9jayBvciBleHRyYWN0ZWQgc2VjdGlvblxuICAgICAgICAvLyBUaGlzIGlzIHNpbXBsaWZpZWQgLSBhIGZ1bGwgaW1wbGVtZW50YXRpb24gd291bGQgcmVjb25zdHJ1Y3Qgd2l0aCByZWZlcmVuY2VzXG4gICAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGNvbnN0IG1haW5MaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBsZXQgaW5FeHRyYWN0ZWRTZWN0aW9uID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBlbnRlcmluZyBhbiBleHRyYWN0ZWQgc2VjdGlvblxuICAgICAgICAgICAgY29uc3QgaXNFeHRyYWN0ZWQgPSBleHRyYWN0ZWRTZWN0aW9ucy5zb21lKFxuICAgICAgICAgICAgICAgIHMgPT4gaSA+PSBzLnN0YXJ0TGluZSAmJiBpIDw9IHMuZW5kTGluZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGlzRXh0cmFjdGVkKSB7XG4gICAgICAgICAgICAgICAgaW5FeHRyYWN0ZWRTZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpbkV4dHJhY3RlZFNlY3Rpb24gfHwgbGluZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgICAgICAgICBtYWluTGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICBpbkV4dHJhY3RlZFNlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYWluTGluZXMuam9pbignXFxuJykudHJpbSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3QgZG9jdW1lbnRhdGlvbiBzZWN0aW9ucyAoSW5wdXQgRm9ybWF0cywgRXJyb3IgSGFuZGxpbmcsIGV0Yy4pXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0RG9jdW1lbnRhdGlvblNlY3Rpb25zKGNvbnRlbnQ6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBzZWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgIC8vIENvbW1vbiBkb2N1bWVudGF0aW9uIHNlY3Rpb24gcGF0dGVybnNcbiAgICAgICAgY29uc3Qgc2VjdGlvblBhdHRlcm5zID0gW1xuICAgICAgICAgICAgJ0lucHV0IEZvcm1hdHMnLFxuICAgICAgICAgICAgJ0Vycm9yIEhhbmRsaW5nJyxcbiAgICAgICAgICAgICdTdXBwb3J0ZWQgQ2xpZW50cycsXG4gICAgICAgICAgICAnQ29tbWFuZCBCdWlsZGluZycsXG4gICAgICAgICAgICAnQ29uZmlndXJhdGlvbicsXG4gICAgICAgICAgICAnVHJvdWJsZXNob290aW5nJ1xuICAgICAgICBdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBzZWN0aW9uUGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLmNvbnRlbnRFeHRyYWN0b3IuZXh0cmFjdERvY3VtZW50YXRpb25TZWN0aW9uKGNvbnRlbnQsIHBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKHNlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9uc1twYXR0ZXJuXSA9IHNlY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0IHNjcmlwdCBmaWxlIHdpdGggcHJvcGVyIHNoZWJhbmcgYW5kIGhlYWRlcnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGZvcm1hdFNjcmlwdEZpbGUoY29udGVudDogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc2hlYmFuZyA9IHRoaXMuZ2V0U2hlYmFuZyhsYW5ndWFnZSk7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZ2V0U2NyaXB0SGVhZGVyKGNvbnRlbnQpO1xuXG4gICAgICAgIHJldHVybiBgJHtzaGViYW5nfVxcbiR7aGVhZGVyfVxcbiR7Y29udGVudH1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhcHByb3ByaWF0ZSBzaGViYW5nIGZvciBzY3JpcHQgbGFuZ3VhZ2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFNoZWJhbmcobGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHNoZWJhbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgYmFzaDogJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgIHNoOiAnIyEvYmluL3NoJyxcbiAgICAgICAgICAgIHB5dGhvbjogJyMhL3Vzci9iaW4vZW52IHB5dGhvbjMnLFxuICAgICAgICAgICAgcHk6ICcjIS91c3IvYmluL2VudiBweXRob24zJyxcbiAgICAgICAgICAgIG5vZGU6ICcjIS91c3IvYmluL2VudiBub2RlJyxcbiAgICAgICAgICAgIGphdmFzY3JpcHQ6ICcjIS91c3IvYmluL2VudiBub2RlJyxcbiAgICAgICAgICAgIGpzOiAnIyEvdXNyL2Jpbi9lbnYgbm9kZSdcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc2hlYmFuZ3NbbGFuZ3VhZ2UudG9Mb3dlckNhc2UoKV0gfHwgJyMhL2Jpbi9iYXNoJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2NyaXB0IGhlYWRlciBjb21tZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRTY3JpcHRIZWFkZXIoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLy8gRXh0cmFjdCBmaXJzdCBjb21tZW50IGlmIHByZXNlbnRcbiAgICAgICAgY29uc3QgZmlyc3RMaW5lID0gY29udGVudC5zcGxpdCgnXFxuJylbMF07XG4gICAgICAgIGlmIChmaXJzdExpbmUuc3RhcnRzV2l0aCgnIycpIHx8IGZpcnN0TGluZS5zdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3RMaW5lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnIyBFeHRyYWN0ZWQgc2NyaXB0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZmlsZSBleHRlbnNpb24gZm9yIGxhbmd1YWdlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRFeHRlbnNpb24obGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICBiYXNoOiAnc2gnLFxuICAgICAgICAgICAgc2g6ICdzaCcsXG4gICAgICAgICAgICBweXRob246ICdweScsXG4gICAgICAgICAgICBweTogJ3B5JyxcbiAgICAgICAgICAgIGphdmFzY3JpcHQ6ICdqcycsXG4gICAgICAgICAgICBqczogJ2pzJyxcbiAgICAgICAgICAgIHR5cGVzY3JpcHQ6ICd0cycsXG4gICAgICAgICAgICB0czogJ3RzJ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBleHRlbnNpb25zW2xhbmd1YWdlLnRvTG93ZXJDYXNlKCldIHx8ICd0eHQnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBzbHVnaWZpZWQgZmlsZW5hbWUgZnJvbSB0aXRsZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2x1Z2lmeSh0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRpdGxlXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1teYS16MC05XFxzLV0vZywgJycpXG4gICAgICAgICAgICAucmVwbGFjZUFsbCgvXFxzKy9nLCAnLScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBMSUNFTlNFLnR4dCBmaWxlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVMaWNlbnNlRmlsZShsaWNlbnNlOiBzdHJpbmcsIGF1dGhvcj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGF1dGhvclN1ZmZpeCA9IGF1dGhvciA/IGBcXG5cXG5BdXRob3I6ICR7YXV0aG9yfWAgOiAnJztcbiAgICAgICAgcmV0dXJuIGAke2xpY2Vuc2V9JHthdXRob3JTdWZmaXh9YDtcbiAgICB9XG59XG4iXX0=
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9sbGhvdXNlVG9BbnRocm9waWNDb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udmVydGVycy9Eb2xsaG91c2VUb0FudGhyb3BpY0NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUUsWUFBWSxFQUErRCxNQUFNLG1CQUFtQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQVlqRSxNQUFNLE9BQU8sNkJBQTZCO0lBQ3JCLFlBQVksQ0FBZTtJQUMzQixnQkFBZ0IsQ0FBbUI7SUFFcEQ7UUFDSSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFvQixFQUFFLE9BR3hDO1FBQ0csbUNBQW1DO1FBQ25DLDRGQUE0RjtRQUM1RixvRkFBb0Y7UUFDcEYsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFNUUsMkVBQTJFO1FBQzNFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckUsbUNBQW1DO1FBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENB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Q0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUIsQ0FBQyxPQUFlLEVBQUUsTUFBZTtRQUN0RCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEdBQUcsT0FBTyxHQUFHLFlBQVksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRG9sbGhvdXNlVG9BbnRocm9waWNDb252ZXJ0ZXIgLSBDb252ZXJ0cyBzaW5nbGUtZmlsZSBEb2xsaG91c2VNQ1Agc2tpbGxzIHRvIG11bHRpLWZpbGUgQW50aHJvcGljIFNraWxsc1xuICpcbiAqIEJhc2VkIG9uIHRoZSBleGFjdCBhbGdvcml0aG0gZG9jdW1lbnRlZCBpbjpcbiAqIGJ1c2luZXNzL2RvY3VtZW50cy9sZWdhbC9ldmlkZW5jZS9hbnRocm9waWMtc2tpbGxzLWRlY29tcG9zaXRpb24tYW5hbHlzaXMubWQgKGxpbmVzIDEwOC0xNjMpXG4gKlxuICogSW1wbGVtZW50cyB0aGUgbWVjaGFuaWNhbCB0cmFuc2Zvcm1hdGlvbjpcbiAqIERvbGxob3VzZU1DUCBTa2lsbCAoc2luZ2xlIC5tZCBmaWxlKSDihpIgQW50aHJvcGljIFNraWxsIChkaXJlY3Rvcnkgd2l0aCBzZXBhcmF0ZWQgY29tcG9uZW50cylcbiAqXG4gKiBTRUNVUklUWSBNT0RFTDpcbiAqIC0gVGhpcyBpcyBhIEZPUk1BVCBUUkFOU0ZPUk1FUiwgbm90IGEgc2VjdXJpdHkgYm91bmRhcnlcbiAqIC0gUHJlc2VydmVzIGNvbnRlbnQgZmlkZWxpdHkgLSBubyBtb2RpZmljYXRpb24sIHNhbml0aXphdGlvbiwgb3IgdmFsaWRhdGlvblxuICogLSBZQU1MIHBhcnNpbmcgdXNlcyBDT1JFX1NDSEVNQSB0byBwcmV2ZW50IGRlc2VyaWFsaXphdGlvbiBhdHRhY2tzIG9ubHlcbiAqIC0gU2VjdXJpdHkgdmFsaWRhdGlvbiBoYXBwZW5zIGF0IFNraWxsTWFuYWdlci5sb2FkKCkgdGltZSwgbm90IGNvbnZlcnNpb24gdGltZVxuICogLSBJbnB1dCBza2lsbHMgc2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkICh0aGV5J3JlIGZyb20gRG9sbGhvdXNlTUNQIHN5c3RlbSlcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBTY2hlbWFNYXBwZXIsIHR5cGUgRG9sbGhvdXNlTUNQU2tpbGxNZXRhZGF0YSwgdHlwZSBBbnRocm9waWNTa2lsbE1ldGFkYXRhIH0gZnJvbSAnLi9TY2hlbWFNYXBwZXIuanMnO1xuaW1wb3J0IHsgQ29udGVudEV4dHJhY3RvciwgdHlwZSBFeHRyYWN0ZWRTZWN0aW9uIH0gZnJvbSAnLi9Db250ZW50RXh0cmFjdG9yLmpzJztcbmltcG9ydCB7IHJlc29sdmVQYXRoV2l0aGluQmFzZSB9IGZyb20gJy4uL3V0aWxzL3BhdGhTZWN1cml0eS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUge1xuICAgICdTS0lMTC5tZCc6IHN0cmluZztcbiAgICAnc2NyaXB0cy8nPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAncmVmZXJlbmNlLyc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICd0aGVtZXMvJz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgJ2V4YW1wbGVzLyc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICdtZXRhZGF0YS8nPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAnTElDRU5TRS50eHQnPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRG9sbGhvdXNlVG9BbnRocm9waWNDb252ZXJ0ZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hTWFwcGVyOiBTY2hlbWFNYXBwZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZW50RXh0cmFjdG9yOiBDb250ZW50RXh0cmFjdG9yO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hTWFwcGVyID0gbmV3IFNjaGVtYU1hcHBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnRFeHRyYWN0b3IgPSBuZXcgQ29udGVudEV4dHJhY3RvcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBEb2xsaG91c2VNQ1Agc2tpbGwgKC5tZCBmaWxlKSB0byBBbnRocm9waWMgU2tpbGwgZm9ybWF0IChkaXJlY3Rvcnkgc3RydWN0dXJlKVxuICAgICAqXG4gICAgICogRVhBQ1QgQUxHT1JJVEhNIGZyb20gZXZpZGVuY2UvYW50aHJvcGljLXNraWxscy1kZWNvbXBvc2l0aW9uLWFuYWx5c2lzLm1kOlxuICAgICAqIDEuIEV4dHJhY3QgWUFNTCBmcm9udG1hdHRlclxuICAgICAqIDIuIFNpbXBsaWZ5IFlBTUwgKGtlZXAgb25seSBuYW1lICsgZGVzY3JpcHRpb24pXG4gICAgICogMy4gRXh0cmFjdCBtYWluIGluc3RydWN0aW9uc1xuICAgICAqIDQuIEV4dHJhY3QgZW1iZWRkZWQgY29kZSBibG9ja3Mg4oaSIHNjcmlwdHMvXG4gICAgICogNS4gRXh0cmFjdCByZWZlcmVuY2Ugc2VjdGlvbnMg4oaSIHJlZmVyZW5jZS9cbiAgICAgKiA2LiBFeHRyYWN0IHRlbXBsYXRlcyDihpIgdGhlbWVzLyBvciBleGFtcGxlcy9cbiAgICAgKiA3LiBDcmVhdGUgU0tJTEwubWQgd2l0aCByZWZlcmVuY2VzXG4gICAgICogOC4gUmV0dXJuIGRpcmVjdG9yeSBzdHJ1Y3R1cmVcbiAgICAgKi9cbiAgICBhc3luYyBjb252ZXJ0U2tpbGwoc2tpbGxDb250ZW50OiBzdHJpbmcsIG9wdGlvbnM/OiB7XG4gICAgICAgIGluY2x1ZGVsaWNlbnNlPzogYm9vbGVhbjtcbiAgICAgICAgcHJlc2VydmVDb21tZW50cz86IGJvb2xlYW47XG4gICAgfSk6IFByb21pc2U8QW50aHJvcGljU2tpbGxTdHJ1Y3R1cmU+IHtcbiAgICAgICAgLy8gU3RlcCAxOiBFeHRyYWN0IFlBTUwgZnJvbnRtYXR0ZXJcbiAgICAgICAgLy8gTk9URTogTm8gVW5pY29kZSBub3JtYWxpemF0aW9uIC0gcHJlc2VydmVzIGNvbnRlbnQgZmlkZWxpdHkgZm9yIG1lY2hhbmljYWwgdHJhbnNmb3JtYXRpb25cbiAgICAgICAgLy8gU2VjdXJpdHkgdmFsaWRhdGlvbiBoYXBwZW5zIHdoZW4gbG9hZGluZyBjb252ZXJ0ZWQgc2tpbGxzIHZpYSBTa2lsbE1hbmFnZXIubG9hZCgpXG4gICAgICAgIGNvbnN0IHsgbWV0YWRhdGEsIGJvZHlDb250ZW50IH0gPSB0aGlzLmV4dHJhY3RZQU1MRnJvbnRtYXR0ZXIoc2tpbGxDb250ZW50KTtcblxuICAgICAgICAvLyBTdGVwIDI6IFNpbXBsaWZ5IFlBTUwgKGtlZXAgb25seSBuYW1lICsgZGVzY3JpcHRpb24sIG9wdGlvbmFsbHkgbGljZW5zZSlcbiAgICAgICAgY29uc3QgbWluaW1hbFlBTUwgPSB0aGlzLnNjaGVtYU1hcHBlci5kb2xsaG91c2VUb0FudGhyb3BpYyhtZXRhZGF0YSk7XG5cbiAgICAgICAgLy8gU3RlcCAzLTY6IEV4dHJhY3QgYWxsIGNvbXBvbmVudHNcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLmNvbnRlbnRFeHRyYWN0b3IuZXh0cmFjdFNlY3Rpb25zKGJvZHlDb250ZW50KTtcblxuICAgICAgICAvLyBPcmdhbml6ZSBleHRyYWN0ZWQgc2VjdGlvbnMgYnkgdHlwZVxuICAgICAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBjb25zdCB0aGVtZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgY29uc3QgZXhhbXBsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICBsZXQgbWFpbkluc3RydWN0aW9ucyA9ICcnO1xuICAgICAgICBjb25zdCBzZWN0aW9uUmVmZXJlbmNlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAvLyBTdGVwIDQ6IEV4dHJhY3QgY29kZSBibG9ja3Mg4oaSIHNjcmlwdHMvXG4gICAgICAgIGNvbnN0IGNvZGVCbG9ja3MgPSBzZWN0aW9ucy5maWx0ZXIocyA9PiBzLnR5cGUgPT09ICdjb2RlJyk7XG4gICAgICAgIGZvciAoY29uc3QgYmxvY2sgb2YgY29kZUJsb2Nrcykge1xuICAgICAgICAgICAgaWYgKGJsb2NrLmZpbGVuYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBibG9jay5maWxlbmFtZTtcbiAgICAgICAgICAgICAgICBzY3JpcHRzW2ZpbGVuYW1lXSA9IHRoaXMuZm9ybWF0U2NyaXB0RmlsZShibG9jay5jb250ZW50LCBibG9jay5sYW5ndWFnZSB8fCAnJyk7XG4gICAgICAgICAgICAgICAgc2VjdGlvblJlZmVyZW5jZXMucHVzaChgU2VlIFxcYHNjcmlwdHMvJHtmaWxlbmFtZX1cXGAgZm9yICR7YmxvY2sudGl0bGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDU6IEV4dHJhY3QgZG9jdW1lbnRhdGlvbiBzZWN0aW9ucyDihpIgcmVmZXJlbmNlL1xuICAgICAgICBjb25zdCBkb2NTZWN0aW9ucyA9IHRoaXMuZXh0cmFjdERvY3VtZW50YXRpb25TZWN0aW9ucyhib2R5Q29udGVudCk7XG4gICAgICAgIGZvciAoY29uc3QgW3RpdGxlLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhkb2NTZWN0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5zbHVnaWZ5KHRpdGxlKSArICcubWQnO1xuICAgICAgICAgICAgcmVmZXJlbmNlW2ZpbGVuYW1lXSA9IGNvbnRlbnQ7XG4gICAgICAgICAgICBzZWN0aW9uUmVmZXJlbmNlcy5wdXNoKGBTZWUgXFxgcmVmZXJlbmNlLyR7ZmlsZW5hbWV9XFxgIGZvciAke3RpdGxlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcCA2OiBFeHRyYWN0IGV4YW1wbGVzXG4gICAgICAgIGNvbnN0IGV4YW1wbGVTZWN0aW9uID0gdGhpcy5jb250ZW50RXh0cmFjdG9yLmV4dHJhY3REb2N1bWVudGF0aW9uU2VjdGlvbihib2R5Q29udGVudCwgJ2V4YW1wbGUnKTtcbiAgICAgICAgaWYgKGV4YW1wbGVTZWN0aW9uKSB7XG4gICAgICAgICAgICBleGFtcGxlc1snaW5zdGFsbGF0aW9uLWV4YW1wbGUubWQnXSA9IGV4YW1wbGVTZWN0aW9uO1xuICAgICAgICAgICAgc2VjdGlvblJlZmVyZW5jZXMucHVzaChgU2VlIFxcYGV4YW1wbGVzL2luc3RhbGxhdGlvbi1leGFtcGxlLm1kXFxgIGZvciBjb21wbGV0ZSB3YWxrdGhyb3VnaGApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcCAzOiBFeHRyYWN0IG1haW4gaW5zdHJ1Y3Rpb25zIChwcmVzZXJ2ZSBzdHJ1Y3R1cmFsIGNvbnRlbnQsIHJlbW92ZSBleHRyYWN0ZWQgc2VjdGlvbnMpXG4gICAgICAgIG1haW5JbnN0cnVjdGlvbnMgPSB0aGlzLmV4dHJhY3RNYWluSW5zdHJ1Y3Rpb25zKGJvZHlDb250ZW50LCBzZWN0aW9ucyk7XG5cbiAgICAgICAgLy8gU3RlcCA3OiBDcmVhdGUgU0tJTEwubWQgd2l0aCByZWZlcmVuY2VzIHRvIHNlcGFyYXRlZCBmaWxlc1xuICAgICAgICBjb25zdCBza2lsbE1EID0gdGhpcy5jcmVhdGVTa2lsbE1EKG1pbmltYWxZQU1MLCBtYWluSW5zdHJ1Y3Rpb25zLCBzZWN0aW9uUmVmZXJlbmNlcyk7XG5cbiAgICAgICAgLy8gU3RlcCA4OiBSZXR1cm4gZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgICAgICBjb25zdCByZXN1bHQ6IEFudGhyb3BpY1NraWxsU3RydWN0dXJlID0ge1xuICAgICAgICAgICAgJ1NLSUxMLm1kJzogc2tpbGxNRFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzY3JpcHRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHRbJ3NjcmlwdHMvJ10gPSBzY3JpcHRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlZmVyZW5jZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0WydyZWZlcmVuY2UvJ10gPSByZWZlcmVuY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhlbWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHRbJ3RoZW1lcy8nXSA9IHRoZW1lcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhleGFtcGxlcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0WydleGFtcGxlcy8nXSA9IGV4YW1wbGVzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmluY2x1ZGVsaWNlbnNlICYmIG1ldGFkYXRhLmxpY2Vuc2UpIHtcbiAgICAgICAgICAgIHJlc3VsdFsnTElDRU5TRS50eHQnXSA9IHRoaXMuY3JlYXRlTGljZW5zZUZpbGUobWV0YWRhdGEubGljZW5zZSwgbWV0YWRhdGEuYXV0aG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsd2F5cyBwcmVzZXJ2ZSBmdWxsIERvbGxob3VzZU1DUCBtZXRhZGF0YSBmb3IgcGVyZmVjdCByb3VuZHRyaXBcbiAgICAgICAgcmVzdWx0WydtZXRhZGF0YS8nXSA9IHtcbiAgICAgICAgICAgICdkb2xsaG91c2UueWFtbCc6IHlhbWwuZHVtcChtZXRhZGF0YSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlIHRoZSBBbnRocm9waWMgc2tpbGwgc3RydWN0dXJlIHRvIGRpc2tcbiAgICAgKiBSRUZBQ1RPUkVEOiBTaW1wbGlmaWVkIGJ5IGV4dHJhY3RpbmcgZGlyZWN0b3J5IHdyaXRpbmcgbG9naWNcbiAgICAgKi9cbiAgICBhc3luYyB3cml0ZVRvRGlyZWN0b3J5KHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUsIG91dHB1dERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5XG4gICAgICAgIHRoaXMuZW5zdXJlRGlyZWN0b3J5RXhpc3RzKG91dHB1dERpcik7XG5cbiAgICAgICAgLy8gV3JpdGUgU0tJTEwubWRcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXNvbHZlUGF0aFdpdGhpbkJhc2Uob3V0cHV0RGlyLCAnU0tJTEwubWQnKSwgc3RydWN0dXJlWydTS0lMTC5tZCddKTtcblxuICAgICAgICAvLyBXcml0ZSBhbGwgY29tcG9uZW50IGRpcmVjdG9yaWVzXG4gICAgICAgIHRoaXMud3JpdGVTY3JpcHRzRGlyZWN0b3J5KHN0cnVjdHVyZSwgb3V0cHV0RGlyKTtcbiAgICAgICAgdGhpcy53cml0ZUZpbGVzRGlyZWN0b3J5KHN0cnVjdHVyZVsncmVmZXJlbmNlLyddLCBvdXRwdXREaXIsICdyZWZlcmVuY2UnKTtcbiAgICAgICAgdGhpcy53cml0ZUZpbGVzRGlyZWN0b3J5KHN0cnVjdHVyZVsndGhlbWVzLyddLCBvdXRwdXREaXIsICd0aGVtZXMnKTtcbiAgICAgICAgdGhpcy53cml0ZUZpbGVzRGlyZWN0b3J5KHN0cnVjdHVyZVsnZXhhbXBsZXMvJ10sIG91dHB1dERpciwgJ2V4YW1wbGVzJyk7XG4gICAgICAgIHRoaXMud3JpdGVGaWxlc0RpcmVjdG9yeShzdHJ1Y3R1cmVbJ21ldGFkYXRhLyddLCBvdXRwdXREaXIsICdtZXRhZGF0YScpO1xuXG4gICAgICAgIC8vIFdyaXRlIGxpY2Vuc2UgZmlsZVxuICAgICAgICBpZiAoc3RydWN0dXJlWydMSUNFTlNFLnR4dCddKSB7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHJlc29sdmVQYXRoV2l0aGluQmFzZShvdXRwdXREaXIsICdMSUNFTlNFLnR4dCcpLCBzdHJ1Y3R1cmVbJ0xJQ0VOU0UudHh0J10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5zdXJlIGRpcmVjdG9yeSBleGlzdHMsIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeVxuICAgICAqIFJFRkFDVE9SRUQ6IEV4dHJhY3RlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICAgKi9cbiAgICBwcml2YXRlIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZSBzY3JpcHRzIGRpcmVjdG9yeSB3aXRoIHNlY3VyaXR5IGNvbnNpZGVyYXRpb25zXG4gICAgICogUkVGQUNUT1JFRDogRXh0cmFjdGVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgICAqL1xuICAgIHByaXZhdGUgd3JpdGVTY3JpcHRzRGlyZWN0b3J5KHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUsIG91dHB1dERpcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghc3RydWN0dXJlWydzY3JpcHRzLyddKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc2NyaXB0c0RpciA9IHJlc29sdmVQYXRoV2l0aGluQmFzZShvdXRwdXREaXIsICdzY3JpcHRzJyk7XG4gICAgICAgIGZzLm1rZGlyU3luYyhzY3JpcHRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtmaWxlbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc3RydWN0dXJlWydzY3JpcHRzLyddKSkge1xuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXNvbHZlUGF0aFdpdGhpbkJhc2Uoc2NyaXB0c0RpciwgZmlsZW5hbWUpLCBjb250ZW50KTtcbiAgICAgICAgICAgIC8vIFNFQ1VSSVRZIChTb25hckNsb3VkIFMyNjEyKTogRG8gTk9UIGF1dG8tY2htb2Qgc2NyaXB0cyBleGVjdXRhYmxlXG4gICAgICAgICAgICAvLyAtIFNjcmlwdHMgZnJvbSBEb2xsaG91c2VNQ1AgYXJlIG1hcmtkb3duIGNvZGUgYmxvY2tzLCBub3QgZXhlY3V0YWJsZSBmaWxlc1xuICAgICAgICAgICAgLy8gLSBGb3JtYXQgdHJhbnNmb3JtZXIgc2hvdWxkbid0IG1ha2Ugc2VjdXJpdHkgZGVjaXNpb25zIChjaG1vZCA9IHNlY3VyaXR5IGRlY2lzaW9uKVxuICAgICAgICAgICAgLy8gLSBQcmluY2lwbGUgb2YgbGVhc3QgcHJpdmlsZWdlOiB1c2VyIGNhbiBjaG1vZCBpZiBuZWVkZWRcbiAgICAgICAgICAgIC8vIC0gUHJldmVudHMgYXV0b21hdGljIGV4ZWN1dGlvbiBvZiBwb3RlbnRpYWxseSBtYWxpY2lvdXMgY29udmVydGVkIHNjcmlwdHNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlIGdlbmVyaWMgZmlsZXMgZGlyZWN0b3J5IChyZWZlcmVuY2UsIHRoZW1lcywgZXhhbXBsZXMsIG1ldGFkYXRhKVxuICAgICAqIFJFRkFDVE9SRUQ6IEV4dHJhY3RlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkgYW5kIHJldXNlIGNvZGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHdyaXRlRmlsZXNEaXJlY3RvcnkoXG4gICAgICAgIGZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICAgICAgICBvdXRwdXREaXI6IHN0cmluZyxcbiAgICAgICAgZGlyTmFtZTogc3RyaW5nXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICghZmlsZXMpIHJldHVybjtcblxuICAgICAgICBjb25zdCB0YXJnZXREaXIgPSByZXNvbHZlUGF0aFdpdGhpbkJhc2Uob3V0cHV0RGlyLCBkaXJOYW1lKTtcbiAgICAgICAgZnMubWtkaXJTeW5jKHRhcmdldERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbZmlsZW5hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGZpbGVzKSkge1xuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXNvbHZlUGF0aFdpdGhpbkJhc2UodGFyZ2V0RGlyLCBmaWxlbmFtZSksIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCBZQU1MIGZyb250bWF0dGVyIGZyb20gbWFya2Rvd25cbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RZQU1MRnJvbnRtYXR0ZXIoY29udGVudDogc3RyaW5nKToge1xuICAgICAgICBtZXRhZGF0YTogRG9sbGhvdXNlTUNQU2tpbGxNZXRhZGF0YTtcbiAgICAgICAgYm9keUNvbnRlbnQ6IHN0cmluZztcbiAgICB9IHtcbiAgICAgICAgY29uc3QgeWFtbE1hdGNoID0gL14tLS1cXG4oW1xcc1xcU10qPylcXG4tLS1cXG4oW1xcc1xcU10qKSQvLmV4ZWMoY29udGVudCk7XG5cbiAgICAgICAgaWYgKCF5YW1sTWF0Y2gpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gWUFNTCBmcm9udG1hdHRlciBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRklYIChETUNQLVNFQy0wMDUpOiBVc2UgQ09SRV9TQ0hFTUEgdG8gcHJldmVudCBZQU1MIGRlc2VyaWFsaXphdGlvbiBhdHRhY2tzXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0geWFtbC5sb2FkKHlhbWxNYXRjaFsxXSwgeyBzY2hlbWE6IHlhbWwuQ09SRV9TQ0hFTUEgfSkgYXMgRG9sbGhvdXNlTUNQU2tpbGxNZXRhZGF0YTtcbiAgICAgICAgY29uc3QgYm9keUNvbnRlbnQgPSB5YW1sTWF0Y2hbMl07XG5cbiAgICAgICAgcmV0dXJuIHsgbWV0YWRhdGEsIGJvZHlDb250ZW50IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFNLSUxMLm1kIGNvbnRlbnQgd2l0aCBzaW1wbGlmaWVkIG1ldGFkYXRhIGFuZCByZWZlcmVuY2VzXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTa2lsbE1EKFxuICAgICAgICBtZXRhZGF0YTogQW50aHJvcGljU2tpbGxNZXRhZGF0YSxcbiAgICAgICAgbWFpbkluc3RydWN0aW9uczogc3RyaW5nLFxuICAgICAgICByZWZlcmVuY2VzOiBzdHJpbmdbXVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHlhbWxTdHJpbmcgPSB5YW1sLmR1bXAobWV0YWRhdGEpO1xuXG4gICAgICAgIGxldCBza2lsbE1EID0gYC0tLVxcbiR7eWFtbFN0cmluZ30tLS1cXG5cXG4ke21haW5JbnN0cnVjdGlvbnN9YDtcblxuICAgICAgICAvLyBBZGQgcmVmZXJlbmNlcyBzZWN0aW9uIGlmIHRoZXJlIGFyZSBleHRyYWN0ZWQgY29tcG9uZW50c1xuICAgICAgICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBza2lsbE1EICs9ICdcXG5cXG4jIyBBZGRpdGlvbmFsIFJlc291cmNlc1xcblxcbic7XG4gICAgICAgICAgICBza2lsbE1EICs9IHJlZmVyZW5jZXMuam9pbignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2tpbGxNRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IG1haW4gaW5zdHJ1Y3Rpb25zIChjb250ZW50IGJlZm9yZSBjb2RlIGJsb2NrcyBhbmQgc3BlY2lhbCBzZWN0aW9ucylcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RNYWluSW5zdHJ1Y3Rpb25zKGNvbnRlbnQ6IHN0cmluZywgZXh0cmFjdGVkU2VjdGlvbnM6IEV4dHJhY3RlZFNlY3Rpb25bXSk6IHN0cmluZyB7XG4gICAgICAgIC8vIEZvciBub3csIHJldHVybiBjb250ZW50IHVwIHRvIGZpcnN0IGNvZGUgYmxvY2sgb3IgZXh0cmFjdGVkIHNlY3Rpb25cbiAgICAgICAgLy8gVGhpcyBpcyBzaW1wbGlmaWVkIC0gYSBmdWxsIGltcGxlbWVudGF0aW9uIHdvdWxkIHJlY29uc3RydWN0IHdpdGggcmVmZXJlbmNlc1xuICAgICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgICAgICBjb25zdCBtYWluTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgbGV0IGluRXh0cmFjdGVkU2VjdGlvbiA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgZW50ZXJpbmcgYW4gZXh0cmFjdGVkIHNlY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGlzRXh0cmFjdGVkID0gZXh0cmFjdGVkU2VjdGlvbnMuc29tZShcbiAgICAgICAgICAgICAgICBzID0+IGkgPj0gcy5zdGFydExpbmUgJiYgaSA8PSBzLmVuZExpbmVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChpc0V4dHJhY3RlZCkge1xuICAgICAgICAgICAgICAgIGluRXh0cmFjdGVkU2VjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaW5FeHRyYWN0ZWRTZWN0aW9uIHx8IGxpbmUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgICAgICAgICAgbWFpbkxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgaW5FeHRyYWN0ZWRTZWN0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFpbkxpbmVzLmpvaW4oJ1xcbicpLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IGRvY3VtZW50YXRpb24gc2VjdGlvbnMgKElucHV0IEZvcm1hdHMsIEVycm9yIEhhbmRsaW5nLCBldGMuKVxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdERvY3VtZW50YXRpb25TZWN0aW9ucyhjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAvLyBDb21tb24gZG9jdW1lbnRhdGlvbiBzZWN0aW9uIHBhdHRlcm5zXG4gICAgICAgIGNvbnN0IHNlY3Rpb25QYXR0ZXJucyA9IFtcbiAgICAgICAgICAgICdJbnB1dCBGb3JtYXRzJyxcbiAgICAgICAgICAgICdFcnJvciBIYW5kbGluZycsXG4gICAgICAgICAgICAnU3VwcG9ydGVkIENsaWVudHMnLFxuICAgICAgICAgICAgJ0NvbW1hbmQgQnVpbGRpbmcnLFxuICAgICAgICAgICAgJ0NvbmZpZ3VyYXRpb24nLFxuICAgICAgICAgICAgJ1Ryb3VibGVzaG9vdGluZydcbiAgICAgICAgXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2Ygc2VjdGlvblBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5jb250ZW50RXh0cmFjdG9yLmV4dHJhY3REb2N1bWVudGF0aW9uU2VjdGlvbihjb250ZW50LCBwYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnNbcGF0dGVybl0gPSBzZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlY3Rpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdCBzY3JpcHQgZmlsZSB3aXRoIHByb3BlciBzaGViYW5nIGFuZCBoZWFkZXJzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmb3JtYXRTY3JpcHRGaWxlKGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHNoZWJhbmcgPSB0aGlzLmdldFNoZWJhbmcobGFuZ3VhZ2UpO1xuICAgICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmdldFNjcmlwdEhlYWRlcihjb250ZW50KTtcblxuICAgICAgICByZXR1cm4gYCR7c2hlYmFuZ31cXG4ke2hlYWRlcn1cXG4ke2NvbnRlbnR9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYXBwcm9wcmlhdGUgc2hlYmFuZyBmb3Igc2NyaXB0IGxhbmd1YWdlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRTaGViYW5nKGxhbmd1YWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzaGViYW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIGJhc2g6ICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICBzaDogJyMhL2Jpbi9zaCcsXG4gICAgICAgICAgICBweXRob246ICcjIS91c3IvYmluL2VudiBweXRob24zJyxcbiAgICAgICAgICAgIHB5OiAnIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMycsXG4gICAgICAgICAgICBub2RlOiAnIyEvdXNyL2Jpbi9lbnYgbm9kZScsXG4gICAgICAgICAgICBqYXZhc2NyaXB0OiAnIyEvdXNyL2Jpbi9lbnYgbm9kZScsXG4gICAgICAgICAgICBqczogJyMhL3Vzci9iaW4vZW52IG5vZGUnXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHNoZWJhbmdzW2xhbmd1YWdlLnRvTG93ZXJDYXNlKCldIHx8ICcjIS9iaW4vYmFzaCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNjcmlwdCBoZWFkZXIgY29tbWVudFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0U2NyaXB0SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8vIEV4dHJhY3QgZmlyc3QgY29tbWVudCBpZiBwcmVzZW50XG4gICAgICAgIGNvbnN0IGZpcnN0TGluZSA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpWzBdO1xuICAgICAgICBpZiAoZmlyc3RMaW5lLnN0YXJ0c1dpdGgoJyMnKSB8fCBmaXJzdExpbmUuc3RhcnRzV2l0aCgnLy8nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0TGluZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyMgRXh0cmFjdGVkIHNjcmlwdCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGZpbGUgZXh0ZW5zaW9uIGZvciBsYW5ndWFnZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RXh0ZW5zaW9uKGxhbmd1YWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBleHRlbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgYmFzaDogJ3NoJyxcbiAgICAgICAgICAgIHNoOiAnc2gnLFxuICAgICAgICAgICAgcHl0aG9uOiAncHknLFxuICAgICAgICAgICAgcHk6ICdweScsXG4gICAgICAgICAgICBqYXZhc2NyaXB0OiAnanMnLFxuICAgICAgICAgICAganM6ICdqcycsXG4gICAgICAgICAgICB0eXBlc2NyaXB0OiAndHMnLFxuICAgICAgICAgICAgdHM6ICd0cydcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZXh0ZW5zaW9uc1tsYW5ndWFnZS50b0xvd2VyQ2FzZSgpXSB8fCAndHh0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgc2x1Z2lmaWVkIGZpbGVuYW1lIGZyb20gdGl0bGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHNsdWdpZnkodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aXRsZVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5yZXBsYWNlQWxsKC9bXmEtejAtOVxccy1dL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1xccysvZywgJy0nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgTElDRU5TRS50eHQgZmlsZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTGljZW5zZUZpbGUobGljZW5zZTogc3RyaW5nLCBhdXRob3I/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBhdXRob3JTdWZmaXggPSBhdXRob3IgPyBgXFxuXFxuQXV0aG9yOiAke2F1dGhvcn1gIDogJyc7XG4gICAgICAgIHJldHVybiBgJHtsaWNlbnNlfSR7YXV0aG9yU3VmZml4fWA7XG4gICAgfVxufVxuIl19