@angular/benchpress
Version:
Benchpress - a framework for e2e performance tests
124 lines • 16.1 kB
JavaScript
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
var IOsDriverExtension_1;
import { __decorate, __metadata } from "tslib";
import { Injectable } from '@angular/core';
import { WebDriverAdapter } from '../web_driver_adapter';
import { PerfLogFeatures, WebDriverExtension } from '../web_driver_extension';
let IOsDriverExtension = IOsDriverExtension_1 = class IOsDriverExtension extends WebDriverExtension {
constructor(_driver) {
super();
this._driver = _driver;
}
gc() {
throw new Error('Force GC is not supported on iOS');
}
timeBegin(name) {
return this._driver.executeScript(`console.time('${name}');`);
}
timeEnd(name, restartName = null) {
let script = `console.timeEnd('${name}');`;
if (restartName != null) {
script += `console.time('${restartName}');`;
}
return this._driver.executeScript(script);
}
// See https://github.com/WebKit/webkit/tree/master/Source/WebInspectorUI/Versions
readPerfLog() {
// TODO(tbosch): Bug in IOsDriver: Need to execute at least one command
// so that the browser logs can be read out!
return this._driver.executeScript('1+1')
.then((_) => this._driver.logs('performance'))
.then((entries) => {
const records = [];
entries.forEach((entry) => {
const message = JSON.parse(entry['message'])['message'];
if (message['method'] === 'Timeline.eventRecorded') {
records.push(message['params']['record']);
}
});
return this._convertPerfRecordsToEvents(records);
});
}
/** @internal */
_convertPerfRecordsToEvents(records, events = null) {
if (!events) {
events = [];
}
records.forEach((record) => {
let endEvent = null;
const type = record['type'];
const data = record['data'];
const startTime = record['startTime'];
const endTime = record['endTime'];
if (type === 'FunctionCall' && (data == null || data['scriptName'] !== 'InjectedScript')) {
events.push(createStartEvent('script', startTime));
endEvent = createEndEvent('script', endTime);
}
else if (type === 'Time') {
events.push(createMarkStartEvent(data['message'], startTime));
}
else if (type === 'TimeEnd') {
events.push(createMarkEndEvent(data['message'], startTime));
}
else if (type === 'RecalculateStyles' || type === 'Layout' || type === 'UpdateLayerTree' ||
type === 'Paint' || type === 'Rasterize' || type === 'CompositeLayers') {
events.push(createStartEvent('render', startTime));
endEvent = createEndEvent('render', endTime);
}
// Note: ios used to support GCEvent up until iOS 6 :-(
if (record['children'] != null) {
this._convertPerfRecordsToEvents(record['children'], events);
}
if (endEvent != null) {
events.push(endEvent);
}
});
return events;
}
perfLogFeatures() {
return new PerfLogFeatures({ render: true });
}
supports(capabilities) {
return capabilities['browserName'].toLowerCase() === 'safari';
}
};
IOsDriverExtension.PROVIDERS = [{ provide: IOsDriverExtension_1, deps: [WebDriverAdapter] }];
IOsDriverExtension = IOsDriverExtension_1 = __decorate([
Injectable(),
__metadata("design:paramtypes", [WebDriverAdapter])
], IOsDriverExtension);
export { IOsDriverExtension };
function createEvent(ph, name, time, args = null) {
const result = {
'cat': 'timeline',
'name': name,
'ts': time,
'ph': ph,
// The ios protocol does not support the notions of multiple processes in
// the perflog...
'pid': 'pid0'
};
if (args != null) {
result['args'] = args;
}
return result;
}
function createStartEvent(name, time, args = null) {
return createEvent('B', name, time, args);
}
function createEndEvent(name, time, args = null) {
return createEvent('E', name, time, args);
}
function createMarkStartEvent(name, time) {
return createEvent('B', name, time);
}
function createMarkEndEvent(name, time) {
return createEvent('E', name, time);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9zX2RyaXZlcl9leHRlbnNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9iZW5jaHByZXNzL3NyYy93ZWJkcml2ZXIvaW9zX2RyaXZlcl9leHRlbnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBZSxlQUFlLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUcxRixJQUFhLGtCQUFrQiwwQkFBL0IsTUFBYSxrQkFBbUIsU0FBUSxrQkFBa0I7SUFHeEQsWUFBb0IsT0FBeUI7UUFDM0MsS0FBSyxFQUFFLENBQUM7UUFEVSxZQUFPLEdBQVAsT0FBTyxDQUFrQjtJQUU3QyxDQUFDO0lBRVEsRUFBRTtRQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRVEsU0FBUyxDQUFDLElBQVk7UUFDN0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRVEsT0FBTyxDQUFDLElBQVksRUFBRSxjQUEyQixJQUFJO1FBQzVELElBQUksTUFBTSxHQUFHLG9CQUFvQixJQUFJLEtBQUssQ0FBQztRQUMzQyxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7WUFDdkIsTUFBTSxJQUFJLGlCQUFpQixXQUFXLEtBQUssQ0FBQztTQUM3QztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGtGQUFrRjtJQUN6RSxXQUFXO1FBQ2xCLHVFQUF1RTtRQUN2RSw0Q0FBNEM7UUFDNUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7YUFDbkMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUM3QyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNoQixNQUFNLE9BQU8sR0FBVSxFQUFFLENBQUM7WUFDMUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUM3QixNQUFNLE9BQU8sR0FDUixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FDdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssd0JBQXdCLEVBQUU7b0JBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7aUJBQzNDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNULENBQUM7SUFFRCxnQkFBZ0I7SUFDUiwyQkFBMkIsQ0FBQyxPQUFjLEVBQUUsU0FBOEIsSUFBSTtRQUNwRixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsTUFBTSxHQUFHLEVBQUUsQ0FBQztTQUNiO1FBQ0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3pCLElBQUksUUFBUSxHQUFzQixJQUFJLENBQUM7WUFDdkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRWxDLElBQUksSUFBSSxLQUFLLGNBQWMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLGdCQUFnQixDQUFDLEVBQUU7Z0JBQ3hGLE1BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzlDO2lCQUFNLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtnQkFDMUIsTUFBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUNoRTtpQkFBTSxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQzdCLE1BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDOUQ7aUJBQU0sSUFDSCxJQUFJLEtBQUssbUJBQW1CLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssaUJBQWlCO2dCQUMvRSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxLQUFLLGlCQUFpQixFQUFFO2dCQUMxRSxNQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNwRCxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUM5QztZQUNELHVEQUF1RDtZQUN2RCxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQzlCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDOUQ7WUFDRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLE1BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDeEI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFUSxlQUFlO1FBQ3RCLE9BQU8sSUFBSSxlQUFlLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRVEsUUFBUSxDQUFDLFlBQWtDO1FBQ2xELE9BQU8sWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsQ0FBQztJQUNoRSxDQUFDO0NBQ0YsQ0FBQTtBQXJGUSw0QkFBUyxHQUFHLENBQUMsRUFBQyxPQUFPLEVBQUUsb0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUM7QUFEbEUsa0JBQWtCO0lBRDlCLFVBQVUsRUFBRTtxQ0FJa0IsZ0JBQWdCO0dBSGxDLGtCQUFrQixDQXNGOUI7U0F0Rlksa0JBQWtCO0FBd0YvQixTQUFTLFdBQVcsQ0FBQyxFQUF1QixFQUFFLElBQVksRUFBRSxJQUFZLEVBQUUsT0FBWSxJQUFJO0lBQ3hGLE1BQU0sTUFBTSxHQUFpQjtRQUMzQixLQUFLLEVBQUUsVUFBVTtRQUNqQixNQUFNLEVBQUUsSUFBSTtRQUNaLElBQUksRUFBRSxJQUFJO1FBQ1YsSUFBSSxFQUFFLEVBQUU7UUFDUix5RUFBeUU7UUFDekUsaUJBQWlCO1FBQ2pCLEtBQUssRUFBRSxNQUFNO0tBQ2QsQ0FBQztJQUNGLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtRQUNoQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3ZCO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxPQUFZLElBQUk7SUFDcEUsT0FBTyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsT0FBWSxJQUFJO0lBQ2xFLE9BQU8sV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLElBQVksRUFBRSxJQUFZO0lBQ3RELE9BQU8sV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsSUFBWSxFQUFFLElBQVk7SUFDcEQsT0FBTyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7V2ViRHJpdmVyQWRhcHRlcn0gZnJvbSAnLi4vd2ViX2RyaXZlcl9hZGFwdGVyJztcbmltcG9ydCB7UGVyZkxvZ0V2ZW50LCBQZXJmTG9nRmVhdHVyZXMsIFdlYkRyaXZlckV4dGVuc2lvbn0gZnJvbSAnLi4vd2ViX2RyaXZlcl9leHRlbnNpb24nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSU9zRHJpdmVyRXh0ZW5zaW9uIGV4dGVuZHMgV2ViRHJpdmVyRXh0ZW5zaW9uIHtcbiAgc3RhdGljIFBST1ZJREVSUyA9IFt7cHJvdmlkZTogSU9zRHJpdmVyRXh0ZW5zaW9uLCBkZXBzOiBbV2ViRHJpdmVyQWRhcHRlcl19XTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kcml2ZXI6IFdlYkRyaXZlckFkYXB0ZXIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2MoKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvcmNlIEdDIGlzIG5vdCBzdXBwb3J0ZWQgb24gaU9TJyk7XG4gIH1cblxuICBvdmVycmlkZSB0aW1lQmVnaW4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fZHJpdmVyLmV4ZWN1dGVTY3JpcHQoYGNvbnNvbGUudGltZSgnJHtuYW1lfScpO2ApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGltZUVuZChuYW1lOiBzdHJpbmcsIHJlc3RhcnROYW1lOiBzdHJpbmd8bnVsbCA9IG51bGwpOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCBzY3JpcHQgPSBgY29uc29sZS50aW1lRW5kKCcke25hbWV9Jyk7YDtcbiAgICBpZiAocmVzdGFydE5hbWUgIT0gbnVsbCkge1xuICAgICAgc2NyaXB0ICs9IGBjb25zb2xlLnRpbWUoJyR7cmVzdGFydE5hbWV9Jyk7YDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RyaXZlci5leGVjdXRlU2NyaXB0KHNjcmlwdCk7XG4gIH1cblxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1dlYktpdC93ZWJraXQvdHJlZS9tYXN0ZXIvU291cmNlL1dlYkluc3BlY3RvclVJL1ZlcnNpb25zXG4gIG92ZXJyaWRlIHJlYWRQZXJmTG9nKCkge1xuICAgIC8vIFRPRE8odGJvc2NoKTogQnVnIGluIElPc0RyaXZlcjogTmVlZCB0byBleGVjdXRlIGF0IGxlYXN0IG9uZSBjb21tYW5kXG4gICAgLy8gc28gdGhhdCB0aGUgYnJvd3NlciBsb2dzIGNhbiBiZSByZWFkIG91dCFcbiAgICByZXR1cm4gdGhpcy5fZHJpdmVyLmV4ZWN1dGVTY3JpcHQoJzErMScpXG4gICAgICAgIC50aGVuKChfKSA9PiB0aGlzLl9kcml2ZXIubG9ncygncGVyZm9ybWFuY2UnKSlcbiAgICAgICAgLnRoZW4oKGVudHJpZXMpID0+IHtcbiAgICAgICAgICBjb25zdCByZWNvcmRzOiBhbnlbXSA9IFtdO1xuICAgICAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnk6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgKEpTT04ucGFyc2UoZW50cnlbJ21lc3NhZ2UnXSkgYXNcbiAgICAgICAgICAgICAgICAge21lc3NhZ2U6IHttZXRob2Q6IHN0cmluZywgcGFyYW1zOiBQZXJmTG9nRXZlbnR9fSlbJ21lc3NhZ2UnXTtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlWydtZXRob2QnXSA9PT0gJ1RpbWVsaW5lLmV2ZW50UmVjb3JkZWQnKSB7XG4gICAgICAgICAgICAgIHJlY29yZHMucHVzaChtZXNzYWdlWydwYXJhbXMnXVsncmVjb3JkJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0UGVyZlJlY29yZHNUb0V2ZW50cyhyZWNvcmRzKTtcbiAgICAgICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2NvbnZlcnRQZXJmUmVjb3Jkc1RvRXZlbnRzKHJlY29yZHM6IGFueVtdLCBldmVudHM6IFBlcmZMb2dFdmVudFtdfG51bGwgPSBudWxsKSB7XG4gICAgaWYgKCFldmVudHMpIHtcbiAgICAgIGV2ZW50cyA9IFtdO1xuICAgIH1cbiAgICByZWNvcmRzLmZvckVhY2goKHJlY29yZCkgPT4ge1xuICAgICAgbGV0IGVuZEV2ZW50OiBQZXJmTG9nRXZlbnR8bnVsbCA9IG51bGw7XG4gICAgICBjb25zdCB0eXBlID0gcmVjb3JkWyd0eXBlJ107XG4gICAgICBjb25zdCBkYXRhID0gcmVjb3JkWydkYXRhJ107XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSByZWNvcmRbJ3N0YXJ0VGltZSddO1xuICAgICAgY29uc3QgZW5kVGltZSA9IHJlY29yZFsnZW5kVGltZSddO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ0Z1bmN0aW9uQ2FsbCcgJiYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhWydzY3JpcHROYW1lJ10gIT09ICdJbmplY3RlZFNjcmlwdCcpKSB7XG4gICAgICAgIGV2ZW50cyEucHVzaChjcmVhdGVTdGFydEV2ZW50KCdzY3JpcHQnLCBzdGFydFRpbWUpKTtcbiAgICAgICAgZW5kRXZlbnQgPSBjcmVhdGVFbmRFdmVudCgnc2NyaXB0JywgZW5kVGltZSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdUaW1lJykge1xuICAgICAgICBldmVudHMhLnB1c2goY3JlYXRlTWFya1N0YXJ0RXZlbnQoZGF0YVsnbWVzc2FnZSddLCBzdGFydFRpbWUpKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1RpbWVFbmQnKSB7XG4gICAgICAgIGV2ZW50cyEucHVzaChjcmVhdGVNYXJrRW5kRXZlbnQoZGF0YVsnbWVzc2FnZSddLCBzdGFydFRpbWUpKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZSA9PT0gJ1JlY2FsY3VsYXRlU3R5bGVzJyB8fCB0eXBlID09PSAnTGF5b3V0JyB8fCB0eXBlID09PSAnVXBkYXRlTGF5ZXJUcmVlJyB8fFxuICAgICAgICAgIHR5cGUgPT09ICdQYWludCcgfHwgdHlwZSA9PT0gJ1Jhc3Rlcml6ZScgfHwgdHlwZSA9PT0gJ0NvbXBvc2l0ZUxheWVycycpIHtcbiAgICAgICAgZXZlbnRzIS5wdXNoKGNyZWF0ZVN0YXJ0RXZlbnQoJ3JlbmRlcicsIHN0YXJ0VGltZSkpO1xuICAgICAgICBlbmRFdmVudCA9IGNyZWF0ZUVuZEV2ZW50KCdyZW5kZXInLCBlbmRUaW1lKTtcbiAgICAgIH1cbiAgICAgIC8vIE5vdGU6IGlvcyB1c2VkIHRvIHN1cHBvcnQgR0NFdmVudCB1cCB1bnRpbCBpT1MgNiA6LShcbiAgICAgIGlmIChyZWNvcmRbJ2NoaWxkcmVuJ10gIT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9jb252ZXJ0UGVyZlJlY29yZHNUb0V2ZW50cyhyZWNvcmRbJ2NoaWxkcmVuJ10sIGV2ZW50cyk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kRXZlbnQgIT0gbnVsbCkge1xuICAgICAgICBldmVudHMhLnB1c2goZW5kRXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBldmVudHM7XG4gIH1cblxuICBvdmVycmlkZSBwZXJmTG9nRmVhdHVyZXMoKTogUGVyZkxvZ0ZlYXR1cmVzIHtcbiAgICByZXR1cm4gbmV3IFBlcmZMb2dGZWF0dXJlcyh7cmVuZGVyOiB0cnVlfSk7XG4gIH1cblxuICBvdmVycmlkZSBzdXBwb3J0cyhjYXBhYmlsaXRpZXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNhcGFiaWxpdGllc1snYnJvd3Nlck5hbWUnXS50b0xvd2VyQ2FzZSgpID09PSAnc2FmYXJpJztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFdmVudChwaDogJ1gnfCdCJ3wnRSd8J0InfCdFJywgbmFtZTogc3RyaW5nLCB0aW1lOiBudW1iZXIsIGFyZ3M6IGFueSA9IG51bGwpIHtcbiAgY29uc3QgcmVzdWx0OiBQZXJmTG9nRXZlbnQgPSB7XG4gICAgJ2NhdCc6ICd0aW1lbGluZScsXG4gICAgJ25hbWUnOiBuYW1lLFxuICAgICd0cyc6IHRpbWUsXG4gICAgJ3BoJzogcGgsXG4gICAgLy8gVGhlIGlvcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBub3Rpb25zIG9mIG11bHRpcGxlIHByb2Nlc3NlcyBpblxuICAgIC8vIHRoZSBwZXJmbG9nLi4uXG4gICAgJ3BpZCc6ICdwaWQwJ1xuICB9O1xuICBpZiAoYXJncyAhPSBudWxsKSB7XG4gICAgcmVzdWx0WydhcmdzJ10gPSBhcmdzO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0YXJ0RXZlbnQobmFtZTogc3RyaW5nLCB0aW1lOiBudW1iZXIsIGFyZ3M6IGFueSA9IG51bGwpIHtcbiAgcmV0dXJuIGNyZWF0ZUV2ZW50KCdCJywgbmFtZSwgdGltZSwgYXJncyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVuZEV2ZW50KG5hbWU6IHN0cmluZywgdGltZTogbnVtYmVyLCBhcmdzOiBhbnkgPSBudWxsKSB7XG4gIHJldHVybiBjcmVhdGVFdmVudCgnRScsIG5hbWUsIHRpbWUsIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXJrU3RhcnRFdmVudChuYW1lOiBzdHJpbmcsIHRpbWU6IG51bWJlcikge1xuICByZXR1cm4gY3JlYXRlRXZlbnQoJ0InLCBuYW1lLCB0aW1lKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFya0VuZEV2ZW50KG5hbWU6IHN0cmluZywgdGltZTogbnVtYmVyKSB7XG4gIHJldHVybiBjcmVhdGVFdmVudCgnRScsIG5hbWUsIHRpbWUpO1xufVxuIl19