@dollhousemcp/mcp-server
Version:
DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.
141 lines • 16.5 kB
JavaScript
/**
* Collects search-performance and system-resource metrics from a PerformanceMonitor
* instance. Returns an empty array (never throws) when the source is unavailable.
*/
const SOURCE = 'PerformanceMonitor';
export class PerformanceMonitorCollector {
monitor;
name = 'performance-monitor';
description = 'Search performance timings, cache hit rate, and system memory/CPU from PerformanceMonitor';
constructor(monitor) {
this.monitor = monitor;
}
collect() {
try {
const metrics = this.monitor.getMetrics();
const searchStats = this.monitor.getSearchStats();
const memStats = this.monitor.getMemoryStats();
const searchTimes = metrics.searchTimes ?? [];
const histCount = searchTimes.length;
const histSum = searchTimes.reduce((s, v) => s + v, 0);
const entries = [
{
type: 'counter',
name: 'performance.search.searches_total',
source: SOURCE,
unit: 'count',
description: 'Total number of searches performed',
value: searchStats.totalSearches,
},
{
type: 'histogram',
name: 'performance.search.duration',
source: SOURCE,
unit: 'milliseconds',
description: 'Distribution of search durations',
value: {
count: histCount,
sum: histSum,
avg: searchStats.averageTime,
p50: searchStats.medianTime,
p95: searchStats.p95Time,
p99: searchStats.p99Time,
},
},
{
type: 'counter',
name: 'performance.search.slow_query_count',
source: SOURCE,
unit: 'count',
description: 'Number of searches that exceeded the slow-query threshold',
value: searchStats.slowQueries,
},
{
type: 'gauge',
name: 'performance.search.cache_hit_rate',
source: SOURCE,
unit: 'ratio',
description: 'Fraction of searches served from cache',
value: searchStats.cacheHitRate,
},
{
type: 'gauge',
name: 'system.memory.heap_used_bytes',
source: SOURCE,
unit: 'bytes',
description: 'V8 heap used (bytes)',
value: memStats.currentUsage.heapUsed,
},
{
type: 'gauge',
name: 'system.memory.heap_total_bytes',
source: SOURCE,
unit: 'bytes',
description: 'V8 heap total (bytes)',
value: memStats.currentUsage.heapTotal,
},
{
type: 'gauge',
name: 'system.memory.rss_bytes',
source: SOURCE,
unit: 'bytes',
description: 'Process resident set size (bytes)',
value: memStats.currentUsage.rss,
},
{
type: 'gauge',
name: 'system.memory.external_bytes',
source: SOURCE,
unit: 'bytes',
description: 'V8 external memory (bytes)',
value: memStats.currentUsage.external,
},
{
type: 'gauge',
name: 'system.memory.growth_rate',
source: SOURCE,
unit: 'megabytes',
description: 'Heap growth rate (MB/s)',
value: memStats.growthRate,
},
{
type: 'counter',
name: 'system.cpu.usage_seconds',
source: SOURCE,
unit: 'seconds',
description: 'CPU time consumed by the process (seconds)',
value: metrics.systemStats.cpuUsage,
},
{
type: 'counter',
name: 'system.uptime_seconds',
source: SOURCE,
unit: 'seconds',
description: 'Process uptime (seconds)',
value: metrics.systemStats.uptime,
},
{
type: 'gauge',
name: 'system.memory.free_bytes',
source: SOURCE,
unit: 'bytes',
description: 'System free memory (bytes)',
value: metrics.systemStats.freeMemory,
},
{
type: 'gauge',
name: 'system.memory.total_bytes',
source: SOURCE,
unit: 'bytes',
description: 'System total memory (bytes)',
value: metrics.systemStats.totalMemory,
},
];
return entries;
}
catch {
return [];
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyZm9ybWFuY2VNb25pdG9yQ29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21ldHJpY3MvY29sbGVjdG9ycy9QZXJmb3JtYW5jZU1vbml0b3JDb2xsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBS0gsTUFBTSxNQUFNLEdBQUcsb0JBQTZCLENBQUM7QUFFN0MsTUFBTSxPQUFPLDJCQUEyQjtJQUtUO0lBSnBCLElBQUksR0FBRyxxQkFBcUIsQ0FBQztJQUM3QixXQUFXLEdBQ2xCLDJGQUEyRixDQUFDO0lBRTlGLFlBQTZCLE9BQTJCO1FBQTNCLFlBQU8sR0FBUCxPQUFPLENBQW9CO0lBQUcsQ0FBQztJQUU1RCxPQUFPO1FBQ0wsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFL0MsTUFBTSxXQUFXLEdBQWEsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDeEQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNyQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUV2RCxNQUFNLE9BQU8sR0FBa0I7Z0JBQzdCO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLG1DQUFtQztvQkFDekMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxLQUFLLEVBQUUsV0FBVyxDQUFDLGFBQWE7aUJBQ2pDO2dCQUNEO29CQUNFLElBQUksRUFBRSxXQUFvQjtvQkFDMUIsSUFBSSxFQUFFLDZCQUE2QjtvQkFDbkMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLGNBQXVCO29CQUM3QixXQUFXLEVBQUUsa0NBQWtDO29CQUMvQyxLQUFLLEVBQUU7d0JBQ0wsS0FBSyxFQUFFLFNBQVM7d0JBQ2hCLEdBQUcsRUFBRSxPQUFPO3dCQUNaLEdBQUcsRUFBRSxXQUFXLENBQUMsV0FBVzt3QkFDNUIsR0FBRyxFQUFFLFdBQVcsQ0FBQyxVQUFVO3dCQUMzQixHQUFHLEVBQUUsV0FBVyxDQUFDLE9BQU87d0JBQ3hCLEdBQUcsRUFBRSxXQUFXLENBQUMsT0FBTztxQkFDekI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFNBQWtCO29CQUN4QixJQUFJLEVBQUUscUNBQXFDO29CQUMzQyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSwyREFBMkQ7b0JBQ3hFLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVztpQkFDL0I7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsbUNBQW1DO29CQUN6QyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSx3Q0FBd0M7b0JBQ3JELEtBQUssRUFBRSxXQUFXLENBQUMsWUFBWTtpQkFDaEM7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsK0JBQStCO29CQUNyQyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSxzQkFBc0I7b0JBQ25DLEtBQUssRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVE7aUJBQ3RDO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLGdDQUFnQztvQkFDdEMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsdUJBQXVCO29CQUNwQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTO2lCQUN2QztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSx5QkFBeUI7b0JBQy9CLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLG1DQUFtQztvQkFDaEQsS0FBSyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRztpQkFDakM7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsOEJBQThCO29CQUNwQyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSw0QkFBNEI7b0JBQ3pDLEtBQUssRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVE7aUJBQ3RDO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLFdBQW9CO29CQUMxQixXQUFXLEVBQUUseUJBQXlCO29CQUN0QyxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVU7aUJBQzNCO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLDBCQUEwQjtvQkFDaEMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLFNBQWtCO29CQUN4QixXQUFXLEVBQUUsNENBQTRDO29CQUN6RCxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRO2lCQUNwQztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsU0FBa0I7b0JBQ3hCLElBQUksRUFBRSx1QkFBdUI7b0JBQzdCLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsV0FBVyxFQUFFLDBCQUEwQjtvQkFDdkMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTTtpQkFDbEM7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsMEJBQTBCO29CQUNoQyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSw0QkFBNEI7b0JBQ3pDLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVU7aUJBQ3RDO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsNkJBQTZCO29CQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXO2lCQUN2QzthQUNGLENBQUM7WUFFRixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb2xsZWN0cyBzZWFyY2gtcGVyZm9ybWFuY2UgYW5kIHN5c3RlbS1yZXNvdXJjZSBtZXRyaWNzIGZyb20gYSBQZXJmb3JtYW5jZU1vbml0b3JcbiAqIGluc3RhbmNlLiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IChuZXZlciB0aHJvd3MpIHdoZW4gdGhlIHNvdXJjZSBpcyB1bmF2YWlsYWJsZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElNZXRyaWNDb2xsZWN0b3IsIE1ldHJpY0VudHJ5IH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQZXJmb3JtYW5jZU1vbml0b3IgfSBmcm9tICcuLi8uLi91dGlscy9QZXJmb3JtYW5jZU1vbml0b3IuanMnO1xuXG5jb25zdCBTT1VSQ0UgPSAnUGVyZm9ybWFuY2VNb25pdG9yJyBhcyBjb25zdDtcblxuZXhwb3J0IGNsYXNzIFBlcmZvcm1hbmNlTW9uaXRvckNvbGxlY3RvciBpbXBsZW1lbnRzIElNZXRyaWNDb2xsZWN0b3Ige1xuICByZWFkb25seSBuYW1lID0gJ3BlcmZvcm1hbmNlLW1vbml0b3InO1xuICByZWFkb25seSBkZXNjcmlwdGlvbiA9XG4gICAgJ1NlYXJjaCBwZXJmb3JtYW5jZSB0aW1pbmdzLCBjYWNoZSBoaXQgcmF0ZSwgYW5kIHN5c3RlbSBtZW1vcnkvQ1BVIGZyb20gUGVyZm9ybWFuY2VNb25pdG9yJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1vbml0b3I6IFBlcmZvcm1hbmNlTW9uaXRvcikge31cblxuICBjb2xsZWN0KCk6IE1ldHJpY0VudHJ5W10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5tb25pdG9yLmdldE1ldHJpY3MoKTtcbiAgICAgIGNvbnN0IHNlYXJjaFN0YXRzID0gdGhpcy5tb25pdG9yLmdldFNlYXJjaFN0YXRzKCk7XG4gICAgICBjb25zdCBtZW1TdGF0cyA9IHRoaXMubW9uaXRvci5nZXRNZW1vcnlTdGF0cygpO1xuXG4gICAgICBjb25zdCBzZWFyY2hUaW1lczogbnVtYmVyW10gPSBtZXRyaWNzLnNlYXJjaFRpbWVzID8/IFtdO1xuICAgICAgY29uc3QgaGlzdENvdW50ID0gc2VhcmNoVGltZXMubGVuZ3RoO1xuICAgICAgY29uc3QgaGlzdFN1bSA9IHNlYXJjaFRpbWVzLnJlZHVjZSgocywgdikgPT4gcyArIHYsIDApO1xuXG4gICAgICBjb25zdCBlbnRyaWVzOiBNZXRyaWNFbnRyeVtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdwZXJmb3JtYW5jZS5zZWFyY2guc2VhcmNoZXNfdG90YWwnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2Ygc2VhcmNoZXMgcGVyZm9ybWVkJyxcbiAgICAgICAgICB2YWx1ZTogc2VhcmNoU3RhdHMudG90YWxTZWFyY2hlcyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdoaXN0b2dyYW0nIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdwZXJmb3JtYW5jZS5zZWFyY2guZHVyYXRpb24nLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdtaWxsaXNlY29uZHMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRGlzdHJpYnV0aW9uIG9mIHNlYXJjaCBkdXJhdGlvbnMnLFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICBjb3VudDogaGlzdENvdW50LFxuICAgICAgICAgICAgc3VtOiBoaXN0U3VtLFxuICAgICAgICAgICAgYXZnOiBzZWFyY2hTdGF0cy5hdmVyYWdlVGltZSxcbiAgICAgICAgICAgIHA1MDogc2VhcmNoU3RhdHMubWVkaWFuVGltZSxcbiAgICAgICAgICAgIHA5NTogc2VhcmNoU3RhdHMucDk1VGltZSxcbiAgICAgICAgICAgIHA5OTogc2VhcmNoU3RhdHMucDk5VGltZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdwZXJmb3JtYW5jZS5zZWFyY2guc2xvd19xdWVyeV9jb3VudCcsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBzZWFyY2hlcyB0aGF0IGV4Y2VlZGVkIHRoZSBzbG93LXF1ZXJ5IHRocmVzaG9sZCcsXG4gICAgICAgICAgdmFsdWU6IHNlYXJjaFN0YXRzLnNsb3dRdWVyaWVzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAncGVyZm9ybWFuY2Uuc2VhcmNoLmNhY2hlX2hpdF9yYXRlJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAncmF0aW8nIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRnJhY3Rpb24gb2Ygc2VhcmNoZXMgc2VydmVkIGZyb20gY2FjaGUnLFxuICAgICAgICAgIHZhbHVlOiBzZWFyY2hTdGF0cy5jYWNoZUhpdFJhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzeXN0ZW0ubWVtb3J5LmhlYXBfdXNlZF9ieXRlcycsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2J5dGVzJyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1Y4IGhlYXAgdXNlZCAoYnl0ZXMpJyxcbiAgICAgICAgICB2YWx1ZTogbWVtU3RhdHMuY3VycmVudFVzYWdlLmhlYXBVc2VkLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnc3lzdGVtLm1lbW9yeS5oZWFwX3RvdGFsX2J5dGVzJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAnYnl0ZXMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVjggaGVhcCB0b3RhbCAoYnl0ZXMpJyxcbiAgICAgICAgICB2YWx1ZTogbWVtU3RhdHMuY3VycmVudFVzYWdlLmhlYXBUb3RhbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkucnNzX2J5dGVzJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAnYnl0ZXMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUHJvY2VzcyByZXNpZGVudCBzZXQgc2l6ZSAoYnl0ZXMpJyxcbiAgICAgICAgICB2YWx1ZTogbWVtU3RhdHMuY3VycmVudFVzYWdlLnJzcyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkuZXh0ZXJuYWxfYnl0ZXMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdieXRlcycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdWOCBleHRlcm5hbCBtZW1vcnkgKGJ5dGVzKScsXG4gICAgICAgICAgdmFsdWU6IG1lbVN0YXRzLmN1cnJlbnRVc2FnZS5leHRlcm5hbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkuZ3Jvd3RoX3JhdGUnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdtZWdhYnl0ZXMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSGVhcCBncm93dGggcmF0ZSAoTUIvcyknLFxuICAgICAgICAgIHZhbHVlOiBtZW1TdGF0cy5ncm93dGhSYXRlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzeXN0ZW0uY3B1LnVzYWdlX3NlY29uZHMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdzZWNvbmRzJyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NQVSB0aW1lIGNvbnN1bWVkIGJ5IHRoZSBwcm9jZXNzIChzZWNvbmRzKScsXG4gICAgICAgICAgdmFsdWU6IG1ldHJpY3Muc3lzdGVtU3RhdHMuY3B1VXNhZ2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnY291bnRlcicgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS51cHRpbWVfc2Vjb25kcycsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ3NlY29uZHMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUHJvY2VzcyB1cHRpbWUgKHNlY29uZHMpJyxcbiAgICAgICAgICB2YWx1ZTogbWV0cmljcy5zeXN0ZW1TdGF0cy51cHRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzeXN0ZW0ubWVtb3J5LmZyZWVfYnl0ZXMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdieXRlcycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdTeXN0ZW0gZnJlZSBtZW1vcnkgKGJ5dGVzKScsXG4gICAgICAgICAgdmFsdWU6IG1ldHJpY3Muc3lzdGVtU3RhdHMuZnJlZU1lbW9yeSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkudG90YWxfYnl0ZXMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdieXRlcycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdTeXN0ZW0gdG90YWwgbWVtb3J5IChieXRlcyknLFxuICAgICAgICAgIHZhbHVlOiBtZXRyaWNzLnN5c3RlbVN0YXRzLnRvdGFsTWVtb3J5LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG59XG4iXX0=