@dollhousemcp/mcp-server 1.7.4 → 1.8.1

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 (43) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/README.github.md +90 -1
  3. package/README.md +1 -1
  4. package/README.md.backup +90 -1
  5. package/README.npm.md +1 -1
  6. package/dist/collection/CollectionBrowser.js +2 -2
  7. package/dist/collection/CollectionSearch.js +3 -3
  8. package/dist/collection/PersonaDetails.js +2 -2
  9. package/dist/config/ConfigManager.d.ts +20 -0
  10. package/dist/config/ConfigManager.d.ts.map +1 -1
  11. package/dist/config/ConfigManager.js +48 -4
  12. package/dist/generated/version.d.ts +2 -2
  13. package/dist/generated/version.js +3 -3
  14. package/dist/handlers/ConfigHandler.d.ts +30 -0
  15. package/dist/handlers/ConfigHandler.d.ts.map +1 -1
  16. package/dist/handlers/ConfigHandler.js +149 -21
  17. package/dist/index.d.ts +4 -6
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +73 -52
  20. package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -1
  21. package/dist/portfolio/GitHubPortfolioIndexer.js +8 -5
  22. package/dist/portfolio/PortfolioIndexManager.d.ts +1 -1
  23. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  24. package/dist/portfolio/PortfolioRepoManager.d.ts +16 -2
  25. package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -1
  26. package/dist/portfolio/PortfolioRepoManager.js +95 -18
  27. package/dist/portfolio/PortfolioSyncManager.d.ts.map +1 -1
  28. package/dist/portfolio/PortfolioSyncManager.js +23 -15
  29. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  30. package/dist/security/audit/config/suppressions.js +11 -1
  31. package/dist/server/ServerSetup.d.ts.map +1 -1
  32. package/dist/server/ServerSetup.js +11 -6
  33. package/dist/server/tools/CollectionTools.js +6 -6
  34. package/dist/server/tools/ConfigTools.js +2 -2
  35. package/dist/server/tools/ConfigToolsV2.js +5 -5
  36. package/dist/server/tools/PortfolioTools.d.ts.map +1 -1
  37. package/dist/server/tools/PortfolioTools.js +16 -5
  38. package/dist/server/types.d.ts +2 -0
  39. package/dist/server/types.d.ts.map +1 -1
  40. package/dist/server/types.js +1 -1
  41. package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -1
  42. package/dist/tools/portfolio/submitToPortfolioTool.js +6 -5
  43. package/package.json +7 -6
@@ -24,8 +24,13 @@ export class ConfigManager {
24
24
  backupPath;
25
25
  config = null;
26
26
  constructor() {
27
- // Initialize paths
28
- this.configDir = path.join(os.homedir(), '.dollhouse');
27
+ // Initialize paths - use test directory if in test environment
28
+ if (process.env.NODE_ENV === 'test' && process.env.TEST_CONFIG_DIR) {
29
+ this.configDir = process.env.TEST_CONFIG_DIR;
30
+ }
31
+ else {
32
+ this.configDir = path.join(os.homedir(), '.dollhouse');
33
+ }
29
34
  this.configPath = path.join(this.configDir, 'config.yml');
30
35
  this.backupPath = path.join(this.configDir, 'config.yml.backup');
31
36
  }
@@ -52,6 +57,31 @@ export class ConfigManager {
52
57
  ConfigManager.instanceLock = false;
53
58
  return ConfigManager.instance;
54
59
  }
60
+ /**
61
+ * Reset the singleton instance for testing purposes only.
62
+ * This method is ONLY available in test environments to enable proper test isolation.
63
+ *
64
+ * IMPORTANT: This follows industry-standard patterns used by Google, Facebook, Microsoft
65
+ * for testing singleton classes. The method is protected by an environment check to
66
+ * ensure it cannot be called in production.
67
+ *
68
+ * @throws Error if called outside test environment
69
+ */
70
+ static resetForTesting() {
71
+ // Security check: only allow in test environment
72
+ if (process.env.NODE_ENV !== 'test') {
73
+ const errorMsg = 'ConfigManager.resetForTesting() can only be called in test environment';
74
+ console.error(errorMsg);
75
+ throw new Error(errorMsg);
76
+ }
77
+ // Reset the singleton instance
78
+ ConfigManager.instance = null;
79
+ ConfigManager.instanceLock = false;
80
+ // Log for debugging (only in test environment with DEBUG flag)
81
+ if (process.env.DEBUG) {
82
+ console.log('[TEST] ConfigManager singleton reset');
83
+ }
84
+ }
55
85
  /**
56
86
  * Get default configuration
57
87
  */
@@ -66,7 +96,7 @@ export class ConfigManager {
66
96
  github: {
67
97
  portfolio: {
68
98
  repository_url: null,
69
- repository_name: 'dollhouse-portfolio',
99
+ repository_name: process.env.TEST_GITHUB_REPO || 'dollhouse-portfolio',
70
100
  default_branch: 'main',
71
101
  auto_create: true
72
102
  },
@@ -118,6 +148,10 @@ export class ConfigManager {
118
148
  },
119
149
  verbose_logging: false,
120
150
  show_progress: true
151
+ },
152
+ wizard: {
153
+ completed: false,
154
+ dismissed: false
121
155
  }
122
156
  };
123
157
  }
@@ -504,6 +538,11 @@ export class ConfigManager {
504
538
  }
505
539
  }
506
540
  }
541
+ // Fix wizard settings
542
+ if (this.config.wizard) {
543
+ this.config.wizard.completed = fixBoolean(this.config.wizard.completed);
544
+ this.config.wizard.dismissed = fixBoolean(this.config.wizard.dismissed);
545
+ }
507
546
  }
