UNPKG

ionic-logging-service

Version:

Logging functionalities for apps built with Ionic framework

133 lines 14 kB
import * as log4javascript from "log4javascript"; import { LogLevelConverter } from "./log-level.converter"; import { LogLevel } from "./log-level.model"; /** * An appender which stores the log messages in the browser's memory. * * The MemoryAppender is enabled by default. * If you do not specify anything else, it is using this configuration: * * ```JSON * { * "memoryAppender": [ * { * "maxMessages": 250, * "threshold": "ALL" * } * } * ``` */ export class MemoryAppender extends log4javascript.Appender { static { this.maxMessagesDefault = 250; } static { this.thresholdDefault = "ALL"; } /** * Creates a new instance of the appender. * * @param configuration configuration for the appender. */ constructor(configuration) { super(); this.logMessages = []; // process configuration configuration = configuration || {}; this.configure({ maxMessages: configuration.maxMessages || MemoryAppender.maxMessagesDefault, threshold: configuration.threshold || MemoryAppender.thresholdDefault, }); this.maxMessages = MemoryAppender.maxMessagesDefault; } /** * Configures the logging depending on the given configuration. * Only the defined properties get overwritten. * * @param configuration configuration data. */ configure(configuration) { if (configuration) { if (configuration.maxMessages) { this.setMaxMessages(configuration.maxMessages); } if (configuration.threshold) { const convertedThreshold = LogLevelConverter.levelToLog4Javascript(LogLevelConverter.levelFromString(configuration.threshold)); this.setThreshold(convertedThreshold); } } } /** * Appender-specific method to append a log message. * * @param loggingEvent event to be appended. */ append(loggingEvent) { // if logMessages is already full, remove oldest element while (this.logMessages.length >= this.maxMessages) { this.logMessages.shift(); } // add event to logMessages const message = { level: LogLevel[LogLevelConverter.levelFromLog4Javascript(loggingEvent.level)], logger: typeof loggingEvent.logger === "object" ? loggingEvent.logger.name : undefined, message: loggingEvent.messages.slice(1), methodName: loggingEvent.messages[0], timeStamp: loggingEvent.timeStamp, }; this.logMessages.push(message); // inform about new message if (typeof this.onLogMessagesChangedCallback === "function") { this.onLogMessagesChangedCallback(message); } } /** * Gets the appender's name. * Mainly for unit testing purposes. * * @return appender's name */ toString() { return "Ionic.Logging.MemoryAppender"; } /** * Get the maximum number of messages which will be stored in memory. */ getMaxMessages() { return this.maxMessages; } /** * Set the maximum number of messages which will be stored in memory. * * If the appender stores currently more messages than the new value allows, the oldest messages get removed. * * @param value new maximum number */ setMaxMessages(value) { this.maxMessages = value; // if there are too much logMessages for the new value, remove oldest messages if (this.logMessages.length > this.maxMessages) { this.logMessages.splice(0, this.logMessages.length - this.maxMessages); } } /** * Gets all messages stored in memory. * * @return stored messages */ getLogMessages() { return this.logMessages; } /** * Remove all messages stored in memory. */ removeLogMessages() { this.logMessages.splice(0); } /** * Registers a callback which will be called every time a new message is appended. * This could be useful if you want to show new messages in realtime. * * @param callback callback to be called */ setOnLogMessagesChangedCallback(callback) { this.onLogMessagesChangedCallback = callback; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LWFwcGVuZGVyLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW9uaWMtbG9nZ2luZy1zZXJ2aWNlL3NyYy9saWIvbWVtb3J5LWFwcGVuZGVyLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxjQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBSTdDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sT0FBTyxjQUFlLFNBQVEsY0FBYyxDQUFDLFFBQVE7YUFFM0MsdUJBQWtCLEdBQUcsR0FBRyxDQUFDO2FBQ3pCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztJQU94Qzs7OztPQUlHO0lBQ0gsWUFBWSxhQUEyQztRQUN0RCxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXRCLHdCQUF3QjtRQUN4QixhQUFhLEdBQUcsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2QsV0FBVyxFQUFFLGFBQWEsQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLGtCQUFrQjtZQUMzRSxTQUFTLEVBQUUsYUFBYSxDQUFDLFNBQVMsSUFBSSxjQUFjLENBQUMsZ0JBQWdCO1NBQ3JFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDLGtCQUFrQixDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFNBQVMsQ0FBQyxhQUEwQztRQUMxRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ25CLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsSUFBSSxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sa0JBQWtCLEdBQUcsaUJBQWlCLENBQUMscUJBQXFCLENBQ2pFLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsWUFBeUM7UUFDdEQsd0RBQXdEO1FBQ3hELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELDJCQUEyQjtRQUMzQixNQUFNLE9BQU8sR0FBZTtZQUMzQixLQUFLLEVBQUUsUUFBUSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5RSxNQUFNLEVBQUUsT0FBTyxZQUFZLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDdEYsT0FBTyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QyxVQUFVLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDcEMsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTO1NBQ2pDLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvQiwyQkFBMkI7UUFDM0IsSUFBSSxPQUFPLElBQUksQ0FBQyw0QkFBNEIsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsQ0FBQztJQUNGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFFBQVE7UUFDZCxPQUFPLDhCQUE4QixDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWM7UUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxjQUFjLENBQUMsS0FBYTtRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6Qiw4RUFBOEU7UUFDOUUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RSxDQUFDO0lBQ0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxjQUFjO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksK0JBQStCLENBQUMsUUFBdUM7UUFDN0UsSUFBSSxDQUFDLDRCQUE0QixHQUFHLFFBQVEsQ0FBQztJQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbG9nNGphdmFzY3JpcHQgZnJvbSBcImxvZzRqYXZhc2NyaXB0XCI7XG5cbmltcG9ydCB7IExvZ0xldmVsQ29udmVydGVyIH0gZnJvbSBcIi4vbG9nLWxldmVsLmNvbnZlcnRlclwiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9sb2ctbGV2ZWwubW9kZWxcIjtcbmltcG9ydCB7IExvZ01lc3NhZ2UgfSBmcm9tIFwiLi9sb2ctbWVzc2FnZS5tb2RlbFwiO1xuaW1wb3J0IHsgTWVtb3J5QXBwZW5kZXJDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vbWVtb3J5LWFwcGVuZGVyLmNvbmZpZ3VyYXRpb25cIjtcblxuLyoqXG4gKiBBbiBhcHBlbmRlciB3aGljaCBzdG9yZXMgdGhlIGxvZyBtZXNzYWdlcyBpbiB0aGUgYnJvd3NlcidzIG1lbW9yeS5cbiAqXG4gKiBUaGUgTWVtb3J5QXBwZW5kZXIgaXMgZW5hYmxlZCBieSBkZWZhdWx0LlxuICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueXRoaW5nIGVsc2UsIGl0IGlzIHVzaW5nIHRoaXMgY29uZmlndXJhdGlvbjpcbiAqXG4gKiBgYGBKU09OXG4gKiB7XG4gKiAgIFwibWVtb3J5QXBwZW5kZXJcIjogW1xuICogICAgIHtcbiAqICAgICAgIFwibWF4TWVzc2FnZXNcIjogMjUwLFxuICogICAgICAgXCJ0aHJlc2hvbGRcIjogXCJBTExcIlxuICogICAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTWVtb3J5QXBwZW5kZXIgZXh0ZW5kcyBsb2c0amF2YXNjcmlwdC5BcHBlbmRlciB7XG5cblx0cHJpdmF0ZSBzdGF0aWMgbWF4TWVzc2FnZXNEZWZhdWx0ID0gMjUwO1xuXHRwcml2YXRlIHN0YXRpYyB0aHJlc2hvbGREZWZhdWx0ID0gXCJBTExcIjtcblxuXHRwcml2YXRlIG1heE1lc3NhZ2VzOiBudW1iZXI7XG5cblx0cHJpdmF0ZSBsb2dNZXNzYWdlczogTG9nTWVzc2FnZVtdO1xuXHRwcml2YXRlIG9uTG9nTWVzc2FnZXNDaGFuZ2VkQ2FsbGJhY2s6IChtZXNzYWdlOiBMb2dNZXNzYWdlKSA9PiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBhcHBlbmRlci5cblx0ICpcblx0ICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGFwcGVuZGVyLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoY29uZmlndXJhdGlvbj86IE1lbW9yeUFwcGVuZGVyQ29uZmlndXJhdGlvbikge1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLmxvZ01lc3NhZ2VzID0gW107XG5cblx0XHQvLyBwcm9jZXNzIGNvbmZpZ3VyYXRpb25cblx0XHRjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbiB8fCB7fTtcblx0XHR0aGlzLmNvbmZpZ3VyZSh7XG5cdFx0XHRtYXhNZXNzYWdlczogY29uZmlndXJhdGlvbi5tYXhNZXNzYWdlcyB8fCBNZW1vcnlBcHBlbmRlci5tYXhNZXNzYWdlc0RlZmF1bHQsXG5cdFx0XHR0aHJlc2hvbGQ6IGNvbmZpZ3VyYXRpb24udGhyZXNob2xkIHx8IE1lbW9yeUFwcGVuZGVyLnRocmVzaG9sZERlZmF1bHQsXG5cdFx0fSk7XG5cblx0XHR0aGlzLm1heE1lc3NhZ2VzID0gTWVtb3J5QXBwZW5kZXIubWF4TWVzc2FnZXNEZWZhdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpZ3VyZXMgdGhlIGxvZ2dpbmcgZGVwZW5kaW5nIG9uIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuXHQgKiBPbmx5IHRoZSBkZWZpbmVkIHByb3BlcnRpZXMgZ2V0IG92ZXJ3cml0dGVuLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uIGRhdGEuXG5cdCAqL1xuXHRwdWJsaWMgY29uZmlndXJlKGNvbmZpZ3VyYXRpb246IE1lbW9yeUFwcGVuZGVyQ29uZmlndXJhdGlvbik6IHZvaWQge1xuXHRcdGlmIChjb25maWd1cmF0aW9uKSB7XG5cdFx0XHRpZiAoY29uZmlndXJhdGlvbi5tYXhNZXNzYWdlcykge1xuXHRcdFx0XHR0aGlzLnNldE1heE1lc3NhZ2VzKGNvbmZpZ3VyYXRpb24ubWF4TWVzc2FnZXMpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbmZpZ3VyYXRpb24udGhyZXNob2xkKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZFRocmVzaG9sZCA9IExvZ0xldmVsQ29udmVydGVyLmxldmVsVG9Mb2c0SmF2YXNjcmlwdChcblx0XHRcdFx0XHRMb2dMZXZlbENvbnZlcnRlci5sZXZlbEZyb21TdHJpbmcoY29uZmlndXJhdGlvbi50aHJlc2hvbGQpKTtcblx0XHRcdFx0dGhpcy5zZXRUaHJlc2hvbGQoY29udmVydGVkVGhyZXNob2xkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQXBwZW5kZXItc3BlY2lmaWMgbWV0aG9kIHRvIGFwcGVuZCBhIGxvZyBtZXNzYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gbG9nZ2luZ0V2ZW50IGV2ZW50IHRvIGJlIGFwcGVuZGVkLlxuXHQgKi9cblx0cHVibGljIGFwcGVuZChsb2dnaW5nRXZlbnQ6IGxvZzRqYXZhc2NyaXB0LkxvZ2dpbmdFdmVudCk6IHZvaWQge1xuXHRcdC8vIGlmIGxvZ01lc3NhZ2VzIGlzIGFscmVhZHkgZnVsbCwgcmVtb3ZlIG9sZGVzdCBlbGVtZW50XG5cdFx0d2hpbGUgKHRoaXMubG9nTWVzc2FnZXMubGVuZ3RoID49IHRoaXMubWF4TWVzc2FnZXMpIHtcblx0XHRcdHRoaXMubG9nTWVzc2FnZXMuc2hpZnQoKTtcblx0XHR9XG5cdFx0Ly8gYWRkIGV2ZW50IHRvIGxvZ01lc3NhZ2VzXG5cdFx0Y29uc3QgbWVzc2FnZTogTG9nTWVzc2FnZSA9IHtcblx0XHRcdGxldmVsOiBMb2dMZXZlbFtMb2dMZXZlbENvbnZlcnRlci5sZXZlbEZyb21Mb2c0SmF2YXNjcmlwdChsb2dnaW5nRXZlbnQubGV2ZWwpXSxcblx0XHRcdGxvZ2dlcjogdHlwZW9mIGxvZ2dpbmdFdmVudC5sb2dnZXIgPT09IFwib2JqZWN0XCIgPyBsb2dnaW5nRXZlbnQubG9nZ2VyLm5hbWUgOiB1bmRlZmluZWQsXG5cdFx0XHRtZXNzYWdlOiBsb2dnaW5nRXZlbnQubWVzc2FnZXMuc2xpY2UoMSksXG5cdFx0XHRtZXRob2ROYW1lOiBsb2dnaW5nRXZlbnQubWVzc2FnZXNbMF0sXG5cdFx0XHR0aW1lU3RhbXA6IGxvZ2dpbmdFdmVudC50aW1lU3RhbXAsXG5cdFx0fTtcblx0XHR0aGlzLmxvZ01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG5cblx0XHQvLyBpbmZvcm0gYWJvdXQgbmV3IG1lc3NhZ2Vcblx0XHRpZiAodHlwZW9mIHRoaXMub25Mb2dNZXNzYWdlc0NoYW5nZWRDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHR0aGlzLm9uTG9nTWVzc2FnZXNDaGFuZ2VkQ2FsbGJhY2sobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcGVuZGVyJ3MgbmFtZS5cblx0ICogTWFpbmx5IGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMuXG5cdCAqXG5cdCAqIEByZXR1cm4gYXBwZW5kZXIncyBuYW1lXG5cdCAqL1xuXHRwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gXCJJb25pYy5Mb2dnaW5nLk1lbW9yeUFwcGVuZGVyXCI7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyB3aGljaCB3aWxsIGJlIHN0b3JlZCBpbiBtZW1vcnkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TWF4TWVzc2FnZXMoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5tYXhNZXNzYWdlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHdoaWNoIHdpbGwgYmUgc3RvcmVkIGluIG1lbW9yeS5cblx0ICpcblx0ICogSWYgdGhlIGFwcGVuZGVyIHN0b3JlcyBjdXJyZW50bHkgbW9yZSBtZXNzYWdlcyB0aGFuIHRoZSBuZXcgdmFsdWUgYWxsb3dzLCB0aGUgb2xkZXN0IG1lc3NhZ2VzIGdldCByZW1vdmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWUgbmV3IG1heGltdW0gbnVtYmVyXG5cdCAqL1xuXHRwdWJsaWMgc2V0TWF4TWVzc2FnZXModmFsdWU6IG51bWJlcik6IHZvaWQge1xuXHRcdHRoaXMubWF4TWVzc2FnZXMgPSB2YWx1ZTtcblxuXHRcdC8vIGlmIHRoZXJlIGFyZSB0b28gbXVjaCBsb2dNZXNzYWdlcyBmb3IgdGhlIG5ldyB2YWx1ZSwgcmVtb3ZlIG9sZGVzdCBtZXNzYWdlc1xuXHRcdGlmICh0aGlzLmxvZ01lc3NhZ2VzLmxlbmd0aCA+IHRoaXMubWF4TWVzc2FnZXMpIHtcblx0XHRcdHRoaXMubG9nTWVzc2FnZXMuc3BsaWNlKDAsIHRoaXMubG9nTWVzc2FnZXMubGVuZ3RoIC0gdGhpcy5tYXhNZXNzYWdlcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgYWxsIG1lc3NhZ2VzIHN0b3JlZCBpbiBtZW1vcnkuXG5cdCAqXG5cdCAqIEByZXR1cm4gc3RvcmVkIG1lc3NhZ2VzXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9nTWVzc2FnZXMoKTogTG9nTWVzc2FnZVtdIHtcblx0XHRyZXR1cm4gdGhpcy5sb2dNZXNzYWdlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYWxsIG1lc3NhZ2VzIHN0b3JlZCBpbiBtZW1vcnkuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlTG9nTWVzc2FnZXMoKTogdm9pZCB7XG5cdFx0dGhpcy5sb2dNZXNzYWdlcy5zcGxpY2UoMCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIG5ldyBtZXNzYWdlIGlzIGFwcGVuZGVkLlxuXHQgKiBUaGlzIGNvdWxkIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzaG93IG5ldyBtZXNzYWdlcyBpbiByZWFsdGltZS5cblx0ICpcblx0ICogQHBhcmFtIGNhbGxiYWNrIGNhbGxiYWNrIHRvIGJlIGNhbGxlZFxuXHQgKi9cblx0cHVibGljIHNldE9uTG9nTWVzc2FnZXNDaGFuZ2VkQ2FsbGJhY2soY2FsbGJhY2s6IChtZXNzYWdlOiBMb2dNZXNzYWdlKSA9PiB2b2lkKTogdm9pZCB7XG5cdFx0dGhpcy5vbkxvZ01lc3NhZ2VzQ2hhbmdlZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cdH1cbn1cbiJdfQ==