508
547
  /**
509
548
  * Merge partial config with defaults
@@ -575,6 +614,11 @@ export class ConfigManager {
575
614
  };
576
615
  result.display.verbose_logging = result.display.verbose_logging ?? defaults.display.verbose_logging;
577
616
  result.display.show_progress = result.display.show_progress ?? defaults.display.show_progress;
617
+ // Wizard section
618
+ result.wizard = {
619
+ ...defaults.wizard,
620
+ ...result.wizard
621
+ };
578
622
  return result;
579
623
  }
580
624
  /**
@@ -752,4 +796,4 @@ export class ConfigManager {
752
796
  });
753
797
  }
754
798
  }
755
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvQ29uZmlnTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQXlHbkUsTUFBTSxPQUFPLGFBQWE7SUFDaEIsTUFBTSxDQUFDLFFBQVEsR0FBeUIsSUFBSSxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxZQUFZLEdBQVksS0FBSyxDQUFDO0lBRXJDLFNBQVMsQ0FBUztJQUNsQixVQUFVLENBQVM7SUFDbkIsVUFBVSxDQUFTO0lBQ25CLE1BQU0sR0FBMkIsSUFBSSxDQUFDO0lBRTlDO1FBQ0UsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsV0FBVztRQUN2QixJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzQixP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LE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDMUIsTUFBTSxFQUFFLENBQUM7WUFDVCxTQUFTLEVBQUUsR0FBRztZQUNkLE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uZmlnTWFuYWdlciAtIENlbnRyYWxpemVkIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBmb3IgRG9sbGhvdXNlTUNQXG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBZQU1MLWJhc2VkIGNvbmZpZ3VyYXRpb24gZmlsZVxuICogLSBEZWZhdWx0IHZhbHVlcyB3aXRoIHVzZXIgb3ZlcnJpZGVzXG4gKiAtIE1pZ3JhdGlvbiBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICogLSBWYWxpZGF0aW9uIGFuZCB0eXBlIHNhZmV0eVxuICogLSBBdG9taWMgdXBkYXRlcyB3aXRoIGJhY2t1cFxuICogLSBQcml2YWN5LWZpcnN0IGRlZmF1bHRzXG4gKiAtIE9BdXRoIGNsaWVudCBJRCBzdG9yYWdlIGZvciBDbGF1ZGUgRGVza3RvcCBpbnRlZ3JhdGlvblxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQ29uZmlnIHtcbiAgdXNlcm5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGVtYWlsOiBzdHJpbmcgfCBudWxsO1xuICBkaXNwbGF5X25hbWU6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViUG9ydGZvbGlvQ29uZmlnIHtcbiAgcmVwb3NpdG9yeV91cmw6IHN0cmluZyB8IG51bGw7XG4gIHJlcG9zaXRvcnlfbmFtZTogc3RyaW5nO1xuICBkZWZhdWx0X2JyYW5jaDogc3RyaW5nO1xuICBhdXRvX2NyZWF0ZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJBdXRoQ29uZmlnIHtcbiAgdXNlX29hdXRoOiBib29sZWFuO1xuICB0b2tlbl9zb3VyY2U6ICdlbnZpcm9ubWVudCcgfCAnb2F1dGgnIHwgJ2NvbmZpZyc7XG4gIGNsaWVudF9pZD86IHN0cmluZzsgLy8gT0F1dGggY2xpZW50IElEIGZvciBHaXRIdWIgQXBwXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViQ29uZmlnIHtcbiAgcG9ydGZvbGlvOiBHaXRIdWJQb3J0Zm9saW9Db25maWc7XG4gIGF1dGg6IEdpdEh1YkF1dGhDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3luY0luZGl2aWR1YWxDb25maWcge1xuICByZXF1aXJlX2NvbmZpcm1hdGlvbjogYm9vbGVhbjtcbiAgc2hvd19kaWZmX2JlZm9yZV9zeW5jOiBib29sZWFuO1xuICB0cmFja192ZXJzaW9uczogYm9vbGVhbjtcbiAga2VlcF9oaXN0b3J5OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3luY0J1bGtDb25maWcge1xuICB1cGxvYWRfZW5hYmxlZDogYm9vbGVhbjtcbiAgZG93bmxvYWRfZW5hYmxlZDogYm9vbGVhbjtcbiAgcmVxdWlyZV9wcmV2aWV3OiBib29sZWFuO1xuICByZXNwZWN0X2xvY2FsX29ubHk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1ByaXZhY3lDb25maWcge1xuICBzY2FuX2Zvcl9zZWNyZXRzOiBib29sZWFuO1xuICBzY2FuX2Zvcl9waWk6IGJvb2xlYW47XG4gIHdhcm5fb25fc2Vuc2l0aXZlOiBib29sZWFuO1xuICBleGNsdWRlZF9wYXR0ZXJuczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3luY0NvbmZpZyB7XG4gIGVuYWJsZWQ6IGJvb2xlYW47XG4gIGluZGl2aWR1YWw6IFN5bmNJbmRpdmlkdWFsQ29uZmlnO1xuICBidWxrOiBTeW5jQnVsa0NvbmZpZztcbiAgcHJpdmFjeTogU3luY1ByaXZhY3lDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkNvbmZpZyB7XG4gIGF1dG9fc3VibWl0OiBib29sZWFuO1xuICByZXF1aXJlX3JldmlldzogYm9vbGVhbjtcbiAgYWRkX2F0dHJpYnV0aW9uOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRzQ29uZmlnIHtcbiAgYXV0b19hY3RpdmF0ZToge1xuICAgIHBlcnNvbmFzPzogc3RyaW5nW107XG4gICAgc2tpbGxzPzogc3RyaW5nW107XG4gICAgdGVtcGxhdGVzPzogc3RyaW5nW107XG4gICAgYWdlbnRzPzogc3RyaW5nW107XG4gICAgbWVtb3JpZXM/OiBzdHJpbmdbXTtcbiAgICBlbnNlbWJsZXM/OiBzdHJpbmdbXTtcbiAgfTtcbiAgZGVmYXVsdF9lbGVtZW50X2Rpcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc3BsYXlDb25maWcge1xuICBwZXJzb25hX2luZGljYXRvcnM6IHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIHN0eWxlOiAnZnVsbCcgfCAnbWluaW1hbCcgfCAnY29tcGFjdCcgfCAnY3VzdG9tJztcbiAgICBpbmNsdWRlX2Vtb2ppOiBib29sZWFuO1xuICB9O1xuICB2ZXJib3NlX2xvZ2dpbmc6IGJvb2xlYW47XG4gIHNob3dfcHJvZ3Jlc3M6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9sbGhvdXNlQ29uZmlnIHtcbiAgdmVyc2lvbjogc3RyaW5nO1xuICB1c2VyOiBVc2VyQ29uZmlnO1xuICBnaXRodWI6IEdpdEh1YkNvbmZpZztcbiAgc3luYzogU3luY0NvbmZpZztcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZztcbiAgZWxlbWVudHM6IEVsZW1lbnRzQ29uZmlnO1xuICBkaXNwbGF5OiBEaXNwbGF5Q29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ1VwZGF0ZVJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgcHJldmlvdXNWYWx1ZT86IGFueTtcbiAgbmV3VmFsdWU/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnQWN0aW9uUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkYXRhPzogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmlnTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb25maWdNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlTG9jazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY29uZmlnRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgY29uZmlnUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGJhY2t1cFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBjb25maWc6IERvbGxob3VzZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBwYXRoc1xuICAgIHRoaXMuY29uZmlnRGlyID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5kb2xsaG91c2UnKTtcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBwYXRoLmpvaW4odGhpcy5jb25maWdEaXIsICdjb25maWcueW1sJyk7XG4gICAgdGhpcy5iYWNrdXBQYXRoID0gcGF0aC5qb2luKHRoaXMuY29uZmlnRGlyLCAnY29uZmlnLnltbC5iYWNrdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJlYWQtc2FmZSBzaW5nbGV0b24gaW5zdGFuY2UgZ2V0dGVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IENvbmZpZ01hbmFnZXIge1xuICAgIGlmIChDb25maWdNYW5hZ2VyLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gQ29uZmlnTWFuYWdlci5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvLyBTaW1wbGUgbG9ja2luZyBtZWNoYW5pc20gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBpZiAoQ29uZmlnTWFuYWdlci5pbnN0YW5jZUxvY2spIHtcbiAgICAgIC8vIFdhaXQgZm9yIGxvY2sgdG8gYmUgcmVsZWFzZWQsIHRoZW4gcmV0dXJuIHRoZSBpbnN0YW5jZVxuICAgICAgd2hpbGUgKENvbmZpZ01hbmFnZXIuaW5zdGFuY2VMb2NrICYmICFDb25maWdNYW5hZ2VyLmluc3RhbmNlKSB7XG4gICAgICAgIC8vIEluIGEgcmVhbCBzY2VuYXJpbyB3aXRoIGFzeW5jIG9wZXJhdGlvbnMsIHRoaXMgd291bGQgYmUgbW9yZSBzb3BoaXN0aWNhdGVkXG4gICAgICAgIC8vIEJ1dCBmb3IgdGhlIHRlc3QgY2FzZXMsIHRoaXMgc2ltcGxlIGFwcHJvYWNoIHdvcmtzXG4gICAgICB9XG4gICAgICByZXR1cm4gQ29uZmlnTWFuYWdlci5pbnN0YW5jZSE7XG4gICAgfVxuXG4gICAgQ29uZmlnTWFuYWdlci5pbnN0YW5jZUxvY2sgPSB0cnVlO1xuICAgIFxuICAgIGlmICghQ29uZmlnTWFuYWdlci5pbnN0YW5jZSkge1xuICAgICAgQ29uZmlnTWFuYWdlci5pbnN0YW5jZSA9IG5ldyBDb25maWdNYW5hZ2VyKCk7XG4gICAgfVxuICAgIFxuICAgIENvbmZpZ01hbmFnZXIuaW5zdGFuY2VMb2NrID0gZmFsc2U7XG4gICAgcmV0dXJuIENvbmZpZ01hbmFnZXIuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRlZmF1bHQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXREZWZhdWx0Q29uZmlnKCk6IERvbGxob3VzZUNvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICB1c2VyOiB7XG4gICAgICAgIHVzZXJuYW1lOiBudWxsLFxuICAgICAgICBlbWFpbDogbnVsbCxcbiAgICAgICAgZGlzcGxheV9uYW1lOiBudWxsXG4gICAgICB9LFxuICAgICAgZ2l0aHViOiB7XG4gICAgICAgIHBvcnRmb2xpbzoge1xuICAgICAgICAgIHJlcG9zaXRvcnlfdXJsOiBudWxsLFxuICAgICAgICAgIHJlcG9zaXRvcnlfbmFtZTogJ2RvbGxob3VzZS1wb3J0Zm9saW8nLFxuICAgICAgICAgIGRlZmF1bHRfYnJhbmNoOiAnbWFpbicsXG4gICAgICAgICAgYXV0b19jcmVhdGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgIHVzZV9vYXV0aDogdHJ1ZSxcbiAgICAgICAgICB0b2tlbl9zb3VyY2U6ICdlbnZpcm9ubWVudCdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN5bmM6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsIC8vIFByaXZhY3kgZmlyc3QgLSBvZmYgYnkgZGVmYXVsdFxuICAgICAgICBpbmRpdmlkdWFsOiB7XG4gICAgICAgICAgcmVxdWlyZV9jb25maXJtYXRpb246IHRydWUsXG4gICAgICAgICAgc2hvd19kaWZmX2JlZm9yZV9zeW5jOiB0cnVlLFxuICAgICAgICAgIHRyYWNrX3ZlcnNpb25zOiB0cnVlLFxuICAgICAgICAgIGtlZXBfaGlzdG9yeTogMTBcbiAgICAgICAgfSxcbiAgICAgICAgYnVsazoge1xuICAgICAgICAgIHVwbG9hZF9lbmFibGVkOiBmYWxzZSwgLy8gUmVxdWlyZXMgZXhwbGljaXQgZW5hYmxlbWVudFxuICAgICAgICAgIGRvd25sb2FkX2VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIHJlcXVpcmVfcHJldmlldzogdHJ1ZSxcbiAgICAgICAgICByZXNwZWN0X2xvY2FsX29ubHk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgcHJpdmFjeToge1xuICAgICAgICAgIHNjYW5fZm9yX3NlY3JldHM6IHRydWUsXG4gICAgICAgICAgc2Nhbl9mb3JfcGlpOiB0cnVlLFxuICAgICAgICAgIHdhcm5fb25fc2Vuc2l0aXZlOiB0cnVlLFxuICAgICAgICAgIGV4Y2x1ZGVkX3BhdHRlcm5zOiBbXG4gICAgICAgICAgICAnKi5zZWNyZXQnLFxuICAgICAgICAgICAgJyotcHJpdmF0ZS4qJyxcbiAgICAgICAgICAgICdjcmVkZW50aWFscy8qKicsXG4gICAgICAgICAgICAncGVyc29uYWwvKionXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY29sbGVjdGlvbjoge1xuICAgICAgICBhdXRvX3N1Ym1pdDogZmFsc2UsIC8vIE5ldmVyIGF1dG8tc3VibWl0XG4gICAgICAgIHJlcXVpcmVfcmV2aWV3OiB0cnVlLFxuICAgICAgICBhZGRfYXR0cmlidXRpb246IHRydWVcbiAgICAgIH0sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICBhdXRvX2FjdGl2YXRlOiB7fSxcbiAgICAgICAgZGVmYXVsdF9lbGVtZW50X2RpcjogcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAncG9ydGZvbGlvJylcbiAgICAgIH0sXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIHBlcnNvbmFfaW5kaWNhdG9yczoge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgc3R5bGU6ICdtaW5pbWFsJyxcbiAgICAgICAgICBpbmNsdWRlX2Vtb2ppOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHZlcmJvc2VfbG9nZ2luZzogZmFsc2UsXG4gICAgICAgIHNob3dfcHJvZ3Jlc3M6IHRydWVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQWx3YXlzIHJlbG9hZCBjb25maWcgZnJvbSBkaXNrIGlmIGl0IGV4aXN0cywgZXZlbiBpZiB3ZSBoYXZlIGRlZmF1bHRzIGluIG1lbW9yeVxuICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBwaWNrIHVwIGFueSBtYW51YWwgZWRpdHMgb3Igc2F2ZWQgc2V0dGluZ3NcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGNvbmZpZyBkaXJlY3RvcnkgZXhpc3RzIHdpdGggcHJvcGVyIHBlcm1pc3Npb25zICgwbzcwMCA9IG93bmVyIG9ubHkpXG4gICAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLmNvbmZpZ0RpciwgeyByZWN1cnNpdmU6IHRydWUsIG1vZGU6IDBvNzAwIH0pO1xuICAgICAgXG4gICAgICAvLyBMb2FkIG9yIGNyZWF0ZSBjb25maWdcbiAgICAgIGlmIChhd2FpdCB0aGlzLmNvbmZpZ0V4aXN0cygpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZENvbmZpZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGRlZmF1bHQgY29uZmlnXG4gICAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBUcnkgdG8gbWlncmF0ZSBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgICAgICBhd2FpdCB0aGlzLm1pZ3JhdGVGcm9tRW52aXJvbm1lbnQoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNhdmUgdGhlIGNvbmZpZ1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci5pbmZvKCdDcmVhdGVkIG5ldyBjb25maWd1cmF0aW9uIGZpbGUnLCB7XG4gICAgICAgICAgcGF0aDogdGhpcy5jb25maWdQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24nLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgLy8gVXNlIGRlZmF1bHRzIGluIG1lbW9yeVxuICAgICAgdGhpcy5jb25maWcgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIGZyb20gZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5jb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICAgIFxuICAgICAgLyoqXG4gICAgICAgKiBJTVBPUlRBTlQ6IFBhcnNlciBTZWxlY3Rpb24gZm9yIERpZmZlcmVudCBGaWxlIFR5cGVzXG4gICAgICAgKiBcbiAgICAgICAqIFdlIHVzZSBESUZGRVJFTlQgcGFyc2VycyBmb3IgZGlmZmVyZW50IGZpbGUgdHlwZXM6XG4gICAgICAgKiBcbiAgICAgICAqIDEuIGpzLXlhbWwgKHVzZWQgaGVyZSkgLSBGb3IgUFVSRSBZQU1MIGZpbGVzOlxuICAgICAgICogICAgLSBDb25maWd1cmF0aW9uIGZpbGVzIChjb25maWcueW1sKVxuICAgICAgICogICAgLSBEYXRhIGZpbGVzIHdpdGhvdXQgbWFya2Rvd24gY29udGVudFxuICAgICAgICogICAgLSBBbnkgLnltbCBvciAueWFtbCBmaWxlIHRoYXQncyBqdXN0IFlBTUxcbiAgICAgICAqICAgIEV4YW1wbGUgZm9ybWF0OlxuICAgICAgICogICAgYGBgeWFtbFxuICAgICAgICogICAgdmVyc2lvbjogMS4wLjBcbiAgICAgICAqICAgIHVzZXI6XG4gICAgICAgKiAgICAgIHVzZXJuYW1lOiBqb2huZG9lXG4gICAgICAgKiAgICAgIGVtYWlsOiBqb2huQGV4YW1wbGUuY29tXG4gICAgICAgKiAgICBgYGBcbiAgICAgICAqIFxuICAgICAgICogMi4gU2VjdXJlWWFtbFBhcnNlciAtIEZvciBNQVJLRE9XTiBmaWxlcyB3aXRoIFlBTUwgZnJvbnRtYXR0ZXI6XG4gICAgICAgKiAgICAtIFBlcnNvbmEgZmlsZXMgKCoubWQgaW4gcGVyc29uYXMvKVxuICAgICAgICogICAgLSBTa2lsbCBmaWxlcyAoKi5tZCBpbiBza2lsbHMvKVxuICAgICAgICogICAgLSBUZW1wbGF0ZSBmaWxlcyAoKi5tZCBpbiB0ZW1wbGF0ZXMvKVxuICAgICAgICogICAgLSBBbnkgLm1kIGZpbGUgd2l0aCBmcm9udG1hdHRlciBiZXR3ZWVuIC0tLSBtYXJrZXJzXG4gICAgICAgKiAgICBFeGFtcGxlIGZvcm1hdDpcbiAgICAgICAqICAgIGBgYG1hcmtkb3duXG4gICAgICAgKiAgICAtLS1cbiAgICAgICAqICAgIG5hbWU6IENyZWF0aXZlIFdyaXRlclxuICAgICAgICogICAgZGVzY3JpcHRpb246IEEgY3JlYXRpdmUgYXNzaXN0YW50XG4gICAgICAgKiAgICAtLS1cbiAgICAgICAqICAgICMgSW5zdHJ1Y3Rpb25zXG4gICAgICAgKiAgICBZb3UgYXJlIGEgY3JlYXRpdmUgd3JpdGVyLi4uXG4gICAgICAgKiAgICBgYGBcbiAgICAgICAqIFxuICAgICAgICogVGhlIGNvbmZpZyBmaWxlIGlzIFBVUkUgWUFNTCwgc28gd2UgdXNlIGpzLXlhbWwgZGlyZWN0bHkgd2l0aCBGQUlMU0FGRV9TQ0hFTUFcbiAgICAgICAqIGZvciBzZWN1cml0eSAocHJldmVudHMgY29kZSBleGVjdXRpb24gdmlhIFlBTUwgdGFncykuXG4gICAgICAgKiBTRUNVUklUWTogVGhpcyBpcyBOT1QgYSB2dWxuZXJhYmlsaXR5IC0gRkFJTFNBRkVfU0NIRU1BIHByZXZlbnRzIGNvZGUgZXhlY3V0aW9uXG4gICAgICAgKi9cbiAgICAgIGxldCBsb2FkZWREYXRhOiBhbnk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBVc2luZyB5YW1sIHdpdGggRkFJTFNBRkVfU0NIRU1BIGlzIHNlY3VyZSAtIHByZXZlbnRzIGNvZGUgZXhlY3V0aW9uXG4gICAgICAgIGxvYWRlZERhdGEgPSB5YW1sLmxvYWQoY29udGVudCwge1xuICAgICAgICAgIHNjaGVtYTogeWFtbC5GQUlMU0FGRV9TQ0hFTUEgLy8gU2FmZSBzY2hlbWEgcHJldmVudHMgY29kZSBleGVjdXRpb25cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoICh5YW1sRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFlBTUwgaW4gY29uZmlndXJhdGlvbiBmaWxlOiAke3lhbWxFcnJvciBpbnN0YW5jZW9mIEVycm9yID8geWFtbEVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoeWFtbEVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKCFsb2FkZWREYXRhIHx8IHR5cGVvZiBsb2FkZWREYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29uZmlndXJhdGlvbiBmb3JtYXQnKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZygnTG9hZGVkIGNvbmZpZyBmcm9tIGZpbGUnLCB7XG4gICAgICAgIHVzZXJuYW1lOiBsb2FkZWREYXRhLnVzZXI/LnVzZXJuYW1lLFxuICAgICAgICBlbWFpbDogbG9hZGVkRGF0YS51c2VyPy5lbWFpbCxcbiAgICAgICAgc3luY0VuYWJsZWQ6IGxvYWRlZERhdGEuc3luYz8uZW5hYmxlZFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZVdpdGhEZWZhdWx0cyhsb2FkZWREYXRhKTtcbiAgICAgIFxuICAgICAgLy8gRml4IGFueSBzdHJpbmcgYm9vbGVhbnMgdGhhdCBtaWdodCBoYXZlIGJlZW4gc2F2ZWQgaW5jb3JyZWN0bHlcbiAgICAgIHRoaXMuZml4Q29uZmlnVHlwZXMoKTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdDb25maWd1cmF0aW9uIGxvYWRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHVzZXJuYW1lOiB0aGlzLmNvbmZpZy51c2VyLnVzZXJuYW1lLFxuICAgICAgICBzeW5jRW5hYmxlZDogdGhpcy5jb25maWcuc3luYy5lbmFibGVkXG4gICAgICB9KTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGNvbmZpZ3VyYXRpb24nLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNvbmZpZyBmaWxlIGV4aXN0c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb25maWdFeGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aGlzLmNvbmZpZ1BhdGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgT0F1dGggY2xpZW50IElEXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBjb25maWcgZmlsZVxuICAgKi9cbiAgcHVibGljIGdldEdpdEh1YkNsaWVudElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIENoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlIGZpcnN0XG4gICAgY29uc3QgZW52Q2xpZW50SWQgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfR0lUSFVCX0NMSUVOVF9JRDtcbiAgICBpZiAoZW52Q2xpZW50SWQpIHtcbiAgICAgIHJldHVybiBlbnZDbGllbnRJZDtcbiAgICB9XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gY29uZmlnIGZpbGVcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LmdpdGh1Yj8uYXV0aD8uY2xpZW50X2lkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IEdpdEh1YiBPQXV0aCBjbGllbnQgSUQgaW4gY29uZmlnIGZpbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRHaXRIdWJDbGllbnRJZChjbGllbnRJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFDb25maWdNYW5hZ2VyLnZhbGlkYXRlQ2xpZW50SWQoY2xpZW50SWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIEdpdEh1YiBjbGllbnQgSUQgZm9ybWF0LiBFeHBlY3RlZCBmb3JtYXQ6IE92MjNsaSBmb2xsb3dlZCBieSBhdCBsZWFzdCAxNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyAoZS5nLiwgT3YyM2xpQUJDREVGR0hJSktMTU4pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBnaXRodWIuYXV0aCBvYmplY3QgZXhpc3RzXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5naXRodWIpIHtcbiAgICAgIHRoaXMuY29uZmlnLmdpdGh1YiA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpLmdpdGh1YjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5naXRodWIuYXV0aCkge1xuICAgICAgdGhpcy5jb25maWcuZ2l0aHViLmF1dGggPSB0aGlzLmdldERlZmF1bHRDb25maWcoKS5naXRodWIuYXV0aDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZy5naXRodWIuYXV0aC5jbGllbnRfaWQgPSBjbGllbnRJZDtcbiAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGdldENvbmZpZygpOiBEb2xsaG91c2VDb25maWcge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNwZWNpZmljIHNldHRpbmcgdXNpbmcgZG90IG5vdGF0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0U2V0dGluZzxUPihwYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCB2YWx1ZTogYW55ID0gdGhpcy5jb25maWc7XG4gICAgXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB2YWx1ZSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHNwZWNpZmljIHNldHRpbmcgdXNpbmcgZG90IG5vdGF0aW9uXG4gICAqIFNFQ1VSSVRZIEZJWCAoUFIgIzg5NSk6IEFkZGVkIHByb3RvdHlwZSBwb2xsdXRpb24gcHJvdGVjdGlvblxuICAgKiBQcmV2aW91c2x5OiBEaXJlY3QgcHJvcGVydHkgYXNzaWdubWVudCBhbGxvd2VkIF9fcHJvdG9fXyBpbmplY3Rpb25cbiAgICogTm93OiBWYWxpZGF0ZXMga2V5cyBhZ2FpbnN0IGZvcmJpZGRlbiBwcm9wZXJ0aWVzIGJlZm9yZSBhc3NpZ25tZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlU2V0dGluZyhwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPENvbmZpZ1VwZGF0ZVJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBhbGwga2V5cyB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICBjb25zdCBGT1JCSURERU5fS0VZUyA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChGT1JCSURERU5fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yYmlkZGVuIHByb3BlcnR5IGluIHBhdGg6ICR7a2V5fWApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsZXQgY3VycmVudDogYW55ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuZ2V0U2V0dGluZyhwYXRoKTtcbiAgICBcbiAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgcGFyZW50IG9iamVjdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgICAgY3VycmVudFtrZXldID0ge307XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXQgdGhlIHZhbHVlXG4gICAgY29uc3QgbGFzdEtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICBjdXJyZW50W2xhc3RLZXldID0gdmFsdWU7XG4gICAgXG4gICAgLy8gU2F2ZSB0aGUgY29uZmlndXJhdGlvblxuICAgIGF3YWl0IHRoaXMuc2F2ZUNvbmZpZygpO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdDb25maWd1cmF0aW9uIHNldHRpbmcgdXBkYXRlZCcsIHtcbiAgICAgIHBhdGgsXG4gICAgICBwcmV2aW91c1ZhbHVlLFxuICAgICAgbmV3VmFsdWU6IHZhbHVlXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlOiBgU2V0dGluZyAnJHtwYXRofScgdXBkYXRlZCBzdWNjZXNzZnVsbHlgLFxuICAgICAgcHJldmlvdXNWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlOiB2YWx1ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgR2l0SHViIE9BdXRoIGNsaWVudCBJRCBmb3JtYXRcbiAgICogQ2xpZW50IElEcyBzdGFydCB3aXRoIFwiT3YyM2xpXCIgZm9sbG93ZWQgYnkgYXQgbGVhc3QgMTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICogXG4gICAqIEBwYXJhbSBjbGllbnRJZCAtIFRoZSBjbGllbnQgSUQgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBDb25maWdNYW5hZ2VyLnZhbGlkYXRlQ2xpZW50SWQoXCJPdjIzbGlBQkNERUZHSElKS0xNTjEyMzQ1NlwiKSAvLyB0cnVlXG4gICAqIENvbmZpZ01hbmFnZXIudmFsaWRhdGVDbGllbnRJZChcImludmFsaWRcIikgLy8gZmFsc2VcbiAgICogQ29uZmlnTWFuYWdlci52YWxpZGF0ZUNsaWVudElkKFwiT3YyM2xpXCIpIC8vIGZhbHNlICh0b28gc2hvcnQpXG4gICAqIENvbmZpZ01hbmFnZXIudmFsaWRhdGVDbGllbnRJZChcIlh2MjNsaUFCQ0RFRkdISUpLTE1OXCIpIC8vIGZhbHNlICh3cm9uZyBwcmVmaXgpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZhbGlkYXRlQ2xpZW50SWQoY2xpZW50SWQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgY2xpZW50SWQgIT09ICdzdHJpbmcnIHx8ICFjbGllbnRJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEdpdEh1YiBPQXV0aCBjbGllbnQgSURzIGZvbGxvdyB0aGUgcGF0dGVybjogT3YyM2xpW0EtWmEtejAtOV17MTQsfVxuICAgIGNvbnN0IGNsaWVudElkUGF0dGVybiA9IC9eT3YyM2xpW0EtWmEtejAtOV17MTQsfSQvO1xuICAgIHJldHVybiBjbGllbnRJZFBhdHRlcm4udGVzdChjbGllbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjb25maWd1cmF0aW9uIHRvIGZpbGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUNvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbmZpZ3VyYXRpb24gdG8gc2F2ZScpO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGJhY2t1cCBvZiBleGlzdGluZyBjb25maWdcbiAgICAgIGlmIChhd2FpdCB0aGlzLmNvbmZpZ0V4aXN0cygpKSB7XG4gICAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKHRoaXMuY29uZmlnUGF0aCwgdGhpcy5iYWNrdXBQYXRoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ29udmVydCB0byBZQU1MXG4gICAgICAvLyBOb3RlOiBXZSB1c2UganMteWFtbCdzIGR1bXAoKSBmb3IgcHVyZSBZQU1MIG91dHB1dCAobm8gZnJvbnRtYXR0ZXIgbWFya2VycylcbiAgICAgIC8vIFRoaXMgY3JlYXRlcyBhIHN0YW5kYXJkIFlBTUwgZmlsZSwgbm90IGEgbWFya2Rvd24gZmlsZSB3aXRoIGZyb250bWF0dGVyXG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcCh0aGlzLmNvbmZpZywge1xuICAgICAgICBpbmRlbnQ6IDIsXG4gICAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiBmYWxzZVxuICAgICAgICAvLyBVc2luZyBkZWZhdWx0IHNjaGVtYSAobm90IEZBSUxTQUZFKSBmb3IgZHVtcCB0byBwcmVzZXJ2ZSB0eXBlcyBsaWtlIGJvb2xlYW5zXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gV3JpdGUgYXRvbWljYWxseSB3aXRoIHByb3BlciBwZXJtaXNzaW9ucyAoMG82MDAgPSBvd25lciByZWFkL3dyaXRlIG9ubHkpXG4gICAgICBjb25zdCB0ZW1wUGF0aCA9IGAke3RoaXMuY29uZmlnUGF0aH0udG1wYDtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wUGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcsIG1vZGU6IDBvNjAwIH0pO1xuICAgICAgYXdhaXQgZnMucmVuYW1lKHRlbXBQYXRoLCB0aGlzLmNvbmZpZ1BhdGgpO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ0NvbmZpZ3VyYXRpb24gc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICBcbiAgICAgIC8vIExvZyBhdWRpdCBldmVudCBmb3IgY29uZmlndXJhdGlvbiB1cGRhdGVcbiAgICAgIGxvZ2dlci5kZWJ1ZygnQ29uZmlndXJhdGlvbiB1cGRhdGUgYXVkaXQnLCB7XG4gICAgICAgIGV2ZW50OiAnQ09ORklHX1VQREFURUQnLFxuICAgICAgICBzb3VyY2U6ICdDb25maWdNYW5hZ2VyLnNhdmVDb25maWcnLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgICAgfSk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gc2F2ZSBjb25maWd1cmF0aW9uJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gVHJ5IHRvIHJlc3RvcmUgYmFja3VwXG4gICAgICBpZiAoYXdhaXQgdGhpcy5iYWNrdXBFeGlzdHMoKSkge1xuICAgICAgICBhd2FpdCBmcy5jb3B5RmlsZSh0aGlzLmJhY2t1cFBhdGgsIHRoaXMuY29uZmlnUGF0aCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZXN0b3JlZCBjb25maWd1cmF0aW9uIGZyb20gYmFja3VwJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBiYWNrdXAgZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJhY2t1cEV4aXN0cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKHRoaXMuYmFja3VwUGF0aCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRml4IGluY29ycmVjdCB0eXBlcyBpbiBjb25maWcgKGUuZy4sIHN0cmluZyBib29sZWFucywgc3RyaW5nIFwibnVsbFwiKVxuICAgKi9cbiAgcHJpdmF0ZSBmaXhDb25maWdUeXBlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSByZXR1cm47XG4gICAgXG4gICAgLy8gSGVscGVyIHRvIGNvbnZlcnQgc3RyaW5nIFwibnVsbFwiIHRvIGFjdHVhbCBudWxsXG4gICAgY29uc3QgZml4TnVsbCA9ICh2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJ251bGwnIHx8IHZhbHVlID09PSAnTlVMTCcpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgXG4gICAgLy8gSGVscGVyIHRvIGNvbnZlcnQgc3RyaW5nIGJvb2xlYW5zIHRvIGFjdHVhbCBib29sZWFuc1xuICAgIGNvbnN0IGZpeEJvb2xlYW4gPSAodmFsdWU6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBsb3dlciA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChsb3dlciA9PT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGxvd2VyID09PSAnZmFsc2UnKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBcbiAgICAvLyBGaXggdXNlciBmaWVsZHMgLSBoYW5kbGUgc3RyaW5nIFwibnVsbFwiIHZhbHVlc1xuICAgIGlmICh0aGlzLmNvbmZpZy51c2VyKSB7XG4gICAgICB0aGlzLmNvbmZpZy51c2VyLnVzZXJuYW1lID0gZml4TnVsbCh0aGlzLmNvbmZpZy51c2VyLnVzZXJuYW1lKTtcbiAgICAgIHRoaXMuY29uZmlnLnVzZXIuZW1haWwgPSBmaXhOdWxsKHRoaXMuY29uZmlnLnVzZXIuZW1haWwpO1xuICAgICAgdGhpcy5jb25maWcudXNlci5kaXNwbGF5X25hbWUgPSBmaXhOdWxsKHRoaXMuY29uZmlnLnVzZXIuZGlzcGxheV9uYW1lKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRml4IHN5bmMgc2V0dGluZ3NcbiAgICBpZiAodGhpcy5jb25maWcuc3luYykge1xuICAgICAgdGhpcy5jb25maWcuc3luYy5lbmFibGVkID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmVuYWJsZWQpO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuaW5kaXZpZHVhbC5yZXF1aXJlX2NvbmZpcm1hdGlvbiA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnJlcXVpcmVfY29uZmlybWF0aW9uKTtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnNob3dfZGlmZl9iZWZvcmVfc3luYyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnNob3dfZGlmZl9iZWZvcmVfc3luYyk7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuaW5kaXZpZHVhbC50cmFja192ZXJzaW9ucyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnRyYWNrX3ZlcnNpb25zKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRoaXMuY29uZmlnLnN5bmMuYnVsaykge1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLmJ1bGsudXBsb2FkX2VuYWJsZWQgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMuYnVsay51cGxvYWRfZW5hYmxlZCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuYnVsay5kb3dubG9hZF9lbmFibGVkID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmJ1bGsuZG93bmxvYWRfZW5hYmxlZCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuYnVsay5yZXF1aXJlX3ByZXZpZXcgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMuYnVsay5yZXF1aXJlX3ByZXZpZXcpO1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLmJ1bGsucmVzcGVjdF9sb2NhbF9vbmx5ID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmJ1bGsucmVzcGVjdF9sb2NhbF9vbmx5KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRoaXMuY29uZmlnLnN5bmMucHJpdmFjeSkge1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kuc2Nhbl9mb3Jfc2VjcmV0cyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5wcml2YWN5LnNjYW5fZm9yX3NlY3JldHMpO1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kuc2Nhbl9mb3JfcGlpID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kuc2Nhbl9mb3JfcGlpKTtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5wcml2YWN5Lndhcm5fb25fc2Vuc2l0aXZlID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kud2Fybl9vbl9zZW5zaXRpdmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBGaXggY29sbGVjdGlvbiBzZXR0aW5nc1xuICAgIGlmICh0aGlzLmNvbmZpZy5jb2xsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbmZpZy5jb2xsZWN0aW9uLmF1dG9fc3VibWl0ID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5jb2xsZWN0aW9uLmF1dG9fc3VibWl0KTtcbiAgICAgIHRoaXMuY29uZmlnLmNvbGxlY3Rpb24ucmVxdWlyZV9yZXZpZXcgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmNvbGxlY3Rpb24ucmVxdWlyZV9yZXZpZXcpO1xuICAgICAgdGhpcy5jb25maWcuY29sbGVjdGlvbi5hZGRfYXR0cmlidXRpb24gPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmNvbGxlY3Rpb24uYWRkX2F0dHJpYnV0aW9uKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRml4IGRpc3BsYXkgc2V0dGluZ3NcbiAgICBpZiAodGhpcy5jb25maWcuZGlzcGxheSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzLmVuYWJsZWQgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzLmVuYWJsZWQpO1xuICAgICAgICB0aGlzLmNvbmZpZy5kaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9ycy5pbmNsdWRlX2Vtb2ppID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5kaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9ycy5pbmNsdWRlX2Vtb2ppKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZmlnLmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5kaXNwbGF5LnZlcmJvc2VfbG9nZ2luZyk7XG4gICAgICB0aGlzLmNvbmZpZy5kaXNwbGF5LnNob3dfcHJvZ3Jlc3MgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmRpc3BsYXkuc2hvd19wcm9ncmVzcyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEZpeCBnaXRodWIgc2V0dGluZ3NcbiAgICBpZiAodGhpcy5jb25maWcuZ2l0aHViKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuZ2l0aHViLnBvcnRmb2xpbykge1xuICAgICAgICB0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvLnJlcG9zaXRvcnlfdXJsID0gZml4TnVsbCh0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvLnJlcG9zaXRvcnlfdXJsKTtcbiAgICAgICAgdGhpcy5jb25maWcuZ2l0aHViLnBvcnRmb2xpby5hdXRvX2NyZWF0ZSA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuZ2l0aHViLnBvcnRmb2xpby5hdXRvX2NyZWF0ZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25maWcuZ2l0aHViLmF1dGgpIHtcbiAgICAgICAgdGhpcy5jb25maWcuZ2l0aHViLmF1dGgudXNlX29hdXRoID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5naXRodWIuYXV0aC51c2Vfb2F1dGgpO1xuICAgICAgICAvLyBGaXggY2xpZW50X2lkIGlmIGl0J3MgYSBzdHJpbmcgXCJudWxsXCJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmdpdGh1Yi5hdXRoLmNsaWVudF9pZCkge1xuICAgICAgICAgIHRoaXMuY29uZmlnLmdpdGh1Yi5hdXRoLmNsaWVudF9pZCA9IGZpeE51bGwodGhpcy5jb25maWcuZ2l0aHViLmF1dGguY2xpZW50X2lkKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgcGFydGlhbCBjb25maWcgd2l0aCBkZWZhdWx0c1xuICAgKiBcbiAgICogSU1QT1JUQU5UOiBUaGlzIGZ1bmN0aW9uIHByZXNlcnZlcyB1bmtub3duIGZpZWxkcyBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKiBJZiBhIGZ1dHVyZSB2ZXJzaW9uIGFkZHMgbmV3IGNvbmZpZyBmaWVsZHMsIG9sZGVyIHZlcnNpb25zIHdvbid0IGxvc2UgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgbWVyZ2VXaXRoRGVmYXVsdHMocGFydGlhbDogUGFydGlhbDxEb2xsaG91c2VDb25maWc+KTogRG9sbGhvdXNlQ29uZmlnIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpO1xuICAgIFxuICAgIC8vIFN0YXJ0IHdpdGggYSBkZWVwIGNsb25lIG9mIHBhcnRpYWwgdG8gcHJlc2VydmUgYWxsIHVua25vd24gZmllbGRzXG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBhcnRpYWwpKTtcbiAgICBcbiAgICAvLyBFbnN1cmUgYWxsIHJlcXVpcmVkIGZpZWxkcyBleGlzdCB3aXRoIGRlZmF1bHRzXG4gICAgcmVzdWx0LnZlcnNpb24gPSByZXN1bHQudmVyc2lvbiB8fCBkZWZhdWx0cy52ZXJzaW9uO1xuICAgIFxuICAgIC8vIFVzZXIgc2VjdGlvbiAtIHByZXNlcnZlIHVua25vd24gZmllbGRzIHdoaWxlIGVuc3VyaW5nIHJlcXVpcmVkIGZpZWxkc1xuICAgIHJlc3VsdC51c2VyID0ge1xuICAgICAgLi4ucmVzdWx0LnVzZXIsXG4gICAgICB1c2VybmFtZTogcmVzdWx0LnVzZXI/LnVzZXJuYW1lID8/IGRlZmF1bHRzLnVzZXIudXNlcm5hbWUsXG4gICAgICBlbWFpbDogcmVzdWx0LnVzZXI/LmVtYWlsID8/IGRlZmF1bHRzLnVzZXIuZW1haWwsXG4gICAgICBkaXNwbGF5X25hbWU6IHJlc3VsdC51c2VyPy5kaXNwbGF5X25hbWUgPz8gZGVmYXVsdHMudXNlci5kaXNwbGF5X25hbWVcbiAgICB9O1xuICAgIFxuICAgIC8vIEdpdEh1YiBzZWN0aW9uIC0gZGVlcCBtZXJnZSBwcmVzZXJ2aW5nIHVua25vd24gZmllbGRzXG4gICAgaWYgKCFyZXN1bHQuZ2l0aHViKSByZXN1bHQuZ2l0aHViID0ge307XG4gICAgcmVzdWx0LmdpdGh1Yi5wb3J0Zm9saW8gPSB7XG4gICAgICAuLi5kZWZhdWx0cy5naXRodWIucG9ydGZvbGlvLFxuICAgICAgLi4ucmVzdWx0LmdpdGh1Yi5wb3J0Zm9saW9cbiAgICB9O1xuICAgIHJlc3VsdC5naXRodWIuYXV0aCA9IHtcbiAgICAgIC4uLmRlZmF1bHRzLmdpdGh1Yi5hdXRoLFxuICAgICAgLi4ucmVzdWx0LmdpdGh1Yi5hdXRoXG4gICAgfTtcbiAgICBcbiAgICAvLyBTeW5jIHNlY3Rpb24gLSBwcmVzZXJ2ZSB1bmtub3duIGZpZWxkcyBhdCBhbGwgbGV2ZWxzXG4gICAgaWYgKCFyZXN1bHQuc3luYykgcmVzdWx0LnN5bmMgPSB7fTtcbiAgICByZXN1bHQuc3luYy5lbmFibGVkID0gcmVzdWx0LnN5bmMuZW5hYmxlZCA/PyBkZWZhdWx0cy5zeW5jLmVuYWJsZWQ7XG4gICAgcmVzdWx0LnN5bmMuaW5kaXZpZHVhbCA9IHtcbiAgICAgIC4uLmRlZmF1bHRzLnN5bmMuaW5kaXZpZHVhbCxcbiAgICAgIC4uLnJlc3VsdC5zeW5jLmluZGl2aWR1YWxcbiAgICB9O1xuICAgIHJlc3VsdC5zeW5jLmJ1bGsgPSB7XG4gICAgICAuLi5kZWZhdWx0cy5zeW5jLmJ1bGssXG4gICAgICAuLi5yZXN1bHQuc3luYy5idWxrXG4gICAgfTtcbiAgICByZXN1bHQuc3luYy5wcml2YWN5ID0ge1xuICAgICAgLi4uZGVmYXVsdHMuc3luYy5wcml2YWN5LFxuICAgICAgLi4ucmVzdWx0LnN5bmMucHJpdmFjeSxcbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5cyAtIHVzZSBwcm92aWRlZCBvciBkZWZhdWx0XG4gICAgICBleGNsdWRlZF9wYXR0ZXJuczogcmVzdWx0LnN5bmMucHJpdmFjeT8uZXhjbHVkZWRfcGF0dGVybnMgfHwgZGVmYXVsdHMuc3luYy5wcml2YWN5LmV4Y2x1ZGVkX3BhdHRlcm5zXG4gICAgfTtcbiAgICBcbiAgICAvLyBDb2xsZWN0aW9uIHNlY3Rpb25cbiAgICByZXN1bHQuY29sbGVjdGlvbiA9IHtcbiAgICAgIC4uLmRlZmF1bHRzLmNvbGxlY3Rpb24sXG4gICAgICAuLi5yZXN1bHQuY29sbGVjdGlvblxuICAgIH07XG4gICAgXG4gICAgLy8gRWxlbWVudHMgc2VjdGlvblxuICAgIGlmICghcmVzdWx0LmVsZW1lbnRzKSByZXN1bHQuZWxlbWVudHMgPSB7fTtcbiAgICByZXN1bHQuZWxlbWVudHMgPSB7XG4gICAgICAuLi5yZXN1bHQuZWxlbWVudHMsXG4gICAgICBhdXRvX2FjdGl2YXRlOiByZXN1bHQuZWxlbWVudHMuYXV0b19hY3RpdmF0ZSB8fCBkZWZhdWx0cy5lbGVtZW50cy5hdXRvX2FjdGl2YXRlLFxuICAgICAgZGVmYXVsdF9lbGVtZW50X2RpcjogcmVzdWx0LmVsZW1lbnRzLmRlZmF1bHRfZWxlbWVudF9kaXIgfHwgZGVmYXVsdHMuZWxlbWVudHMuZGVmYXVsdF9lbGVtZW50X2RpclxuICAgIH07XG4gICAgXG4gICAgLy8gRGlzcGxheSBzZWN0aW9uXG4gICAgaWYgKCFyZXN1bHQuZGlzcGxheSkgcmVzdWx0LmRpc3BsYXkgPSB7fTtcbiAgICByZXN1bHQuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMgPSB7XG4gICAgICAuLi5kZWZhdWx0cy5kaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9ycyxcbiAgICAgIC4uLnJlc3VsdC5kaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9yc1xuICAgIH07XG4gICAgcmVzdWx0LmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nID0gcmVzdWx0LmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nID8/IGRlZmF1bHRzLmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nO1xuICAgIHJlc3VsdC5kaXNwbGF5LnNob3dfcHJvZ3Jlc3MgPSByZXN1bHQuZGlzcGxheS5zaG93X3Byb2dyZXNzID8/IGRlZmF1bHRzLmRpc3BsYXkuc2hvd19wcm9ncmVzcztcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0IGFzIERvbGxob3VzZUNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBNaWdyYXRlIHNldHRpbmdzIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1pZ3JhdGVGcm9tRW52aXJvbm1lbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IG1pZ3JhdGVkID0gZmFsc2U7XG4gICAgXG4gICAgLy8gTWlncmF0ZSB1c2VyIHNldHRpbmdzXG4gICAgaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9VU0VSICYmICF0aGlzLmNvbmZpZz8udXNlci51c2VybmFtZSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZykgdGhpcy5jb25maWcgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKTtcbiAgICAgIHRoaXMuY29uZmlnLnVzZXIudXNlcm5hbWUgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUjtcbiAgICAgIG1pZ3JhdGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTUFJTCAmJiAhdGhpcy5jb25maWc/LnVzZXIuZW1haWwpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZy51c2VyLmVtYWlsID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VNQUlMO1xuICAgICAgbWlncmF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBNaWdyYXRlIHBvcnRmb2xpbyBVUkxcbiAgICBpZiAocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1BPUlRGT0xJT19VUkwgJiYgIXRoaXMuY29uZmlnPy5naXRodWIucG9ydGZvbGlvLnJlcG9zaXRvcnlfdXJsKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlnKSB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpO1xuICAgICAgdGhpcy5jb25maWcuZ2l0aHViLnBvcnRmb2xpby5yZXBvc2l0b3J5X3VybCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9QT1JURk9MSU9fVVJMO1xuICAgICAgbWlncmF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBNaWdyYXRlIGNvbGxlY3Rpb24gYXV0by1zdWJtaXRcbiAgICBpZiAocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0FVVE9fU1VCTUlUX1RPX0NPTExFQ1RJT04gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZykgdGhpcy5jb25maWcgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKTtcbiAgICAgIHRoaXMuY29uZmlnLmNvbGxlY3Rpb24uYXV0b19zdWJtaXQgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfQVVUT19TVUJNSVRfVE9fQ09MTEVDVElPTiA9PT0gJ3RydWUnO1xuICAgICAgbWlncmF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBcbiAgICBpZiAobWlncmF0ZWQpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdNaWdyYXRlZCBzZXR0aW5ncyBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBjb25maWd1cmF0aW9uIHRvIGRlZmF1bHRzXG4gICAqIFNFQ1VSSVRZIEZJWCAoUFIgIzg5NSk6IEFkZGVkIHByb3RvdHlwZSBwb2xsdXRpb24gcHJvdGVjdGlvblxuICAgKiBQcmV2aW91c2x5OiBEaXJlY3QgcHJvcGVydHkgYXNzaWdubWVudCBhbGxvd2VkIF9fcHJvdG9fXyBpbmplY3Rpb25cbiAgICogTm93OiBWYWxpZGF0ZXMga2V5cyBhZ2FpbnN0IGZvcmJpZGRlbiBwcm9wZXJ0aWVzIGJlZm9yZSBhc3NpZ25tZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVzZXRDb25maWcoc2VjdGlvbj86IHN0cmluZyk6IFByb21pc2U8Q29uZmlnQWN0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKTtcbiAgICBcbiAgICBpZiAoc2VjdGlvbikge1xuICAgICAgLy8gUmVzZXQgc3BlY2lmaWMgc2VjdGlvblxuICAgICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGRlZmF1bHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbktleXMgPSBzZWN0aW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBTRUNVUklUWTogVmFsaWRhdGUgYWxsIGtleXMgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgICAgIGNvbnN0IEZPUkJJRERFTl9LRVlTID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNlY3Rpb25LZXlzKSB7XG4gICAgICAgICAgaWYgKEZPUkJJRERFTl9LRVlTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yYmlkZGVuIHByb3BlcnR5IGluIHNlY3Rpb246ICR7a2V5fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGN1cnJlbnQ6IGFueSA9IHRoaXMuY29uZmlnO1xuICAgICAgICBsZXQgZGVmYXVsdFNlY3Rpb246IGFueSA9IGRlZmF1bHRzO1xuICAgICAgICBcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWN0aW9uS2V5cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtzZWN0aW9uS2V5c1tpXV07XG4gICAgICAgICAgZGVmYXVsdFNlY3Rpb24gPSBkZWZhdWx0U2VjdGlvbltzZWN0aW9uS2V5c1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSBzZWN0aW9uS2V5c1tzZWN0aW9uS2V5cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY3VycmVudFtsYXN0S2V5XSA9IGRlZmF1bHRTZWN0aW9uW2xhc3RLZXldO1xuICAgICAgfVxuICAgICAgXG4gICAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYFNlY3Rpb24gJyR7c2VjdGlvbn0nIHJlc2V0IHRvIGRlZmF1bHRzYFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzZXQgZW50aXJlIGNvbmZpZ1xuICAgICAgdGhpcy5jb25maWcgPSBkZWZhdWx0cztcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZUNvbmZpZygpO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiAnQ29uZmlndXJhdGlvbiByZXNldCB0byBkZWZhdWx0cydcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBjb25maWd1cmF0aW9uIHRvIGZpbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleHBvcnRDb25maWcoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Q29uZmlnQWN0aW9uUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6ICdObyBjb25maWd1cmF0aW9uIHRvIGV4cG9ydCdcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcCh0aGlzLmNvbmZpZywge1xuICAgICAgICBpbmRlbnQ6IDIsXG4gICAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcsIG1vZGU6IDBvNjAwIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiBgQ29uZmlndXJhdGlvbiBleHBvcnRlZCB0byAke2ZpbGVQYXRofWBcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIGV4cG9ydCBjb25maWd1cmF0aW9uOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbXBvcnRDb25maWcoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Q29uZmlnQWN0aW9uUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIGFuZCB2YWxpZGF0ZVxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShjb250ZW50LCB7XG4gICAgICAgIG1heFlhbWxTaXplOiA2NCAqIDEwMjQsXG4gICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmICghcGFyc2VkLmRhdGEgfHwgdHlwZW9mIHBhcnNlZC5kYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGNvbmZpZ3VyYXRpb24gZm9ybWF0IGluIGltcG9ydCBmaWxlJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBNZXJnZSB3aXRoIGRlZmF1bHRzXG4gICAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VXaXRoRGVmYXVsdHMocGFyc2VkLmRhdGEgYXMgUGFydGlhbDxEb2xsaG91c2VDb25maWc+KTtcbiAgICAgIFxuICAgICAgLy8gU2F2ZSB0aGUgaW1wb3J0ZWQgY29uZmlnXG4gICAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYENvbmZpZ3VyYXRpb24gaW1wb3J0ZWQgZnJvbSAke2ZpbGVQYXRofWBcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIGltcG9ydCBjb25maWd1cmF0aW9uOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZm9ybWF0dGVkIGNvbmZpZyBmb3IgZGlzcGxheVxuICAgKi9cbiAgcHVibGljIGdldEZvcm1hdHRlZENvbmZpZyhzZWN0aW9uPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICByZXR1cm4gJ0NvbmZpZ3VyYXRpb24gbm90IGluaXRpYWxpemVkJztcbiAgICB9XG4gICAgXG4gICAgbGV0IGNvbmZpZ1RvU2hvdzogYW55ID0gdGhpcy5jb25maWc7XG4gICAgXG4gICAgaWYgKHNlY3Rpb24pIHtcbiAgICAgIGNvbmZpZ1RvU2hvdyA9IHRoaXMuZ2V0U2V0dGluZyhzZWN0aW9uKTtcbiAgICAgIGlmICghY29uZmlnVG9TaG93KSB7XG4gICAgICAgIHJldHVybiBgU2VjdGlvbiAnJHtzZWN0aW9ufScgbm90IGZvdW5kYDtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gUmVtb3ZlIHNlbnNpdGl2ZSBkYXRhIGZvciBkaXNwbGF5XG4gICAgY29uc3Qgc2FuaXRpemVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb25maWdUb1Nob3cpKTtcbiAgICBcbiAgICAvLyBEb24ndCBzaG93IHRva2VucyBpZiB0aGV5IGV4aXN0XG4gICAgaWYgKHNhbml0aXplZC5naXRodWI/LmF1dGg/LnRva2VuKSB7XG4gICAgICBzYW5pdGl6ZWQuZ2l0aHViLmF1dGgudG9rZW4gPSAnKioqUkVEQUNURUQqKionO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4geWFtbC5kdW1wKHNhbml0aXplZCwge1xuICAgICAgaW5kZW50OiAyLFxuICAgICAgbGluZVdpZHRoOiAxMjAsXG4gICAgICBub1JlZnM6IHRydWUsXG4gICAgICBzb3J0S2V5czogZmFsc2VcbiAgICB9KTtcbiAgfVxufSJdfQ==
799
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvQ29uZmlnTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQW1IbkUsTUFBTSxPQUFPLGFBQWE7SUFDaEIsTUFBTSxDQUFDLFFBQVEsR0FBeUIsSUFBSSxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxZQUFZLEdBQVksS0FBSyxDQUFDO0lBRXJDLFNBQVMsQ0FBUztJQUNsQixVQUFVLENBQVM7SUFDbkIsVUFBVSxDQUFTO0lBQ25CLE1BQU0sR0FBMkIsSUFBSSxDQUFDO0lBRTlDO1FBQ0UsK0RBQStEO1FBQy9ELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbkUsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUMvQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFdBQVc7UUFDdkIsSUFBSSxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0IsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDO1FBQ2hDLENBQUM7UUFFRCxzREFBc0Q7UUFDdEQsSUFBSSxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDL0IseURBQXlEO1lBQ3pELE9BQU8sYUFBYSxDQUFDLFlBQVksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDN0QsNkVBQTZFO2dCQUM3RSxxREFBcUQ7WUFDdkQsQ0FBQztZQUNELE9BQU8sYUFBYSxDQUFDLFFBQVMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsYUFBYSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1QixhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFDL0MsQ0FBQztRQUVELGFBQWEsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ25DLE9BQU8sYUFBYSxDQUFDLFFBQVEsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksTUFBTSxDQUFDLGVBQWU7UUFDM0IsaURBQWlEO1FBQ2pELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDcEMsTUFBTSxRQUFRLEdBQUcsd0VBQXdFLENBQUM7WUFDMUYsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDOUIsYUFBYSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFFbkMsK0RBQStEO1FBQy9ELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQjtRQUN0QixPQUFPO1lBQ0wsT0FBTyxFQUFFLE9BQU87WUFDaEIsSUFBSSxFQUFFO2dCQUNKLFFBQVEsRUFBRSxJQUFJO2dCQUNkLEtBQUssRUFBRSxJQUFJO2dCQUNYLFlBQVksRUFBRSxJQUFJO2FBQ25CO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLFNBQVMsRUFBRTtvQkFDVCxjQUFjLEVBQUUsSUFBSTtvQkFDcEIsZUFBZSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLElBQUkscUJBQXFCO29CQUN0RSxjQUFjLEVBQUUsTUFBTTtvQkFDdEIsV0FBVyxFQUFFLElBQUk7aUJBQ2xCO2dCQUNELElBQUksRUFBRTtvQkFDSixTQUFTLEVBQUUsSUFBSTtvQkFDZixZQUFZLEVBQUUsYUFBYTtpQkFDNUI7YUFDRjtZQUNELElBQUksRUFBRTtnQkFDSixPQUFPLEVBQUUsS0FBSyxFQUFFLGlDQUFpQztnQkFDakQsVUFBVSxFQUFFO29CQUNWLG9CQUFvQixFQUFFLElBQUk7b0JBQzFCLHFCQUFxQixFQUFFLElBQUk7b0JBQzNCLGNBQWMsRUFBRSxJQUFJO29CQUNwQixZQUFZLEVBQUUsRUFBRTtpQkFDakI7Z0JBQ0QsSUFBSSxFQUFFO29CQUNKLGNBQWMsRUFBRSxLQUFLLEVBQUUsK0JBQStCO29CQUN0RCxnQkFBZ0IsRUFBRSxLQUFLO29CQUN2QixlQUFlLEVBQUUsSUFBSTtvQkFDckIsa0JBQWtCLEVBQUUsSUFBSTtpQkFDekI7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLGdCQUFnQixFQUFFLElBQUk7b0JBQ3RCLFlBQVksRUFBRSxJQUFJO29CQUNsQixpQkFBaUIsRUFBRSxJQUFJO29CQUN2QixpQkFBaUIsRUFBRTt3QkFDakIsVUFBVTt3QkFDVixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsYUFBYTtxQkFDZDtpQkFDRjthQUNGO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLFdBQVcsRUFBRSxLQUFLLEVBQUUsb0JBQW9CO2dCQUN4QyxjQUFjLEVBQUUsSUFBSTtnQkFDcEIsZUFBZSxFQUFFLElBQUk7YUFDdEI7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUM7YUFDeEU7WUFDRCxPQUFPLEVBQUU7Z0JBQ1Asa0JBQWtCLEVBQUU7b0JBQ2xCLE9BQU8sRUFBRSxJQUFJO29CQUNiLEtBQUssRUFBRSxTQUFTO29CQUNoQixhQUFhLEVBQUUsSUFBSTtpQkFDcEI7Z0JBQ0QsZUFBZSxFQUFFLEtBQUs7Z0JBQ3RCLGFBQWEsRUFBRSxJQUFJO2FBQ3BCO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixTQUFTLEVBQUUsS0FBSzthQUNqQjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixrRkFBa0Y7UUFDbEYsNkRBQTZEO1FBRTdELElBQUksQ0FBQztZQUNILDhFQUE4RTtZQUM5RSxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFakUsd0JBQXdCO1lBQ3hCLElBQUksTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHdCQUF3QjtnQkFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFFdEMsNENBQTRDO2dCQUM1QyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUVwQyxrQkFBa0I7Z0JBQ2xCLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUV4QixNQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFO29CQUM1QyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVU7aUJBQ3RCLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUU7Z0JBQ2pELEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQzlELENBQUMsQ0FBQztZQUNILHlCQUF5QjtZQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsVUFBVTtRQUN0QixJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7ZUFtQ0c7WUFDSCxJQUFJLFVBQWUsQ0FBQztZQUNwQixJQUFJLENBQUM7Z0JBQ0gsc0VBQXNFO2dCQUN0RSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLHNDQUFzQztpQkFDcEUsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sU0FBUyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLFNBQVMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0gsQ0FBQztZQUVELElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRTtnQkFDdEMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUTtnQkFDbkMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSztnQkFDN0IsV0FBVyxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTzthQUN0QyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVqRCxpRUFBaUU7WUFDakUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXRCLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUU7Z0JBQ2hELFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUNuQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTzthQUN0QyxDQUFDLENBQUM7UUFFTCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUU7Z0JBQzNDLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQzlELENBQUMsQ0FBQztZQUNILE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxZQUFZO1FBQ3hCLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGlCQUFpQjtRQUN0QixtQ0FBbUM7UUFDbkMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQztRQUMzRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxJQUFJLElBQUksQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBZ0I7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSxLQUFLLENBQ2IsdUlBQXVJLENBQ3hJLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3RELENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDaEUsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBSSxJQUFZLEVBQUUsWUFBZ0I7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLEtBQUssR0FBUSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTdCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDdkQsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxZQUFZLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUFDLElBQVksRUFBRSxLQUFVO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0IsNkRBQTZEO1FBQzdELE1BQU0sY0FBYyxHQUFHLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNqRSxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLEdBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVDLGdDQUFnQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDcEIsQ0FBQztZQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELGdCQUFnQjtRQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRXpCLHlCQUF5QjtRQUN6QixNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV4QixNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFO1lBQzNDLElBQUk7WUFDSixhQUFhO1lBQ2IsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLFlBQVksSUFBSSx3QkFBd0I7WUFDakQsYUFBYTtZQUNiLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQWE7UUFDMUMsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxxRUFBcUU7UUFDckUsTUFBTSxlQUFlLEdBQUcsMEJBQTBCLENBQUM7UUFDbkQsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxVQUFVO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxtQ0FBbUM7WUFDbkMsSUFBSSxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUVELGtCQUFrQjtZQUNsQiw4RUFBOEU7WUFDOUUsMEVBQTBFO1lBQzFFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDekMsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsU0FBUyxFQUFFLEdBQUc7Z0JBQ2QsTUFBTSxFQUFFLElBQUk7Z0JBQ1osUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsK0VBQStFO2FBQ2hGLENBQUMsQ0FBQztZQUVILDJFQUEyRTtZQUMzRSxNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLE1BQU0sQ0FBQztZQUMxQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDOUUsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFM0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBRWpELDJDQUEyQztZQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFO2dCQUN6QyxLQUFLLEVBQUUsZ0JBQWdCO2dCQUN2QixNQUFNLEVBQUUsMEJBQTBCO2dCQUNsQyxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDcEMsQ0FBQyxDQUFDO1FBRUwsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFO2dCQUMzQyxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUM5RCxDQUFDLENBQUM7WUFFSCx3QkFBd0I7WUFDeEIsSUFBSSxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBRUQsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVk7UUFDeEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFFekIsaURBQWlEO1FBQ2pELE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBVSxFQUFPLEVBQUU7WUFDbEMsSUFBSSxLQUFLLEtBQUssTUFBTSxJQUFJLEtBQUssS0FBSyxNQUFNO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ3RELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDO1FBRUYsdURBQXVEO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBVSxFQUFPLEVBQUU7WUFDckMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLEtBQUssS0FBSyxNQUFNO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUNsQyxJQUFJLEtBQUssS0FBSyxPQUFPO29CQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3RDLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQztRQUVGLGdEQUFnRDtRQUNoRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELG9CQUFvQjtRQUNwQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVoRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUNoSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNsSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdEcsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDeEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDNUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMxRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2xHLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNsRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzFGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDdEcsQ0FBQztRQUNILENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDNUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN0RixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbkcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xHLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2xGLHdDQUF3QztnQkFDeEMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUM7Z0JBQzlGLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxpQkFBaUIsQ0FBQyxPQUFpQztRQUN6RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV6QyxvRUFBb0U7UUFDcEUsTUFBTSxNQUFNLEdBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFeEQsaURBQWlEO1FBQ2pELE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDO1FBRXBELHdFQUF3RTtRQUN4RSxNQUFNLENBQUMsSUFBSSxHQUFHO1lBQ1osR0FBRyxNQUFNLENBQUMsSUFBSTtZQUNkLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDekQsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSztZQUNoRCxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZO1NBQ3RFLENBQUM7UUFFRix3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUc7WUFDeEIsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVM7WUFDNUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVM7U0FDM0IsQ0FBQztRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHO1lBQ25CLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQ3ZCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1NBQ3RCLENBQUM7UUFFRix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDbkUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDdkIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFDM0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVU7U0FDMUIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHO1lBQ2pCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQ3JCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJO1NBQ3BCLENBQUM7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNwQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztZQUN4QixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTztZQUN0Qix3REFBd0Q7WUFDeEQsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCO1NBQ3JHLENBQUM7UUFFRixxQkFBcUI7UUFDckIsTUFBTSxDQUFDLFVBQVUsR0FBRztZQUNsQixHQUFHLFFBQVEsQ0FBQyxVQUFVO1lBQ3RCLEdBQUcsTUFBTSxDQUFDLFVBQVU7U0FDckIsQ0FBQztRQUVGLG1CQUFtQjtRQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFBRSxNQUFNLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUMzQyxNQUFNLENBQUMsUUFBUSxHQUFHO1lBQ2hCLEdBQUcsTUFBTSxDQUFDLFFBQVE7WUFDbEIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYTtZQUMvRSxtQkFBbUIsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CO1NBQ2xHLENBQUM7UUFFRixrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDekMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsR0FBRztZQUNsQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCO1lBQ3RDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0I7U0FDckMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBQ3BHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBRTlGLGlCQUFpQjtRQUNqQixNQUFNLENBQUMsTUFBTSxHQUFHO1lBQ2QsR0FBRyxRQUFRLENBQUMsTUFBTTtZQUNsQixHQUFHLE1BQU0sQ0FBQyxNQUFNO1NBQ2pCLENBQUM7UUFFRixPQUFPLE1BQXlCLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLHNCQUFzQjtRQUNsQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFckIsd0JBQXdCO1FBQ3hCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07Z0JBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7WUFDdkQsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNsQixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtnQkFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUNyRCxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLENBQUM7UUFFRCx3QkFBd0I7UUFDeEIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pGLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtnQkFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztZQUNsRixRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLENBQUM7UUFFRCxpQ0FBaUM7UUFDakMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtnQkFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxLQUFLLE1BQU0sQ0FBQztZQUNoRyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLENBQUM7UUFFRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQWdCO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXpDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWix5QkFBeUI7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7WUFDekIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRXZDLDZEQUE2RDtnQkFDN0QsTUFBTSxjQUFjLEdBQUcsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUNqRSxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUM5QixJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsR0FBRyxFQUFFLENBQUMsQ0FBQztvQkFDM0QsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksT0FBTyxHQUFRLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLElBQUksY0FBYyxHQUFRLFFBQVEsQ0FBQztnQkFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ2hELE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xDLGNBQWMsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELENBQUM7Z0JBRUQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRXhCLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsT0FBTyxFQUFFLFlBQVksT0FBTyxxQkFBcUI7YUFDbEQsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sc0JBQXNCO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRXhCLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsT0FBTyxFQUFFLGlDQUFpQzthQUMzQyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBZ0I7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE9BQU8sRUFBRSw0QkFBNEI7YUFDdEMsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3pDLE1BQU0sRUFBRSxDQUFDO2dCQUNULFNBQVMsRUFBRSxHQUFHO2dCQUNkLE1BQU0sRUFBRSxJQUFJO2dCQUNaLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUMsQ0FBQztZQUVILE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUU5RSxPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJO2dCQUNiLE9BQU8sRUFBRSw2QkFBNkIsUUFBUSxFQUFFO2FBQ2pELENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLG1DQUFtQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7YUFDckcsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWdCO1FBQ3hDLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFckQscUJBQXFCO1lBQ3JCLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQzdDLFdBQVcsRUFBRSxFQUFFLEdBQUcsSUFBSTtnQkFDdEIsZUFBZSxFQUFFLEtBQUs7Z0JBQ3RCLGNBQWMsRUFBRSxLQUFLO2FBQ3RCLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDcEQsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxPQUFPLEVBQUUsNkNBQTZDO2lCQUN2RCxDQUFDO1lBQ0osQ0FBQztZQUVELHNCQUFzQjtZQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBZ0MsQ0FBQyxDQUFDO1lBRTlFLDJCQUEyQjtZQUMzQixNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUV4QixPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJO2dCQUNiLE9BQU8sRUFBRSwrQkFBK0IsUUFBUSxFQUFFO2FBQ25ELENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLG1DQUFtQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7YUFDckcsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxPQUFnQjtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE9BQU8sK0JBQStCLENBQUM7UUFDekMsQ0FBQztRQUVELElBQUksWUFBWSxHQUFRLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFcEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxZQUFZLE9BQU8sYUFBYSxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRTNELGtDQUFrQztRQUNsQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2xDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztRQUNqRCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUMxQixNQUFNLEVBQUUsQ0FBQztZQUNULFNBQVMsRUFBRSxHQUFHO1lBQ2QsTUFBTSxFQUFFLElBQUk7WUFDWixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb25maWdNYW5hZ2VyIC0gQ2VudHJhbGl6ZWQgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IGZvciBEb2xsaG91c2VNQ1BcbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIFlBTUwtYmFzZWQgY29uZmlndXJhdGlvbiBmaWxlXG4gKiAtIERlZmF1bHQgdmFsdWVzIHdpdGggdXNlciBvdmVycmlkZXNcbiAqIC0gTWlncmF0aW9uIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKiAtIFZhbGlkYXRpb24gYW5kIHR5cGUgc2FmZXR5XG4gKiAtIEF0b21pYyB1cGRhdGVzIHdpdGggYmFja3VwXG4gKiAtIFByaXZhY3ktZmlyc3QgZGVmYXVsdHNcbiAqIC0gT0F1dGggY2xpZW50IElEIHN0b3JhZ2UgZm9yIENsYXVkZSBEZXNrdG9wIGludGVncmF0aW9uXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDb25maWcge1xuICB1c2VybmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgZW1haWw6IHN0cmluZyB8IG51bGw7XG4gIGRpc3BsYXlfbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJQb3J0Zm9saW9Db25maWcge1xuICByZXBvc2l0b3J5X3VybDogc3RyaW5nIHwgbnVsbDtcbiAgcmVwb3NpdG9yeV9uYW1lOiBzdHJpbmc7XG4gIGRlZmF1bHRfYnJhbmNoOiBzdHJpbmc7XG4gIGF1dG9fY3JlYXRlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkF1dGhDb25maWcge1xuICB1c2Vfb2F1dGg6IGJvb2xlYW47XG4gIHRva2VuX3NvdXJjZTogJ2Vudmlyb25tZW50JyB8ICdvYXV0aCcgfCAnY29uZmlnJztcbiAgY2xpZW50X2lkPzogc3RyaW5nOyAvLyBPQXV0aCBjbGllbnQgSUQgZm9yIEdpdEh1YiBBcHBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJDb25maWcge1xuICBwb3J0Zm9saW86IEdpdEh1YlBvcnRmb2xpb0NvbmZpZztcbiAgYXV0aDogR2l0SHViQXV0aENvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jSW5kaXZpZHVhbENvbmZpZyB7XG4gIHJlcXVpcmVfY29uZmlybWF0aW9uOiBib29sZWFuO1xuICBzaG93X2RpZmZfYmVmb3JlX3N5bmM6IGJvb2xlYW47XG4gIHRyYWNrX3ZlcnNpb25zOiBib29sZWFuO1xuICBrZWVwX2hpc3Rvcnk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jQnVsa0NvbmZpZyB7XG4gIHVwbG9hZF9lbmFibGVkOiBib29sZWFuO1xuICBkb3dubG9hZF9lbmFibGVkOiBib29sZWFuO1xuICByZXF1aXJlX3ByZXZpZXc6IGJvb2xlYW47XG4gIHJlc3BlY3RfbG9jYWxfb25seTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jUHJpdmFjeUNvbmZpZyB7XG4gIHNjYW5fZm9yX3NlY3JldHM6IGJvb2xlYW47XG4gIHNjYW5fZm9yX3BpaTogYm9vbGVhbjtcbiAgd2Fybl9vbl9zZW5zaXRpdmU6IGJvb2xlYW47XG4gIGV4Y2x1ZGVkX3BhdHRlcm5zOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW5jQ29uZmlnIHtcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgaW5kaXZpZHVhbDogU3luY0luZGl2aWR1YWxDb25maWc7XG4gIGJ1bGs6IFN5bmNCdWxrQ29uZmlnO1xuICBwcml2YWN5OiBTeW5jUHJpdmFjeUNvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ29uZmlnIHtcbiAgYXV0b19zdWJtaXQ6IGJvb2xlYW47XG4gIHJlcXVpcmVfcmV2aWV3OiBib29sZWFuO1xuICBhZGRfYXR0cmlidXRpb246IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudHNDb25maWcge1xuICBhdXRvX2FjdGl2YXRlOiB7XG4gICAgcGVyc29uYXM/OiBzdHJpbmdbXTtcbiAgICBza2lsbHM/OiBzdHJpbmdbXTtcbiAgICB0ZW1wbGF0ZXM/OiBzdHJpbmdbXTtcbiAgICBhZ2VudHM/OiBzdHJpbmdbXTtcbiAgICBtZW1vcmllcz86IHN0cmluZ1tdO1xuICAgIGVuc2VtYmxlcz86IHN0cmluZ1tdO1xuICB9O1xuICBkZWZhdWx0X2VsZW1lbnRfZGlyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGxheUNvbmZpZyB7XG4gIHBlcnNvbmFfaW5kaWNhdG9yczoge1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgc3R5bGU6ICdmdWxsJyB8ICdtaW5pbWFsJyB8ICdjb21wYWN0JyB8ICdjdXN0b20nO1xuICAgIGluY2x1ZGVfZW1vamk6IGJvb2xlYW47XG4gIH07XG4gIHZlcmJvc2VfbG9nZ2luZzogYm9vbGVhbjtcbiAgc2hvd19wcm9ncmVzczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXphcmRDb25maWcge1xuICBjb21wbGV0ZWQ6IGJvb2xlYW47ICAgICAgLy8gV2l6YXJkIHdhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkXG4gIGRpc21pc3NlZDogYm9vbGVhbjsgICAgICAvLyBVc2VyIGNob3NlIFwiRG9uJ3Qgc2hvdyBhZ2FpblwiXG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nOyAgICAvLyBJU08gdGltZXN0YW1wIHdoZW4gY29tcGxldGVkXG4gIHZlcnNpb24/OiBzdHJpbmc7ICAgICAgICAvLyBXaXphcmQgdmVyc2lvbiBmb3IgZnV0dXJlIHVwZGF0ZXMgKGRlcHJlY2F0ZWQgLSB1c2UgbGFzdFNlZW5WZXJzaW9uKVxuICBsYXN0U2VlblZlcnNpb24/OiBzdHJpbmc7IC8vIExhc3QgdmVyc2lvbiB3aGVyZSB1c2VyIHNhdyB0aGUgd2l6YXJkXG4gIHNraXBwZWRTZWN0aW9ucz86IHN0cmluZ1tdOyAvLyBUcmFjayB3aGljaCBzZWN0aW9ucyB3ZXJlIHNraXBwZWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb2xsaG91c2VDb25maWcge1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHVzZXI6IFVzZXJDb25maWc7XG4gIGdpdGh1YjogR2l0SHViQ29uZmlnO1xuICBzeW5jOiBTeW5jQ29uZmlnO1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uQ29uZmlnO1xuICBlbGVtZW50czogRWxlbWVudHNDb25maWc7XG4gIGRpc3BsYXk6IERpc3BsYXlDb25maWc7XG4gIHdpemFyZDogV2l6YXJkQ29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ1VwZGF0ZVJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgcHJldmlvdXNWYWx1ZT86IGFueTtcbiAgbmV3VmFsdWU/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnQWN0aW9uUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkYXRhPzogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmlnTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb25maWdNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlTG9jazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY29uZmlnRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgY29uZmlnUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGJhY2t1cFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBjb25maWc6IERvbGxob3VzZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBwYXRocyAtIHVzZSB0ZXN0IGRpcmVjdG9yeSBpZiBpbiB0ZXN0IGVudmlyb25tZW50XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcgJiYgcHJvY2Vzcy5lbnYuVEVTVF9DT05GSUdfRElSKSB7XG4gICAgICB0aGlzLmNvbmZpZ0RpciA9IHByb2Nlc3MuZW52LlRFU1RfQ09ORklHX0RJUjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWdEaXIgPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmRvbGxob3VzZScpO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBwYXRoLmpvaW4odGhpcy5jb25maWdEaXIsICdjb25maWcueW1sJyk7XG4gICAgdGhpcy5iYWNrdXBQYXRoID0gcGF0aC5qb2luKHRoaXMuY29uZmlnRGlyLCAnY29uZmlnLnltbC5iYWNrdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJlYWQtc2FmZSBzaW5nbGV0b24gaW5zdGFuY2UgZ2V0dGVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IENvbmZpZ01hbmFnZXIge1xuICAgIGlmIChDb25maWdNYW5hZ2VyLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gQ29uZmlnTWFuYWdlci5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvLyBTaW1wbGUgbG9ja2luZyBtZWNoYW5pc20gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBpZiAoQ29uZmlnTWFuYWdlci5pbnN0YW5jZUxvY2spIHtcbiAgICAgIC8vIFdhaXQgZm9yIGxvY2sgdG8gYmUgcmVsZWFzZWQsIHRoZW4gcmV0dXJuIHRoZSBpbnN0YW5jZVxuICAgICAgd2hpbGUgKENvbmZpZ01hbmFnZXIuaW5zdGFuY2VMb2NrICYmICFDb25maWdNYW5hZ2VyLmluc3RhbmNlKSB7XG4gICAgICAgIC8vIEluIGEgcmVhbCBzY2VuYXJpbyB3aXRoIGFzeW5jIG9wZXJhdGlvbnMsIHRoaXMgd291bGQgYmUgbW9yZSBzb3BoaXN0aWNhdGVkXG4gICAgICAgIC8vIEJ1dCBmb3IgdGhlIHRlc3QgY2FzZXMsIHRoaXMgc2ltcGxlIGFwcHJvYWNoIHdvcmtzXG4gICAgICB9XG4gICAgICByZXR1cm4gQ29uZmlnTWFuYWdlci5pbnN0YW5jZSE7XG4gICAgfVxuXG4gICAgQ29uZmlnTWFuYWdlci5pbnN0YW5jZUxvY2sgPSB0cnVlO1xuICAgIFxuICAgIGlmICghQ29uZmlnTWFuYWdlci5pbnN0YW5jZSkge1xuICAgICAgQ29uZmlnTWFuYWdlci5pbnN0YW5jZSA9IG5ldyBDb25maWdNYW5hZ2VyKCk7XG4gICAgfVxuICAgIFxuICAgIENvbmZpZ01hbmFnZXIuaW5zdGFuY2VMb2NrID0gZmFsc2U7XG4gICAgcmV0dXJuIENvbmZpZ01hbmFnZXIuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuICAgKiBUaGlzIG1ldGhvZCBpcyBPTkxZIGF2YWlsYWJsZSBpbiB0ZXN0IGVudmlyb25tZW50cyB0byBlbmFibGUgcHJvcGVyIHRlc3QgaXNvbGF0aW9uLlxuICAgKiBcbiAgICogSU1QT1JUQU5UOiBUaGlzIGZvbGxvd3MgaW5kdXN0cnktc3RhbmRhcmQgcGF0dGVybnMgdXNlZCBieSBHb29nbGUsIEZhY2Vib29rLCBNaWNyb3NvZnRcbiAgICogZm9yIHRlc3Rpbmcgc2luZ2xldG9uIGNsYXNzZXMuIFRoZSBtZXRob2QgaXMgcHJvdGVjdGVkIGJ5IGFuIGVudmlyb25tZW50IGNoZWNrIHRvXG4gICAqIGVuc3VyZSBpdCBjYW5ub3QgYmUgY2FsbGVkIGluIHByb2R1Y3Rpb24uXG4gICAqIFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGNhbGxlZCBvdXRzaWRlIHRlc3QgZW52aXJvbm1lbnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRGb3JUZXN0aW5nKCk6IHZvaWQge1xuICAgIC8vIFNlY3VyaXR5IGNoZWNrOiBvbmx5IGFsbG93IGluIHRlc3QgZW52aXJvbm1lbnRcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0Jykge1xuICAgICAgY29uc3QgZXJyb3JNc2cgPSAnQ29uZmlnTWFuYWdlci5yZXNldEZvclRlc3RpbmcoKSBjYW4gb25seSBiZSBjYWxsZWQgaW4gdGVzdCBlbnZpcm9ubWVudCc7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yTXNnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICBDb25maWdNYW5hZ2VyLmluc3RhbmNlID0gbnVsbDtcbiAgICBDb25maWdNYW5hZ2VyLmluc3RhbmNlTG9jayA9IGZhbHNlO1xuICAgIFxuICAgIC8vIExvZyBmb3IgZGVidWdnaW5nIChvbmx5IGluIHRlc3QgZW52aXJvbm1lbnQgd2l0aCBERUJVRyBmbGFnKVxuICAgIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgY29uc29sZS5sb2coJ1tURVNUXSBDb25maWdNYW5hZ2VyIHNpbmdsZXRvbiByZXNldCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGdldERlZmF1bHRDb25maWcoKTogRG9sbGhvdXNlQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdXNlcm5hbWU6IG51bGwsXG4gICAgICAgIGVtYWlsOiBudWxsLFxuICAgICAgICBkaXNwbGF5X25hbWU6IG51bGxcbiAgICAgIH0sXG4gICAgICBnaXRodWI6IHtcbiAgICAgICAgcG9ydGZvbGlvOiB7XG4gICAgICAgICAgcmVwb3NpdG9yeV91cmw6IG51bGwsXG4gICAgICAgICAgcmVwb3NpdG9yeV9uYW1lOiBwcm9jZXNzLmVudi5URVNUX0dJVEhVQl9SRVBPIHx8ICdkb2xsaG91c2UtcG9ydGZvbGlvJyxcbiAgICAgICAgICBkZWZhdWx0X2JyYW5jaDogJ21haW4nLFxuICAgICAgICAgIGF1dG9fY3JlYXRlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIGF1dGg6IHtcbiAgICAgICAgICB1c2Vfb2F1dGg6IHRydWUsXG4gICAgICAgICAgdG9rZW5fc291cmNlOiAnZW52aXJvbm1lbnQnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzeW5jOiB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLCAvLyBQcml2YWN5IGZpcnN0IC0gb2ZmIGJ5IGRlZmF1bHRcbiAgICAgICAgaW5kaXZpZHVhbDoge1xuICAgICAgICAgIHJlcXVpcmVfY29uZmlybWF0aW9uOiB0cnVlLFxuICAgICAgICAgIHNob3dfZGlmZl9iZWZvcmVfc3luYzogdHJ1ZSxcbiAgICAgICAgICB0cmFja192ZXJzaW9uczogdHJ1ZSxcbiAgICAgICAgICBrZWVwX2hpc3Rvcnk6IDEwXG4gICAgICAgIH0sXG4gICAgICAgIGJ1bGs6IHtcbiAgICAgICAgICB1cGxvYWRfZW5hYmxlZDogZmFsc2UsIC8vIFJlcXVpcmVzIGV4cGxpY2l0IGVuYWJsZW1lbnRcbiAgICAgICAgICBkb3dubG9hZF9lbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICByZXF1aXJlX3ByZXZpZXc6IHRydWUsXG4gICAgICAgICAgcmVzcGVjdF9sb2NhbF9vbmx5OiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHByaXZhY3k6IHtcbiAgICAgICAgICBzY2FuX2Zvcl9zZWNyZXRzOiB0cnVlLFxuICAgICAgICAgIHNjYW5fZm9yX3BpaTogdHJ1ZSxcbiAgICAgICAgICB3YXJuX29uX3NlbnNpdGl2ZTogdHJ1ZSxcbiAgICAgICAgICBleGNsdWRlZF9wYXR0ZXJuczogW1xuICAgICAgICAgICAgJyouc2VjcmV0JyxcbiAgICAgICAgICAgICcqLXByaXZhdGUuKicsXG4gICAgICAgICAgICAnY3JlZGVudGlhbHMvKionLFxuICAgICAgICAgICAgJ3BlcnNvbmFsLyoqJ1xuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgYXV0b19zdWJtaXQ6IGZhbHNlLCAvLyBOZXZlciBhdXRvLXN1Ym1pdFxuICAgICAgICByZXF1aXJlX3JldmlldzogdHJ1ZSxcbiAgICAgICAgYWRkX2F0dHJpYnV0aW9uOiB0cnVlXG4gICAgICB9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgYXV0b19hY3RpdmF0ZToge30sXG4gICAgICAgIGRlZmF1bHRfZWxlbWVudF9kaXI6IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ3BvcnRmb2xpbycpXG4gICAgICB9LFxuICAgICAgZGlzcGxheToge1xuICAgICAgICBwZXJzb25hX2luZGljYXRvcnM6IHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIHN0eWxlOiAnbWluaW1hbCcsXG4gICAgICAgICAgaW5jbHVkZV9lbW9qaTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICB2ZXJib3NlX2xvZ2dpbmc6IGZhbHNlLFxuICAgICAgICBzaG93X3Byb2dyZXNzOiB0cnVlXG4gICAgICB9LFxuICAgICAgd2l6YXJkOiB7XG4gICAgICAgIGNvbXBsZXRlZDogZmFsc2UsXG4gICAgICAgIGRpc21pc3NlZDogZmFsc2VcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQWx3YXlzIHJlbG9hZCBjb25maWcgZnJvbSBkaXNrIGlmIGl0IGV4aXN0cywgZXZlbiBpZiB3ZSBoYXZlIGRlZmF1bHRzIGluIG1lbW9yeVxuICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBwaWNrIHVwIGFueSBtYW51YWwgZWRpdHMgb3Igc2F2ZWQgc2V0dGluZ3NcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGNvbmZpZyBkaXJlY3RvcnkgZXhpc3RzIHdpdGggcHJvcGVyIHBlcm1pc3Npb25zICgwbzcwMCA9IG93bmVyIG9ubHkpXG4gICAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLmNvbmZpZ0RpciwgeyByZWN1cnNpdmU6IHRydWUsIG1vZGU6IDBvNzAwIH0pO1xuICAgICAgXG4gICAgICAvLyBMb2FkIG9yIGNyZWF0ZSBjb25maWdcbiAgICAgIGlmIChhd2FpdCB0aGlzLmNvbmZpZ0V4aXN0cygpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZENvbmZpZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGRlZmF1bHQgY29uZmlnXG4gICAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBUcnkgdG8gbWlncmF0ZSBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgICAgICBhd2FpdCB0aGlzLm1pZ3JhdGVGcm9tRW52aXJvbm1lbnQoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNhdmUgdGhlIGNvbmZpZ1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci5pbmZvKCdDcmVhdGVkIG5ldyBjb25maWd1cmF0aW9uIGZpbGUnLCB7XG4gICAgICAgICAgcGF0aDogdGhpcy5jb25maWdQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24nLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgLy8gVXNlIGRlZmF1bHRzIGluIG1lbW9yeVxuICAgICAgdGhpcy5jb25maWcgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIGZyb20gZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5jb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICAgIFxuICAgICAgLyoqXG4gICAgICAgKiBJTVBPUlRBTlQ6IFBhcnNlciBTZWxlY3Rpb24gZm9yIERpZmZlcmVudCBGaWxlIFR5cGVzXG4gICAgICAgKiBcbiAgICAgICAqIFdlIHVzZSBESUZGRVJFTlQgcGFyc2VycyBmb3IgZGlmZmVyZW50IGZpbGUgdHlwZXM6XG4gICAgICAgKiBcbiAgICAgICAqIDEuIGpzLXlhbWwgKHVzZWQgaGVyZSkgLSBGb3IgUFVSRSBZQU1MIGZpbGVzOlxuICAgICAgICogICAgLSBDb25maWd1cmF0aW9uIGZpbGVzIChjb25maWcueW1sKVxuICAgICAgICogICAgLSBEYXRhIGZpbGVzIHdpdGhvdXQgbWFya2Rvd24gY29udGVudFxuICAgICAgICogICAgLSBBbnkgLnltbCBvciAueWFtbCBmaWxlIHRoYXQncyBqdXN0IFlBTUxcbiAgICAgICAqICAgIEV4YW1wbGUgZm9ybWF0OlxuICAgICAgICogICAgYGBgeWFtbFxuICAgICAgICogICAgdmVyc2lvbjogMS4wLjBcbiAgICAgICAqICAgIHVzZXI6XG4gICAgICAgKiAgICAgIHVzZXJuYW1lOiBqb2huZG9lXG4gICAgICAgKiAgICAgIGVtYWlsOiBqb2huQGV4YW1wbGUuY29tXG4gICAgICAgKiAgICBgYGBcbiAgICAgICAqIFxuICAgICAgICogMi4gU2VjdXJlWWFtbFBhcnNlciAtIEZvciBNQVJLRE9XTiBmaWxlcyB3aXRoIFlBTUwgZnJvbnRtYXR0ZXI6XG4gICAgICAgKiAgICAtIFBlcnNvbmEgZmlsZXMgKCoubWQgaW4gcGVyc29uYXMvKVxuICAgICAgICogICAgLSBTa2lsbCBmaWxlcyAoKi5tZCBpbiBza2lsbHMvKVxuICAgICAgICogICAgLSBUZW1wbGF0ZSBmaWxlcyAoKi5tZCBpbiB0ZW1wbGF0ZXMvKVxuICAgICAgICogICAgLSBBbnkgLm1kIGZpbGUgd2l0aCBmcm9udG1hdHRlciBiZXR3ZWVuIC0tLSBtYXJrZXJzXG4gICAgICAgKiAgICBFeGFtcGxlIGZvcm1hdDpcbiAgICAgICAqICAgIGBgYG1hcmtkb3duXG4gICAgICAgKiAgICAtLS1cbiAgICAgICAqICAgIG5hbWU6IENyZWF0aXZlIFdyaXRlclxuICAgICAgICogICAgZGVzY3JpcHRpb246IEEgY3JlYXRpdmUgYXNzaXN0YW50XG4gICAgICAgKiAgICAtLS1cbiAgICAgICAqICAgICMgSW5zdHJ1Y3Rpb25zXG4gICAgICAgKiAgICBZb3UgYXJlIGEgY3JlYXRpdmUgd3JpdGVyLi4uXG4gICAgICAgKiAgICBgYGBcbiAgICAgICAqIFxuICAgICAgICogVGhlIGNvbmZpZyBmaWxlIGlzIFBVUkUgWUFNTCwgc28gd2UgdXNlIGpzLXlhbWwgZGlyZWN0bHkgd2l0aCBGQUlMU0FGRV9TQ0hFTUFcbiAgICAgICAqIGZvciBzZWN1cml0eSAocHJldmVudHMgY29kZSBleGVjdXRpb24gdmlhIFlBTUwgdGFncykuXG4gICAgICAgKiBTRUNVUklUWTogVGhpcyBpcyBOT1QgYSB2dWxuZXJhYmlsaXR5IC0gRkFJTFNBRkVfU0NIRU1BIHByZXZlbnRzIGNvZGUgZXhlY3V0aW9uXG4gICAgICAgKi9cbiAgICAgIGxldCBsb2FkZWREYXRhOiBhbnk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBVc2luZyB5YW1sIHdpdGggRkFJTFNBRkVfU0NIRU1BIGlzIHNlY3VyZSAtIHByZXZlbnRzIGNvZGUgZXhlY3V0aW9uXG4gICAgICAgIGxvYWRlZERhdGEgPSB5YW1sLmxvYWQoY29udGVudCwge1xuICAgICAgICAgIHNjaGVtYTogeWFtbC5GQUlMU0FGRV9TQ0hFTUEgLy8gU2FmZSBzY2hlbWEgcHJldmVudHMgY29kZSBleGVjdXRpb25cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoICh5YW1sRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFlBTUwgaW4gY29uZmlndXJhdGlvbiBmaWxlOiAke3lhbWxFcnJvciBpbnN0YW5jZW9mIEVycm9yID8geWFtbEVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoeWFtbEVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKCFsb2FkZWREYXRhIHx8IHR5cGVvZiBsb2FkZWREYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29uZmlndXJhdGlvbiBmb3JtYXQnKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZygnTG9hZGVkIGNvbmZpZyBmcm9tIGZpbGUnLCB7XG4gICAgICAgIHVzZXJuYW1lOiBsb2FkZWREYXRhLnVzZXI/LnVzZXJuYW1lLFxuICAgICAgICBlbWFpbDogbG9hZGVkRGF0YS51c2VyPy5lbWFpbCxcbiAgICAgICAgc3luY0VuYWJsZWQ6IGxvYWRlZERhdGEuc3luYz8uZW5hYmxlZFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZVdpdGhEZWZhdWx0cyhsb2FkZWREYXRhKTtcbiAgICAgIFxuICAgICAgLy8gRml4IGFueSBzdHJpbmcgYm9vbGVhbnMgdGhhdCBtaWdodCBoYXZlIGJlZW4gc2F2ZWQgaW5jb3JyZWN0bHlcbiAgICAgIHRoaXMuZml4Q29uZmlnVHlwZXMoKTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdDb25maWd1cmF0aW9uIGxvYWRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHVzZXJuYW1lOiB0aGlzLmNvbmZpZy51c2VyLnVzZXJuYW1lLFxuICAgICAgICBzeW5jRW5hYmxlZDogdGhpcy5jb25maWcuc3luYy5lbmFibGVkXG4gICAgICB9KTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGNvbmZpZ3VyYXRpb24nLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNvbmZpZyBmaWxlIGV4aXN0c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb25maWdFeGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2Vzcyh0aGlzLmNvbmZpZ1BhdGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgT0F1dGggY2xpZW50IElEXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBjb25maWcgZmlsZVxuICAgKi9cbiAgcHVibGljIGdldEdpdEh1YkNsaWVudElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIENoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlIGZpcnN0XG4gICAgY29uc3QgZW52Q2xpZW50SWQgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfR0lUSFVCX0NMSUVOVF9JRDtcbiAgICBpZiAoZW52Q2xpZW50SWQpIHtcbiAgICAgIHJldHVybiBlbnZDbGllbnRJZDtcbiAgICB9XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gY29uZmlnIGZpbGVcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LmdpdGh1Yj8uYXV0aD8uY2xpZW50X2lkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IEdpdEh1YiBPQXV0aCBjbGllbnQgSUQgaW4gY29uZmlnIGZpbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRHaXRIdWJDbGllbnRJZChjbGllbnRJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFDb25maWdNYW5hZ2VyLnZhbGlkYXRlQ2xpZW50SWQoY2xpZW50SWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIEdpdEh1YiBjbGllbnQgSUQgZm9ybWF0LiBFeHBlY3RlZCBmb3JtYXQ6IE92MjNsaSBmb2xsb3dlZCBieSBhdCBsZWFzdCAxNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyAoZS5nLiwgT3YyM2xpQUJDREVGR0hJSktMTU4pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBnaXRodWIuYXV0aCBvYmplY3QgZXhpc3RzXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5naXRodWIpIHtcbiAgICAgIHRoaXMuY29uZmlnLmdpdGh1YiA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpLmdpdGh1YjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5naXRodWIuYXV0aCkge1xuICAgICAgdGhpcy5jb25maWcuZ2l0aHViLmF1dGggPSB0aGlzLmdldERlZmF1bHRDb25maWcoKS5naXRodWIuYXV0aDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZy5naXRodWIuYXV0aC5jbGllbnRfaWQgPSBjbGllbnRJZDtcbiAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGdldENvbmZpZygpOiBEb2xsaG91c2VDb25maWcge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlndXJhdGlvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNwZWNpZmljIHNldHRpbmcgdXNpbmcgZG90IG5vdGF0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0U2V0dGluZzxUPihwYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCB2YWx1ZTogYW55ID0gdGhpcy5jb25maWc7XG4gICAgXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB2YWx1ZSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHNwZWNpZmljIHNldHRpbmcgdXNpbmcgZG90IG5vdGF0aW9uXG4gICAqIFNFQ1VSSVRZIEZJWCAoUFIgIzg5NSk6IEFkZGVkIHByb3RvdHlwZSBwb2xsdXRpb24gcHJvdGVjdGlvblxuICAgKiBQcmV2aW91c2x5OiBEaXJlY3QgcHJvcGVydHkgYXNzaWdubWVudCBhbGxvd2VkIF9fcHJvdG9fXyBpbmplY3Rpb25cbiAgICogTm93OiBWYWxpZGF0ZXMga2V5cyBhZ2FpbnN0IGZvcmJpZGRlbiBwcm9wZXJ0aWVzIGJlZm9yZSBhc3NpZ25tZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlU2V0dGluZyhwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPENvbmZpZ1VwZGF0ZVJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBhbGwga2V5cyB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICBjb25zdCBGT1JCSURERU5fS0VZUyA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChGT1JCSURERU5fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yYmlkZGVuIHByb3BlcnR5IGluIHBhdGg6ICR7a2V5fWApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsZXQgY3VycmVudDogYW55ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuZ2V0U2V0dGluZyhwYXRoKTtcbiAgICBcbiAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgcGFyZW50IG9iamVjdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgICAgY3VycmVudFtrZXldID0ge307XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXQgdGhlIHZhbHVlXG4gICAgY29uc3QgbGFzdEtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICBjdXJyZW50W2xhc3RLZXldID0gdmFsdWU7XG4gICAgXG4gICAgLy8gU2F2ZSB0aGUgY29uZmlndXJhdGlvblxuICAgIGF3YWl0IHRoaXMuc2F2ZUNvbmZpZygpO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdDb25maWd1cmF0aW9uIHNldHRpbmcgdXBkYXRlZCcsIHtcbiAgICAgIHBhdGgsXG4gICAgICBwcmV2aW91c1ZhbHVlLFxuICAgICAgbmV3VmFsdWU6IHZhbHVlXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlOiBgU2V0dGluZyAnJHtwYXRofScgdXBkYXRlZCBzdWNjZXNzZnVsbHlgLFxuICAgICAgcHJldmlvdXNWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlOiB2YWx1ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgR2l0SHViIE9BdXRoIGNsaWVudCBJRCBmb3JtYXRcbiAgICogQ2xpZW50IElEcyBzdGFydCB3aXRoIFwiT3YyM2xpXCIgZm9sbG93ZWQgYnkgYXQgbGVhc3QgMTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICogXG4gICAqIEBwYXJhbSBjbGllbnRJZCAtIFRoZSBjbGllbnQgSUQgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBDb25maWdNYW5hZ2VyLnZhbGlkYXRlQ2xpZW50SWQoXCJPdjIzbGlBQkNERUZHSElKS0xNTjEyMzQ1NlwiKSAvLyB0cnVlXG4gICAqIENvbmZpZ01hbmFnZXIudmFsaWRhdGVDbGllbnRJZChcImludmFsaWRcIikgLy8gZmFsc2VcbiAgICogQ29uZmlnTWFuYWdlci52YWxpZGF0ZUNsaWVudElkKFwiT3YyM2xpXCIpIC8vIGZhbHNlICh0b28gc2hvcnQpXG4gICAqIENvbmZpZ01hbmFnZXIudmFsaWRhdGVDbGllbnRJZChcIlh2MjNsaUFCQ0RFRkdISUpLTE1OXCIpIC8vIGZhbHNlICh3cm9uZyBwcmVmaXgpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZhbGlkYXRlQ2xpZW50SWQoY2xpZW50SWQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgY2xpZW50SWQgIT09ICdzdHJpbmcnIHx8ICFjbGllbnRJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEdpdEh1YiBPQXV0aCBjbGllbnQgSURzIGZvbGxvdyB0aGUgcGF0dGVybjogT3YyM2xpW0EtWmEtejAtOV17MTQsfVxuICAgIGNvbnN0IGNsaWVudElkUGF0dGVybiA9IC9eT3YyM2xpW0EtWmEtejAtOV17MTQsfSQvO1xuICAgIHJldHVybiBjbGllbnRJZFBhdHRlcm4udGVzdChjbGllbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjb25maWd1cmF0aW9uIHRvIGZpbGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUNvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbmZpZ3VyYXRpb24gdG8gc2F2ZScpO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGJhY2t1cCBvZiBleGlzdGluZyBjb25maWdcbiAgICAgIGlmIChhd2FpdCB0aGlzLmNvbmZpZ0V4aXN0cygpKSB7XG4gICAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKHRoaXMuY29uZmlnUGF0aCwgdGhpcy5iYWNrdXBQYXRoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ29udmVydCB0byBZQU1MXG4gICAgICAvLyBOb3RlOiBXZSB1c2UganMteWFtbCdzIGR1bXAoKSBmb3IgcHVyZSBZQU1MIG91dHB1dCAobm8gZnJvbnRtYXR0ZXIgbWFya2VycylcbiAgICAgIC8vIFRoaXMgY3JlYXRlcyBhIHN0YW5kYXJkIFlBTUwgZmlsZSwgbm90IGEgbWFya2Rvd24gZmlsZSB3aXRoIGZyb250bWF0dGVyXG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcCh0aGlzLmNvbmZpZywge1xuICAgICAgICBpbmRlbnQ6IDIsXG4gICAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiBmYWxzZVxuICAgICAgICAvLyBVc2luZyBkZWZhdWx0IHNjaGVtYSAobm90IEZBSUxTQUZFKSBmb3IgZHVtcCB0byBwcmVzZXJ2ZSB0eXBlcyBsaWtlIGJvb2xlYW5zXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gV3JpdGUgYXRvbWljYWxseSB3aXRoIHByb3BlciBwZXJtaXNzaW9ucyAoMG82MDAgPSBvd25lciByZWFkL3dyaXRlIG9ubHkpXG4gICAgICBjb25zdCB0ZW1wUGF0aCA9IGAke3RoaXMuY29uZmlnUGF0aH0udG1wYDtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wUGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcsIG1vZGU6IDBvNjAwIH0pO1xuICAgICAgYXdhaXQgZnMucmVuYW1lKHRlbXBQYXRoLCB0aGlzLmNvbmZpZ1BhdGgpO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ0NvbmZpZ3VyYXRpb24gc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICBcbiAgICAgIC8vIExvZyBhdWRpdCBldmVudCBmb3IgY29uZmlndXJhdGlvbiB1cGRhdGVcbiAgICAgIGxvZ2dlci5kZWJ1ZygnQ29uZmlndXJhdGlvbiB1cGRhdGUgYXVkaXQnLCB7XG4gICAgICAgIGV2ZW50OiAnQ09ORklHX1VQREFURUQnLFxuICAgICAgICBzb3VyY2U6ICdDb25maWdNYW5hZ2VyLnNhdmVDb25maWcnLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgICAgfSk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gc2F2ZSBjb25maWd1cmF0aW9uJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gVHJ5IHRvIHJlc3RvcmUgYmFja3VwXG4gICAgICBpZiAoYXdhaXQgdGhpcy5iYWNrdXBFeGlzdHMoKSkge1xuICAgICAgICBhd2FpdCBmcy5jb3B5RmlsZSh0aGlzLmJhY2t1cFBhdGgsIHRoaXMuY29uZmlnUGF0aCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZXN0b3JlZCBjb25maWd1cmF0aW9uIGZyb20gYmFja3VwJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBiYWNrdXAgZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJhY2t1cEV4aXN0cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKHRoaXMuYmFja3VwUGF0aCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRml4IGluY29ycmVjdCB0eXBlcyBpbiBjb25maWcgKGUuZy4sIHN0cmluZyBib29sZWFucywgc3RyaW5nIFwibnVsbFwiKVxuICAgKi9cbiAgcHJpdmF0ZSBmaXhDb25maWdUeXBlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSByZXR1cm47XG4gICAgXG4gICAgLy8gSGVscGVyIHRvIGNvbnZlcnQgc3RyaW5nIFwibnVsbFwiIHRvIGFjdHVhbCBudWxsXG4gICAgY29uc3QgZml4TnVsbCA9ICh2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJ251bGwnIHx8IHZhbHVlID09PSAnTlVMTCcpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgXG4gICAgLy8gSGVscGVyIHRvIGNvbnZlcnQgc3RyaW5nIGJvb2xlYW5zIHRvIGFjdHVhbCBib29sZWFuc1xuICAgIGNvbnN0IGZpeEJvb2xlYW4gPSAodmFsdWU6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBsb3dlciA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChsb3dlciA9PT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGxvd2VyID09PSAnZmFsc2UnKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBcbiAgICAvLyBGaXggdXNlciBmaWVsZHMgLSBoYW5kbGUgc3RyaW5nIFwibnVsbFwiIHZhbHVlc1xuICAgIGlmICh0aGlzLmNvbmZpZy51c2VyKSB7XG4gICAgICB0aGlzLmNvbmZpZy51c2VyLnVzZXJuYW1lID0gZml4TnVsbCh0aGlzLmNvbmZpZy51c2VyLnVzZXJuYW1lKTtcbiAgICAgIHRoaXMuY29uZmlnLnVzZXIuZW1haWwgPSBmaXhOdWxsKHRoaXMuY29uZmlnLnVzZXIuZW1haWwpO1xuICAgICAgdGhpcy5jb25maWcudXNlci5kaXNwbGF5X25hbWUgPSBmaXhOdWxsKHRoaXMuY29uZmlnLnVzZXIuZGlzcGxheV9uYW1lKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRml4IHN5bmMgc2V0dGluZ3NcbiAgICBpZiAodGhpcy5jb25maWcuc3luYykge1xuICAgICAgdGhpcy5jb25maWcuc3luYy5lbmFibGVkID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmVuYWJsZWQpO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuaW5kaXZpZHVhbC5yZXF1aXJlX2NvbmZpcm1hdGlvbiA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnJlcXVpcmVfY29uZmlybWF0aW9uKTtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnNob3dfZGlmZl9iZWZvcmVfc3luYyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnNob3dfZGlmZl9iZWZvcmVfc3luYyk7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuaW5kaXZpZHVhbC50cmFja192ZXJzaW9ucyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5pbmRpdmlkdWFsLnRyYWNrX3ZlcnNpb25zKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRoaXMuY29uZmlnLnN5bmMuYnVsaykge1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLmJ1bGsudXBsb2FkX2VuYWJsZWQgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMuYnVsay51cGxvYWRfZW5hYmxlZCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuYnVsay5kb3dubG9hZF9lbmFibGVkID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmJ1bGsuZG93bmxvYWRfZW5hYmxlZCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnN5bmMuYnVsay5yZXF1aXJlX3ByZXZpZXcgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLnN5bmMuYnVsay5yZXF1aXJlX3ByZXZpZXcpO1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLmJ1bGsucmVzcGVjdF9sb2NhbF9vbmx5ID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLmJ1bGsucmVzcGVjdF9sb2NhbF9vbmx5KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRoaXMuY29uZmlnLnN5bmMucHJpdmFjeSkge1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kuc2Nhbl9mb3Jfc2VjcmV0cyA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuc3luYy5wcml2YWN5LnNjYW5fZm9yX3NlY3JldHMpO1xuICAgICAgICB0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kuc2Nhbl9mb3JfcGlpID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kuc2Nhbl9mb3JfcGlpKTtcbiAgICAgICAgdGhpcy5jb25maWcuc3luYy5wcml2YWN5Lndhcm5fb25fc2Vuc2l0aXZlID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5zeW5jLnByaXZhY3kud2Fybl9vbl9zZW5zaXRpdmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBGaXggY29sbGVjdGlvbiBzZXR0aW5nc1xuICAgIGlmICh0aGlzLmNvbmZpZy5jb2xsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbmZpZy5jb2xsZWN0aW9uLmF1dG9fc3VibWl0ID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5jb2xsZWN0aW9uLmF1dG9fc3VibWl0KTtcbiAgICAgIHRoaXMuY29uZmlnLmNvbGxlY3Rpb24ucmVxdWlyZV9yZXZpZXcgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmNvbGxlY3Rpb24ucmVxdWlyZV9yZXZpZXcpO1xuICAgICAgdGhpcy5jb25maWcuY29sbGVjdGlvbi5hZGRfYXR0cmlidXRpb24gPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmNvbGxlY3Rpb24uYWRkX2F0dHJpYnV0aW9uKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRml4IGRpc3BsYXkgc2V0dGluZ3NcbiAgICBpZiAodGhpcy5jb25maWcuZGlzcGxheSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzLmVuYWJsZWQgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzLmVuYWJsZWQpO1xuICAgICAgICB0aGlzLmNvbmZpZy5kaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9ycy5pbmNsdWRlX2Vtb2ppID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5kaXNwbGF5LnBlcnNvbmFfaW5kaWNhdG9ycy5pbmNsdWRlX2Vtb2ppKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZmlnLmRpc3BsYXkudmVyYm9zZV9sb2dnaW5nID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5kaXNwbGF5LnZlcmJvc2VfbG9nZ2luZyk7XG4gICAgICB0aGlzLmNvbmZpZy5kaXNwbGF5LnNob3dfcHJvZ3Jlc3MgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLmRpc3BsYXkuc2hvd19wcm9ncmVzcyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEZpeCBnaXRodWIgc2V0dGluZ3NcbiAgICBpZiAodGhpcy5jb25maWcuZ2l0aHViKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuZ2l0aHViLnBvcnRmb2xpbykge1xuICAgICAgICB0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvLnJlcG9zaXRvcnlfdXJsID0gZml4TnVsbCh0aGlzLmNvbmZpZy5naXRodWIucG9ydGZvbGlvLnJlcG9zaXRvcnlfdXJsKTtcbiAgICAgICAgdGhpcy5jb25maWcuZ2l0aHViLnBvcnRmb2xpby5hdXRvX2NyZWF0ZSA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcuZ2l0aHViLnBvcnRmb2xpby5hdXRvX2NyZWF0ZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25maWcuZ2l0aHViLmF1dGgpIHtcbiAgICAgICAgdGhpcy5jb25maWcuZ2l0aHViLmF1dGgudXNlX29hdXRoID0gZml4Qm9vbGVhbih0aGlzLmNvbmZpZy5naXRodWIuYXV0aC51c2Vfb2F1dGgpO1xuICAgICAgICAvLyBGaXggY2xpZW50X2lkIGlmIGl0J3MgYSBzdHJpbmcgXCJudWxsXCJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmdpdGh1Yi5hdXRoLmNsaWVudF9pZCkge1xuICAgICAgICAgIHRoaXMuY29uZmlnLmdpdGh1Yi5hdXRoLmNsaWVudF9pZCA9IGZpeE51bGwodGhpcy5jb25maWcuZ2l0aHViLmF1dGguY2xpZW50X2lkKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gRml4IHdpemFyZCBzZXR0aW5nc1xuICAgIGlmICh0aGlzLmNvbmZpZy53aXphcmQpIHtcbiAgICAgIHRoaXMuY29uZmlnLndpemFyZC5jb21wbGV0ZWQgPSBmaXhCb29sZWFuKHRoaXMuY29uZmlnLndpemFyZC5jb21wbGV0ZWQpO1xuICAgICAgdGhpcy5jb25maWcud2l6YXJkLmRpc21pc3NlZCA9IGZpeEJvb2xlYW4odGhpcy5jb25maWcud2l6YXJkLmRpc21pc3NlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIHBhcnRpYWwgY29uZmlnIHdpdGggZGVmYXVsdHNcbiAgICogXG4gICAqIElNUE9SVEFOVDogVGhpcyBmdW5jdGlvbiBwcmVzZXJ2ZXMgdW5rbm93biBmaWVsZHMgZm9yIGZvcndhcmQgY29tcGF0aWJpbGl0eS5cbiAgICogSWYgYSBmdXR1cmUgdmVyc2lvbiBhZGRzIG5ldyBjb25maWcgZmllbGRzLCBvbGRlciB2ZXJzaW9ucyB3b24ndCBsb3NlIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIG1lcmdlV2l0aERlZmF1bHRzKHBhcnRpYWw6IFBhcnRpYWw8RG9sbGhvdXNlQ29uZmlnPik6IERvbGxob3VzZUNvbmZpZyB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKTtcbiAgICBcbiAgICAvLyBTdGFydCB3aXRoIGEgZGVlcCBjbG9uZSBvZiBwYXJ0aWFsIHRvIHByZXNlcnZlIGFsbCB1bmtub3duIGZpZWxkc1xuICAgIGNvbnN0IHJlc3VsdDogYW55ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwYXJ0aWFsKSk7XG4gICAgXG4gICAgLy8gRW5zdXJlIGFsbCByZXF1aXJlZCBmaWVsZHMgZXhpc3Qgd2l0aCBkZWZhdWx0c1xuICAgIHJlc3VsdC52ZXJzaW9uID0gcmVzdWx0LnZlcnNpb24gfHwgZGVmYXVsdHMudmVyc2lvbjtcbiAgICBcbiAgICAvLyBVc2VyIHNlY3Rpb24gLSBwcmVzZXJ2ZSB1bmtub3duIGZpZWxkcyB3aGlsZSBlbnN1cmluZyByZXF1aXJlZCBmaWVsZHNcbiAgICByZXN1bHQudXNlciA9IHtcbiAgICAgIC4uLnJlc3VsdC51c2VyLFxuICAgICAgdXNlcm5hbWU6IHJlc3VsdC51c2VyPy51c2VybmFtZSA/PyBkZWZhdWx0cy51c2VyLnVzZXJuYW1lLFxuICAgICAgZW1haWw6IHJlc3VsdC51c2VyPy5lbWFpbCA/PyBkZWZhdWx0cy51c2VyLmVtYWlsLFxuICAgICAgZGlzcGxheV9uYW1lOiByZXN1bHQudXNlcj8uZGlzcGxheV9uYW1lID8/IGRlZmF1bHRzLnVzZXIuZGlzcGxheV9uYW1lXG4gICAgfTtcbiAgICBcbiAgICAvLyBHaXRIdWIgc2VjdGlvbiAtIGRlZXAgbWVyZ2UgcHJlc2VydmluZyB1bmtub3duIGZpZWxkc1xuICAgIGlmICghcmVzdWx0LmdpdGh1YikgcmVzdWx0LmdpdGh1YiA9IHt9O1xuICAgIHJlc3VsdC5naXRodWIucG9ydGZvbGlvID0ge1xuICAgICAgLi4uZGVmYXVsdHMuZ2l0aHViLnBvcnRmb2xpbyxcbiAgICAgIC4uLnJlc3VsdC5naXRodWIucG9ydGZvbGlvXG4gICAgfTtcbiAgICByZXN1bHQuZ2l0aHViLmF1dGggPSB7XG4gICAgICAuLi5kZWZhdWx0cy5naXRodWIuYXV0aCxcbiAgICAgIC4uLnJlc3VsdC5naXRodWIuYXV0aFxuICAgIH07XG4gICAgXG4gICAgLy8gU3luYyBzZWN0aW9uIC0gcHJlc2VydmUgdW5rbm93biBmaWVsZHMgYXQgYWxsIGxldmVsc1xuICAgIGlmICghcmVzdWx0LnN5bmMpIHJlc3VsdC5zeW5jID0ge307XG4gICAgcmVzdWx0LnN5bmMuZW5hYmxlZCA9IHJlc3VsdC5zeW5jLmVuYWJsZWQgPz8gZGVmYXVsdHMuc3luYy5lbmFibGVkO1xuICAgIHJlc3VsdC5zeW5jLmluZGl2aWR1YWwgPSB7XG4gICAgICAuLi5kZWZhdWx0cy5zeW5jLmluZGl2aWR1YWwsXG4gICAgICAuLi5yZXN1bHQuc3luYy5pbmRpdmlkdWFsXG4gICAgfTtcbiAgICByZXN1bHQuc3luYy5idWxrID0ge1xuICAgICAgLi4uZGVmYXVsdHMuc3luYy5idWxrLFxuICAgICAgLi4ucmVzdWx0LnN5bmMuYnVsa1xuICAgIH07XG4gICAgcmVzdWx0LnN5bmMucHJpdmFjeSA9IHtcbiAgICAgIC4uLmRlZmF1bHRzLnN5bmMucHJpdmFjeSxcbiAgICAgIC4uLnJlc3VsdC5zeW5jLnByaXZhY3ksXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBhcnJheXMgLSB1c2UgcHJvdmlkZWQgb3IgZGVmYXVsdFxuICAgICAgZXhjbHVkZWRfcGF0dGVybnM6IHJlc3VsdC5zeW5jLnByaXZhY3k/LmV4Y2x1ZGVkX3BhdHRlcm5zIHx8IGRlZmF1bHRzLnN5bmMucHJpdmFjeS5leGNsdWRlZF9wYXR0ZXJuc1xuICAgIH07XG4gICAgXG4gICAgLy8gQ29sbGVjdGlvbiBzZWN0aW9uXG4gICAgcmVzdWx0LmNvbGxlY3Rpb24gPSB7XG4gICAgICAuLi5kZWZhdWx0cy5jb2xsZWN0aW9uLFxuICAgICAgLi4ucmVzdWx0LmNvbGxlY3Rpb25cbiAgICB9O1xuICAgIFxuICAgIC8vIEVsZW1lbnRzIHNlY3Rpb25cbiAgICBpZiAoIXJlc3VsdC5lbGVtZW50cykgcmVzdWx0LmVsZW1lbnRzID0ge307XG4gICAgcmVzdWx0LmVsZW1lbnRzID0ge1xuICAgICAgLi4ucmVzdWx0LmVsZW1lbnRzLFxuICAgICAgYXV0b19hY3RpdmF0ZTogcmVzdWx0LmVsZW1lbnRzLmF1dG9fYWN0aXZhdGUgfHwgZGVmYXVsdHMuZWxlbWVudHMuYXV0b19hY3RpdmF0ZSxcbiAgICAgIGRlZmF1bHRfZWxlbWVudF9kaXI6IHJlc3VsdC5lbGVtZW50cy5kZWZhdWx0X2VsZW1lbnRfZGlyIHx8IGRlZmF1bHRzLmVsZW1lbnRzLmRlZmF1bHRfZWxlbWVudF9kaXJcbiAgICB9O1xuICAgIFxuICAgIC8vIERpc3BsYXkgc2VjdGlvblxuICAgIGlmICghcmVzdWx0LmRpc3BsYXkpIHJlc3VsdC5kaXNwbGF5ID0ge307XG4gICAgcmVzdWx0LmRpc3BsYXkucGVyc29uYV9pbmRpY2F0b3JzID0ge1xuICAgICAgLi4uZGVmYXVsdHMuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnMsXG4gICAgICAuLi5yZXN1bHQuZGlzcGxheS5wZXJzb25hX2luZGljYXRvcnNcbiAgICB9O1xuICAgIHJlc3VsdC5kaXNwbGF5LnZlcmJvc2VfbG9nZ2luZyA9IHJlc3VsdC5kaXNwbGF5LnZlcmJvc2VfbG9nZ2luZyA/PyBkZWZhdWx0cy5kaXNwbGF5LnZlcmJvc2VfbG9nZ2luZztcbiAgICByZXN1bHQuZGlzcGxheS5zaG93X3Byb2dyZXNzID0gcmVzdWx0LmRpc3BsYXkuc2hvd19wcm9ncmVzcyA/PyBkZWZhdWx0cy5kaXNwbGF5LnNob3dfcHJvZ3Jlc3M7XG4gICAgXG4gICAgLy8gV2l6YXJkIHNlY3Rpb25cbiAgICByZXN1bHQud2l6YXJkID0ge1xuICAgICAgLi4uZGVmYXVsdHMud2l6YXJkLFxuICAgICAgLi4ucmVzdWx0LndpemFyZFxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdCBhcyBEb2xsaG91c2VDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZSBzZXR0aW5ncyBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtaWdyYXRlRnJvbUVudmlyb25tZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBtaWdyYXRlZCA9IGZhbHNlO1xuICAgIFxuICAgIC8vIE1pZ3JhdGUgdXNlciBzZXR0aW5nc1xuICAgIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiAmJiAhdGhpcy5jb25maWc/LnVzZXIudXNlcm5hbWUpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZy51c2VyLnVzZXJuYW1lID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1VTRVI7XG4gICAgICBtaWdyYXRlZCA9IHRydWU7XG4gICAgfVxuICAgIFxuICAgIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfRU1BSUwgJiYgIXRoaXMuY29uZmlnPy51c2VyLmVtYWlsKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlnKSB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdENvbmZpZygpO1xuICAgICAgdGhpcy5jb25maWcudXNlci5lbWFpbCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTUFJTDtcbiAgICAgIG1pZ3JhdGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gTWlncmF0ZSBwb3J0Zm9saW8gVVJMXG4gICAgaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9QT1JURk9MSU9fVVJMICYmICF0aGlzLmNvbmZpZz8uZ2l0aHViLnBvcnRmb2xpby5yZXBvc2l0b3J5X3VybCkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZykgdGhpcy5jb25maWcgPSB0aGlzLmdldERlZmF1bHRDb25maWcoKTtcbiAgICAgIHRoaXMuY29uZmlnLmdpdGh1Yi5wb3J0Zm9saW8ucmVwb3NpdG9yeV91cmwgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfUE9SVEZPTElPX1VSTDtcbiAgICAgIG1pZ3JhdGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gTWlncmF0ZSBjb2xsZWN0aW9uIGF1dG8tc3VibWl0XG4gICAgaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9BVVRPX1NVQk1JVF9UT19DT0xMRUNUSU9OICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZy5jb2xsZWN0aW9uLmF1dG9fc3VibWl0ID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0FVVE9fU1VCTUlUX1RPX0NPTExFQ1RJT04gPT09ICd0cnVlJztcbiAgICAgIG1pZ3JhdGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKG1pZ3JhdGVkKSB7XG4gICAgICBsb2dnZXIuaW5mbygnTWlncmF0ZWQgc2V0dGluZ3MgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgY29uZmlndXJhdGlvbiB0byBkZWZhdWx0c1xuICAgKiBTRUNVUklUWSBGSVggKFBSICM4OTUpOiBBZGRlZCBwcm90b3R5cGUgcG9sbHV0aW9uIHByb3RlY3Rpb25cbiAgICogUHJldmlvdXNseTogRGlyZWN0IHByb3BlcnR5IGFzc2lnbm1lbnQgYWxsb3dlZCBfX3Byb3RvX18gaW5qZWN0aW9uXG4gICAqIE5vdzogVmFsaWRhdGVzIGtleXMgYWdhaW5zdCBmb3JiaWRkZW4gcHJvcGVydGllcyBiZWZvcmUgYXNzaWdubWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc2V0Q29uZmlnKHNlY3Rpb24/OiBzdHJpbmcpOiBQcm9taXNlPENvbmZpZ0FjdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5nZXREZWZhdWx0Q29uZmlnKCk7XG4gICAgXG4gICAgaWYgKHNlY3Rpb24pIHtcbiAgICAgIC8vIFJlc2V0IHNwZWNpZmljIHNlY3Rpb25cbiAgICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBkZWZhdWx0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25LZXlzID0gc2VjdGlvbi5zcGxpdCgnLicpO1xuICAgICAgICBcbiAgICAgICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIGFsbCBrZXlzIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgICAgICBjb25zdCBGT1JCSURERU5fS0VZUyA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBzZWN0aW9uS2V5cykge1xuICAgICAgICAgIGlmIChGT1JCSURERU5fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcmJpZGRlbiBwcm9wZXJ0eSBpbiBzZWN0aW9uOiAke2tleX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBjdXJyZW50OiBhbnkgPSB0aGlzLmNvbmZpZztcbiAgICAgICAgbGV0IGRlZmF1bHRTZWN0aW9uOiBhbnkgPSBkZWZhdWx0cztcbiAgICAgICAgXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VjdGlvbktleXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbc2VjdGlvbktleXNbaV1dO1xuICAgICAgICAgIGRlZmF1bHRTZWN0aW9uID0gZGVmYXVsdFNlY3Rpb25bc2VjdGlvbktleXNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBsYXN0S2V5ID0gc2VjdGlvbktleXNbc2VjdGlvbktleXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGN1cnJlbnRbbGFzdEtleV0gPSBkZWZhdWx0U2VjdGlvbltsYXN0S2V5XTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgYXdhaXQgdGhpcy5zYXZlQ29uZmlnKCk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBTZWN0aW9uICcke3NlY3Rpb259JyByZXNldCB0byBkZWZhdWx0c2BcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IGVudGlyZSBjb25maWdcbiAgICAgIHRoaXMuY29uZmlnID0gZGVmYXVsdHM7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogJ0NvbmZpZ3VyYXRpb24gcmVzZXQgdG8gZGVmYXVsdHMnXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgY29uZmlndXJhdGlvbiB0byBmaWxlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhwb3J0Q29uZmlnKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENvbmZpZ0FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnTm8gY29uZmlndXJhdGlvbiB0byBleHBvcnQnXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAodGhpcy5jb25maWcsIHtcbiAgICAgICAgaW5kZW50OiAyLFxuICAgICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnLCBtb2RlOiAwbzYwMCB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYENvbmZpZ3VyYXRpb24gZXhwb3J0ZWQgdG8gJHtmaWxlUGF0aH1gXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBleHBvcnQgY29uZmlndXJhdGlvbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGNvbmZpZ3VyYXRpb24gZnJvbSBmaWxlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW1wb3J0Q29uZmlnKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENvbmZpZ0FjdGlvblJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgXG4gICAgICAvLyBQYXJzZSBhbmQgdmFsaWRhdGVcbiAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoY29udGVudCwge1xuICAgICAgICBtYXhZYW1sU2l6ZTogNjQgKiAxMDI0LFxuICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBpZiAoIXBhcnNlZC5kYXRhIHx8IHR5cGVvZiBwYXJzZWQuZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBjb25maWd1cmF0aW9uIGZvcm1hdCBpbiBpbXBvcnQgZmlsZSdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTWVyZ2Ugd2l0aCBkZWZhdWx0c1xuICAgICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlV2l0aERlZmF1bHRzKHBhcnNlZC5kYXRhIGFzIFBhcnRpYWw8RG9sbGhvdXNlQ29uZmlnPik7XG4gICAgICBcbiAgICAgIC8vIFNhdmUgdGhlIGltcG9ydGVkIGNvbmZpZ1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQ29uZmlnKCk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBDb25maWd1cmF0aW9uIGltcG9ydGVkIGZyb20gJHtmaWxlUGF0aH1gXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBpbXBvcnQgY29uZmlndXJhdGlvbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcm1hdHRlZCBjb25maWcgZm9yIGRpc3BsYXlcbiAgICovXG4gIHB1YmxpYyBnZXRGb3JtYXR0ZWRDb25maWcoc2VjdGlvbj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgcmV0dXJuICdDb25maWd1cmF0aW9uIG5vdCBpbml0aWFsaXplZCc7XG4gICAgfVxuICAgIFxuICAgIGxldCBjb25maWdUb1Nob3c6IGFueSA9IHRoaXMuY29uZmlnO1xuICAgIFxuICAgIGlmIChzZWN0aW9uKSB7XG4gICAgICBjb25maWdUb1Nob3cgPSB0aGlzLmdldFNldHRpbmcoc2VjdGlvbik7XG4gICAgICBpZiAoIWNvbmZpZ1RvU2hvdykge1xuICAgICAgICByZXR1cm4gYFNlY3Rpb24gJyR7c2VjdGlvbn0nIG5vdCBmb3VuZGA7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFJlbW92ZSBzZW5zaXRpdmUgZGF0YSBmb3IgZGlzcGxheVxuICAgIGNvbnN0IHNhbml0aXplZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29uZmlnVG9TaG93KSk7XG4gICAgXG4gICAgLy8gRG9uJ3Qgc2hvdyB0b2tlbnMgaWYgdGhleSBleGlzdFxuICAgIGlmIChzYW5pdGl6ZWQuZ2l0aHViPy5hdXRoPy50b2tlbikge1xuICAgICAgc2FuaXRpemVkLmdpdGh1Yi5hdXRoLnRva2VuID0gJyoqKlJFREFDVEVEKioqJztcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHlhbWwuZHVtcChzYW5pdGl6ZWQsIHtcbiAgICAgIGluZGVudDogMixcbiAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgc29ydEtleXM6IGZhbHNlXG4gICAgfSk7XG4gIH1cbn0iXX0=
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export declare const PACKAGE_VERSION = "1.7.4";
6
- export declare const BUILD_TIMESTAMP = "2025-09-12T15:57:23.505Z";
5
+ export declare const PACKAGE_VERSION = "1.8.1";
6
+ export declare const BUILD_TIMESTAMP = "2025-09-15T23:09:38.741Z";
7
7
  export declare const BUILD_TYPE: 'npm' | 'git';
8
8
  export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
9
9
  //# sourceMappingURL=version.d.ts.map
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export const PACKAGE_VERSION = '1.7.4';
6
- export const BUILD_TIMESTAMP = '2025-09-12T15:57:23.505Z';
5
+ export const PACKAGE_VERSION = '1.8.1';
6
+ export const BUILD_TIMESTAMP = '2025-09-15T23:09:38.741Z';
7
7
  export const BUILD_TYPE = 'npm';
8
8
  export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcxLjcuNCc7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjUtMDktMTJUMTU6NTc6MjMuNTA1Wic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcxLjguMSc7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjUtMDktMTVUMjM6MDk6MzguNzQxWic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
@@ -15,6 +15,20 @@ export declare class ConfigHandler {
15
15
  constructor();
16
16
  /**
17
17
  * Handle configuration operations via the dollhouse_config tool
18
+ *
19
+ * @param options - Configuration operation options
20
+ * @param options.action - The action to perform (get, set, reset, export, import, wizard)
21
+ * @param options.setting - Optional setting path for get/set operations
22
+ * @param options.value - Optional value for set operations
23
+ * @param options.section - Optional section for filtering
24
+ * @param options.format - Optional format for export (yaml or json)
25
+ * @param options.data - Optional data for import operations
26
+ * @param indicator - Optional indicator string for persona context
27
+ * @returns Promise resolving to content object with operation result
28
+ * @async
29
+ *
30
+ * @note The wizard action is async and will await the handleWizard method
31
+ * @since v1.4.0 - handleWizard made async for better config fetching
18
32
  */
19
33
  handleConfigOperation(options: ConfigOperationOptions, indicator?: string): Promise<{
20
34
  content: {
@@ -27,6 +41,22 @@ export declare class ConfigHandler {
27
41
  private handleReset;
28
42
  private handleExport;
29
43
  private handleImport;
44
+ /**
45
+ * Handle the configuration wizard
46
+ * @returns Promise with wizard interface content
47
+ * @async
48
+ */
30
49
  private handleWizard;
50
+ /**
51
+ * Format a value for user-friendly display
52
+ * Replaces null/undefined with helpful messages
53
+ */
54
+ private formatValue;
55
+ /**
56
+ * Make configuration display user-friendly for non-technical users
57
+ * Replaces null values with helpful explanations
58
+ * Uses centralized friendly values for i18n support
59
+ */
60
+ private makeFriendlyConfig;
31
61
  }
32
62
  //# sourceMappingURL=ConfigHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/ConfigHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAAgB;;IAMrC;;OAEG;IACG,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,EAAE,SAAS,GAAE,MAAW;;;;;;YA4CrE,SAAS;YAkCT,SAAS;YA2CT,WAAW;YAyBX,YAAY;YAeZ,YAAY;IAuB1B,OAAO,CAAC,YAAY;CAsBrB"}
1
+ {"version":3,"file":"ConfigHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/ConfigHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAAgB;;IAMrC;;;;;;;;;;;;;;;;OAgBG;IACG,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,EAAE,SAAS,GAAE,MAAW;;;;;;YA4CrE,SAAS;YAoCT,SAAS;YA2CT,WAAW;YAyBX,YAAY;YAeZ,YAAY;IAuB1B;;;;OAIG;YACW,YAAY;IAwD1B;;;OAGG;IACH,OAAO,CAAC,WAAW;IAUnB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;CA6D3B"}