diff --git a/dist/exceptionless.d.ts b/dist/exceptionless.d.ts
index 20ed6c8f..d13b476d 100644
--- a/dist/exceptionless.d.ts
+++ b/dist/exceptionless.d.ts
@@ -208,20 +208,20 @@ export declare class Configuration implements IConfigurationSettings {
     settings: Object;
     storage: IStorageProvider;
     queue: IEventQueue;
+    private _apiKey;
+    private _serverUrl;
+    private _heartbeatServerUrl;
+    private _updateSettingsWhenIdleInterval;
+    private _dataExclusions;
+    private _userAgentBotPatterns;
     private _plugins;
     private _handlers;
     constructor(configSettings?: IConfigurationSettings);
-    private _apiKey;
     apiKey: string;
     isValid: boolean;
-    private _serverUrl;
     serverUrl: string;
-    private _heartbeatServerUrl;
     heartbeatServerUrl: string;
-    private _updateSettingsWhenIdleInterval;
     updateSettingsWhenIdleInterval: number;
-    private _dataExclusions;
-    private _userAgentBotPatterns;
     dataExclusions: string[];
     addDataExclusions(...exclusions: string[]): void;
     userAgentBotPatterns: string[];
diff --git a/dist/exceptionless.js b/dist/exceptionless.js
index e03c45d1..c165c615 100644
--- a/dist/exceptionless.js
+++ b/dist/exceptionless.js
@@ -1246,13 +1246,13 @@ if (typeof module !== 'undefined' && module.exports && this.module !== module) {
 
 (function(root, factory) {
   if (typeof define === 'function' && define.amd) {
-    define('exceptionless', factory);
+    define('exceptionless', ["require","exports","module","TraceKit"], factory);
   } else if (typeof exports === 'object') {
-    module.exports = factory(require, exports, module);
+    module.exports = factory(require, exports, module, require('TraceKit'));
   } else {
-    root.exceptionless = factory();
+    root.exceptionless = factory(require, exports, module, root.TraceKit);
   }
-}(this, function(require, exports, module) {
+}(this, function(require, exports, module, TraceKit) {
 if (!require) {
 	require = function(name) {
 		return (typeof window !== "undefined" ? window : global)[name];
@@ -1962,13 +1962,13 @@ var Configuration = (function () {
         this.enabled = true;
         this.lastReferenceIdManager = new DefaultLastReferenceIdManager();
         this.settings = {};
-        this._plugins = [];
-        this._handlers = [];
         this._serverUrl = 'https://collector.exceptionless.io';
         this._heartbeatServerUrl = 'https://heartbeat.exceptionless.io';
         this._updateSettingsWhenIdleInterval = 120000;
         this._dataExclusions = [];
         this._userAgentBotPatterns = [];
+        this._plugins = [];
+        this._handlers = [];
         function inject(fn) {
             return typeof fn === 'function' ? fn(this) : fn;
         }
diff --git a/dist/exceptionless.js.map b/dist/exceptionless.js.map
index ae649d81..5c5878e3 100644
--- a/dist/exceptionless.js.map
+++ b/dist/exceptionless.js.map
@@ -1 +1 @@
-{"version":3,"sources":["tracekit.js","/source/exceptionless.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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","file":"exceptionless.js","sourcesContent":["/**\n * https://github.com/csnover/TraceKit\n * @license MIT\n * @namespace TraceKit\n */\n(function(window, undefined) {\nif (!window) {\n    return;\n}\n\nvar TraceKit = {};\nvar _oldTraceKit = window.TraceKit;\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n/**\n * A better form of hasOwnProperty<br/>\n * Example: `_has(MainHostObject, property) === true/false`\n *\n * @param {Object} object to check property\n * @param {string} key to check\n * @return {Boolean} true if the object has the key and it is not inherited\n */\nfunction _has(object, key) {\n    return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/**\n * Returns true if the parameter is undefined<br/>\n * Example: `_isUndefined(val) === true/false`\n *\n * @param {*} what Value to check\n * @return {Boolean} true if undefined and false otherwise\n */\nfunction _isUndefined(what) {\n    return typeof what === 'undefined';\n}\n\n/**\n * Export TraceKit out to another variable<br/>\n * Example: `var TK = TraceKit.noConflict()`\n * @return {Object} The TraceKit object\n * @memberof TraceKit\n */\nTraceKit.noConflict = function noConflict() {\n    window.TraceKit = _oldTraceKit;\n    return TraceKit;\n};\n\n/**\n * Wrap any function in a TraceKit reporter<br/>\n * Example: `func = TraceKit.wrap(func);`\n *\n * @param {Function} func Function to be wrapped\n * @return {Function} The wrapped func\n * @memberof TraceKit\n */\nTraceKit.wrap = function traceKitWrapper(func) {\n    function wrapped() {\n        try {\n            return func.apply(this, arguments);\n        } catch (e) {\n            TraceKit.report(e);\n            throw e;\n        }\n    }\n    return wrapped;\n};\n\n/**\n * Cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * ```js\n *   TraceKit.report.subscribe(function(stackInfo) { ... })\n *   TraceKit.report.unsubscribe(function(stackInfo) { ... })\n *   TraceKit.report(exception)\n *   try { ...code... } catch(ex) { TraceKit.report(ex); }\n * ```\n *\n * Supports:\n *   - Firefox: full stack trace with line numbers, plus column number\n *     on top frame; column number is not guaranteed\n *   - Opera: full stack trace with line and column numbers\n *   - Chrome: full stack trace with line and column numbers\n *   - Safari: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *   - IE: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n *   - IE5.5+ (only 8.0 tested)\n *   - Firefox 0.9+ (only 3.5+ tested)\n *   - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n *     Exceptions Have Stacktrace to be enabled in opera:config)\n *   - Safari 3+ (only 4+ tested)\n *   - Chrome 1+ (only 5+ tested)\n *   - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a TraceKit.StackTrace object as described in the\n * TraceKit.computeStackTrace docs.\n *\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.report = (function reportModuleWrapper() {\n    var handlers = [],\n        lastArgs = null,\n        lastException = null,\n        lastExceptionStack = null;\n\n    /**\n     * Add a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function subscribe(handler) {\n        installGlobalHandler();\n        handlers.push(handler);\n    }\n\n    /**\n     * Remove a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function unsubscribe(handler) {\n        for (var i = handlers.length - 1; i >= 0; --i) {\n            if (handlers[i] === handler) {\n                handlers.splice(i, 1);\n            }\n        }\n    }\n\n    /**\n     * Dispatch stack information to all handlers.\n     * @param {TraceKit.StackTrace} stack\n     * @param {boolean} isWindowError Is this a top-level window error?\n     * @memberof TraceKit.report\n     * @throws An exception if an error occurs while calling an handler.\n     */\n    function notifyHandlers(stack, isWindowError) {\n        var exception = null;\n        if (isWindowError && !TraceKit.collectWindowErrors) {\n          return;\n        }\n        for (var i in handlers) {\n            if (_has(handlers, i)) {\n                try {\n                    handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n                } catch (inner) {\n                    exception = inner;\n                }\n            }\n        }\n\n        if (exception) {\n            throw exception;\n        }\n    }\n\n    var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n    /**\n     * Ensures all global unhandled exceptions are recorded.\n     * Supported by Gecko and IE.\n     * @param {string} message Error message.\n     * @param {string} url URL of script that generated the exception.\n     * @param {(number|string)} lineNo The line number at which the error occurred.\n     * @param {(number|string)=} columnNo The column number at which the error occurred.\n     * @param {Error=} errorObj The actual Error object.\n     * @memberof TraceKit.report\n     */\n    function traceKitWindowOnError(message, url, lineNo, columnNo, errorObj) {\n        var stack = null;\n\n        if (lastExceptionStack) {\n            TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message);\n    \t    processLastException();\n\t    } else if (errorObj) {\n            stack = TraceKit.computeStackTrace(errorObj);\n            notifyHandlers(stack, true);\n        } else {\n            var location = {\n              'url': url,\n              'line': lineNo,\n              'column': columnNo\n            };\n            location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line);\n            location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line);\n            stack = {\n              'mode': 'onerror',\n              'message': message,\n              'stack': [location]\n            };\n\n            notifyHandlers(stack, true);\n        }\n\n        if (_oldOnerrorHandler) {\n            return _oldOnerrorHandler.apply(this, arguments);\n        }\n\n        return false;\n    }\n\n    /**\n     * Install a global onerror handler\n     * @memberof TraceKit.report\n     */\n    function installGlobalHandler () {\n        if (_onErrorHandlerInstalled === true) {\n            return;\n        }\n        _oldOnerrorHandler = window.onerror;\n        window.onerror = traceKitWindowOnError;\n        _onErrorHandlerInstalled = true;\n    }\n\n    /**\n     * Process the most recent exception\n     * @memberof TraceKit.report\n     */\n    function processLastException() {\n        var _lastExceptionStack = lastExceptionStack,\n            _lastArgs = lastArgs;\n        lastArgs = null;\n        lastExceptionStack = null;\n        lastException = null;\n        notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n    }\n\n    /**\n     * Reports an unhandled Error to TraceKit.\n     * @param {Error} ex\n     * @memberof TraceKit.report\n     * @throws An exception if an incomplete stack trace is detected (old IE browsers).\n     */\n    function report(ex) {\n        if (lastExceptionStack) {\n            if (lastException === ex) {\n                return; // already caught by an inner catch block, ignore\n            } else {\n              processLastException();\n            }\n        }\n\n        var stack = TraceKit.computeStackTrace(ex);\n        lastExceptionStack = stack;\n        lastException = ex;\n        lastArgs = _slice.call(arguments, 1);\n\n        // If the stack trace is incomplete, wait for 2 seconds for\n        // slow slow IE to see if onerror occurs or not before reporting\n        // this exception; otherwise, we will end up with an incomplete\n        // stack trace\n        window.setTimeout(function () {\n            if (lastException === ex) {\n                processLastException();\n            }\n        }, (stack.incomplete ? 2000 : 0));\n\n        throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n    }\n\n    report.subscribe = subscribe;\n    report.unsubscribe = unsubscribe;\n    return report;\n}());\n\n/**\n * An object representing a single stack frame.\n * @typedef {Object} StackFrame\n * @property {string} url The JavaScript or HTML file URL.\n * @property {string} func The function name, or empty for anonymous functions (if guessing did not work).\n * @property {string[]?} args The arguments passed to the function, if known.\n * @property {number=} line The line number, if known.\n * @property {number=} column The column number, if known.\n * @property {string[]} context An array of source code lines; the middle element corresponds to the correct line#.\n * @memberof TraceKit\n */\n\n/**\n * An object representing a JavaScript stack trace.\n * @typedef {Object} StackTrace\n * @property {string} name The name of the thrown exception.\n * @property {string} message The exception error message.\n * @property {TraceKit.StackFrame[]} stack An array of stack frames.\n * @property {string} mode 'stack', 'stacktrace', 'multiline', 'callers', 'onerror', or 'failed' -- method used to collect the stack trace.\n * @memberof TraceKit\n */\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n *   ```js\n *   s = TraceKit.computeStackTrace.ofCaller([depth])\n *   s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n *   ```\n *\n * Supports:\n *   - Firefox:  full stack trace with line numbers and unreliable column\n *               number on top frame\n *   - Opera 10: full stack trace with line and column numbers\n *   - Opera 9-: full stack trace with line numbers\n *   - Chrome:   full stack trace with line and column numbers\n *   - Safari:   line and column number for the topmost stacktrace element\n *               only\n *   - IE:       no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n *  * in Safari, some methods may be missing from the stack trace;\n *  * in IE, the topmost function in the stack trace will always be the\n *    caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n * Tracing example:\n *  ```js\n *     function trace(message) {\n *         var stackInfo = TraceKit.computeStackTrace.ofCaller();\n *         var data = message + \"\\n\";\n *         for(var i in stackInfo.stack) {\n *             var item = stackInfo.stack[i];\n *             data += (item.func || '[anonymous]') + \"() in \" + item.url + \":\" + (item.line || '0') + \"\\n\";\n *         }\n *         if (window.console)\n *             console.info(data);\n *         else\n *             alert(data);\n *     }\n * ```\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n    var debug = false,\n        sourceCache = {};\n\n    /**\n     * Attempts to retrieve source code via XMLHttpRequest, which is used\n     * to look up anonymous function names.\n     * @param {string} url URL of source code.\n     * @return {string} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function loadSource(url) {\n        if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on.\n            return '';\n        }\n        try {\n            var getXHR = function() {\n                try {\n                    return new window.XMLHttpRequest();\n                } catch (e) {\n                    // explicitly bubble up the exception if not found\n                    return new window.ActiveXObject('Microsoft.XMLHTTP');\n                }\n            };\n\n            var request = getXHR();\n            request.open('GET', url, false);\n            request.send('');\n            return request.responseText;\n        } catch (e) {\n            return '';\n        }\n    }\n\n    /**\n     * Retrieves source code from the source code cache.\n     * @param {string} url URL of source code.\n     * @return {Array.<string>} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function getSource(url) {\n        if (typeof url !== 'string') {\n            return [];\n        }\n\n        if (!_has(sourceCache, url)) {\n            // URL needs to be able to fetched within the acceptable domain.  Otherwise,\n            // cross-domain errors will be triggered.\n            /*\n                Regex matches:\n                0 - Full Url\n                1 - Protocol\n                2 - Domain\n                3 - Port (Useful for internal applications)\n                4 - Path\n            */\n            var source = '';\n            var domain = '';\n            try { domain = window.document.domain; } catch (e) { }\n            var match = /(.*)\\:\\/\\/([^:\\/]+)([:\\d]*)\\/{0,1}([\\s\\S]*)/.exec(url);\n            if (match && match[2] === domain) {\n                source = loadSource(url);\n            }\n            sourceCache[url] = source ? source.split('\\n') : [];\n        }\n\n        return sourceCache[url];\n    }\n\n    /**\n     * Tries to use an externally loaded copy of source code to determine\n     * the name of a function by looking at the name of the variable it was\n     * assigned to, if any.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} lineNo Line number in source code.\n     * @return {string} The function name, if discoverable.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function guessFunctionName(url, lineNo) {\n        var reFunctionArgNames = /function ([^(]*)\\(([^)]*)\\)/,\n            reGuessFunction = /['\"]?([0-9A-Za-z$_]+)['\"]?\\s*[:=]\\s*(function|eval|new Function)/,\n            line = '',\n            maxLines = 10,\n            source = getSource(url),\n            m;\n\n        if (!source.length) {\n            return UNKNOWN_FUNCTION;\n        }\n\n        // Walk backwards from the first line in the function until we find the line which\n        // matches the pattern above, which is the function definition\n        for (var i = 0; i < maxLines; ++i) {\n            line = source[lineNo - i] + line;\n\n            if (!_isUndefined(line)) {\n                if ((m = reGuessFunction.exec(line))) {\n                    return m[1];\n                } else if ((m = reFunctionArgNames.exec(line))) {\n                    return m[1];\n                }\n            }\n        }\n\n        return UNKNOWN_FUNCTION;\n    }\n\n    /**\n     * Retrieves the surrounding lines from where an exception occurred.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} line Line number in source code to centre\n     * around for context.\n     * @return {?Array.<string>} Lines of source code.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function gatherContext(url, line) {\n        var source = getSource(url);\n\n        if (!source.length) {\n            return null;\n        }\n\n        var context = [],\n            // linesBefore & linesAfter are inclusive with the offending line.\n            // if linesOfContext is even, there will be one extra line\n            //   *before* the offending line.\n            linesBefore = Math.floor(TraceKit.linesOfContext / 2),\n            // Add one extra line if linesOfContext is odd\n            linesAfter = linesBefore + (TraceKit.linesOfContext % 2),\n            start = Math.max(0, line - linesBefore - 1),\n            end = Math.min(source.length, line + linesAfter - 1);\n\n        line -= 1; // convert to 0-based index\n\n        for (var i = start; i < end; ++i) {\n            if (!_isUndefined(source[i])) {\n                context.push(source[i]);\n            }\n        }\n\n        return context.length > 0 ? context : null;\n    }\n\n    /**\n     * Escapes special characters, except for whitespace, in a string to be\n     * used inside a regular expression as a string literal.\n     * @param {string} text The string.\n     * @return {string} The escaped string literal.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeRegExp(text) {\n        return text.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#]/g, '\\\\$&');\n    }\n\n    /**\n     * Escapes special characters in a string to be used inside a regular\n     * expression as a string literal. Also ensures that HTML entities will\n     * be matched the same as their literal friends.\n     * @param {string} body The string.\n     * @return {string} The escaped string.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeCodeAsRegExpForMatchingInsideHTML(body) {\n        return escapeRegExp(body).replace('<', '(?:<|&lt;)').replace('>', '(?:>|&gt;)').replace('&', '(?:&|&amp;)').replace('\"', '(?:\"|&quot;)').replace(/\\s+/g, '\\\\s+');\n    }\n\n    /**\n     * Determines where a code fragment occurs in the source code.\n     * @param {RegExp} re The function definition.\n     * @param {Array.<string>} urls A list of URLs to search.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInUrls(re, urls) {\n        var source, m;\n        for (var i = 0, j = urls.length; i < j; ++i) {\n            // console.log('searching', urls[i]);\n            if ((source = getSource(urls[i])).length) {\n                source = source.join('\\n');\n                if ((m = re.exec(source))) {\n                    // console.log('Found function in ' + urls[i]);\n\n                    return {\n                        'url': urls[i],\n                        'line': source.substring(0, m.index).split('\\n').length,\n                        'column': m.index - source.lastIndexOf('\\n', m.index) - 1\n                    };\n                }\n            }\n        }\n\n        // console.log('no match');\n\n        return null;\n    }\n\n    /**\n     * Determines at which column a code fragment occurs on a line of the\n     * source code.\n     * @param {string} fragment The code fragment.\n     * @param {string} url The URL to search.\n     * @param {(string|number)} line The line number to examine.\n     * @return {?number} The column number.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInLine(fragment, url, line) {\n        var source = getSource(url),\n            re = new RegExp('\\\\b' + escapeRegExp(fragment) + '\\\\b'),\n            m;\n\n        line -= 1;\n\n        if (source && source.length > line && (m = re.exec(source[line]))) {\n            return m.index;\n        }\n\n        return null;\n    }\n\n    /**\n     * Determines where a function was defined within the source code.\n     * @param {(Function|string)} func A function reference or serialized\n     * function definition.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceByFunctionBody(func) {\n        if (_isUndefined(window && window.document)) {\n            return;\n        }\n\n        var urls = [window.location.href],\n            scripts = window.document.getElementsByTagName('script'),\n            body,\n            code = '' + func,\n            codeRE = /^function(?:\\s+([\\w$]+))?\\s*\\(([\\w\\s,]*)\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            eventRE = /^function on([\\w$]+)\\s*\\(event\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            re,\n            parts,\n            result;\n\n        for (var i = 0; i < scripts.length; ++i) {\n            var script = scripts[i];\n            if (script.src) {\n                urls.push(script.src);\n            }\n        }\n\n        if (!(parts = codeRE.exec(code))) {\n            re = new RegExp(escapeRegExp(code).replace(/\\s+/g, '\\\\s+'));\n        }\n\n        // not sure if this is really necessary, but I don’t have a test\n        // corpus large enough to confirm that and it was in the original.\n        else {\n            var name = parts[1] ? '\\\\s+' + parts[1] : '',\n                args = parts[2].split(',').join('\\\\s*,\\\\s*');\n\n            body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\\s+/g, '\\\\s+');\n            re = new RegExp('function' + name + '\\\\s*\\\\(\\\\s*' + args + '\\\\s*\\\\)\\\\s*{\\\\s*' + body + '\\\\s*}');\n        }\n\n        // look for a normal function definition\n        if ((result = findSourceInUrls(re, urls))) {\n            return result;\n        }\n\n        // look for an old-school event handler function\n        if ((parts = eventRE.exec(code))) {\n            var event = parts[1];\n            body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]);\n\n            // look for a function defined in HTML as an onXXX handler\n            re = new RegExp('on' + event + '=[\\\\\\'\"]\\\\s*' + body + '\\\\s*[\\\\\\'\"]', 'i');\n\n            if ((result = findSourceInUrls(re, urls[0]))) {\n                return result;\n            }\n\n            // look for ???\n            re = new RegExp(body);\n\n            if ((result = findSourceInUrls(re, urls))) {\n                return result;\n            }\n        }\n\n        return null;\n    }\n\n    // Contents of Exception in various browsers.\n    //\n    // SAFARI:\n    // ex.message = Can't find variable: qq\n    // ex.line = 59\n    // ex.sourceId = 580238192\n    // ex.sourceURL = http://...\n    // ex.expressionBeginOffset = 96\n    // ex.expressionCaretOffset = 98\n    // ex.expressionEndOffset = 98\n    // ex.name = ReferenceError\n    //\n    // FIREFOX:\n    // ex.message = qq is not defined\n    // ex.fileName = http://...\n    // ex.lineNumber = 59\n    // ex.columnNumber = 69\n    // ex.stack = ...stack trace... (see the example below)\n    // ex.name = ReferenceError\n    //\n    // CHROME:\n    // ex.message = qq is not defined\n    // ex.name = ReferenceError\n    // ex.type = not_defined\n    // ex.arguments = ['aa']\n    // ex.stack = ...stack trace...\n    //\n    // INTERNET EXPLORER:\n    // ex.message = ...\n    // ex.name = ReferenceError\n    //\n    // OPERA:\n    // ex.message = ...message... (see the example below)\n    // ex.name = ReferenceError\n    // ex.opera#sourceloc = 11  (pretty much useless, duplicates the info in ex.message)\n    // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n    /**\n     * Computes stack trace information from the stack property.\n     * Chrome and Gecko use this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStackProp(ex) {\n        if (!ex.stack) {\n            return null;\n        }\n\n        var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n            gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|\\[native).*?)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n            winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:ms-appx|https?|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n            lines = ex.stack.split('\\n'),\n            stack = [],\n            parts,\n            element,\n            reference = /^(.*) is undefined$/.exec(ex.message);\n\n        for (var i = 0, j = lines.length; i < j; ++i) {\n            if ((parts = chrome.exec(lines[i]))) {\n                var isNative = parts[2] && parts[2].indexOf('native') !== -1;\n                element = {\n                    'url': !isNative ? parts[2] : null,\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': isNative ? [parts[2]] : [],\n                    'line': parts[3] ? +parts[3] : null,\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ( parts = winjs.exec(lines[i]) ) {\n                element = {\n                    'url': parts[2],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': [],\n                    'line': +parts[3],\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ((parts = gecko.exec(lines[i]))) {\n                element = {\n                    'url': parts[3],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': parts[2] ? parts[2].split(',') : [],\n                    'line': parts[4] ? +parts[4] : null,\n                    'column': parts[5] ? +parts[5] : null\n                };\n            } else {\n                continue;\n            }\n\n            if (!element.func && element.line) {\n                element.func = guessFunctionName(element.url, element.line);\n            }\n\n            if (element.line) {\n                element.context = gatherContext(element.url, element.line);\n            }\n\n            stack.push(element);\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        if (stack[0] && stack[0].line && !stack[0].column && reference) {\n            stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line);\n        } else if (!stack[0].column && !_isUndefined(ex.columnNumber)) {\n            // FireFox uses this awesome columnNumber property for its top frame\n            // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n            // so adding 1\n            stack[0].column = ex.columnNumber + 1;\n        }\n\n        return {\n            'mode': 'stack',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * Computes stack trace information from the stacktrace property.\n     * Opera 10+ uses this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStacktraceProp(ex) {\n        // Access and store the stacktrace property before doing ANYTHING\n        // else to it because Opera is not very good at providing it\n        // reliably in other circumstances.\n        var stacktrace = ex.stacktrace;\n        if (!stacktrace) {\n            return;\n        }\n\n        var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i,\n            opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i,\n            lines = stacktrace.split('\\n'),\n            stack = [],\n            parts;\n\n        for (var line = 0; line < lines.length; line += 2) {\n            var element = null;\n            if ((parts = opera10Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[2],\n                    'line': +parts[1],\n                    'column': null,\n                    'func': parts[3],\n                    'args':[]\n                };\n            } else if ((parts = opera11Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[6],\n                    'line': +parts[1],\n                    'column': +parts[2],\n                    'func': parts[3] || parts[4],\n                    'args': parts[5] ? parts[5].split(',') : []\n                };\n            }\n\n            if (element) {\n                if (!element.func && element.line) {\n                    element.func = guessFunctionName(element.url, element.line);\n                }\n                if (element.line) {\n                    try {\n                        element.context = gatherContext(element.url, element.line);\n                    } catch (exc) {}\n                }\n\n                if (!element.context) {\n                    element.context = [lines[line + 1]];\n                }\n\n                stack.push(element);\n            }\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        return {\n            'mode': 'stacktrace',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * NOT TESTED.\n     * Computes stack trace information from an error message that includes\n     * the stack trace.\n     * Opera 9 and earlier use this method if the option to show stack\n     * traces is turned on in opera:config.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromOperaMultiLineMessage(ex) {\n        // TODO: Clean this function up\n        // Opera includes a stack trace into the exception message. An example is:\n        //\n        // Statement on line 3: Undefined variable: undefinedFunc\n        // Backtrace:\n        //   Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz\n        //         undefinedFunc(a);\n        //   Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy\n        //           zzz(x, y, z);\n        //   Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx\n        //           yyy(a, a, a);\n        //   Line 1 of function script\n        //     try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); }\n        //   ...\n\n        var lines = ex.message.split('\\n');\n        if (lines.length < 4) {\n            return null;\n        }\n\n        var lineRE1 = /^\\s*Line (\\d+) of linked script ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE2 = /^\\s*Line (\\d+) of inline#(\\d+) script in ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE3 = /^\\s*Line (\\d+) of function script\\s*$/i,\n            stack = [],\n            scripts = (window && window.document && window.document.getElementsByTagName('script')),\n            inlineScriptBlocks = [],\n            parts;\n\n        for (var s in scripts) {\n            if (_has(scripts, s) && !scripts[s].src) {\n                inlineScriptBlocks.push(scripts[s]);\n            }\n        }\n\n        for (var line = 2; line < lines.length; line += 2) {\n            var item = null;\n            if ((parts = lineRE1.exec(lines[line]))) {\n                item = {\n                    'url': parts[2],\n                    'func': parts[3],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null\n                };\n            } else if ((parts = lineRE2.exec(lines[line]))) {\n                item = {\n                    'url': parts[3],\n                    'func': parts[4],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null // TODO: Check to see if inline#1 (+parts[2]) points to the script number or column number.\n                };\n                var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block\n                var script = inlineScriptBlocks[parts[2] - 1];\n                if (script) {\n                    var source = getSource(item.url);\n                    if (source) {\n                        source = source.join('\\n');\n                        var pos = source.indexOf(script.innerText);\n                        if (pos >= 0) {\n                            item.line = relativeLine + source.substring(0, pos).split('\\n').length;\n                        }\n                    }\n                }\n            } else if ((parts = lineRE3.exec(lines[line]))) {\n                var url = window.location.href.replace(/#.*$/, '');\n                var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[line + 1]));\n                var src = findSourceInUrls(re, [url]);\n                item = {\n                    'url': url,\n                    'func': '',\n                    'args': [],\n                    'line': src ? src.line : parts[1],\n                    'column': null\n                };\n            }\n\n            if (item) {\n                if (!item.func) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n                var context = gatherContext(item.url, item.line);\n                var midline = (context ? context[Math.floor(context.length / 2)] : null);\n                if (context && midline.replace(/^\\s*/, '') === lines[line + 1].replace(/^\\s*/, '')) {\n                    item.context = context;\n                } else {\n                    // if (context) alert(\"Context mismatch. Correct midline:\\n\" + lines[i+1] + \"\\n\\nMidline:\\n\" + midline + \"\\n\\nContext:\\n\" + context.join(\"\\n\") + \"\\n\\nURL:\\n\" + item.url);\n                    item.context = [lines[line + 1]];\n                }\n                stack.push(item);\n            }\n        }\n        if (!stack.length) {\n            return null; // could not parse multiline exception message as Opera stack trace\n        }\n\n        return {\n            'mode': 'multiline',\n            'name': ex.name,\n            'message': lines[0],\n            'stack': stack\n        };\n    }\n\n    /**\n     * Adds information about the first frame to incomplete stack traces.\n     * Safari and IE require this to get complete data on the first frame.\n     * @param {TraceKit.StackTrace} stackInfo Stack trace information from\n     * one of the compute* methods.\n     * @param {string} url The URL of the script that caused an error.\n     * @param {(number|string)} lineNo The line number of the script that\n     * caused an error.\n     * @param {string=} message The error generated by the browser, which\n     * hopefully contains the name of the object that caused the error.\n     * @return {boolean} Whether or not the stack information was\n     * augmented.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n        var initial = {\n            'url': url,\n            'line': lineNo\n        };\n\n        if (initial.url && initial.line) {\n            stackInfo.incomplete = false;\n\n            if (!initial.func) {\n                initial.func = guessFunctionName(initial.url, initial.line);\n            }\n\n            if (!initial.context) {\n                initial.context = gatherContext(initial.url, initial.line);\n            }\n\n            var reference = / '([^']+)' /.exec(message);\n            if (reference) {\n                initial.column = findSourceInLine(reference[1], initial.url, initial.line);\n            }\n\n            if (stackInfo.stack.length > 0) {\n                if (stackInfo.stack[0].url === initial.url) {\n                    if (stackInfo.stack[0].line === initial.line) {\n                        return false; // already in stack trace\n                    } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) {\n                        stackInfo.stack[0].line = initial.line;\n                        stackInfo.stack[0].context = initial.context;\n                        return false;\n                    }\n                }\n            }\n\n            stackInfo.stack.unshift(initial);\n            stackInfo.partial = true;\n            return true;\n        } else {\n            stackInfo.incomplete = true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Computes stack trace information by walking the arguments.caller\n     * chain at the time the exception occurred. This will cause earlier\n     * frames to be missed but is the only way to get any stack trace in\n     * Safari and IE. The top frame is restored by\n     * {@link augmentStackTraceWithInitialElement}.\n     * @param {Error} ex\n     * @return {TraceKit.StackTrace=} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceByWalkingCallerChain(ex, depth) {\n        var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n            stack = [],\n            funcs = {},\n            recursion = false,\n            parts,\n            item,\n            source;\n\n        for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {\n            if (curr === computeStackTrace || curr === TraceKit.report) {\n                // console.log('skipping internal function');\n                continue;\n            }\n\n            item = {\n                'url': null,\n                'func': UNKNOWN_FUNCTION,\n                'args': [],\n                'line': null,\n                'column': null\n            };\n\n            if (curr.name) {\n                item.func = curr.name;\n            } else if ((parts = functionName.exec(curr.toString()))) {\n                item.func = parts[1];\n            }\n\n            if (typeof item.func === 'undefined') {\n              try {\n                item.func = parts.input.substring(0, parts.input.indexOf('{'));\n              } catch (e) { }\n            }\n\n            if ((source = findSourceByFunctionBody(curr))) {\n                item.url = source.url;\n                item.line = source.line;\n\n                if (item.func === UNKNOWN_FUNCTION) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n\n                var reference = / '([^']+)' /.exec(ex.message || ex.description);\n                if (reference) {\n                    item.column = findSourceInLine(reference[1], source.url, source.line);\n                }\n            }\n\n            if (funcs['' + curr]) {\n                recursion = true;\n            }else{\n                funcs['' + curr] = true;\n            }\n\n            stack.push(item);\n        }\n\n        if (depth) {\n            // console.log('depth is ' + depth);\n            // console.log('stack is ' + stack.length);\n            stack.splice(0, depth);\n        }\n\n        var result = {\n            'mode': 'callers',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n        augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description);\n        return result;\n    }\n\n    /**\n     * Computes a stack trace for an exception.\n     * @param {Error} ex\n     * @param {(string|number)=} depth\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTrace(ex, depth) {\n        var stack = null;\n        depth = (depth == null ? 0 : +depth);\n\n        try {\n            // This must be tried first because Opera 10 *destroys*\n            // its stacktrace property if you try to access the stack\n            // property first!!\n            stack = computeStackTraceFromStacktraceProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromStackProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromOperaMultiLineMessage(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        return {\n            'mode': 'failed'\n        };\n    }\n\n    /**\n     * Logs a stacktrace starting from the previous call and working down.\n     * @param {(number|string)=} depth How many frames deep to trace.\n     * @return {TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceOfCaller(depth) {\n        depth = (depth == null ? 0 : +depth) + 1; // \"+ 1\" because \"ofCaller\" should drop one frame\n        try {\n            throw new Error();\n        } catch (ex) {\n            return computeStackTrace(ex, depth + 1);\n        }\n    }\n\n    computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n    computeStackTrace.guessFunctionName = guessFunctionName;\n    computeStackTrace.gatherContext = gatherContext;\n    computeStackTrace.ofCaller = computeStackTraceOfCaller;\n    computeStackTrace.getSource = getSource;\n\n    return computeStackTrace;\n}());\n\n/**\n * Extends support for global error handling for asynchronous browser\n * functions. Adopted from Closure Library's errorhandler.js\n * @memberof TraceKit\n */\nTraceKit.extendToAsynchronousCallbacks = function () {\n    var _helper = function _helper(fnName) {\n        var originalFn = window[fnName];\n        window[fnName] = function traceKitAsyncExtension() {\n            // Make a copy of the arguments\n            var args = _slice.call(arguments);\n            var originalCallback = args[0];\n            if (typeof (originalCallback) === 'function') {\n                args[0] = TraceKit.wrap(originalCallback);\n            }\n            // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n            // also only supports 2 argument and doesn't care what \"this\" is, so we\n            // can just call the original function directly.\n            if (originalFn.apply) {\n                return originalFn.apply(this, args);\n            } else {\n                return originalFn(args[0], args[1]);\n            }\n        };\n    };\n\n    _helper('setTimeout');\n    _helper('setInterval');\n};\n\n//Default options:\nif (!TraceKit.remoteFetching) {\n    TraceKit.remoteFetching = true;\n}\nif (!TraceKit.collectWindowErrors) {\n    TraceKit.collectWindowErrors = true;\n}\nif (!TraceKit.linesOfContext || TraceKit.linesOfContext < 1) {\n    // 5 lines before, the offending line, 5 lines after\n    TraceKit.linesOfContext = 11;\n}\n\n// UMD export\nif (typeof module !== 'undefined' && module.exports && this.module !== module) {\n    module.exports = TraceKit;\n} else if (typeof define === 'function' && define.amd) {\n    define('TraceKit', [], TraceKit);\n} else {\n    window.TraceKit = TraceKit;\n}\n\n}(typeof window !== 'undefined' ? window : global));\n","import * as TraceKit from 'TraceKit';\nexport interface IEvent {\n  type?: string;\n  source?: string;\n  date?: Date;\n  tags?: string[];\n  message?: string;\n  geo?: string;\n  value?: number;\n  data?: any;\n  reference_id?: string;\n}\n\nexport class SubmissionResponse {\n  public success: boolean = false;\n  public badRequest: boolean = false;\n  public serviceUnavailable: boolean = false;\n  public paymentRequired: boolean = false;\n  public unableToAuthenticate: boolean = false;\n  public notFound: boolean = false;\n  public requestEntityTooLarge: boolean = false;\n  public statusCode: number;\n  public message: string;\n\n  constructor(statusCode: number, message?: string) {\n    this.statusCode = statusCode;\n    this.message = message;\n\n    this.success = statusCode >= 200 && statusCode <= 299;\n    this.badRequest = statusCode === 400;\n    this.serviceUnavailable = statusCode === 503;\n    this.paymentRequired = statusCode === 402;\n    this.unableToAuthenticate = statusCode === 401 || statusCode === 403;\n    this.notFound = statusCode === 404;\n    this.requestEntityTooLarge = statusCode === 413;\n  }\n}\n\nexport interface ILastReferenceIdManager {\n  getLast(): string;\n  clearLast(): void;\n  setLast(eventId: string): void;\n}\n\nexport interface ILog {\n  info(message: string): void;\n  warn(message: string): void;\n  error(message: string): void;\n}\n\n                                                                                                                 \n\nexport interface IEventQueue {\n  enqueue(event: IEvent): void;\n  process(isAppExiting?: boolean): void;\n  suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void;\n  onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void;\n}\n\n                                                                                                                                  \n\nexport interface IEnvironmentInfoCollector {\n  getEnvironmentInfo(context: EventPluginContext): IEnvironmentInfo;\n}\n\n                                                                                                              \n\nexport interface IErrorParser {\n  parse(context: EventPluginContext, exception: Error): IError;\n}\n\n                                                                                                                \n\nexport interface IModuleCollector {\n  getModules(context: EventPluginContext): IModule[];\n}\n\n                                                                                                                          \n\nexport interface IRequestInfoCollector {\n  getRequestInfo(context: EventPluginContext): IRequestInfo;\n}\n\n                                      \n\nexport interface IStorageProvider {\n  queue: IStorage;\n  settings: IStorage;\n}\n\n                                                                                                                   \n\nexport interface ISubmissionAdapter {\n  sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean): void;\n}\n\n                                                                                                                                                                                                                                                                                           \n\nexport interface ISubmissionClient {\n  postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void;\n  postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void;\n  getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void;\n  sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void;\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            \n\nexport interface IConfigurationSettings {\n  apiKey?: string;\n  serverUrl?: string;\n  heartbeatServerUrl?: string;\n  updateSettingsWhenIdleInterval?: number;\n  environmentInfoCollector?: IEnvironmentInfoCollector;\n  errorParser?: IErrorParser;\n  lastReferenceIdManager?: ILastReferenceIdManager;\n  log?: ILog;\n  moduleCollector?: IModuleCollector;\n  requestInfoCollector?: IRequestInfoCollector;\n  submissionBatchSize?: number;\n  submissionClient?: ISubmissionClient;\n  submissionAdapter?: ISubmissionAdapter;\n  storage?: IStorageProvider;\n  queue?: IEventQueue;\n}\n\n                                                                                                                                                     \n\ninterface ISettingsWithVersion {\n  version: number;\n  settings: { [key: string]: string };\n}\n\nexport class SettingsManager {\n  /**\n   * A list of handlers that will be fired when the settings change.\n   * @type {Array}\n   * @private\n   */\n  private static _handlers: { (config: Configuration): void }[] = [];\n\n  public static onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  public static applySavedServerSettings(config: Configuration): void {\n    if (!config || !config.isValid) {\n      return;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    config.log.info(`Applying saved settings: v${savedSettings.version}`);\n    config.settings = Utils.merge(config.settings, savedSettings.settings);\n    this.changed(config);\n  }\n\n  public static getVersion(config: Configuration): number {\n    if (!config || !config.isValid) {\n      return 0;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    return savedSettings.version || 0;\n  }\n\n  public static checkVersion(version: number, config: Configuration): void {\n    let currentVersion: number = this.getVersion(config);\n    if (version <= currentVersion) {\n      return;\n    }\n\n    config.log.info(`Updating settings from v${currentVersion} to v${version}`);\n    this.updateSettings(config, currentVersion);\n  }\n\n  public static updateSettings(config: Configuration, version?: number): void {\n    if (!config || !config.enabled) {\n      return;\n    }\n\n    let unableToUpdateMessage = 'Unable to update settings';\n    if (!config.isValid) {\n      config.log.error(`${unableToUpdateMessage}: ApiKey is not set.`);\n      return;\n    }\n\n    if (!version || version < 0) {\n      version = this.getVersion(config);\n    }\n\n    config.log.info(`Checking for updated settings from: v${version}.`);\n    config.submissionClient.getSettings(config, version, (response: SettingsResponse) => {\n      if (!config || !response || !response.success || !response.settings) {\n        config.log.warn(`${unableToUpdateMessage}: ${response.message}`);\n        return;\n      }\n\n      config.settings = Utils.merge(config.settings, response.settings);\n\n      // TODO: Store snapshot of settings after reading from config and attributes and use that to revert to defaults.\n      // Remove any existing server settings that are not in the new server settings.\n      let savedServerSettings = SettingsManager.getSavedServerSettings(config);\n      for (let key in savedServerSettings) {\n        if (response.settings[key]) {\n          continue;\n        }\n\n        delete config.settings[key];\n      }\n\n      let newSettings = <ISettingsWithVersion>{\n        version: response.settingsVersion,\n        settings: response.settings\n      };\n\n      config.storage.settings.save(newSettings);\n\n      config.log.info(`Updated settings: v${newSettings.version}`);\n      this.changed(config);\n    });\n  }\n\n  private static changed(config: Configuration) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](config);\n      } catch (ex) {\n        config.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  private static getSavedServerSettings(config: Configuration): ISettingsWithVersion {\n    let item = config.storage.settings.get()[0];\n    if (item && item.value && item.value.version && item.value.settings) {\n      return item.value;\n    }\n\n    return { version: 0, settings: {} };\n  }\n}\n\n                                                                    \n\nexport class DefaultLastReferenceIdManager implements ILastReferenceIdManager {\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @type {string}\n   * @private\n   */\n  private _lastReferenceId: string = null;\n\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @returns {string}\n   */\n  public getLast(): string {\n    return this._lastReferenceId;\n  }\n\n  /**\n   * Clears the last event's reference id.\n   */\n  public clearLast(): void {\n    this._lastReferenceId = null;\n  }\n\n  /**\n   * Sets the last event's reference id.\n   * @param eventId\n   */\n  public setLast(eventId: string): void {\n    this._lastReferenceId = eventId;\n  }\n}\n\n                              \n\nexport class ConsoleLog implements ILog {\n  public info(message: string): void {\n    this.log('info', message);\n  }\n\n  public warn(message: string): void {\n    this.log('warn', message);\n  }\n\n  public error(message: string): void {\n    this.log('error', message);\n  }\n\n  private log(level: string, message: string) {\n    if (console && console[level]) {\n      console[level](`[${level}] Exceptionless: ${message}`);\n    }\n  }\n}\n\n                              \n\nexport class NullLog implements ILog {\n  public info(message: string): void { }\n  public warn(message: string): void { }\n  public error(message: string): void { }\n}\n\nexport interface IUserInfo {\n  identity?: string;\n  name?: string;\n  data?: any;\n}\n\n                                                                                                         \n\nexport interface IEventPlugin {\n  priority?: number;\n  name?: string;\n  run(context: EventPluginContext, next?: () => void): void;\n}\n\n                                                                                                                                                                                             \n\nexport class EventPluginContext {\n  public cancelled: boolean;\n  public client: ExceptionlessClient;\n  public event: IEvent;\n  public contextData: ContextData;\n\n  constructor(client: ExceptionlessClient, event: IEvent, contextData?: ContextData) {\n    this.client = client;\n    this.event = event;\n    this.contextData = contextData ? contextData : new ContextData();\n  }\n\n  public get log(): ILog {\n    return this.client.config.log;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \n\nexport class EventPluginManager {\n  public static run(context: EventPluginContext, callback: (context?: EventPluginContext) => void): void {\n    let wrap = function(plugin: IEventPlugin, next?: () => void): () => void {\n      return () => {\n        try {\n          if (!context.cancelled) {\n            plugin.run(context, next);\n          }\n        } catch (ex) {\n          context.cancelled = true;\n          context.log.error(`Error running plugin '${plugin.name}': ${ex.message}. Discarding Event.`);\n        }\n\n        if (context.cancelled && !!callback) {\n          callback(context);\n        }\n      };\n    };\n\n    let plugins: IEventPlugin[] = context.client.config.plugins; // optimization for minifier.\n    let wrappedPlugins: { (): void }[] = [];\n    if (!!callback) {\n      wrappedPlugins[plugins.length] = wrap({ name: 'cb', priority: 9007199254740992, run: callback }, null);\n    }\n\n    for (let index = plugins.length - 1; index > -1; index--) {\n      wrappedPlugins[index] = wrap(plugins[index], !!callback || (index < plugins.length - 1) ? wrappedPlugins[index + 1] : null);\n    }\n\n    wrappedPlugins[0]();\n  }\n\n  public static addDefaultPlugins(config: Configuration): void {\n    config.addPlugin(new ConfigurationDefaultsPlugin());\n    config.addPlugin(new ErrorPlugin());\n    config.addPlugin(new DuplicateCheckerPlugin());\n    config.addPlugin(new EventExclusionPlugin());\n    config.addPlugin(new ModuleInfoPlugin());\n    config.addPlugin(new RequestInfoPlugin());\n    config.addPlugin(new EnvironmentInfoPlugin());\n    config.addPlugin(new SubmissionMethodPlugin());\n  }\n}\n\n                                                                                                                                                               \n\nexport class HeartbeatPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'HeartbeatPlugin';\n\n  private _interval: number;\n  private _intervalId: any;\n\n  constructor (heartbeatInterval: number = 30000) {\n    this._interval = heartbeatInterval;\n  }\n\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    clearInterval(this._intervalId);\n\n    let user: IUserInfo = context.event.data['@user'];\n    if (user && user.identity) {\n      this._intervalId = setInterval(() => context.client.submitSessionHeartbeat(user.identity), this._interval);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ReferenceIdPlugin implements IEventPlugin {\n  public priority: number = 20;\n  public name: string = 'ReferenceIdPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    if ((!context.event.reference_id || context.event.reference_id.length === 0) && context.event.type === 'error') {\n      context.event.reference_id = Utils.guid().replace('-', '').substring(0, 10);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                     \n\nexport class DefaultEventQueue implements IEventQueue {\n  /**\n   * The configuration object.\n   * @type {Configuration}\n   * @private\n   */\n  private _config: Configuration;\n\n  /**\n   * A list of handlers that will be fired when events are submitted.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (events: IEvent[], response: SubmissionResponse): void }[] = [];\n\n  /**\n   * Suspends processing until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _suspendProcessingUntil: Date;\n\n  /**\n   * Discards queued items until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _discardQueuedItemsUntil: Date;\n\n  /**\n   * Returns true if the queue is processing.\n   * @type {boolean}\n   * @private\n   */\n  private _processingQueue: boolean = false;\n\n  /**\n   * Processes the queue every xx seconds.\n   * @type {Timer}\n   * @private\n   */\n  private _queueTimer: any;\n\n  constructor(config: Configuration) {\n    this._config = config;\n  }\n\n  public enqueue(event: IEvent): void {\n    const eventWillNotBeQueued: string = 'The event will not be queued.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (this.areQueuedItemsDiscarded()) {\n      log.info(`Queue items are currently being discarded. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    this.ensureQueueTimer();\n\n    let timestamp = config.storage.queue.save(event);\n    let logText = `type=${event.type} ${!!event.reference_id ? 'refid=' + event.reference_id : ''}`;\n    if (timestamp) {\n      log.info(`Enqueuing event: ${timestamp} ${logText}`);\n    } else {\n      log.error(`Could not enqueue event ${logText}`);\n    }\n  }\n\n  public process(isAppExiting?: boolean): void {\n    const queueNotProcessed: string = 'The queue will not be processed.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (this._processingQueue) {\n      return;\n    }\n\n    log.info('Processing queue...');\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${queueNotProcessed}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${queueNotProcessed}`);\n      return;\n    }\n\n    this._processingQueue = true;\n    this.ensureQueueTimer();\n\n    try {\n      let events = config.storage.queue.get(config.submissionBatchSize);\n      if (!events || events.length === 0) {\n        this._processingQueue = false;\n        return;\n      }\n\n      log.info(`Sending ${events.length} events to ${config.serverUrl}.`);\n      config.submissionClient.postEvents(events.map(e => e.value), config, (response: SubmissionResponse) => {\n        this.processSubmissionResponse(response, events);\n        this.eventsPosted(events.map(e => e.value), response);\n        log.info('Finished processing queue.');\n        this._processingQueue = false;\n      }, isAppExiting);\n    } catch (ex) {\n      log.error(`Error processing queue: ${ex}`);\n      this.suspendProcessing();\n      this._processingQueue = false;\n    }\n  }\n\n  public suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void {\n    let config: Configuration = this._config; // Optimization for minifier.\n\n    if (!durationInMinutes || durationInMinutes <= 0) {\n      durationInMinutes = 5;\n    }\n\n    config.log.info(`Suspending processing for ${durationInMinutes} minutes.`);\n    this._suspendProcessingUntil = new Date(new Date().getTime() + (durationInMinutes * 60000));\n\n    if (discardFutureQueuedItems) {\n      this._discardQueuedItemsUntil = this._suspendProcessingUntil;\n    }\n\n    if (clearQueue) {\n      // Account is over the limit and we want to ensure that the sample size being sent in will contain newer errors.\n      config.storage.queue.clear();\n    }\n  }\n\n  public onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private eventsPosted(events: IEvent[], response: SubmissionResponse) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](events, response);\n      } catch (ex) {\n        this._config.log.error(`Error calling onEventsPosted handler: ${ex}`);\n      }\n    }\n  }\n\n  private areQueuedItemsDiscarded(): boolean {\n    return this._discardQueuedItemsUntil && this._discardQueuedItemsUntil > new Date();\n  }\n\n  private ensureQueueTimer(): void {\n    if (!this._queueTimer) {\n      this._queueTimer = setInterval(() => this.onProcessQueue(), 10000);\n    }\n  }\n\n  private isQueueProcessingSuspended(): boolean {\n    return this._suspendProcessingUntil && this._suspendProcessingUntil > new Date();\n  }\n\n  private onProcessQueue(): void {\n    if (!this.isQueueProcessingSuspended() && !this._processingQueue) {\n      this.process();\n    }\n  }\n\n  private processSubmissionResponse(response: SubmissionResponse, events: IStorageItem[]): void {\n    const noSubmission: string = 'The event will not be submitted.'; // Optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (response.success) {\n      log.info(`Sent ${events.length} events.`);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.serviceUnavailable) {\n      // You are currently over your rate limit or the servers are under stress.\n      log.error('Server returned service unavailable.');\n      this.suspendProcessing();\n      return;\n    }\n\n    if (response.paymentRequired) {\n      // If the organization over the rate limit then discard the event.\n      log.info('Too many events have been submitted, please upgrade your plan.');\n      this.suspendProcessing(null, true, true);\n      return;\n    }\n\n    if (response.unableToAuthenticate) {\n      // The api key was suspended or could not be authorized.\n      log.info(`Unable to authenticate, please check your configuration. ${noSubmission}`);\n      this.suspendProcessing(15);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.notFound || response.badRequest) {\n      // The service end point could not be found.\n      log.error(`Error while trying to submit data: ${response.message}`);\n      this.suspendProcessing(60 * 4);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.requestEntityTooLarge) {\n      let message = 'Event submission discarded for being too large.';\n      if (config.submissionBatchSize > 1) {\n        log.error(`${message} Retrying with smaller batch size.`);\n        config.submissionBatchSize = Math.max(1, Math.round(config.submissionBatchSize / 1.5));\n      } else {\n        log.error(`${message} ${noSubmission}`);\n        this.removeEvents(events);\n      }\n\n      return;\n    }\n\n    if (!response.success) {\n      log.error(`Error submitting events: ${response.message || 'Please check the network tab for more info.'}`);\n      this.suspendProcessing();\n    }\n  }\n\n  private removeEvents(events: IStorageItem[]) {\n    for (let index = 0; index < (events || []).length; index++) {\n      this._config.storage.queue.remove(events[index].timestamp);\n    }\n  }\n}\n\n                                                                                                                                                  \n\nexport class InMemoryStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(maxQueueItems: number = 250) {\n    this.queue = new InMemoryStorage(maxQueueItems);\n    this.settings = new InMemoryStorage(1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n\ndeclare var XDomainRequest: { new (); create(); };\n\nexport class DefaultSubmissionClient implements ISubmissionClient {\n  public configurationVersionHeader: string = 'x-exceptionless-configversion';\n\n  public postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void {\n    let data = JSON.stringify(events);\n    let request = this.createRequest(config, 'POST',  `${config.serverUrl}/api/v2/events`, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb, isAppExiting);\n  }\n\n  public postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void {\n    let path = `${config.serverUrl}/api/v2/events/by-ref/${encodeURIComponent(referenceId)}/user-description`;\n    let data = JSON.stringify(description);\n    let request = this.createRequest(config, 'POST', path, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void {\n    let request = this.createRequest(config, 'GET', `${config.serverUrl}/api/v2/projects/config?v=${version}`);\n    let cb = (status, message, data?, headers?) => {\n      if (status !== 200) {\n        return callback(new SettingsResponse(false, null, -1, null, message));\n      }\n\n      let settings: IClientConfiguration;\n      try {\n        settings = JSON.parse(data);\n      } catch (e) {\n        config.log.error(`Unable to parse settings: '${data}'`);\n      }\n\n      if (!settings || isNaN(settings.version)) {\n        return callback(new SettingsResponse(false, null, -1, null, 'Invalid configuration settings.'));\n      }\n\n      callback(new SettingsResponse(true, settings.settings || {}, settings.version));\n    };\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void {\n    let request = this.createRequest(config, 'GET', `${config.heartbeatServerUrl}/api/v2/events/session/heartbeat?id=${sessionIdOrUserId}&close=${closeSession}`);\n    config.submissionAdapter.sendRequest(request);\n  }\n\n  private createRequest(config: Configuration, method: string, url: string, data: string = null): SubmissionRequest {\n    return {\n      method,\n      url,\n      data,\n      apiKey: config.apiKey,\n      userAgent: config.userAgent\n    };\n  }\n\n  private createSubmissionCallback(config: Configuration, callback: (response: SubmissionResponse) => void) {\n    return (status, message, data?, headers?) => {\n      let settingsVersion: number = headers && parseInt(headers[this.configurationVersionHeader], 10);\n      SettingsManager.checkVersion(settingsVersion, config);\n\n      callback(new SubmissionResponse(status, message));\n    };\n  }\n}\n\nexport class Utils {\n  public static addRange<T>(target: T[], ...values: T[]) {\n    if (!target) {\n      target = [];\n    }\n\n    if (!values || values.length === 0) {\n      return target;\n    }\n\n    for (let index = 0; index < values.length; index++) {\n      if (values[index] && target.indexOf(values[index]) < 0) {\n        target.push(values[index]);\n      }\n    }\n\n    return target;\n  }\n\n  public static getHashCode(source: string): number {\n    if (!source || source.length === 0) {\n      return 0;\n    }\n\n    let hash: number = 0;\n    for (let index = 0; index < source.length; index++) {\n      let character = source.charCodeAt(index);\n      hash = ((hash << 5) - hash) + character;\n      hash |= 0;\n    }\n\n    return hash;\n  }\n\n  public static getCookies(cookies: string, exclusions?: string[]): Object {\n    let result: Object = {};\n\n    let parts: string[] = (cookies || '').split('; ');\n    for (let index = 0; index < parts.length; index++) {\n      let cookie: string[] = parts[index].split('=');\n      if (!Utils.isMatch(cookie[0], exclusions)) {\n        result[cookie[0]] = cookie[1];\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static guid(): string {\n    function s4() {\n      return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n    }\n\n    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n  }\n\n  public static merge(defaultValues: Object, values: Object) {\n    let result: Object = {};\n\n    for (let key in defaultValues || {}) {\n      if (!!defaultValues[key]) {\n        result[key] = defaultValues[key];\n      }\n    }\n\n    for (let key in values || {}) {\n      if (!!values[key]) {\n        result[key] = values[key];\n      }\n    }\n\n    return result;\n  }\n\n  public static parseVersion(source: string): string {\n    if (!source) {\n      return null;\n    }\n\n    let versionRegex = /(v?((\\d+)\\.(\\d+)(\\.(\\d+))?)(?:-([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?(?:\\+([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?)/;\n    let matches = versionRegex.exec(source);\n    if (matches && matches.length > 0) {\n      return matches[0];\n    }\n\n    return null;\n  }\n\n  public static parseQueryString(query: string, exclusions?: string[]) {\n    if (!query || query.length === 0) {\n      return null;\n    }\n\n    let pairs: string[] = query.split('&');\n    if (pairs.length === 0) {\n      return null;\n    }\n\n    let result: Object = {};\n    for (let index = 0; index < pairs.length; index++) {\n      let pair = pairs[index].split('=');\n      if (!Utils.isMatch(pair[0], exclusions)) {\n        result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static randomNumber(): number {\n    return Math.floor(Math.random() * 9007199254740992);\n  }\n\n  /**\n   * Checks to see if a value matches a pattern.\n   * @param input the value to check against the @pattern.\n   * @param pattern The pattern to check, supports wild cards (*).\n   */\n  public static isMatch(input: string, patterns: string[], ignoreCase: boolean = true): boolean {\n    if (!input || typeof input !== 'string') {\n      return false;\n    }\n\n    let trim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n    input = (ignoreCase ? input.toLowerCase() : input).replace(trim, '');\n\n    return (patterns || []).some(pattern => {\n      if (typeof pattern !== 'string') {\n        return false;\n      }\n\n      pattern = (ignoreCase ? pattern.toLowerCase() : pattern).replace(trim, '');\n      if (pattern.length <= 0) {\n        return false;\n      }\n\n      let startsWithWildcard: boolean = pattern[0] === '*';\n      if (startsWithWildcard) {\n        pattern = pattern.slice(1);\n      }\n\n      let endsWithWildcard: boolean = pattern[pattern.length - 1] === '*';\n      if (endsWithWildcard) {\n        pattern = pattern.substring(0, pattern.length - 1);\n      }\n\n      if (startsWithWildcard && endsWithWildcard) {\n        return pattern.length <= input.length && input.indexOf(pattern, 0) !== -1;\n      }\n\n      if (startsWithWildcard) {\n        return Utils.endsWith(input, pattern);\n      }\n\n      if (endsWithWildcard) {\n        return Utils.startsWith(input, pattern);\n      }\n\n      return input === pattern;\n    });\n  }\n\n  public static isEmpty(input: Object) {\n    return input === null || (typeof (input) === 'object' && Object.keys(input).length === 0);\n  }\n\n  public static startsWith(input: string, prefix: string): boolean {\n    return input.substring(0, prefix.length) === prefix;\n  }\n\n  public static endsWith(input: string, suffix: string): boolean {\n    return input.indexOf(suffix, input.length - suffix.length) !== -1;\n  }\n\n  /**\n   * Stringifys an object with optional exclusions and max depth.\n   * @param data The data object to add.\n   * @param exclusions Any property names that should be excluded.\n   * @param maxDepth The max depth of the object to include.\n   */\n  public static stringify(data: any, exclusions?: string[], maxDepth?: number): string {\n    function stringifyImpl(obj: any, excludedKeys: string[]): string {\n      let cache: string[] = [];\n      return JSON.stringify(obj, function(key: string, value: any) {\n        if (Utils.isMatch(key, excludedKeys)) {\n          return;\n        }\n\n        if (typeof value === 'object' && !!value) {\n          if (cache.indexOf(value) !== -1) {\n            // Circular reference found, discard key\n            return;\n          }\n\n          cache.push(value);\n        }\n\n        return value;\n      });\n    }\n\n    if (({}).toString.call(data) === '[object Object]') {\n      let flattened = {};\n      /* tslint:disable:forin */\n      for (let prop in data) {\n        let value = data[prop];\n        if (value === data) {\n          continue;\n        }\n        flattened[prop] = data[prop];\n      }\n      /* tslint:enable:forin */\n\n      return stringifyImpl(flattened, exclusions);\n    }\n\n    if (({}).toString.call(data) === '[object Array]') {\n      let result = [];\n      for (let index = 0; index < data.length; index++) {\n        result[index] = JSON.parse(stringifyImpl(data[index], exclusions));\n      }\n\n      return JSON.stringify(result);\n    }\n\n    return stringifyImpl(data, exclusions);\n  }\n\n  public static toBoolean(input, defaultValue: boolean = false): boolean {\n    if (typeof input === 'boolean') {\n      return input;\n    }\n\n    if (input === null || typeof input !== 'number' && typeof input !== 'string') {\n      return defaultValue;\n    }\n\n    switch ((input + '').toLowerCase().trim()) {\n      case 'true': case 'yes': case '1': return true;\n      case 'false': case 'no': case '0': case null: return false;\n    }\n\n    return defaultValue;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 \n\nexport class Configuration implements IConfigurationSettings {\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @type {IConfigurationSettings}\n   * @private\n   */\n  private static _defaultSettings: IConfigurationSettings = null;\n\n  /**\n   * A default list of tags that will automatically be added to every\n   * report submitted to the server.\n   *\n   * @type {Array}\n   */\n  public defaultTags: string[] = [];\n\n  /**\n   * A default list of of extended data objects that will automatically\n   * be added to every report submitted to the server.\n   *\n   * @type {{}}\n   */\n  public defaultData: Object = {};\n\n  /**\n   * Whether the client is currently enabled or not. If it is disabled,\n   * submitted errors will be discarded and no data will be sent to the server.\n   *\n   * @returns {boolean}\n   */\n  public enabled: boolean = true;\n\n  public environmentInfoCollector: IEnvironmentInfoCollector;\n  public errorParser: IErrorParser;\n  public lastReferenceIdManager: ILastReferenceIdManager = new DefaultLastReferenceIdManager();\n  public log: ILog;\n  public moduleCollector: IModuleCollector;\n  public requestInfoCollector: IRequestInfoCollector;\n\n  /**\n   * Maximum number of events that should be sent to the server together in a batch. (Defaults to 50)\n   */\n  public submissionBatchSize: number;\n  public submissionAdapter: ISubmissionAdapter;\n  public submissionClient: ISubmissionClient;\n\n  /**\n   * Contains a dictionary of custom settings that can be used to control\n   * the client and will be automatically updated from the server.\n   */\n  public settings: Object = {};\n\n  public storage: IStorageProvider;\n\n  public queue: IEventQueue;\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @type {Array}\n   * @private\n   */\n  private _plugins: IEventPlugin[] = [];\n\n  /**\n   * A list of handlers that will be fired when configuration changes.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (config: Configuration): void }[] = [];\n\n  constructor(configSettings?: IConfigurationSettings) {\n    function inject(fn: any) {\n      return typeof fn === 'function' ? fn(this) : fn;\n    }\n\n    configSettings = Utils.merge(Configuration.defaults, configSettings);\n\n    this.log = inject(configSettings.log) || new NullLog();\n    this.apiKey = configSettings.apiKey;\n    this.serverUrl = configSettings.serverUrl;\n    this.heartbeatServerUrl = configSettings.heartbeatServerUrl;\n    this.updateSettingsWhenIdleInterval = configSettings.updateSettingsWhenIdleInterval;\n\n    this.environmentInfoCollector = inject(configSettings.environmentInfoCollector);\n    this.errorParser = inject(configSettings.errorParser);\n    this.lastReferenceIdManager = inject(configSettings.lastReferenceIdManager) || new DefaultLastReferenceIdManager();\n    this.moduleCollector = inject(configSettings.moduleCollector);\n    this.requestInfoCollector = inject(configSettings.requestInfoCollector);\n    this.submissionBatchSize = inject(configSettings.submissionBatchSize) || 50;\n    this.submissionAdapter = inject(configSettings.submissionAdapter);\n    this.submissionClient = inject(configSettings.submissionClient) || new DefaultSubmissionClient();\n    this.storage = inject(configSettings.storage) || new InMemoryStorageProvider();\n    this.queue = inject(configSettings.queue) || new DefaultEventQueue(this);\n\n    SettingsManager.applySavedServerSettings(this);\n    EventPluginManager.addDefaultPlugins(this);\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @type {string}\n   * @private\n   */\n  private _apiKey: string;\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @returns {string}\n   */\n  public get apiKey(): string {\n    return this._apiKey;\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @param value\n   */\n  public set apiKey(value: string) {\n    this._apiKey = value || null;\n    this.log.info(`apiKey: ${this._apiKey}`);\n    this.changed();\n  }\n\n  /**\n   * Returns true if the apiKey is valid.\n   * @returns {boolean}\n   */\n  public get isValid(): boolean {\n    return !!this.apiKey && this.apiKey.length >= 10;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _serverUrl: string = 'https://collector.exceptionless.io';\n\n  /**\n   * The server url that all events will be sent to.\n   * @returns {string}\n   */\n  public get serverUrl(): string {\n    return this._serverUrl;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @param value\n   */\n  public set serverUrl(value: string) {\n    if (!!value) {\n      this._serverUrl = value;\n      this._heartbeatServerUrl = value;\n      this.log.info(`serverUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _heartbeatServerUrl: string = 'https://heartbeat.exceptionless.io';\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @returns {string}\n   */\n  public get heartbeatServerUrl(): string {\n    return this._heartbeatServerUrl;\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @param value\n   */\n  public set heartbeatServerUrl(value: string) {\n    if (!!value) {\n      this._heartbeatServerUrl = value;\n      this.log.info(`heartbeatServerUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @type {number}\n   * @private\n   */\n  private _updateSettingsWhenIdleInterval: number = 120000;\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @returns {number}\n   */\n  public get updateSettingsWhenIdleInterval(): number {\n    return this._updateSettingsWhenIdleInterval;\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @param value\n   */\n  public set updateSettingsWhenIdleInterval(value: number) {\n    if (typeof value !== 'number') {\n      return;\n    }\n\n    if (value <= 0) {\n      value = -1;\n    } else if (value > 0 && value < 15000) {\n      value = 15000;\n    }\n\n    this._updateSettingsWhenIdleInterval = value;\n    this.log.info(`updateSettingsWhenIdleInterval: ${value}`);\n    this.changed();\n  }\n\n  /**\n   * A list of exclusion patterns.\n   * @type {Array}\n   * @private\n   */\n  private _dataExclusions: string[] = [];\n\n  /**\n   * A list of user agent patterns.\n   * @type {Array}\n   * @private\n   */\n  private _userAgentBotPatterns: string[] = [];\n\n  /**\n   *  A list of exclusion patterns that will automatically remove any data that\n   *  matches them from any data submitted to the server.\n   *\n   *  For example, entering CreditCard will remove any extended data properties,\n   *  form fields, cookies and query parameters from the report.\n   *\n   * @returns {string[]}\n   */\n  public get dataExclusions(): string[] {\n    let exclusions: string = this.settings['@@DataExclusions'];\n    return this._dataExclusions.concat(exclusions && exclusions.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of exclusion patterns that will automatically remove any\n   * data that matches them from any data submitted to the server.\n   *\n   * For example, entering CreditCard will remove any extended data properties, form\n   * fields, cookies and query parameters from the report.\n   *\n   * @param exclusions\n   */\n  public addDataExclusions(...exclusions: string[]) {\n    this._dataExclusions = Utils.addRange<string>(this._dataExclusions, ...exclusions);\n  }\n\n  /**\n   * A list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @returns {string[]}\n   */\n  public get userAgentBotPatterns(): string[] {\n    let patterns: string = this.settings['@@UserAgentBotPatterns'];\n    return this._userAgentBotPatterns.concat(patterns && patterns.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @param userAgentBotPatterns\n   */\n  public addUserAgentBotPatterns(...userAgentBotPatterns: string[]) {\n    this._userAgentBotPatterns = Utils.addRange<string>(this._userAgentBotPatterns, ...userAgentBotPatterns);\n  }\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @returns {IEventPlugin[]}\n   */\n  public get plugins(): IEventPlugin[] {\n    return this._plugins.sort((p1: IEventPlugin, p2: IEventPlugin) => {\n      return (p1.priority < p2.priority) ? -1 : (p1.priority > p2.priority) ? 1 : 0;\n    });\n  }\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param plugin\n   */\n  public addPlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param name The name used to identify the plugin.\n   * @param priority Used to determine plugins priority.\n   * @param pluginAction A function that is run.\n   */\n  public addPlugin(name: string, priority: number, pluginAction: (context: EventPluginContext, next?: () => void) => void): void;\n  public addPlugin(pluginOrName: IEventPlugin | string, priority?: number, pluginAction?: (context: EventPluginContext, next?: () => void) => void): void {\n    let plugin: IEventPlugin = !!pluginAction ? { name: <string>pluginOrName, priority: priority, run: pluginAction } : <IEventPlugin>pluginOrName;\n    if (!plugin || !plugin.run) {\n      this.log.error('Add plugin failed: Run method not defined');\n      return;\n    }\n\n    if (!plugin.name) {\n      plugin.name = Utils.guid();\n    }\n\n    if (!plugin.priority) {\n      plugin.priority = 0;\n    }\n\n    let pluginExists: boolean = false;\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === plugin.name) {\n        pluginExists = true;\n        break;\n      }\n    }\n\n    if (!pluginExists) {\n      plugins.push(plugin);\n    }\n  }\n\n  /**\n   * Remove the plugin from this configuration.\n   * @param plugin\n   */\n  public removePlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Remove an plugin by key from this configuration.\n   * @param name\n   */\n  public removePlugin(name: string): void;\n  public removePlugin(pluginOrName: IEventPlugin | string): void {\n    let name: string = typeof pluginOrName === 'string' ? pluginOrName : pluginOrName.name;\n    if (!name) {\n      this.log.error('Remove plugin failed: Plugin name not defined');\n      return;\n    }\n\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === name) {\n        plugins.splice(index, 1);\n        break;\n      }\n    }\n  }\n\n  /**\n   * Automatically set the application version for events.\n   * @param version\n   */\n  public setVersion(version: string): void {\n    if (!!version) {\n      this.defaultData['@version'] = version;\n    }\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): void;\n  public setUserIdentity(identity: string): void;\n  public setUserIdentity(identity: string, name: string): void;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): void {\n    const USER_KEY: string = '@user'; // optimization for minifier.\n    let userInfo: IUserInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n\n    let shouldRemove: boolean = !userInfo || (!userInfo.identity && !userInfo.name);\n    if (shouldRemove) {\n      delete this.defaultData[USER_KEY];\n    } else {\n      this.defaultData[USER_KEY] = userInfo;\n    }\n\n    this.log.info(`user identity: ${shouldRemove ? 'null' : userInfo.identity}`);\n  }\n\n  /**\n   * Used to identify the client that sent the events to the server.\n   * @returns {string}\n   */\n  public get userAgent(): string {\n    return 'exceptionless-js/1.0.0.0';\n  }\n\n  /**\n   * Automatically send a heartbeat to keep the session alive.\n   */\n  public useSessions(sendHeartbeats: boolean = true, heartbeatInterval: number = 30000): void {\n    if (sendHeartbeats) {\n      this.addPlugin(new HeartbeatPlugin(heartbeatInterval));\n    }\n  }\n\n  /**\n   * Automatically set a reference id for error events.\n   */\n  public useReferenceIds(): void {\n    this.addPlugin(new ReferenceIdPlugin());\n  }\n\n  public useLocalStorage(): void {\n    // This method will be injected via the prototype.\n  }\n\n  // TODO: Support a min log level.\n  public useDebugLogger(): void {\n    this.log = new ConsoleLog();\n  }\n\n  public onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private changed() {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](this);\n      } catch (ex) {\n        this.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @returns {IConfigurationSettings}\n   */\n  public static get defaults() {\n    if (Configuration._defaultSettings === null) {\n      Configuration._defaultSettings = {};\n    }\n\n    return Configuration._defaultSettings;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                   \n\nexport class EventBuilder {\n  public target: IEvent;\n  public client: ExceptionlessClient;\n  public pluginContextData: ContextData;\n\n  private _validIdentifierErrorMessage: string = 'must contain between 8 and 100 alphanumeric or \\'-\\' characters.'; // optimization for minifier.\n\n  constructor(event: IEvent, client: ExceptionlessClient, pluginContextData?: ContextData) {\n    this.target = event;\n    this.client = client;\n    this.pluginContextData = pluginContextData || new ContextData();\n  }\n\n  public setType(type: string): EventBuilder {\n    if (!!type) {\n      this.target.type = type;\n    }\n\n    return this;\n  }\n\n  public setSource(source: string): EventBuilder {\n    if (!!source) {\n      this.target.source = source;\n    }\n\n    return this;\n  }\n\n  public setReferenceId(referenceId: string): EventBuilder {\n    if (!this.isValidIdentifier(referenceId)) {\n      throw new Error(`ReferenceId ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.target.reference_id = referenceId;\n    return this;\n  }\n\n  /**\n   * Allows you to reference a parent event by its ReferenceId property. This allows you to have parent and child relationships.\n   * @param name Reference name\n   * @param id The reference id that points to a specific event\n   * @returns {EventBuilder}\n     */\n  public setEventReference(name: string, id: string): EventBuilder {\n    if (!name) {\n      throw new Error('Invalid name');\n    }\n\n    if (!id || !this.isValidIdentifier(id)) {\n      throw new Error(`Id ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.setProperty('@ref:' + name, id);\n    return this;\n  }\n\n  public setMessage(message: string): EventBuilder {\n    if (!!message) {\n      this.target.message = message;\n    }\n\n    return this;\n  }\n\n  public setGeo(latitude: number, longitude: number): EventBuilder {\n    if (latitude < -90.0 || latitude > 90.0) {\n      throw new Error('Must be a valid latitude value between -90.0 and 90.0.');\n    }\n\n    if (longitude < -180.0 || longitude > 180.0) {\n      throw new Error('Must be a valid longitude value between -180.0 and 180.0.');\n    }\n\n    this.target.geo = `${latitude},${longitude}`;\n    return this;\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): EventBuilder;\n  public setUserIdentity(identity: string): EventBuilder;\n  public setUserIdentity(identity: string, name: string): EventBuilder;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): EventBuilder {\n    let userInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n    if (!userInfo || (!userInfo.identity && !userInfo.name)) {\n      return this;\n    }\n\n    this.setProperty('@user', userInfo);\n    return this;\n  }\n\n  /**\n   * Sets the user's description of the event.\n   *\n   * @param emailAddress The email address\n   * @param description The user's description of the event.\n   * @returns {EventBuilder}\n     */\n  public setUserDescription(emailAddress: string, description: string): EventBuilder {\n    if (emailAddress && description) {\n      this.setProperty('@user_description', { email_address: emailAddress, description: description });\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting manual\n   * stacking information.\n   * @param signatureData A dictionary of strings to use for stacking.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingInfo(signatureData: any, title?: string) {\n    if (signatureData) {\n      let stack = <IManualStackingInfo>{\n        signature_data: signatureData\n      };\n      if (title) {\n        stack.title = title;\n      }\n      this.setProperty('@stack', stack);\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting the stacking key.\n   * @param manualStackingKey The manual stacking key.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingKey(manualStackingKey: string, title?: string): EventBuilder {\n    if (manualStackingKey) {\n      let data = {\n        'ManualStackingKey': manualStackingKey\n      };\n      this.setManualStackingInfo(data, title);\n    }\n\n    return this;\n  }\n\n  public setValue(value: number): EventBuilder {\n    if (!!value) {\n      this.target.value = value;\n    }\n\n    return this;\n  }\n\n  public addTags(...tags: string[]): EventBuilder {\n    this.target.tags = Utils.addRange<string>(this.target.tags, ...tags);\n    return this;\n  }\n\n  /**\n   * Adds the object to extended data. Uses @excludedPropertyNames\n   * to exclude data from being included in the event.\n   * @param name The data object to add.\n   * @param value The name of the object to add.\n   * @param maxDepth The max depth of the object to include.\n   * @param excludedPropertyNames Any property names that should be excluded.\n   */\n  public setProperty(name: string, value: any, maxDepth?: number, excludedPropertyNames?: string[]): EventBuilder {\n    if (!name || (value === undefined || value == null)) {\n      return this;\n    }\n\n    if (!this.target.data) {\n      this.target.data = {};\n    }\n\n    let result = JSON.parse(Utils.stringify(value, this.client.config.dataExclusions.concat(excludedPropertyNames || []), maxDepth));\n    if (!Utils.isEmpty(result)) {\n      this.target.data[name] = result;\n    }\n\n    return this;\n  }\n\n  public markAsCritical(critical: boolean): EventBuilder {\n    if (critical) {\n      this.addTags('Critical');\n    }\n\n    return this;\n  }\n\n  public addRequestInfo(request: Object): EventBuilder {\n    if (!!request) {\n      this.pluginContextData['@request'] = request;\n    }\n\n    return this;\n  }\n\n  public submit(callback?: (context: EventPluginContext) => void): void {\n    this.client.submitEvent(this.target, this.pluginContextData, callback);\n  }\n\n  private isValidIdentifier(value: string): boolean {\n    if (!value) {\n      return true;\n    }\n\n    if (value.length < 8 || value.length > 100) {\n      return false;\n    }\n\n    for (let index = 0; index < value.length; index++) {\n      let code = value.charCodeAt(index);\n      let isDigit = (code >= 48) && (code <= 57);\n      let isLetter = ((code >= 65) && (code <= 90)) || ((code >= 97) && (code <= 122));\n      let isMinus = code === 45;\n\n      if (!(isDigit || isLetter) && !isMinus) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n}\n\nexport interface IUserDescription {\n  email_address?: string;\n  description?: string;\n  data?: any;\n}\n\nexport class ContextData {\n  public setException(exception: Error): void {\n    if (exception) {\n      this['@@_Exception'] = exception;\n    }\n  }\n\n  public get hasException(): boolean {\n    return !!this['@@_Exception'];\n  }\n\n  public getException(): Error {\n    return this['@@_Exception'] || null;\n  }\n\n  public markAsUnhandledError(): void {\n    this['@@_IsUnhandledError'] = true;\n  }\n\n  public get isUnhandledError(): boolean {\n    return !!this['@@_IsUnhandledError'];\n  }\n\n  public setSubmissionMethod(method: string): void {\n    if (method) {\n      this['@@_SubmissionMethod'] = method;\n    }\n  }\n\n  public getSubmissionMethod(): string {\n    return this['@@_SubmissionMethod'] || null;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          \n\nexport class ExceptionlessClient {\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   * @private\n   */\n  private static _instance: ExceptionlessClient = null;\n\n  public config: Configuration;\n\n  private _intervalId: any;\n  private _timeoutId: any;\n\n  constructor();\n  constructor(settings: IConfigurationSettings);\n  constructor(apiKey: string, serverUrl?: string);\n  constructor(settingsOrApiKey?: IConfigurationSettings | string, serverUrl?: string) {\n    if (typeof settingsOrApiKey === 'object') {\n      this.config = new Configuration(settingsOrApiKey);\n    } else {\n      this.config = new Configuration({ apiKey: <string>settingsOrApiKey, serverUrl: serverUrl });\n    }\n\n    this.updateSettingsTimer(5000);\n    this.config.onChanged((config) => this.updateSettingsTimer(this._timeoutId > 0 ? 5000 : 0));\n    this.config.queue.onEventsPosted((events, response) =>  this.updateSettingsTimer());\n  }\n\n  public createException(exception: Error): EventBuilder {\n    let pluginContextData = new ContextData();\n    pluginContextData.setException(exception);\n    return this.createEvent(pluginContextData).setType('error');\n  }\n\n  public submitException(exception: Error, callback?: (context: EventPluginContext) => void): void {\n    this.createException(exception).submit(callback);\n  }\n\n  public createUnhandledException(exception: Error, submissionMethod?: string): EventBuilder {\n    let builder = this.createException(exception);\n    builder.pluginContextData.markAsUnhandledError();\n    builder.pluginContextData.setSubmissionMethod(submissionMethod);\n\n    return builder;\n  }\n\n  public submitUnhandledException(exception: Error, submissionMethod?: string, callback?: (context: EventPluginContext) => void) {\n    this.createUnhandledException(exception, submissionMethod).submit(callback);\n  }\n\n  public createFeatureUsage(feature: string): EventBuilder {\n    return this.createEvent().setType('usage').setSource(feature);\n  }\n\n  public submitFeatureUsage(feature: string, callback?: (context: EventPluginContext) => void): void {\n    this.createFeatureUsage(feature).submit(callback);\n  }\n\n  public createLog(message: string): EventBuilder;\n  public createLog(source: string, message: string): EventBuilder;\n  public createLog(source: string, message: string, level: string): EventBuilder;\n  public createLog(sourceOrMessage: string, message?: string, level?: string): EventBuilder {\n    let builder = this.createEvent().setType('log');\n\n    if (message && level) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message).setProperty('@level', level);\n    } else if (message) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message);\n    } else {\n      // TODO: Look into using https: //www.stevefenton.co.uk/Content/Blog/Date/201304/Blog/Obtaining-A-Class-Name-At-Runtime-In-TypeScript/\n      let caller: any = arguments.callee.caller;\n      builder = builder.setSource(caller && caller.name).setMessage(sourceOrMessage);\n    }\n\n    return builder;\n  }\n\n  public submitLog(message: string): void;\n  public submitLog(source: string, message: string): void;\n  public submitLog(source: string, message: string, level: string, callback?: (context: EventPluginContext) => void): void;\n  public submitLog(sourceOrMessage: string, message?: string, level?: string, callback?: (context: EventPluginContext) => void): void {\n    this.createLog(sourceOrMessage, message, level).submit(callback);\n  }\n\n  public createNotFound(resource: string): EventBuilder {\n    return this.createEvent().setType('404').setSource(resource);\n  }\n\n  public submitNotFound(resource: string, callback?: (context: EventPluginContext) => void): void {\n    this.createNotFound(resource).submit(callback);\n  }\n\n  public createSessionStart(): EventBuilder {\n    return this.createEvent().setType('session');\n  }\n\n  public submitSessionStart(callback?: (context: EventPluginContext) => void): void {\n    this.createSessionStart().submit(callback);\n  }\n\n  public submitSessionEnd(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session end: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, true, this.config);\n    }\n  }\n\n  public submitSessionHeartbeat(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session heartbeat: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, false, this.config);\n    }\n  }\n\n  public createEvent(pluginContextData?: ContextData): EventBuilder {\n    return new EventBuilder({ date: new Date() }, this, pluginContextData);\n  }\n\n  /**\n   * Submits the event to be sent to the server.\n   * @param event The event data.\n   * @param pluginContextData Any contextual data objects to be used by Exceptionless plugins to gather default information for inclusion in the report information.\n   * @param callback\n   */\n  public submitEvent(event: IEvent, pluginContextData?: ContextData, callback?: (context: EventPluginContext) => void): void {\n    function cancelled(context: EventPluginContext) {\n      if (!!context) {\n        context.cancelled = true;\n      }\n\n      return !!callback && callback(context);\n    }\n\n    let context = new EventPluginContext(this, event, pluginContextData);\n    if (!event) {\n      return cancelled(context);\n    }\n\n    if (!this.config.enabled) {\n      this.config.log.info('Event submission is currently disabled.');\n      return cancelled(context);\n    }\n\n    if (!event.data) {\n      event.data = {};\n    }\n\n    if (!event.tags || !event.tags.length) {\n      event.tags = [];\n    }\n\n    EventPluginManager.run(context, function (ctx: EventPluginContext) {\n      let config = ctx.client.config;\n      let ev = ctx.event;\n\n      if (!ctx.cancelled) {\n        // ensure all required data\n        if (!ev.type || ev.type.length === 0) {\n          ev.type = 'log';\n        }\n\n        if (!ev.date) {\n          ev.date = new Date();\n        }\n\n        config.queue.enqueue(ev);\n\n        if (ev.reference_id && ev.reference_id.length > 0) {\n          ctx.log.info(`Setting last reference id '${ev.reference_id}'`);\n          config.lastReferenceIdManager.setLast(ev.reference_id);\n        }\n      }\n\n      !!callback && callback(ctx);\n    });\n  }\n\n  /**\n   * Updates the user's email address and description of an event for the specified reference id.\n   * @param referenceId The reference id of the event to update.\n   * @param email The user's email address to set on the event.\n   * @param description The user's description of the event.\n   * @param callback The submission response.\n   */\n  public updateUserEmailAndDescription(referenceId: string, email: string, description: string, callback?: (response: SubmissionResponse) => void) {\n    if (!referenceId || !email || !description || !this.config.enabled) {\n      return !!callback && callback(new SubmissionResponse(500, 'cancelled'));\n    }\n\n    let userDescription: IUserDescription = { email_address: email, description: description };\n    this.config.submissionClient.postUserDescription(referenceId, userDescription, this.config, (response: SubmissionResponse) => {\n      if (!response.success) {\n        this.config.log.error(`Failed to submit user email and description for event '${referenceId}': ${response.statusCode} ${response.message}`);\n      }\n\n      !!callback && callback(response);\n    });\n  }\n\n  /**\n   * Gets the last event client id that was submitted to the server.\n   * @returns {string} The event client id.\n   */\n  public getLastReferenceId(): string {\n    return this.config.lastReferenceIdManager.getLast();\n  }\n\n  private updateSettingsTimer(initialDelay?: number) {\n    this.config.log.info(`Updating settings timer with delay: ${initialDelay}`);\n\n    this._timeoutId = clearTimeout(this._timeoutId);\n    this._timeoutId = clearInterval(this._intervalId);\n\n    let interval = this.config.updateSettingsWhenIdleInterval;\n    if (interval > 0) {\n      let updateSettings = () => SettingsManager.updateSettings(this.config);\n      if (initialDelay > 0) {\n        this._timeoutId = setTimeout(updateSettings, initialDelay);\n      }\n\n      this._intervalId = setInterval(updateSettings, interval);\n    }\n  }\n\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   */\n  public static get default() {\n    if (ExceptionlessClient._instance === null) {\n      ExceptionlessClient._instance = new ExceptionlessClient(null);\n    }\n\n    return ExceptionlessClient._instance;\n  }\n}\n\nexport interface IManualStackingInfo {\n  title?: string;\n  signature_data?: any;\n}\n\nexport interface IModule {\n  data?: any;\n\n  module_id?: number;\n  name?: string;\n  version?: string;\n  is_entry?: boolean;\n  created_date?: Date;\n  modified_date?: Date;\n}\n\nexport interface IRequestInfo {\n  user_agent?: string;\n  http_method?: string;\n  is_secure?: boolean;\n  host?: string;\n  port?: number;\n  path?: string;\n  referrer?: string;\n  client_ip_address?: string;\n  cookies?: any;\n  post_data?: any;\n  query_string?: any;\n  data?: any;\n}\n\nexport interface IEnvironmentInfo {\n  processor_count?: number;\n  total_physical_memory?: number;\n  available_physical_memory?: number;\n  command_line?: string;\n  process_name?: string;\n  process_id?: string;\n  process_memory_size?: number;\n  thread_id?: string;\n  architecture?: string;\n  o_s_name?: string;\n  o_s_version?: string;\n  ip_address?: string;\n  machine_name?: string;\n  install_id?: string;\n  runtime_version?: string;\n  data?: any;\n}\n\nexport interface IParameter {\n  data?: any;\n  generic_arguments?: string[];\n\n  name?: string;\n  type?: string;\n  type_namespace?: string;\n}\n\n                                          \n\nexport interface IMethod {\n  data?: any;\n  generic_arguments?: string[];\n  parameters?: IParameter[];\n\n  is_signature_target?: boolean;\n  declaring_namespace?: string;\n  declaring_type?: string;\n  name?: string;\n  module_id?: number;\n}\n\n                                    \n\nexport interface IStackFrame extends IMethod {\n  file_name?: string;\n  line_number?: number;\n  column?: number;\n}\n\n                                                                                 \n\nexport interface IInnerError {\n  message?: string;\n  type?: string;\n  code?: string;\n  data?: any;\n  inner?: IInnerError;\n  stack_trace?: IStackFrame[];\n  target_method?: IMethod;\n}\n\n                                                                                                                                                \n\nexport class ConfigurationDefaultsPlugin implements IEventPlugin {\n  public priority: number = 10;\n  public name: string = 'ConfigurationDefaultsPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let config = context.client.config;\n    let defaultTags: string[] = config.defaultTags || [];\n    for (let index = 0; index < defaultTags.length; index++) {\n      let tag = defaultTags[index];\n      if (!!tag && context.event.tags.indexOf(tag) < 0) {\n        context.event.tags.push(tag);\n      }\n    }\n\n    let defaultData: Object = config.defaultData || {};\n    for (let key in defaultData) {\n      if (!!defaultData[key]) {\n        let result = JSON.parse(Utils.stringify(defaultData[key], config.dataExclusions));\n        if (!Utils.isEmpty(result)) {\n          context.event.data[key] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ErrorPlugin implements IEventPlugin {\n  public priority: number = 30;\n  public name: string = 'ErrorPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n    let ignoredProperties: string[] = [\n      'arguments',\n      'column',\n      'columnNumber',\n      'description',\n      'fileName',\n      'message',\n      'name',\n      'number',\n      'line',\n      'lineNumber',\n      'opera#sourceloc',\n      'sourceId',\n      'sourceURL',\n      'stack',\n      'stackArray',\n      'stacktrace'\n    ];\n\n    let exception = context.contextData.getException();\n    if (!!exception) {\n      context.event.type = 'error';\n\n      if (!context.event.data[ERROR_KEY]) {\n        let config = context.client.config;\n        let parser = config.errorParser;\n        if (!parser) {\n          throw new Error('No error parser was defined.');\n        }\n\n        let result = parser.parse(context, exception);\n        if (!!result) {\n          let additionalData = JSON.parse(Utils.stringify(exception, config.dataExclusions.concat(ignoredProperties)));\n          if (!Utils.isEmpty(additionalData)) {\n            if (!result.data) {\n              result.data = {};\n            }\n            result.data['@ext'] = additionalData;\n          }\n\n          context.event.data[ERROR_KEY] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                           \n\nexport class ModuleInfoPlugin implements IEventPlugin {\n  public priority: number = 50;\n  public name: string = 'ModuleInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n\n    let collector = context.client.config.moduleCollector;\n    if (context.event.data[ERROR_KEY] && !context.event.data['@error'].modules && !!collector) {\n      let modules: IModule[] = collector.getModules(context);\n      if (modules && modules.length > 0) {\n        context.event.data[ERROR_KEY].modules = modules;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                          \n\nexport class RequestInfoPlugin implements IEventPlugin {\n  public priority: number = 70;\n  public name: string = 'RequestInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const REQUEST_KEY: string = '@request'; // optimization for minifier.\n\n    let config = context.client.config;\n    let collector = config.requestInfoCollector;\n    if (!context.event.data[REQUEST_KEY] && !!collector) {\n      let requestInfo: IRequestInfo = collector.getRequestInfo(context);\n      if (!!requestInfo) {\n        if (Utils.isMatch(requestInfo.user_agent, config.userAgentBotPatterns)) {\n          context.log.info('Cancelling event as the request user agent matches a known bot pattern');\n          context.cancelled = true;\n        } else {\n          context.event.data[REQUEST_KEY] = requestInfo;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                             \n\nexport class EnvironmentInfoPlugin implements IEventPlugin {\n  public priority: number = 80;\n  public name: string = 'EnvironmentInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ENVIRONMENT_KEY: string = '@environment'; // optimization for minifier.\n\n    let collector = context.client.config.environmentInfoCollector;\n    if (!context.event.data[ENVIRONMENT_KEY] && collector) {\n      let environmentInfo: IEnvironmentInfo = collector.getEnvironmentInfo(context);\n      if (!!environmentInfo) {\n        context.event.data[ENVIRONMENT_KEY] = environmentInfo;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                           \n\nexport class SubmissionMethodPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'SubmissionMethodPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let submissionMethod: string = context.contextData.getSubmissionMethod();\n    if (!!submissionMethod) {\n      context.event.data['@submission_method'] = submissionMethod;\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                   \n\nexport class DuplicateCheckerPlugin implements IEventPlugin {\n  public priority: number = 40;\n  public name: string = 'DuplicateCheckerPlugin';\n\n  private _processedHashcodes: TimestampedHash[] = [];\n  private _getCurrentTime: () => number;\n\n  constructor(getCurrentTime: () => number = () => Date.now()) {\n    this._getCurrentTime = getCurrentTime;\n  }\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function isDuplicate(error: IInnerError, processedHashcodes, now, log: ILog): boolean {\n      while (error) {\n        let hashCode = Utils.getHashCode(error.stack_trace && JSON.stringify(error.stack_trace));\n\n        // Only process the unique errors times within a 2 second window.\n        if (hashCode && processedHashcodes.some(h => h.hash === hashCode && h.timestamp >= (now - 2000))) {\n          log.info(`Ignoring duplicate error event hash: ${hashCode}`);\n          return true;\n        }\n\n        // Add this exception to our list of recent processed errors.\n        processedHashcodes.push({ hash: hashCode, timestamp: now });\n\n        // Only keep the last 20 recent errors.\n        while (processedHashcodes.length > 20) {\n          processedHashcodes.shift();\n        }\n\n        error = error.inner;\n      }\n\n      return false;\n    }\n\n    if (context.event.type === 'error') {\n      if (isDuplicate(context.event.data['@error'], this._processedHashcodes, this._getCurrentTime(), context.log)) {\n        context.cancelled = true;\n        return;\n      }\n    }\n\n    next && next();\n  }\n}\n\ninterface TimestampedHash {\n  hash: number;\n  timestamp: number;\n}\n\n                                                                                                                                                                                                        \n\nexport class EventExclusionPlugin implements IEventPlugin {\n  public priority: number = 45;\n  public name: string = 'EventExclusionPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function getLogLevel(level: string): number {\n      switch ((level || '').toLowerCase().trim()) {\n        case 'trace':\n        case 'true':\n        case '1':\n        case 'yes':\n          return 0;\n        case 'debug':\n          return 1;\n        case 'info':\n          return 2;\n        case 'warn':\n          return 3;\n        case 'error':\n          return 4;\n        case 'fatal':\n          return 5;\n        case 'off':\n        case 'false':\n        case '0':\n        case 'no':\n          return 6;\n        default:\n          return -1;\n      }\n    }\n\n    function getMinLogLevel(settings: Object, loggerName: string = '*'): number {\n      return getLogLevel(getTypeAndSourceSetting(settings, 'log', loggerName, 'Trace') + '');\n    }\n\n    function getTypeAndSourceSetting(settings: Object = {}, type: string, source: string, defaultValue: string|boolean = undefined): string|boolean {\n      if (!type) {\n        return defaultValue;\n      }\n\n      let isLog = type === 'log';\n      let sourcePrefix =  `@@${type}:`;\n\n      let value = settings[sourcePrefix + source];\n      if (value) {\n        return !isLog ? Utils.toBoolean(value) : value;\n      }\n\n      // check for wildcard match\n      for (let key in settings) {\n        if (Utils.startsWith(key.toLowerCase(), sourcePrefix.toLowerCase()) && Utils.isMatch(source, [key.substring(sourcePrefix.length)])) {\n          return !isLog ? Utils.toBoolean(settings[key]) : settings[key];\n        }\n      }\n\n      return defaultValue;\n    }\n\n    let ev = context.event;\n    let log = context.log;\n    let settings = context.client.config.settings;\n\n    if (ev.type === 'log') {\n      let minLogLevel = getMinLogLevel(settings, ev.source);\n      let logLevel = getLogLevel(ev.data['@level']);\n\n      if (logLevel >= 0 && (logLevel > 5 || logLevel < minLogLevel)) {\n        log.info('Cancelling log event due to minimum log level.');\n        context.cancelled = true;\n      }\n    } else if (ev.type === 'error') {\n      let error: IInnerError = ev.data['@error'];\n      while (!context.cancelled && error) {\n        if (getTypeAndSourceSetting(settings, ev.type, error.type, true) === false) {\n          log.info(`Cancelling error from excluded exception type: ${error.type}`);\n          context.cancelled = true;\n        }\n\n        error = error.inner;\n      }\n    } else if (getTypeAndSourceSetting(settings, ev.type, ev.source, true) === false) {\n      log.info(`Cancelling event from excluded type: ${ev.type} and source: ${ev.source}`);\n      context.cancelled = true;\n    }\n\n    next && next();\n  }\n}\n\nexport class SettingsResponse {\n  public success: boolean = false;\n  public settings: any;\n  public settingsVersion: number = -1;\n  public message: string;\n  public exception: any;\n\n  constructor(success: boolean, settings: any, settingsVersion: number = -1, exception: any = null, message: string = null) {\n    this.success = success;\n    this.settings = settings;\n    this.settingsVersion = settingsVersion;\n    this.exception = exception;\n    this.message = message;\n  }\n}\n\n                                                                                 \n\nexport interface IError extends IInnerError {\n  modules?: IModule[];\n}\n\nexport interface IStorageItem {\n  timestamp: number;\n  value: any;\n}\n\n                                              \n\nexport interface IStorage {\n  save(value: any): number;\n  get(limit?: number): IStorageItem[];\n  remove(timestamp: number): void;\n  clear(): void;\n}\n\nexport interface SubmissionCallback {\n  (status: number, message: string, data?: string, headers?: Object): void;\n}\n\nexport interface SubmissionRequest {\n  apiKey: string;\n  userAgent: string;\n  method: string;\n  url: string;\n  data: string;\n}\n\n                                                                                     \n\nexport class InMemoryStorage implements IStorage {\n  private maxItems: number;\n  private items: IStorageItem[] = [];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems: number) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any): number {\n    if (!value) {\n      return null;\n    }\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let item = { timestamp, value };\n\n    if (items.push(item) > this.maxItems) {\n      items.shift();\n    }\n\n    this.lastTimestamp = timestamp;\n    return item.timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    return this.items.slice(0, limit);\n  }\n\n  public remove(timestamp: number): void {\n    let items = this.items;\n    for (let i = 0; i < items.length; i++) {\n      if (items[i].timestamp === timestamp) {\n        items.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n  public clear(): void {\n    this.items = [];\n  }\n}\n\nexport interface IClientConfiguration {\n  settings: Object;\n  version: number;\n}\n\n                                                                                     \n\nexport abstract class KeyValueStorageBase implements IStorage {\n  private maxItems: number;\n  private items: number[];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any, single?: boolean): number {\n    if (!value) {\n      return null;\n    }\n\n    this.ensureIndex();\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let key = this.getKey(timestamp);\n    let json = JSON.stringify(value);\n\n    try {\n      this.write(key, json);\n      this.lastTimestamp = timestamp;\n      if (items.push(timestamp) > this.maxItems) {\n        this.delete(this.getKey(items.shift()));\n      }\n    } catch (e) {\n      return null;\n    }\n\n    return timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    this.ensureIndex();\n\n    return this.items.slice(0, limit)\n      .map(timestamp => {\n        // Read and parse item for this timestamp\n        let key = this.getKey(timestamp);\n        try {\n          let json = this.read(key);\n          let value = JSON.parse(json, parseDate);\n          return { timestamp, value };\n        } catch (error) {\n          // Something went wrong - try to delete the cause.\n          this.safeDelete(key);\n          return null;\n        }\n      })\n      .filter(item => item != null);\n  }\n\n  public remove(timestamp: number): void {\n    this.ensureIndex();\n\n    let items = this.items;\n    let index = items.indexOf(timestamp);\n    if (index >= 0) {\n      let key = this.getKey(timestamp);\n      this.safeDelete(key);\n      items.splice(index, 1);\n    };\n  }\n\n  public clear(): void {\n    this.items.forEach(item => this.safeDelete(this.getKey(item)));\n    this.items = [];\n  }\n\n  protected abstract write(key: string, value: string): void;\n  protected abstract read(key: string): string;\n  protected abstract readAllKeys(): string[];\n  protected abstract delete(key: string);\n  protected abstract getKey(timestamp: number): string;\n  protected abstract getTimestamp(key: string): number;\n\n  private ensureIndex() {\n    if (!this.items) {\n      this.items = this.createIndex();\n      this.lastTimestamp = Math.max(0, ...this.items) + 1;\n    }\n  }\n\n  private safeDelete(key: string): void {\n    try {\n      this.delete(key);\n    } catch (error) {\n    }\n  }\n\n  private createIndex() {\n    try {\n      let keys = this.readAllKeys();\n      return keys.map(key => {\n        try {\n          let timestamp = this.getTimestamp(key);\n          if (!timestamp) {\n            this.safeDelete(key);\n            return null;\n          }\n          return timestamp;\n        } catch (error) {\n          this.safeDelete(key);\n          return null;\n        }\n      }).filter(timestamp => timestamp != null)\n        .sort((a, b) => a - b);\n    } catch (error) {\n      return [];\n    }\n  }\n}\n\nfunction parseDate(key, value) {\n  let dateRegx = /\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/g;\n  if (typeof value === 'string') {\n    let a = dateRegx.exec(value);\n    if (a) {\n      return new Date(value);\n    }\n  }\n  return value;\n};\n\n                                                            \n\nexport class BrowserStorage extends KeyValueStorageBase {\n  private prefix: string;\n\n  public static isAvailable(): boolean {\n    try {\n      let storage = window.localStorage,\n        x = '__storage_test__';\n      storage.setItem(x, x);\n      storage.removeItem(x);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  constructor(namespace: string, prefix: string = 'com.exceptionless.', maxItems: number = 20) {\n    super(maxItems);\n\n    this.prefix = prefix + namespace + '-';\n  }\n\n  public write(key: string, value: string) {\n    window.localStorage.setItem(key, value);\n  }\n\n  public read(key: string) {\n    return window.localStorage.getItem(key);\n  }\n\n  public readAllKeys() {\n    return Object.keys(window.localStorage)\n      .filter(key => key.indexOf(this.prefix) === 0);\n  }\n\n  public delete(key: string) {\n    window.localStorage.removeItem(key);\n  }\n\n  public getKey(timestamp) {\n    return this.prefix + timestamp;\n  }\n\n  public getTimestamp(key) {\n    return parseInt(key.substr(this.prefix.length), 10);\n  }\n}\n\n                                                                                                                                                                                                                                                                                                           \n\nexport class DefaultErrorParser implements IErrorParser {\n  public parse(context: EventPluginContext, exception: Error): IError {\n    function getParameters(parameters: string | string[]): IParameter[] {\n      let params: string[] = (typeof parameters === 'string' ? [parameters] : parameters) || [];\n\n      let result: IParameter[] = [];\n      for (let index = 0; index < params.length; index++) {\n        result.push({ name: params[index] });\n      }\n\n      return result;\n    }\n\n    function getStackFrames(stackFrames: TraceKit.StackFrame[]): IStackFrame[] {\n      const ANONYMOUS: string = '<anonymous>';\n      let frames: IStackFrame[] = [];\n\n      for (let index = 0; index < stackFrames.length; index++) {\n        let frame = stackFrames[index];\n        frames.push({\n          name: (frame.func || ANONYMOUS).replace('?', ANONYMOUS),\n          parameters: getParameters(frame.args),\n          file_name: frame.url,\n          line_number: frame.line || 0,\n          column: frame.column || 0\n        });\n      }\n\n      return frames;\n    }\n\n    const TRACEKIT_STACK_TRACE_KEY: string = '@@_TraceKit.StackTrace'; // optimization for minifier.\n\n    let stackTrace: TraceKit.StackTrace = !!context.contextData[TRACEKIT_STACK_TRACE_KEY]\n      ? context.contextData[TRACEKIT_STACK_TRACE_KEY]\n      : TraceKit.computeStackTrace(exception, 25);\n\n    if (!stackTrace) {\n      throw new Error('Unable to parse the exceptions stack trace.');\n    }\n\n    return {\n      type: stackTrace.name,\n      message: stackTrace.message || exception.message,\n      stack_trace: getStackFrames(stackTrace.stack || [])\n    };\n  }\n}\n\n                                                                                                                                                                                                         \n\nexport class DefaultModuleCollector implements IModuleCollector {\n  public getModules(context: EventPluginContext): IModule[] {\n    if (document && document.getElementsByTagName) {\n      return null;\n    }\n\n    let modules: IModule[] = [];\n    let scripts: NodeListOf<HTMLScriptElement> = document.getElementsByTagName('script');\n    if (scripts && scripts.length > 0) {\n      for (let index = 0; index < scripts.length; index++) {\n        if (scripts[index].src) {\n          modules.push({\n            module_id: index,\n            name: scripts[index].src,\n            version: Utils.parseVersion(scripts[index].src)\n          });\n        } else if (!!scripts[index].innerHTML) {\n          modules.push({\n            module_id: index,\n            name: 'Script Tag',\n            version: Utils.getHashCode(scripts[index].innerHTML).toString()\n          });\n        }\n      }\n    }\n\n    return modules;\n  }\n}\n\n                                                                                                                                                                                                                             \n\nexport class DefaultRequestInfoCollector implements IRequestInfoCollector {\n  public getRequestInfo(context: EventPluginContext): IRequestInfo {\n    if (!document || !navigator || !location) {\n      return null;\n    }\n\n    let exclusions = context.client.config.dataExclusions;\n    let requestInfo: IRequestInfo = {\n      user_agent: navigator.userAgent,\n      is_secure: location.protocol === 'https:',\n      host: location.hostname,\n      port: location.port && location.port !== '' ? parseInt(location.port, 10) : 80,\n      path: location.pathname,\n      // client_ip_address: 'TODO',\n      cookies: Utils.getCookies(document.cookie, exclusions),\n      query_string: Utils.parseQueryString(location.search.substring(1), exclusions)\n    };\n\n    if (document.referrer && document.referrer !== '') {\n      requestInfo.referrer = document.referrer;\n    }\n\n    return requestInfo;\n  }\n}\n\n                                                                                                                                                                              \n\ndeclare var XDomainRequest: { new (); create(); };\n\nexport class DefaultSubmissionAdapter implements ISubmissionAdapter {\n  public sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean) {\n    // TODO: Handle sending events when app is exiting with send beacon.\n    const TIMEOUT: string = 'timeout';  // optimization for minifier.\n    const LOADED: string = 'loaded';  // optimization for minifier.\n    const WITH_CREDENTIALS: string = 'withCredentials';  // optimization for minifier.\n\n    let isCompleted: boolean = false;\n    let useSetTimeout: boolean = false;\n    function complete(mode: string, xhr: XMLHttpRequest) {\n      function parseResponseHeaders(headerStr) {\n        function trim(value) {\n          return value.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n        }\n\n        let headers = {};\n        let headerPairs = (headerStr || '').split('\\u000d\\u000a');\n        for (let index: number = 0; index < headerPairs.length; index++) {\n          let headerPair = headerPairs[index];\n          // Can't use split() here because it does the wrong thing\n          // if the header value has the string \": \" in it.\n          let separator = headerPair.indexOf('\\u003a\\u0020');\n          if (separator > 0) {\n            headers[trim(headerPair.substring(0, separator).toLowerCase())] = headerPair.substring(separator + 2);\n          }\n        }\n\n        return headers;\n      }\n\n      if (isCompleted) {\n        return;\n      }\n\n      isCompleted = true;\n\n      let message: string = xhr.statusText;\n      let responseText: string = xhr.responseText;\n      let status: number = xhr.status;\n\n      if (mode === TIMEOUT || status === 0) {\n        message = 'Unable to connect to server.';\n        status = 0;\n      } else if (mode === LOADED && !status) {\n        status = request.method === 'POST' ? 202 : 200;\n      } else if (status < 200 || status > 299) {\n        let responseBody: any = xhr.responseBody;\n        if (!!responseBody && !!responseBody.message) {\n          message = responseBody.message;\n        } else if (!!responseText && responseText.indexOf('message') !== -1) {\n          try {\n            message = JSON.parse(responseText).message;\n          } catch (e) {\n            message = responseText;\n          }\n        }\n      }\n\n      callback && callback(status || 500, message || '', responseText, parseResponseHeaders(xhr.getAllResponseHeaders && xhr.getAllResponseHeaders()));\n    }\n\n    function createRequest(userAgent: string, method: string, url: string): XMLHttpRequest {\n      let xhr: any = new XMLHttpRequest();\n      if (WITH_CREDENTIALS in xhr) {\n        xhr.open(method, url, true);\n\n        xhr.setRequestHeader('X-Exceptionless-Client', userAgent);\n        if (method === 'POST') {\n          xhr.setRequestHeader('Content-Type', 'application/json');\n        }\n      } else if (typeof XDomainRequest !== 'undefined') {\n        useSetTimeout = true;\n        xhr = new XDomainRequest();\n        xhr.open(method, location.protocol === 'http:' ? url.replace('https:', 'http:') : url);\n      } else {\n        xhr = null;\n      }\n\n      if (xhr) {\n        xhr.timeout = 10000;\n      }\n\n      return xhr;\n    }\n\n    let url = `${request.url}${(request.url.indexOf('?') === -1 ? '?' : '&')}access_token=${encodeURIComponent(request.apiKey)}`;\n    let xhr = createRequest(request.userAgent, request.method || 'POST', url);\n    if (!xhr) {\n      return (callback && callback(503, 'CORS not supported.'));\n    }\n\n    if (WITH_CREDENTIALS in xhr) {\n      xhr.onreadystatechange = () => {\n        // xhr not ready.\n        if (xhr.readyState !== 4) {\n          return;\n        }\n\n        complete(LOADED, xhr);\n      };\n    }\n\n    xhr.onprogress = () => { };\n    xhr.ontimeout = () => complete(TIMEOUT, xhr);\n    xhr.onerror = () => complete('error', xhr);\n    xhr.onload = () => complete(LOADED, xhr);\n\n    if (useSetTimeout) {\n      setTimeout(() => xhr.send(request.data), 500);\n    } else {\n      xhr.send(request.data);\n    }\n  }\n}\n\n                                                                                                                                                \n\nexport class BrowserStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(prefix?: string, maxQueueItems: number = 250) {\n    this.queue = new BrowserStorage('q', prefix, maxQueueItems);\n    this.settings = new BrowserStorage('settings', prefix, 1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    \n\nfunction getDefaultsSettingsFromScriptTag(): IConfigurationSettings {\n  if (!document || !document.getElementsByTagName) {\n    return null;\n  }\n\n  let scripts = document.getElementsByTagName('script');\n  for (let index = 0; index < scripts.length; index++) {\n    if (scripts[index].src && scripts[index].src.indexOf('/exceptionless') > -1) {\n      return Utils.parseQueryString(scripts[index].src.split('?').pop());\n    }\n  }\n  return null;\n}\n\nfunction processUnhandledException(stackTrace: TraceKit.StackTrace, options?: any): void {\n  let builder = ExceptionlessClient.default.createUnhandledException(new Error(stackTrace.message || (options || {}).status || 'Script error'), 'onerror');\n  builder.pluginContextData['@@_TraceKit.StackTrace'] = stackTrace;\n  builder.submit();\n}\n\n/*\nTODO: We currently are unable to parse string exceptions.\nfunction processJQueryAjaxError(event, xhr, settings, error:string): void {\n  let client = ExceptionlessClient.default;\n  if (xhr.status === 404) {\n    client.submitNotFound(settings.url);\n  } else if (xhr.status !== 401) {\n    client.createUnhandledException(error, 'JQuery.ajaxError')\n      .setSource(settings.url)\n      .setProperty('status', xhr.status)\n      .setProperty('request', settings.data)\n      .setProperty('response', xhr.responseText && xhr.responseText.slice && xhr.responseText.slice(0, 1024))\n      .submit();\n  }\n}\n*/\n\nConfiguration.prototype.useLocalStorage = function() {\n  if (BrowserStorage.isAvailable()) {\n    this.storage = new BrowserStorageProvider();\n    SettingsManager.applySavedServerSettings(this);\n    this.changed();\n  }\n};\n\nlet defaults = Configuration.defaults;\nlet settings = getDefaultsSettingsFromScriptTag();\nif (settings && (settings.apiKey || settings.serverUrl)) {\n  defaults.apiKey = settings.apiKey;\n  defaults.serverUrl = settings.serverUrl;\n}\n\ndefaults.errorParser = new DefaultErrorParser();\ndefaults.moduleCollector = new DefaultModuleCollector();\ndefaults.requestInfoCollector = new DefaultRequestInfoCollector();\ndefaults.submissionAdapter = new DefaultSubmissionAdapter();\n\nTraceKit.report.subscribe(processUnhandledException);\nTraceKit.extendToAsynchronousCallbacks();\n\n// window && window.addEventListener && window.addEventListener('beforeunload', function () {\n//   ExceptionlessClient.default.config.queue.process(true);\n// });\n\n// if (typeof $ !== 'undefined' && $(document)) {\n//   $(document).ajaxError(processJQueryAjaxError);\n// }\n\n(<any>Error).stackTraceLimit = Infinity;\n\ndeclare var $;\n\n"],"sourceRoot":"/source/"}
\ No newline at end of file
+{"version":3,"sources":["tracekit.js","/source/exceptionless.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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","file":"exceptionless.js","sourcesContent":["/**\n * https://github.com/csnover/TraceKit\n * @license MIT\n * @namespace TraceKit\n */\n(function(window, undefined) {\nif (!window) {\n    return;\n}\n\nvar TraceKit = {};\nvar _oldTraceKit = window.TraceKit;\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n/**\n * A better form of hasOwnProperty<br/>\n * Example: `_has(MainHostObject, property) === true/false`\n *\n * @param {Object} object to check property\n * @param {string} key to check\n * @return {Boolean} true if the object has the key and it is not inherited\n */\nfunction _has(object, key) {\n    return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/**\n * Returns true if the parameter is undefined<br/>\n * Example: `_isUndefined(val) === true/false`\n *\n * @param {*} what Value to check\n * @return {Boolean} true if undefined and false otherwise\n */\nfunction _isUndefined(what) {\n    return typeof what === 'undefined';\n}\n\n/**\n * Export TraceKit out to another variable<br/>\n * Example: `var TK = TraceKit.noConflict()`\n * @return {Object} The TraceKit object\n * @memberof TraceKit\n */\nTraceKit.noConflict = function noConflict() {\n    window.TraceKit = _oldTraceKit;\n    return TraceKit;\n};\n\n/**\n * Wrap any function in a TraceKit reporter<br/>\n * Example: `func = TraceKit.wrap(func);`\n *\n * @param {Function} func Function to be wrapped\n * @return {Function} The wrapped func\n * @memberof TraceKit\n */\nTraceKit.wrap = function traceKitWrapper(func) {\n    function wrapped() {\n        try {\n            return func.apply(this, arguments);\n        } catch (e) {\n            TraceKit.report(e);\n            throw e;\n        }\n    }\n    return wrapped;\n};\n\n/**\n * Cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * ```js\n *   TraceKit.report.subscribe(function(stackInfo) { ... })\n *   TraceKit.report.unsubscribe(function(stackInfo) { ... })\n *   TraceKit.report(exception)\n *   try { ...code... } catch(ex) { TraceKit.report(ex); }\n * ```\n *\n * Supports:\n *   - Firefox: full stack trace with line numbers, plus column number\n *     on top frame; column number is not guaranteed\n *   - Opera: full stack trace with line and column numbers\n *   - Chrome: full stack trace with line and column numbers\n *   - Safari: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *   - IE: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n *   - IE5.5+ (only 8.0 tested)\n *   - Firefox 0.9+ (only 3.5+ tested)\n *   - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n *     Exceptions Have Stacktrace to be enabled in opera:config)\n *   - Safari 3+ (only 4+ tested)\n *   - Chrome 1+ (only 5+ tested)\n *   - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a TraceKit.StackTrace object as described in the\n * TraceKit.computeStackTrace docs.\n *\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.report = (function reportModuleWrapper() {\n    var handlers = [],\n        lastArgs = null,\n        lastException = null,\n        lastExceptionStack = null;\n\n    /**\n     * Add a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function subscribe(handler) {\n        installGlobalHandler();\n        handlers.push(handler);\n    }\n\n    /**\n     * Remove a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function unsubscribe(handler) {\n        for (var i = handlers.length - 1; i >= 0; --i) {\n            if (handlers[i] === handler) {\n                handlers.splice(i, 1);\n            }\n        }\n    }\n\n    /**\n     * Dispatch stack information to all handlers.\n     * @param {TraceKit.StackTrace} stack\n     * @param {boolean} isWindowError Is this a top-level window error?\n     * @memberof TraceKit.report\n     * @throws An exception if an error occurs while calling an handler.\n     */\n    function notifyHandlers(stack, isWindowError) {\n        var exception = null;\n        if (isWindowError && !TraceKit.collectWindowErrors) {\n          return;\n        }\n        for (var i in handlers) {\n            if (_has(handlers, i)) {\n                try {\n                    handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n                } catch (inner) {\n                    exception = inner;\n                }\n            }\n        }\n\n        if (exception) {\n            throw exception;\n        }\n    }\n\n    var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n    /**\n     * Ensures all global unhandled exceptions are recorded.\n     * Supported by Gecko and IE.\n     * @param {string} message Error message.\n     * @param {string} url URL of script that generated the exception.\n     * @param {(number|string)} lineNo The line number at which the error occurred.\n     * @param {(number|string)=} columnNo The column number at which the error occurred.\n     * @param {Error=} errorObj The actual Error object.\n     * @memberof TraceKit.report\n     */\n    function traceKitWindowOnError(message, url, lineNo, columnNo, errorObj) {\n        var stack = null;\n\n        if (lastExceptionStack) {\n            TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message);\n    \t    processLastException();\n\t    } else if (errorObj) {\n            stack = TraceKit.computeStackTrace(errorObj);\n            notifyHandlers(stack, true);\n        } else {\n            var location = {\n              'url': url,\n              'line': lineNo,\n              'column': columnNo\n            };\n            location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line);\n            location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line);\n            stack = {\n              'mode': 'onerror',\n              'message': message,\n              'stack': [location]\n            };\n\n            notifyHandlers(stack, true);\n        }\n\n        if (_oldOnerrorHandler) {\n            return _oldOnerrorHandler.apply(this, arguments);\n        }\n\n        return false;\n    }\n\n    /**\n     * Install a global onerror handler\n     * @memberof TraceKit.report\n     */\n    function installGlobalHandler () {\n        if (_onErrorHandlerInstalled === true) {\n            return;\n        }\n        _oldOnerrorHandler = window.onerror;\n        window.onerror = traceKitWindowOnError;\n        _onErrorHandlerInstalled = true;\n    }\n\n    /**\n     * Process the most recent exception\n     * @memberof TraceKit.report\n     */\n    function processLastException() {\n        var _lastExceptionStack = lastExceptionStack,\n            _lastArgs = lastArgs;\n        lastArgs = null;\n        lastExceptionStack = null;\n        lastException = null;\n        notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n    }\n\n    /**\n     * Reports an unhandled Error to TraceKit.\n     * @param {Error} ex\n     * @memberof TraceKit.report\n     * @throws An exception if an incomplete stack trace is detected (old IE browsers).\n     */\n    function report(ex) {\n        if (lastExceptionStack) {\n            if (lastException === ex) {\n                return; // already caught by an inner catch block, ignore\n            } else {\n              processLastException();\n            }\n        }\n\n        var stack = TraceKit.computeStackTrace(ex);\n        lastExceptionStack = stack;\n        lastException = ex;\n        lastArgs = _slice.call(arguments, 1);\n\n        // If the stack trace is incomplete, wait for 2 seconds for\n        // slow slow IE to see if onerror occurs or not before reporting\n        // this exception; otherwise, we will end up with an incomplete\n        // stack trace\n        window.setTimeout(function () {\n            if (lastException === ex) {\n                processLastException();\n            }\n        }, (stack.incomplete ? 2000 : 0));\n\n        throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n    }\n\n    report.subscribe = subscribe;\n    report.unsubscribe = unsubscribe;\n    return report;\n}());\n\n/**\n * An object representing a single stack frame.\n * @typedef {Object} StackFrame\n * @property {string} url The JavaScript or HTML file URL.\n * @property {string} func The function name, or empty for anonymous functions (if guessing did not work).\n * @property {string[]?} args The arguments passed to the function, if known.\n * @property {number=} line The line number, if known.\n * @property {number=} column The column number, if known.\n * @property {string[]} context An array of source code lines; the middle element corresponds to the correct line#.\n * @memberof TraceKit\n */\n\n/**\n * An object representing a JavaScript stack trace.\n * @typedef {Object} StackTrace\n * @property {string} name The name of the thrown exception.\n * @property {string} message The exception error message.\n * @property {TraceKit.StackFrame[]} stack An array of stack frames.\n * @property {string} mode 'stack', 'stacktrace', 'multiline', 'callers', 'onerror', or 'failed' -- method used to collect the stack trace.\n * @memberof TraceKit\n */\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n *   ```js\n *   s = TraceKit.computeStackTrace.ofCaller([depth])\n *   s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n *   ```\n *\n * Supports:\n *   - Firefox:  full stack trace with line numbers and unreliable column\n *               number on top frame\n *   - Opera 10: full stack trace with line and column numbers\n *   - Opera 9-: full stack trace with line numbers\n *   - Chrome:   full stack trace with line and column numbers\n *   - Safari:   line and column number for the topmost stacktrace element\n *               only\n *   - IE:       no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n *  * in Safari, some methods may be missing from the stack trace;\n *  * in IE, the topmost function in the stack trace will always be the\n *    caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n * Tracing example:\n *  ```js\n *     function trace(message) {\n *         var stackInfo = TraceKit.computeStackTrace.ofCaller();\n *         var data = message + \"\\n\";\n *         for(var i in stackInfo.stack) {\n *             var item = stackInfo.stack[i];\n *             data += (item.func || '[anonymous]') + \"() in \" + item.url + \":\" + (item.line || '0') + \"\\n\";\n *         }\n *         if (window.console)\n *             console.info(data);\n *         else\n *             alert(data);\n *     }\n * ```\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n    var debug = false,\n        sourceCache = {};\n\n    /**\n     * Attempts to retrieve source code via XMLHttpRequest, which is used\n     * to look up anonymous function names.\n     * @param {string} url URL of source code.\n     * @return {string} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function loadSource(url) {\n        if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on.\n            return '';\n        }\n        try {\n            var getXHR = function() {\n                try {\n                    return new window.XMLHttpRequest();\n                } catch (e) {\n                    // explicitly bubble up the exception if not found\n                    return new window.ActiveXObject('Microsoft.XMLHTTP');\n                }\n            };\n\n            var request = getXHR();\n            request.open('GET', url, false);\n            request.send('');\n            return request.responseText;\n        } catch (e) {\n            return '';\n        }\n    }\n\n    /**\n     * Retrieves source code from the source code cache.\n     * @param {string} url URL of source code.\n     * @return {Array.<string>} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function getSource(url) {\n        if (typeof url !== 'string') {\n            return [];\n        }\n\n        if (!_has(sourceCache, url)) {\n            // URL needs to be able to fetched within the acceptable domain.  Otherwise,\n            // cross-domain errors will be triggered.\n            /*\n                Regex matches:\n                0 - Full Url\n                1 - Protocol\n                2 - Domain\n                3 - Port (Useful for internal applications)\n                4 - Path\n            */\n            var source = '';\n            var domain = '';\n            try { domain = window.document.domain; } catch (e) { }\n            var match = /(.*)\\:\\/\\/([^:\\/]+)([:\\d]*)\\/{0,1}([\\s\\S]*)/.exec(url);\n            if (match && match[2] === domain) {\n                source = loadSource(url);\n            }\n            sourceCache[url] = source ? source.split('\\n') : [];\n        }\n\n        return sourceCache[url];\n    }\n\n    /**\n     * Tries to use an externally loaded copy of source code to determine\n     * the name of a function by looking at the name of the variable it was\n     * assigned to, if any.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} lineNo Line number in source code.\n     * @return {string} The function name, if discoverable.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function guessFunctionName(url, lineNo) {\n        var reFunctionArgNames = /function ([^(]*)\\(([^)]*)\\)/,\n            reGuessFunction = /['\"]?([0-9A-Za-z$_]+)['\"]?\\s*[:=]\\s*(function|eval|new Function)/,\n            line = '',\n            maxLines = 10,\n            source = getSource(url),\n            m;\n\n        if (!source.length) {\n            return UNKNOWN_FUNCTION;\n        }\n\n        // Walk backwards from the first line in the function until we find the line which\n        // matches the pattern above, which is the function definition\n        for (var i = 0; i < maxLines; ++i) {\n            line = source[lineNo - i] + line;\n\n            if (!_isUndefined(line)) {\n                if ((m = reGuessFunction.exec(line))) {\n                    return m[1];\n                } else if ((m = reFunctionArgNames.exec(line))) {\n                    return m[1];\n                }\n            }\n        }\n\n        return UNKNOWN_FUNCTION;\n    }\n\n    /**\n     * Retrieves the surrounding lines from where an exception occurred.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} line Line number in source code to centre\n     * around for context.\n     * @return {?Array.<string>} Lines of source code.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function gatherContext(url, line) {\n        var source = getSource(url);\n\n        if (!source.length) {\n            return null;\n        }\n\n        var context = [],\n            // linesBefore & linesAfter are inclusive with the offending line.\n            // if linesOfContext is even, there will be one extra line\n            //   *before* the offending line.\n            linesBefore = Math.floor(TraceKit.linesOfContext / 2),\n            // Add one extra line if linesOfContext is odd\n            linesAfter = linesBefore + (TraceKit.linesOfContext % 2),\n            start = Math.max(0, line - linesBefore - 1),\n            end = Math.min(source.length, line + linesAfter - 1);\n\n        line -= 1; // convert to 0-based index\n\n        for (var i = start; i < end; ++i) {\n            if (!_isUndefined(source[i])) {\n                context.push(source[i]);\n            }\n        }\n\n        return context.length > 0 ? context : null;\n    }\n\n    /**\n     * Escapes special characters, except for whitespace, in a string to be\n     * used inside a regular expression as a string literal.\n     * @param {string} text The string.\n     * @return {string} The escaped string literal.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeRegExp(text) {\n        return text.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#]/g, '\\\\$&');\n    }\n\n    /**\n     * Escapes special characters in a string to be used inside a regular\n     * expression as a string literal. Also ensures that HTML entities will\n     * be matched the same as their literal friends.\n     * @param {string} body The string.\n     * @return {string} The escaped string.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeCodeAsRegExpForMatchingInsideHTML(body) {\n        return escapeRegExp(body).replace('<', '(?:<|&lt;)').replace('>', '(?:>|&gt;)').replace('&', '(?:&|&amp;)').replace('\"', '(?:\"|&quot;)').replace(/\\s+/g, '\\\\s+');\n    }\n\n    /**\n     * Determines where a code fragment occurs in the source code.\n     * @param {RegExp} re The function definition.\n     * @param {Array.<string>} urls A list of URLs to search.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInUrls(re, urls) {\n        var source, m;\n        for (var i = 0, j = urls.length; i < j; ++i) {\n            // console.log('searching', urls[i]);\n            if ((source = getSource(urls[i])).length) {\n                source = source.join('\\n');\n                if ((m = re.exec(source))) {\n                    // console.log('Found function in ' + urls[i]);\n\n                    return {\n                        'url': urls[i],\n                        'line': source.substring(0, m.index).split('\\n').length,\n                        'column': m.index - source.lastIndexOf('\\n', m.index) - 1\n                    };\n                }\n            }\n        }\n\n        // console.log('no match');\n\n        return null;\n    }\n\n    /**\n     * Determines at which column a code fragment occurs on a line of the\n     * source code.\n     * @param {string} fragment The code fragment.\n     * @param {string} url The URL to search.\n     * @param {(string|number)} line The line number to examine.\n     * @return {?number} The column number.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInLine(fragment, url, line) {\n        var source = getSource(url),\n            re = new RegExp('\\\\b' + escapeRegExp(fragment) + '\\\\b'),\n            m;\n\n        line -= 1;\n\n        if (source && source.length > line && (m = re.exec(source[line]))) {\n            return m.index;\n        }\n\n        return null;\n    }\n\n    /**\n     * Determines where a function was defined within the source code.\n     * @param {(Function|string)} func A function reference or serialized\n     * function definition.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceByFunctionBody(func) {\n        if (_isUndefined(window && window.document)) {\n            return;\n        }\n\n        var urls = [window.location.href],\n            scripts = window.document.getElementsByTagName('script'),\n            body,\n            code = '' + func,\n            codeRE = /^function(?:\\s+([\\w$]+))?\\s*\\(([\\w\\s,]*)\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            eventRE = /^function on([\\w$]+)\\s*\\(event\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            re,\n            parts,\n            result;\n\n        for (var i = 0; i < scripts.length; ++i) {\n            var script = scripts[i];\n            if (script.src) {\n                urls.push(script.src);\n            }\n        }\n\n        if (!(parts = codeRE.exec(code))) {\n            re = new RegExp(escapeRegExp(code).replace(/\\s+/g, '\\\\s+'));\n        }\n\n        // not sure if this is really necessary, but I don’t have a test\n        // corpus large enough to confirm that and it was in the original.\n        else {\n            var name = parts[1] ? '\\\\s+' + parts[1] : '',\n                args = parts[2].split(',').join('\\\\s*,\\\\s*');\n\n            body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\\s+/g, '\\\\s+');\n            re = new RegExp('function' + name + '\\\\s*\\\\(\\\\s*' + args + '\\\\s*\\\\)\\\\s*{\\\\s*' + body + '\\\\s*}');\n        }\n\n        // look for a normal function definition\n        if ((result = findSourceInUrls(re, urls))) {\n            return result;\n        }\n\n        // look for an old-school event handler function\n        if ((parts = eventRE.exec(code))) {\n            var event = parts[1];\n            body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]);\n\n            // look for a function defined in HTML as an onXXX handler\n            re = new RegExp('on' + event + '=[\\\\\\'\"]\\\\s*' + body + '\\\\s*[\\\\\\'\"]', 'i');\n\n            if ((result = findSourceInUrls(re, urls[0]))) {\n                return result;\n            }\n\n            // look for ???\n            re = new RegExp(body);\n\n            if ((result = findSourceInUrls(re, urls))) {\n                return result;\n            }\n        }\n\n        return null;\n    }\n\n    // Contents of Exception in various browsers.\n    //\n    // SAFARI:\n    // ex.message = Can't find variable: qq\n    // ex.line = 59\n    // ex.sourceId = 580238192\n    // ex.sourceURL = http://...\n    // ex.expressionBeginOffset = 96\n    // ex.expressionCaretOffset = 98\n    // ex.expressionEndOffset = 98\n    // ex.name = ReferenceError\n    //\n    // FIREFOX:\n    // ex.message = qq is not defined\n    // ex.fileName = http://...\n    // ex.lineNumber = 59\n    // ex.columnNumber = 69\n    // ex.stack = ...stack trace... (see the example below)\n    // ex.name = ReferenceError\n    //\n    // CHROME:\n    // ex.message = qq is not defined\n    // ex.name = ReferenceError\n    // ex.type = not_defined\n    // ex.arguments = ['aa']\n    // ex.stack = ...stack trace...\n    //\n    // INTERNET EXPLORER:\n    // ex.message = ...\n    // ex.name = ReferenceError\n    //\n    // OPERA:\n    // ex.message = ...message... (see the example below)\n    // ex.name = ReferenceError\n    // ex.opera#sourceloc = 11  (pretty much useless, duplicates the info in ex.message)\n    // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n    /**\n     * Computes stack trace information from the stack property.\n     * Chrome and Gecko use this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStackProp(ex) {\n        if (!ex.stack) {\n            return null;\n        }\n\n        var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n            gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|\\[native).*?)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n            winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:ms-appx|https?|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n            lines = ex.stack.split('\\n'),\n            stack = [],\n            parts,\n            element,\n            reference = /^(.*) is undefined$/.exec(ex.message);\n\n        for (var i = 0, j = lines.length; i < j; ++i) {\n            if ((parts = chrome.exec(lines[i]))) {\n                var isNative = parts[2] && parts[2].indexOf('native') !== -1;\n                element = {\n                    'url': !isNative ? parts[2] : null,\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': isNative ? [parts[2]] : [],\n                    'line': parts[3] ? +parts[3] : null,\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ( parts = winjs.exec(lines[i]) ) {\n                element = {\n                    'url': parts[2],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': [],\n                    'line': +parts[3],\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ((parts = gecko.exec(lines[i]))) {\n                element = {\n                    'url': parts[3],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': parts[2] ? parts[2].split(',') : [],\n                    'line': parts[4] ? +parts[4] : null,\n                    'column': parts[5] ? +parts[5] : null\n                };\n            } else {\n                continue;\n            }\n\n            if (!element.func && element.line) {\n                element.func = guessFunctionName(element.url, element.line);\n            }\n\n            if (element.line) {\n                element.context = gatherContext(element.url, element.line);\n            }\n\n            stack.push(element);\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        if (stack[0] && stack[0].line && !stack[0].column && reference) {\n            stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line);\n        } else if (!stack[0].column && !_isUndefined(ex.columnNumber)) {\n            // FireFox uses this awesome columnNumber property for its top frame\n            // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n            // so adding 1\n            stack[0].column = ex.columnNumber + 1;\n        }\n\n        return {\n            'mode': 'stack',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * Computes stack trace information from the stacktrace property.\n     * Opera 10+ uses this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStacktraceProp(ex) {\n        // Access and store the stacktrace property before doing ANYTHING\n        // else to it because Opera is not very good at providing it\n        // reliably in other circumstances.\n        var stacktrace = ex.stacktrace;\n        if (!stacktrace) {\n            return;\n        }\n\n        var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i,\n            opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i,\n            lines = stacktrace.split('\\n'),\n            stack = [],\n            parts;\n\n        for (var line = 0; line < lines.length; line += 2) {\n            var element = null;\n            if ((parts = opera10Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[2],\n                    'line': +parts[1],\n                    'column': null,\n                    'func': parts[3],\n                    'args':[]\n                };\n            } else if ((parts = opera11Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[6],\n                    'line': +parts[1],\n                    'column': +parts[2],\n                    'func': parts[3] || parts[4],\n                    'args': parts[5] ? parts[5].split(',') : []\n                };\n            }\n\n            if (element) {\n                if (!element.func && element.line) {\n                    element.func = guessFunctionName(element.url, element.line);\n                }\n                if (element.line) {\n                    try {\n                        element.context = gatherContext(element.url, element.line);\n                    } catch (exc) {}\n                }\n\n                if (!element.context) {\n                    element.context = [lines[line + 1]];\n                }\n\n                stack.push(element);\n            }\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        return {\n            'mode': 'stacktrace',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * NOT TESTED.\n     * Computes stack trace information from an error message that includes\n     * the stack trace.\n     * Opera 9 and earlier use this method if the option to show stack\n     * traces is turned on in opera:config.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromOperaMultiLineMessage(ex) {\n        // TODO: Clean this function up\n        // Opera includes a stack trace into the exception message. An example is:\n        //\n        // Statement on line 3: Undefined variable: undefinedFunc\n        // Backtrace:\n        //   Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz\n        //         undefinedFunc(a);\n        //   Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy\n        //           zzz(x, y, z);\n        //   Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx\n        //           yyy(a, a, a);\n        //   Line 1 of function script\n        //     try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); }\n        //   ...\n\n        var lines = ex.message.split('\\n');\n        if (lines.length < 4) {\n            return null;\n        }\n\n        var lineRE1 = /^\\s*Line (\\d+) of linked script ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE2 = /^\\s*Line (\\d+) of inline#(\\d+) script in ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE3 = /^\\s*Line (\\d+) of function script\\s*$/i,\n            stack = [],\n            scripts = (window && window.document && window.document.getElementsByTagName('script')),\n            inlineScriptBlocks = [],\n            parts;\n\n        for (var s in scripts) {\n            if (_has(scripts, s) && !scripts[s].src) {\n                inlineScriptBlocks.push(scripts[s]);\n            }\n        }\n\n        for (var line = 2; line < lines.length; line += 2) {\n            var item = null;\n            if ((parts = lineRE1.exec(lines[line]))) {\n                item = {\n                    'url': parts[2],\n                    'func': parts[3],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null\n                };\n            } else if ((parts = lineRE2.exec(lines[line]))) {\n                item = {\n                    'url': parts[3],\n                    'func': parts[4],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null // TODO: Check to see if inline#1 (+parts[2]) points to the script number or column number.\n                };\n                var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block\n                var script = inlineScriptBlocks[parts[2] - 1];\n                if (script) {\n                    var source = getSource(item.url);\n                    if (source) {\n                        source = source.join('\\n');\n                        var pos = source.indexOf(script.innerText);\n                        if (pos >= 0) {\n                            item.line = relativeLine + source.substring(0, pos).split('\\n').length;\n                        }\n                    }\n                }\n            } else if ((parts = lineRE3.exec(lines[line]))) {\n                var url = window.location.href.replace(/#.*$/, '');\n                var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[line + 1]));\n                var src = findSourceInUrls(re, [url]);\n                item = {\n                    'url': url,\n                    'func': '',\n                    'args': [],\n                    'line': src ? src.line : parts[1],\n                    'column': null\n                };\n            }\n\n            if (item) {\n                if (!item.func) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n                var context = gatherContext(item.url, item.line);\n                var midline = (context ? context[Math.floor(context.length / 2)] : null);\n                if (context && midline.replace(/^\\s*/, '') === lines[line + 1].replace(/^\\s*/, '')) {\n                    item.context = context;\n                } else {\n                    // if (context) alert(\"Context mismatch. Correct midline:\\n\" + lines[i+1] + \"\\n\\nMidline:\\n\" + midline + \"\\n\\nContext:\\n\" + context.join(\"\\n\") + \"\\n\\nURL:\\n\" + item.url);\n                    item.context = [lines[line + 1]];\n                }\n                stack.push(item);\n            }\n        }\n        if (!stack.length) {\n            return null; // could not parse multiline exception message as Opera stack trace\n        }\n\n        return {\n            'mode': 'multiline',\n            'name': ex.name,\n            'message': lines[0],\n            'stack': stack\n        };\n    }\n\n    /**\n     * Adds information about the first frame to incomplete stack traces.\n     * Safari and IE require this to get complete data on the first frame.\n     * @param {TraceKit.StackTrace} stackInfo Stack trace information from\n     * one of the compute* methods.\n     * @param {string} url The URL of the script that caused an error.\n     * @param {(number|string)} lineNo The line number of the script that\n     * caused an error.\n     * @param {string=} message The error generated by the browser, which\n     * hopefully contains the name of the object that caused the error.\n     * @return {boolean} Whether or not the stack information was\n     * augmented.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n        var initial = {\n            'url': url,\n            'line': lineNo\n        };\n\n        if (initial.url && initial.line) {\n            stackInfo.incomplete = false;\n\n            if (!initial.func) {\n                initial.func = guessFunctionName(initial.url, initial.line);\n            }\n\n            if (!initial.context) {\n                initial.context = gatherContext(initial.url, initial.line);\n            }\n\n            var reference = / '([^']+)' /.exec(message);\n            if (reference) {\n                initial.column = findSourceInLine(reference[1], initial.url, initial.line);\n            }\n\n            if (stackInfo.stack.length > 0) {\n                if (stackInfo.stack[0].url === initial.url) {\n                    if (stackInfo.stack[0].line === initial.line) {\n                        return false; // already in stack trace\n                    } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) {\n                        stackInfo.stack[0].line = initial.line;\n                        stackInfo.stack[0].context = initial.context;\n                        return false;\n                    }\n                }\n            }\n\n            stackInfo.stack.unshift(initial);\n            stackInfo.partial = true;\n            return true;\n        } else {\n            stackInfo.incomplete = true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Computes stack trace information by walking the arguments.caller\n     * chain at the time the exception occurred. This will cause earlier\n     * frames to be missed but is the only way to get any stack trace in\n     * Safari and IE. The top frame is restored by\n     * {@link augmentStackTraceWithInitialElement}.\n     * @param {Error} ex\n     * @return {TraceKit.StackTrace=} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceByWalkingCallerChain(ex, depth) {\n        var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n            stack = [],\n            funcs = {},\n            recursion = false,\n            parts,\n            item,\n            source;\n\n        for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {\n            if (curr === computeStackTrace || curr === TraceKit.report) {\n                // console.log('skipping internal function');\n                continue;\n            }\n\n            item = {\n                'url': null,\n                'func': UNKNOWN_FUNCTION,\n                'args': [],\n                'line': null,\n                'column': null\n            };\n\n            if (curr.name) {\n                item.func = curr.name;\n            } else if ((parts = functionName.exec(curr.toString()))) {\n                item.func = parts[1];\n            }\n\n            if (typeof item.func === 'undefined') {\n              try {\n                item.func = parts.input.substring(0, parts.input.indexOf('{'));\n              } catch (e) { }\n            }\n\n            if ((source = findSourceByFunctionBody(curr))) {\n                item.url = source.url;\n                item.line = source.line;\n\n                if (item.func === UNKNOWN_FUNCTION) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n\n                var reference = / '([^']+)' /.exec(ex.message || ex.description);\n                if (reference) {\n                    item.column = findSourceInLine(reference[1], source.url, source.line);\n                }\n            }\n\n            if (funcs['' + curr]) {\n                recursion = true;\n            }else{\n                funcs['' + curr] = true;\n            }\n\n            stack.push(item);\n        }\n\n        if (depth) {\n            // console.log('depth is ' + depth);\n            // console.log('stack is ' + stack.length);\n            stack.splice(0, depth);\n        }\n\n        var result = {\n            'mode': 'callers',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n        augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description);\n        return result;\n    }\n\n    /**\n     * Computes a stack trace for an exception.\n     * @param {Error} ex\n     * @param {(string|number)=} depth\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTrace(ex, depth) {\n        var stack = null;\n        depth = (depth == null ? 0 : +depth);\n\n        try {\n            // This must be tried first because Opera 10 *destroys*\n            // its stacktrace property if you try to access the stack\n            // property first!!\n            stack = computeStackTraceFromStacktraceProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromStackProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromOperaMultiLineMessage(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        return {\n            'mode': 'failed'\n        };\n    }\n\n    /**\n     * Logs a stacktrace starting from the previous call and working down.\n     * @param {(number|string)=} depth How many frames deep to trace.\n     * @return {TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceOfCaller(depth) {\n        depth = (depth == null ? 0 : +depth) + 1; // \"+ 1\" because \"ofCaller\" should drop one frame\n        try {\n            throw new Error();\n        } catch (ex) {\n            return computeStackTrace(ex, depth + 1);\n        }\n    }\n\n    computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n    computeStackTrace.guessFunctionName = guessFunctionName;\n    computeStackTrace.gatherContext = gatherContext;\n    computeStackTrace.ofCaller = computeStackTraceOfCaller;\n    computeStackTrace.getSource = getSource;\n\n    return computeStackTrace;\n}());\n\n/**\n * Extends support for global error handling for asynchronous browser\n * functions. Adopted from Closure Library's errorhandler.js\n * @memberof TraceKit\n */\nTraceKit.extendToAsynchronousCallbacks = function () {\n    var _helper = function _helper(fnName) {\n        var originalFn = window[fnName];\n        window[fnName] = function traceKitAsyncExtension() {\n            // Make a copy of the arguments\n            var args = _slice.call(arguments);\n            var originalCallback = args[0];\n            if (typeof (originalCallback) === 'function') {\n                args[0] = TraceKit.wrap(originalCallback);\n            }\n            // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n            // also only supports 2 argument and doesn't care what \"this\" is, so we\n            // can just call the original function directly.\n            if (originalFn.apply) {\n                return originalFn.apply(this, args);\n            } else {\n                return originalFn(args[0], args[1]);\n            }\n        };\n    };\n\n    _helper('setTimeout');\n    _helper('setInterval');\n};\n\n//Default options:\nif (!TraceKit.remoteFetching) {\n    TraceKit.remoteFetching = true;\n}\nif (!TraceKit.collectWindowErrors) {\n    TraceKit.collectWindowErrors = true;\n}\nif (!TraceKit.linesOfContext || TraceKit.linesOfContext < 1) {\n    // 5 lines before, the offending line, 5 lines after\n    TraceKit.linesOfContext = 11;\n}\n\n// UMD export\nif (typeof module !== 'undefined' && module.exports && this.module !== module) {\n    module.exports = TraceKit;\n} else if (typeof define === 'function' && define.amd) {\n    define('TraceKit', [], TraceKit);\n} else {\n    window.TraceKit = TraceKit;\n}\n\n}(typeof window !== 'undefined' ? window : global));\n","import * as TraceKit from 'TraceKit';\nexport interface IEvent {\n  type?: string;\n  source?: string;\n  date?: Date;\n  tags?: string[];\n  message?: string;\n  geo?: string;\n  value?: number;\n  data?: any;\n  reference_id?: string;\n}\n\nexport class SubmissionResponse {\n  public success: boolean = false;\n  public badRequest: boolean = false;\n  public serviceUnavailable: boolean = false;\n  public paymentRequired: boolean = false;\n  public unableToAuthenticate: boolean = false;\n  public notFound: boolean = false;\n  public requestEntityTooLarge: boolean = false;\n  public statusCode: number;\n  public message: string;\n\n  constructor(statusCode: number, message?: string) {\n    this.statusCode = statusCode;\n    this.message = message;\n\n    this.success = statusCode >= 200 && statusCode <= 299;\n    this.badRequest = statusCode === 400;\n    this.serviceUnavailable = statusCode === 503;\n    this.paymentRequired = statusCode === 402;\n    this.unableToAuthenticate = statusCode === 401 || statusCode === 403;\n    this.notFound = statusCode === 404;\n    this.requestEntityTooLarge = statusCode === 413;\n  }\n}\n\nexport interface ILastReferenceIdManager {\n  getLast(): string;\n  clearLast(): void;\n  setLast(eventId: string): void;\n}\n\nexport interface ILog {\n  info(message: string): void;\n  warn(message: string): void;\n  error(message: string): void;\n}\n\n                                                                                                                 \n\nexport interface IEventQueue {\n  enqueue(event: IEvent): void;\n  process(isAppExiting?: boolean): void;\n  suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void;\n  onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void;\n}\n\n                                                                                                                                  \n\nexport interface IEnvironmentInfoCollector {\n  getEnvironmentInfo(context: EventPluginContext): IEnvironmentInfo;\n}\n\n                                                                                                              \n\nexport interface IErrorParser {\n  parse(context: EventPluginContext, exception: Error): IError;\n}\n\n                                                                                                                \n\nexport interface IModuleCollector {\n  getModules(context: EventPluginContext): IModule[];\n}\n\n                                                                                                                          \n\nexport interface IRequestInfoCollector {\n  getRequestInfo(context: EventPluginContext): IRequestInfo;\n}\n\n                                      \n\nexport interface IStorageProvider {\n  queue: IStorage;\n  settings: IStorage;\n}\n\n                                                                                                                   \n\nexport interface ISubmissionAdapter {\n  sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean): void;\n}\n\n                                                                                                                                                                                                                                                                                           \n\nexport interface ISubmissionClient {\n  postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void;\n  postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void;\n  getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void;\n  sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void;\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            \n\nexport interface IConfigurationSettings {\n  apiKey?: string;\n  serverUrl?: string;\n  heartbeatServerUrl?: string;\n  updateSettingsWhenIdleInterval?: number;\n  environmentInfoCollector?: IEnvironmentInfoCollector;\n  errorParser?: IErrorParser;\n  lastReferenceIdManager?: ILastReferenceIdManager;\n  log?: ILog;\n  moduleCollector?: IModuleCollector;\n  requestInfoCollector?: IRequestInfoCollector;\n  submissionBatchSize?: number;\n  submissionClient?: ISubmissionClient;\n  submissionAdapter?: ISubmissionAdapter;\n  storage?: IStorageProvider;\n  queue?: IEventQueue;\n}\n\n                                                                                                                                                     \n\ninterface ISettingsWithVersion {\n  version: number;\n  settings: { [key: string]: string };\n}\n\nexport class SettingsManager {\n  /**\n   * A list of handlers that will be fired when the settings change.\n   * @type {Array}\n   * @private\n   */\n  private static _handlers: { (config: Configuration): void }[] = [];\n\n  public static onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  public static applySavedServerSettings(config: Configuration): void {\n    if (!config || !config.isValid) {\n      return;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    config.log.info(`Applying saved settings: v${savedSettings.version}`);\n    config.settings = Utils.merge(config.settings, savedSettings.settings);\n    this.changed(config);\n  }\n\n  public static getVersion(config: Configuration): number {\n    if (!config || !config.isValid) {\n      return 0;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    return savedSettings.version || 0;\n  }\n\n  public static checkVersion(version: number, config: Configuration): void {\n    let currentVersion: number = this.getVersion(config);\n    if (version <= currentVersion) {\n      return;\n    }\n\n    config.log.info(`Updating settings from v${currentVersion} to v${version}`);\n    this.updateSettings(config, currentVersion);\n  }\n\n  public static updateSettings(config: Configuration, version?: number): void {\n    if (!config || !config.enabled) {\n      return;\n    }\n\n    let unableToUpdateMessage = 'Unable to update settings';\n    if (!config.isValid) {\n      config.log.error(`${unableToUpdateMessage}: ApiKey is not set.`);\n      return;\n    }\n\n    if (!version || version < 0) {\n      version = this.getVersion(config);\n    }\n\n    config.log.info(`Checking for updated settings from: v${version}.`);\n    config.submissionClient.getSettings(config, version, (response: SettingsResponse) => {\n      if (!config || !response || !response.success || !response.settings) {\n        config.log.warn(`${unableToUpdateMessage}: ${response.message}`);\n        return;\n      }\n\n      config.settings = Utils.merge(config.settings, response.settings);\n\n      // TODO: Store snapshot of settings after reading from config and attributes and use that to revert to defaults.\n      // Remove any existing server settings that are not in the new server settings.\n      let savedServerSettings = SettingsManager.getSavedServerSettings(config);\n      for (let key in savedServerSettings) {\n        if (response.settings[key]) {\n          continue;\n        }\n\n        delete config.settings[key];\n      }\n\n      let newSettings = <ISettingsWithVersion>{\n        version: response.settingsVersion,\n        settings: response.settings\n      };\n\n      config.storage.settings.save(newSettings);\n\n      config.log.info(`Updated settings: v${newSettings.version}`);\n      this.changed(config);\n    });\n  }\n\n  private static changed(config: Configuration) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](config);\n      } catch (ex) {\n        config.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  private static getSavedServerSettings(config: Configuration): ISettingsWithVersion {\n    let item = config.storage.settings.get()[0];\n    if (item && item.value && item.value.version && item.value.settings) {\n      return item.value;\n    }\n\n    return { version: 0, settings: {} };\n  }\n}\n\n                                                                    \n\nexport class DefaultLastReferenceIdManager implements ILastReferenceIdManager {\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @type {string}\n   * @private\n   */\n  private _lastReferenceId: string = null;\n\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @returns {string}\n   */\n  public getLast(): string {\n    return this._lastReferenceId;\n  }\n\n  /**\n   * Clears the last event's reference id.\n   */\n  public clearLast(): void {\n    this._lastReferenceId = null;\n  }\n\n  /**\n   * Sets the last event's reference id.\n   * @param eventId\n   */\n  public setLast(eventId: string): void {\n    this._lastReferenceId = eventId;\n  }\n}\n\n                              \n\nexport class ConsoleLog implements ILog {\n  public info(message: string): void {\n    this.log('info', message);\n  }\n\n  public warn(message: string): void {\n    this.log('warn', message);\n  }\n\n  public error(message: string): void {\n    this.log('error', message);\n  }\n\n  private log(level: string, message: string) {\n    if (console && console[level]) {\n      console[level](`[${level}] Exceptionless: ${message}`);\n    }\n  }\n}\n\n                              \n\nexport class NullLog implements ILog {\n  public info(message: string): void { }\n  public warn(message: string): void { }\n  public error(message: string): void { }\n}\n\nexport interface IUserInfo {\n  identity?: string;\n  name?: string;\n  data?: any;\n}\n\n                                                                                                         \n\nexport interface IEventPlugin {\n  priority?: number;\n  name?: string;\n  run(context: EventPluginContext, next?: () => void): void;\n}\n\n                                                                                                                                                                                             \n\nexport class EventPluginContext {\n  public cancelled: boolean;\n  public client: ExceptionlessClient;\n  public event: IEvent;\n  public contextData: ContextData;\n\n  constructor(client: ExceptionlessClient, event: IEvent, contextData?: ContextData) {\n    this.client = client;\n    this.event = event;\n    this.contextData = contextData ? contextData : new ContextData();\n  }\n\n  public get log(): ILog {\n    return this.client.config.log;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \n\nexport class EventPluginManager {\n  public static run(context: EventPluginContext, callback: (context?: EventPluginContext) => void): void {\n    let wrap = function(plugin: IEventPlugin, next?: () => void): () => void {\n      return () => {\n        try {\n          if (!context.cancelled) {\n            plugin.run(context, next);\n          }\n        } catch (ex) {\n          context.cancelled = true;\n          context.log.error(`Error running plugin '${plugin.name}': ${ex.message}. Discarding Event.`);\n        }\n\n        if (context.cancelled && !!callback) {\n          callback(context);\n        }\n      };\n    };\n\n    let plugins: IEventPlugin[] = context.client.config.plugins; // optimization for minifier.\n    let wrappedPlugins: { (): void }[] = [];\n    if (!!callback) {\n      wrappedPlugins[plugins.length] = wrap({ name: 'cb', priority: 9007199254740992, run: callback }, null);\n    }\n\n    for (let index = plugins.length - 1; index > -1; index--) {\n      wrappedPlugins[index] = wrap(plugins[index], !!callback || (index < plugins.length - 1) ? wrappedPlugins[index + 1] : null);\n    }\n\n    wrappedPlugins[0]();\n  }\n\n  public static addDefaultPlugins(config: Configuration): void {\n    config.addPlugin(new ConfigurationDefaultsPlugin());\n    config.addPlugin(new ErrorPlugin());\n    config.addPlugin(new DuplicateCheckerPlugin());\n    config.addPlugin(new EventExclusionPlugin());\n    config.addPlugin(new ModuleInfoPlugin());\n    config.addPlugin(new RequestInfoPlugin());\n    config.addPlugin(new EnvironmentInfoPlugin());\n    config.addPlugin(new SubmissionMethodPlugin());\n  }\n}\n\n                                                                                                                                                               \n\nexport class HeartbeatPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'HeartbeatPlugin';\n\n  private _interval: number;\n  private _intervalId: any;\n\n  constructor (heartbeatInterval: number = 30000) {\n    this._interval = heartbeatInterval;\n  }\n\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    clearInterval(this._intervalId);\n\n    let user: IUserInfo = context.event.data['@user'];\n    if (user && user.identity) {\n      this._intervalId = setInterval(() => context.client.submitSessionHeartbeat(user.identity), this._interval);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ReferenceIdPlugin implements IEventPlugin {\n  public priority: number = 20;\n  public name: string = 'ReferenceIdPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    if ((!context.event.reference_id || context.event.reference_id.length === 0) && context.event.type === 'error') {\n      context.event.reference_id = Utils.guid().replace('-', '').substring(0, 10);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                     \n\nexport class DefaultEventQueue implements IEventQueue {\n  /**\n   * The configuration object.\n   * @type {Configuration}\n   * @private\n   */\n  private _config: Configuration;\n\n  /**\n   * A list of handlers that will be fired when events are submitted.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (events: IEvent[], response: SubmissionResponse): void }[] = [];\n\n  /**\n   * Suspends processing until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _suspendProcessingUntil: Date;\n\n  /**\n   * Discards queued items until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _discardQueuedItemsUntil: Date;\n\n  /**\n   * Returns true if the queue is processing.\n   * @type {boolean}\n   * @private\n   */\n  private _processingQueue: boolean = false;\n\n  /**\n   * Processes the queue every xx seconds.\n   * @type {Timer}\n   * @private\n   */\n  private _queueTimer: any;\n\n  constructor(config: Configuration) {\n    this._config = config;\n  }\n\n  public enqueue(event: IEvent): void {\n    const eventWillNotBeQueued: string = 'The event will not be queued.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (this.areQueuedItemsDiscarded()) {\n      log.info(`Queue items are currently being discarded. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    this.ensureQueueTimer();\n\n    let timestamp = config.storage.queue.save(event);\n    let logText = `type=${event.type} ${!!event.reference_id ? 'refid=' + event.reference_id : ''}`;\n    if (timestamp) {\n      log.info(`Enqueuing event: ${timestamp} ${logText}`);\n    } else {\n      log.error(`Could not enqueue event ${logText}`);\n    }\n  }\n\n  public process(isAppExiting?: boolean): void {\n    const queueNotProcessed: string = 'The queue will not be processed.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (this._processingQueue) {\n      return;\n    }\n\n    log.info('Processing queue...');\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${queueNotProcessed}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${queueNotProcessed}`);\n      return;\n    }\n\n    this._processingQueue = true;\n    this.ensureQueueTimer();\n\n    try {\n      let events = config.storage.queue.get(config.submissionBatchSize);\n      if (!events || events.length === 0) {\n        this._processingQueue = false;\n        return;\n      }\n\n      log.info(`Sending ${events.length} events to ${config.serverUrl}.`);\n      config.submissionClient.postEvents(events.map(e => e.value), config, (response: SubmissionResponse) => {\n        this.processSubmissionResponse(response, events);\n        this.eventsPosted(events.map(e => e.value), response);\n        log.info('Finished processing queue.');\n        this._processingQueue = false;\n      }, isAppExiting);\n    } catch (ex) {\n      log.error(`Error processing queue: ${ex}`);\n      this.suspendProcessing();\n      this._processingQueue = false;\n    }\n  }\n\n  public suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void {\n    let config: Configuration = this._config; // Optimization for minifier.\n\n    if (!durationInMinutes || durationInMinutes <= 0) {\n      durationInMinutes = 5;\n    }\n\n    config.log.info(`Suspending processing for ${durationInMinutes} minutes.`);\n    this._suspendProcessingUntil = new Date(new Date().getTime() + (durationInMinutes * 60000));\n\n    if (discardFutureQueuedItems) {\n      this._discardQueuedItemsUntil = this._suspendProcessingUntil;\n    }\n\n    if (clearQueue) {\n      // Account is over the limit and we want to ensure that the sample size being sent in will contain newer errors.\n      config.storage.queue.clear();\n    }\n  }\n\n  public onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private eventsPosted(events: IEvent[], response: SubmissionResponse) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](events, response);\n      } catch (ex) {\n        this._config.log.error(`Error calling onEventsPosted handler: ${ex}`);\n      }\n    }\n  }\n\n  private areQueuedItemsDiscarded(): boolean {\n    return this._discardQueuedItemsUntil && this._discardQueuedItemsUntil > new Date();\n  }\n\n  private ensureQueueTimer(): void {\n    if (!this._queueTimer) {\n      this._queueTimer = setInterval(() => this.onProcessQueue(), 10000);\n    }\n  }\n\n  private isQueueProcessingSuspended(): boolean {\n    return this._suspendProcessingUntil && this._suspendProcessingUntil > new Date();\n  }\n\n  private onProcessQueue(): void {\n    if (!this.isQueueProcessingSuspended() && !this._processingQueue) {\n      this.process();\n    }\n  }\n\n  private processSubmissionResponse(response: SubmissionResponse, events: IStorageItem[]): void {\n    const noSubmission: string = 'The event will not be submitted.'; // Optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (response.success) {\n      log.info(`Sent ${events.length} events.`);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.serviceUnavailable) {\n      // You are currently over your rate limit or the servers are under stress.\n      log.error('Server returned service unavailable.');\n      this.suspendProcessing();\n      return;\n    }\n\n    if (response.paymentRequired) {\n      // If the organization over the rate limit then discard the event.\n      log.info('Too many events have been submitted, please upgrade your plan.');\n      this.suspendProcessing(null, true, true);\n      return;\n    }\n\n    if (response.unableToAuthenticate) {\n      // The api key was suspended or could not be authorized.\n      log.info(`Unable to authenticate, please check your configuration. ${noSubmission}`);\n      this.suspendProcessing(15);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.notFound || response.badRequest) {\n      // The service end point could not be found.\n      log.error(`Error while trying to submit data: ${response.message}`);\n      this.suspendProcessing(60 * 4);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.requestEntityTooLarge) {\n      let message = 'Event submission discarded for being too large.';\n      if (config.submissionBatchSize > 1) {\n        log.error(`${message} Retrying with smaller batch size.`);\n        config.submissionBatchSize = Math.max(1, Math.round(config.submissionBatchSize / 1.5));\n      } else {\n        log.error(`${message} ${noSubmission}`);\n        this.removeEvents(events);\n      }\n\n      return;\n    }\n\n    if (!response.success) {\n      log.error(`Error submitting events: ${response.message || 'Please check the network tab for more info.'}`);\n      this.suspendProcessing();\n    }\n  }\n\n  private removeEvents(events: IStorageItem[]) {\n    for (let index = 0; index < (events || []).length; index++) {\n      this._config.storage.queue.remove(events[index].timestamp);\n    }\n  }\n}\n\n                                                                                                                                                  \n\nexport class InMemoryStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(maxQueueItems: number = 250) {\n    this.queue = new InMemoryStorage(maxQueueItems);\n    this.settings = new InMemoryStorage(1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n\ndeclare var XDomainRequest: { new (); create(); };\n\nexport class DefaultSubmissionClient implements ISubmissionClient {\n  public configurationVersionHeader: string = 'x-exceptionless-configversion';\n\n  public postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void {\n    let data = JSON.stringify(events);\n    let request = this.createRequest(config, 'POST',  `${config.serverUrl}/api/v2/events`, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb, isAppExiting);\n  }\n\n  public postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void {\n    let path = `${config.serverUrl}/api/v2/events/by-ref/${encodeURIComponent(referenceId)}/user-description`;\n    let data = JSON.stringify(description);\n    let request = this.createRequest(config, 'POST', path, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void {\n    let request = this.createRequest(config, 'GET', `${config.serverUrl}/api/v2/projects/config?v=${version}`);\n    let cb = (status, message, data?, headers?) => {\n      if (status !== 200) {\n        return callback(new SettingsResponse(false, null, -1, null, message));\n      }\n\n      let settings: IClientConfiguration;\n      try {\n        settings = JSON.parse(data);\n      } catch (e) {\n        config.log.error(`Unable to parse settings: '${data}'`);\n      }\n\n      if (!settings || isNaN(settings.version)) {\n        return callback(new SettingsResponse(false, null, -1, null, 'Invalid configuration settings.'));\n      }\n\n      callback(new SettingsResponse(true, settings.settings || {}, settings.version));\n    };\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void {\n    let request = this.createRequest(config, 'GET', `${config.heartbeatServerUrl}/api/v2/events/session/heartbeat?id=${sessionIdOrUserId}&close=${closeSession}`);\n    config.submissionAdapter.sendRequest(request);\n  }\n\n  private createRequest(config: Configuration, method: string, url: string, data: string = null): SubmissionRequest {\n    return {\n      method,\n      url,\n      data,\n      apiKey: config.apiKey,\n      userAgent: config.userAgent\n    };\n  }\n\n  private createSubmissionCallback(config: Configuration, callback: (response: SubmissionResponse) => void) {\n    return (status, message, data?, headers?) => {\n      let settingsVersion: number = headers && parseInt(headers[this.configurationVersionHeader], 10);\n      SettingsManager.checkVersion(settingsVersion, config);\n\n      callback(new SubmissionResponse(status, message));\n    };\n  }\n}\n\nexport class Utils {\n  public static addRange<T>(target: T[], ...values: T[]) {\n    if (!target) {\n      target = [];\n    }\n\n    if (!values || values.length === 0) {\n      return target;\n    }\n\n    for (let index = 0; index < values.length; index++) {\n      if (values[index] && target.indexOf(values[index]) < 0) {\n        target.push(values[index]);\n      }\n    }\n\n    return target;\n  }\n\n  public static getHashCode(source: string): number {\n    if (!source || source.length === 0) {\n      return 0;\n    }\n\n    let hash: number = 0;\n    for (let index = 0; index < source.length; index++) {\n      let character = source.charCodeAt(index);\n      hash = ((hash << 5) - hash) + character;\n      hash |= 0;\n    }\n\n    return hash;\n  }\n\n  public static getCookies(cookies: string, exclusions?: string[]): Object {\n    let result: Object = {};\n\n    let parts: string[] = (cookies || '').split('; ');\n    for (let index = 0; index < parts.length; index++) {\n      let cookie: string[] = parts[index].split('=');\n      if (!Utils.isMatch(cookie[0], exclusions)) {\n        result[cookie[0]] = cookie[1];\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static guid(): string {\n    function s4() {\n      return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n    }\n\n    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n  }\n\n  public static merge(defaultValues: Object, values: Object) {\n    let result: Object = {};\n\n    for (let key in defaultValues || {}) {\n      if (!!defaultValues[key]) {\n        result[key] = defaultValues[key];\n      }\n    }\n\n    for (let key in values || {}) {\n      if (!!values[key]) {\n        result[key] = values[key];\n      }\n    }\n\n    return result;\n  }\n\n  public static parseVersion(source: string): string {\n    if (!source) {\n      return null;\n    }\n\n    let versionRegex = /(v?((\\d+)\\.(\\d+)(\\.(\\d+))?)(?:-([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?(?:\\+([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?)/;\n    let matches = versionRegex.exec(source);\n    if (matches && matches.length > 0) {\n      return matches[0];\n    }\n\n    return null;\n  }\n\n  public static parseQueryString(query: string, exclusions?: string[]) {\n    if (!query || query.length === 0) {\n      return null;\n    }\n\n    let pairs: string[] = query.split('&');\n    if (pairs.length === 0) {\n      return null;\n    }\n\n    let result: Object = {};\n    for (let index = 0; index < pairs.length; index++) {\n      let pair = pairs[index].split('=');\n      if (!Utils.isMatch(pair[0], exclusions)) {\n        result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static randomNumber(): number {\n    return Math.floor(Math.random() * 9007199254740992);\n  }\n\n  /**\n   * Checks to see if a value matches a pattern.\n   * @param input the value to check against the @pattern.\n   * @param pattern The pattern to check, supports wild cards (*).\n   */\n  public static isMatch(input: string, patterns: string[], ignoreCase: boolean = true): boolean {\n    if (!input || typeof input !== 'string') {\n      return false;\n    }\n\n    let trim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n    input = (ignoreCase ? input.toLowerCase() : input).replace(trim, '');\n\n    return (patterns || []).some(pattern => {\n      if (typeof pattern !== 'string') {\n        return false;\n      }\n\n      pattern = (ignoreCase ? pattern.toLowerCase() : pattern).replace(trim, '');\n      if (pattern.length <= 0) {\n        return false;\n      }\n\n      let startsWithWildcard: boolean = pattern[0] === '*';\n      if (startsWithWildcard) {\n        pattern = pattern.slice(1);\n      }\n\n      let endsWithWildcard: boolean = pattern[pattern.length - 1] === '*';\n      if (endsWithWildcard) {\n        pattern = pattern.substring(0, pattern.length - 1);\n      }\n\n      if (startsWithWildcard && endsWithWildcard) {\n        return pattern.length <= input.length && input.indexOf(pattern, 0) !== -1;\n      }\n\n      if (startsWithWildcard) {\n        return Utils.endsWith(input, pattern);\n      }\n\n      if (endsWithWildcard) {\n        return Utils.startsWith(input, pattern);\n      }\n\n      return input === pattern;\n    });\n  }\n\n  public static isEmpty(input: Object) {\n    return input === null || (typeof (input) === 'object' && Object.keys(input).length === 0);\n  }\n\n  public static startsWith(input: string, prefix: string): boolean {\n    return input.substring(0, prefix.length) === prefix;\n  }\n\n  public static endsWith(input: string, suffix: string): boolean {\n    return input.indexOf(suffix, input.length - suffix.length) !== -1;\n  }\n\n  /**\n   * Stringifys an object with optional exclusions and max depth.\n   * @param data The data object to add.\n   * @param exclusions Any property names that should be excluded.\n   * @param maxDepth The max depth of the object to include.\n   */\n  public static stringify(data: any, exclusions?: string[], maxDepth?: number): string {\n    function stringifyImpl(obj: any, excludedKeys: string[]): string {\n      let cache: string[] = [];\n      return JSON.stringify(obj, function(key: string, value: any) {\n        if (Utils.isMatch(key, excludedKeys)) {\n          return;\n        }\n\n        if (typeof value === 'object' && !!value) {\n          if (cache.indexOf(value) !== -1) {\n            // Circular reference found, discard key\n            return;\n          }\n\n          cache.push(value);\n        }\n\n        return value;\n      });\n    }\n\n    if (({}).toString.call(data) === '[object Object]') {\n      let flattened = {};\n      /* tslint:disable:forin */\n      for (let prop in data) {\n        let value = data[prop];\n        if (value === data) {\n          continue;\n        }\n        flattened[prop] = data[prop];\n      }\n      /* tslint:enable:forin */\n\n      return stringifyImpl(flattened, exclusions);\n    }\n\n    if (({}).toString.call(data) === '[object Array]') {\n      let result = [];\n      for (let index = 0; index < data.length; index++) {\n        result[index] = JSON.parse(stringifyImpl(data[index], exclusions));\n      }\n\n      return JSON.stringify(result);\n    }\n\n    return stringifyImpl(data, exclusions);\n  }\n\n  public static toBoolean(input, defaultValue: boolean = false): boolean {\n    if (typeof input === 'boolean') {\n      return input;\n    }\n\n    if (input === null || typeof input !== 'number' && typeof input !== 'string') {\n      return defaultValue;\n    }\n\n    switch ((input + '').toLowerCase().trim()) {\n      case 'true': case 'yes': case '1': return true;\n      case 'false': case 'no': case '0': case null: return false;\n    }\n\n    return defaultValue;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 \n\nexport class Configuration implements IConfigurationSettings {\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @type {IConfigurationSettings}\n   * @private\n   */\n  private static _defaultSettings: IConfigurationSettings = null;\n\n  /**\n   * A default list of tags that will automatically be added to every\n   * report submitted to the server.\n   *\n   * @type {Array}\n   */\n  public defaultTags: string[] = [];\n\n  /**\n   * A default list of of extended data objects that will automatically\n   * be added to every report submitted to the server.\n   *\n   * @type {{}}\n   */\n  public defaultData: Object = {};\n\n  /**\n   * Whether the client is currently enabled or not. If it is disabled,\n   * submitted errors will be discarded and no data will be sent to the server.\n   *\n   * @returns {boolean}\n   */\n  public enabled: boolean = true;\n\n  public environmentInfoCollector: IEnvironmentInfoCollector;\n  public errorParser: IErrorParser;\n  public lastReferenceIdManager: ILastReferenceIdManager = new DefaultLastReferenceIdManager();\n  public log: ILog;\n  public moduleCollector: IModuleCollector;\n  public requestInfoCollector: IRequestInfoCollector;\n\n  /**\n   * Maximum number of events that should be sent to the server together in a batch. (Defaults to 50)\n   */\n  public submissionBatchSize: number;\n  public submissionAdapter: ISubmissionAdapter;\n  public submissionClient: ISubmissionClient;\n\n  /**\n   * Contains a dictionary of custom settings that can be used to control\n   * the client and will be automatically updated from the server.\n   */\n  public settings: Object = {};\n\n  public storage: IStorageProvider;\n\n  public queue: IEventQueue;\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @type {string}\n   * @private\n   */\n  private _apiKey: string;\n\n  /**\n   * The server url that all events will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _serverUrl: string = 'https://collector.exceptionless.io';\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _heartbeatServerUrl: string = 'https://heartbeat.exceptionless.io';\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @type {number}\n   * @private\n   */\n  private _updateSettingsWhenIdleInterval: number = 120000;\n\n  /**\n   * A list of exclusion patterns.\n   * @type {Array}\n   * @private\n   */\n  private _dataExclusions: string[] = [];\n\n  /**\n   * A list of user agent patterns.\n   * @type {Array}\n   * @private\n   */\n  private _userAgentBotPatterns: string[] = [];\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @type {Array}\n   * @private\n   */\n  private _plugins: IEventPlugin[] = [];\n\n  /**\n   * A list of handlers that will be fired when configuration changes.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (config: Configuration): void }[] = [];\n\n  constructor(configSettings?: IConfigurationSettings) {\n    function inject(fn: any) {\n      return typeof fn === 'function' ? fn(this) : fn;\n    }\n\n    configSettings = Utils.merge(Configuration.defaults, configSettings);\n\n    this.log = inject(configSettings.log) || new NullLog();\n    this.apiKey = configSettings.apiKey;\n    this.serverUrl = configSettings.serverUrl;\n    this.heartbeatServerUrl = configSettings.heartbeatServerUrl;\n    this.updateSettingsWhenIdleInterval = configSettings.updateSettingsWhenIdleInterval;\n\n    this.environmentInfoCollector = inject(configSettings.environmentInfoCollector);\n    this.errorParser = inject(configSettings.errorParser);\n    this.lastReferenceIdManager = inject(configSettings.lastReferenceIdManager) || new DefaultLastReferenceIdManager();\n    this.moduleCollector = inject(configSettings.moduleCollector);\n    this.requestInfoCollector = inject(configSettings.requestInfoCollector);\n    this.submissionBatchSize = inject(configSettings.submissionBatchSize) || 50;\n    this.submissionAdapter = inject(configSettings.submissionAdapter);\n    this.submissionClient = inject(configSettings.submissionClient) || new DefaultSubmissionClient();\n    this.storage = inject(configSettings.storage) || new InMemoryStorageProvider();\n    this.queue = inject(configSettings.queue) || new DefaultEventQueue(this);\n\n    SettingsManager.applySavedServerSettings(this);\n    EventPluginManager.addDefaultPlugins(this);\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @returns {string}\n   */\n  public get apiKey(): string {\n    return this._apiKey;\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @param value\n   */\n  public set apiKey(value: string) {\n    this._apiKey = value || null;\n    this.log.info(`apiKey: ${this._apiKey}`);\n    this.changed();\n  }\n\n  /**\n   * Returns true if the apiKey is valid.\n   * @returns {boolean}\n   */\n  public get isValid(): boolean {\n    return !!this.apiKey && this.apiKey.length >= 10;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @returns {string}\n   */\n  public get serverUrl(): string {\n    return this._serverUrl;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @param value\n   */\n  public set serverUrl(value: string) {\n    if (!!value) {\n      this._serverUrl = value;\n      this._heartbeatServerUrl = value;\n      this.log.info(`serverUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @returns {string}\n   */\n  public get heartbeatServerUrl(): string {\n    return this._heartbeatServerUrl;\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @param value\n   */\n  public set heartbeatServerUrl(value: string) {\n    if (!!value) {\n      this._heartbeatServerUrl = value;\n      this.log.info(`heartbeatServerUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @returns {number}\n   */\n  public get updateSettingsWhenIdleInterval(): number {\n    return this._updateSettingsWhenIdleInterval;\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @param value\n   */\n  public set updateSettingsWhenIdleInterval(value: number) {\n    if (typeof value !== 'number') {\n      return;\n    }\n\n    if (value <= 0) {\n      value = -1;\n    } else if (value > 0 && value < 15000) {\n      value = 15000;\n    }\n\n    this._updateSettingsWhenIdleInterval = value;\n    this.log.info(`updateSettingsWhenIdleInterval: ${value}`);\n    this.changed();\n  }\n\n  /**\n   *  A list of exclusion patterns that will automatically remove any data that\n   *  matches them from any data submitted to the server.\n   *\n   *  For example, entering CreditCard will remove any extended data properties,\n   *  form fields, cookies and query parameters from the report.\n   *\n   * @returns {string[]}\n   */\n  public get dataExclusions(): string[] {\n    let exclusions: string = this.settings['@@DataExclusions'];\n    return this._dataExclusions.concat(exclusions && exclusions.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of exclusion patterns that will automatically remove any\n   * data that matches them from any data submitted to the server.\n   *\n   * For example, entering CreditCard will remove any extended data properties, form\n   * fields, cookies and query parameters from the report.\n   *\n   * @param exclusions\n   */\n  public addDataExclusions(...exclusions: string[]) {\n    this._dataExclusions = Utils.addRange<string>(this._dataExclusions, ...exclusions);\n  }\n\n  /**\n   * A list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @returns {string[]}\n   */\n  public get userAgentBotPatterns(): string[] {\n    let patterns: string = this.settings['@@UserAgentBotPatterns'];\n    return this._userAgentBotPatterns.concat(patterns && patterns.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @param userAgentBotPatterns\n   */\n  public addUserAgentBotPatterns(...userAgentBotPatterns: string[]) {\n    this._userAgentBotPatterns = Utils.addRange<string>(this._userAgentBotPatterns, ...userAgentBotPatterns);\n  }\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @returns {IEventPlugin[]}\n   */\n  public get plugins(): IEventPlugin[] {\n    return this._plugins.sort((p1: IEventPlugin, p2: IEventPlugin) => {\n      return (p1.priority < p2.priority) ? -1 : (p1.priority > p2.priority) ? 1 : 0;\n    });\n  }\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param plugin\n   */\n  public addPlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param name The name used to identify the plugin.\n   * @param priority Used to determine plugins priority.\n   * @param pluginAction A function that is run.\n   */\n  public addPlugin(name: string, priority: number, pluginAction: (context: EventPluginContext, next?: () => void) => void): void;\n  public addPlugin(pluginOrName: IEventPlugin | string, priority?: number, pluginAction?: (context: EventPluginContext, next?: () => void) => void): void {\n    let plugin: IEventPlugin = !!pluginAction ? { name: <string>pluginOrName, priority: priority, run: pluginAction } : <IEventPlugin>pluginOrName;\n    if (!plugin || !plugin.run) {\n      this.log.error('Add plugin failed: Run method not defined');\n      return;\n    }\n\n    if (!plugin.name) {\n      plugin.name = Utils.guid();\n    }\n\n    if (!plugin.priority) {\n      plugin.priority = 0;\n    }\n\n    let pluginExists: boolean = false;\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === plugin.name) {\n        pluginExists = true;\n        break;\n      }\n    }\n\n    if (!pluginExists) {\n      plugins.push(plugin);\n    }\n  }\n\n  /**\n   * Remove the plugin from this configuration.\n   * @param plugin\n   */\n  public removePlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Remove an plugin by key from this configuration.\n   * @param name\n   */\n  public removePlugin(name: string): void;\n  public removePlugin(pluginOrName: IEventPlugin | string): void {\n    let name: string = typeof pluginOrName === 'string' ? pluginOrName : pluginOrName.name;\n    if (!name) {\n      this.log.error('Remove plugin failed: Plugin name not defined');\n      return;\n    }\n\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === name) {\n        plugins.splice(index, 1);\n        break;\n      }\n    }\n  }\n\n  /**\n   * Automatically set the application version for events.\n   * @param version\n   */\n  public setVersion(version: string): void {\n    if (!!version) {\n      this.defaultData['@version'] = version;\n    }\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): void;\n  public setUserIdentity(identity: string): void;\n  public setUserIdentity(identity: string, name: string): void;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): void {\n    const USER_KEY: string = '@user'; // optimization for minifier.\n    let userInfo: IUserInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n\n    let shouldRemove: boolean = !userInfo || (!userInfo.identity && !userInfo.name);\n    if (shouldRemove) {\n      delete this.defaultData[USER_KEY];\n    } else {\n      this.defaultData[USER_KEY] = userInfo;\n    }\n\n    this.log.info(`user identity: ${shouldRemove ? 'null' : userInfo.identity}`);\n  }\n\n  /**\n   * Used to identify the client that sent the events to the server.\n   * @returns {string}\n   */\n  public get userAgent(): string {\n    return 'exceptionless-js/1.0.0.0';\n  }\n\n  /**\n   * Automatically send a heartbeat to keep the session alive.\n   */\n  public useSessions(sendHeartbeats: boolean = true, heartbeatInterval: number = 30000): void {\n    if (sendHeartbeats) {\n      this.addPlugin(new HeartbeatPlugin(heartbeatInterval));\n    }\n  }\n\n  /**\n   * Automatically set a reference id for error events.\n   */\n  public useReferenceIds(): void {\n    this.addPlugin(new ReferenceIdPlugin());\n  }\n\n  public useLocalStorage(): void {\n    // This method will be injected via the prototype.\n  }\n\n  // TODO: Support a min log level.\n  public useDebugLogger(): void {\n    this.log = new ConsoleLog();\n  }\n\n  public onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private changed() {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](this);\n      } catch (ex) {\n        this.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @returns {IConfigurationSettings}\n   */\n  public static get defaults() {\n    if (Configuration._defaultSettings === null) {\n      Configuration._defaultSettings = {};\n    }\n\n    return Configuration._defaultSettings;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                   \n\nexport class EventBuilder {\n  public target: IEvent;\n  public client: ExceptionlessClient;\n  public pluginContextData: ContextData;\n\n  private _validIdentifierErrorMessage: string = 'must contain between 8 and 100 alphanumeric or \\'-\\' characters.'; // optimization for minifier.\n\n  constructor(event: IEvent, client: ExceptionlessClient, pluginContextData?: ContextData) {\n    this.target = event;\n    this.client = client;\n    this.pluginContextData = pluginContextData || new ContextData();\n  }\n\n  public setType(type: string): EventBuilder {\n    if (!!type) {\n      this.target.type = type;\n    }\n\n    return this;\n  }\n\n  public setSource(source: string): EventBuilder {\n    if (!!source) {\n      this.target.source = source;\n    }\n\n    return this;\n  }\n\n  public setReferenceId(referenceId: string): EventBuilder {\n    if (!this.isValidIdentifier(referenceId)) {\n      throw new Error(`ReferenceId ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.target.reference_id = referenceId;\n    return this;\n  }\n\n  /**\n   * Allows you to reference a parent event by its ReferenceId property. This allows you to have parent and child relationships.\n   * @param name Reference name\n   * @param id The reference id that points to a specific event\n   * @returns {EventBuilder}\n     */\n  public setEventReference(name: string, id: string): EventBuilder {\n    if (!name) {\n      throw new Error('Invalid name');\n    }\n\n    if (!id || !this.isValidIdentifier(id)) {\n      throw new Error(`Id ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.setProperty('@ref:' + name, id);\n    return this;\n  }\n\n  public setMessage(message: string): EventBuilder {\n    if (!!message) {\n      this.target.message = message;\n    }\n\n    return this;\n  }\n\n  public setGeo(latitude: number, longitude: number): EventBuilder {\n    if (latitude < -90.0 || latitude > 90.0) {\n      throw new Error('Must be a valid latitude value between -90.0 and 90.0.');\n    }\n\n    if (longitude < -180.0 || longitude > 180.0) {\n      throw new Error('Must be a valid longitude value between -180.0 and 180.0.');\n    }\n\n    this.target.geo = `${latitude},${longitude}`;\n    return this;\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): EventBuilder;\n  public setUserIdentity(identity: string): EventBuilder;\n  public setUserIdentity(identity: string, name: string): EventBuilder;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): EventBuilder {\n    let userInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n    if (!userInfo || (!userInfo.identity && !userInfo.name)) {\n      return this;\n    }\n\n    this.setProperty('@user', userInfo);\n    return this;\n  }\n\n  /**\n   * Sets the user's description of the event.\n   *\n   * @param emailAddress The email address\n   * @param description The user's description of the event.\n   * @returns {EventBuilder}\n     */\n  public setUserDescription(emailAddress: string, description: string): EventBuilder {\n    if (emailAddress && description) {\n      this.setProperty('@user_description', { email_address: emailAddress, description: description });\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting manual\n   * stacking information.\n   * @param signatureData A dictionary of strings to use for stacking.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingInfo(signatureData: any, title?: string) {\n    if (signatureData) {\n      let stack = <IManualStackingInfo>{\n        signature_data: signatureData\n      };\n      if (title) {\n        stack.title = title;\n      }\n      this.setProperty('@stack', stack);\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting the stacking key.\n   * @param manualStackingKey The manual stacking key.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingKey(manualStackingKey: string, title?: string): EventBuilder {\n    if (manualStackingKey) {\n      let data = {\n        'ManualStackingKey': manualStackingKey\n      };\n      this.setManualStackingInfo(data, title);\n    }\n\n    return this;\n  }\n\n  public setValue(value: number): EventBuilder {\n    if (!!value) {\n      this.target.value = value;\n    }\n\n    return this;\n  }\n\n  public addTags(...tags: string[]): EventBuilder {\n    this.target.tags = Utils.addRange<string>(this.target.tags, ...tags);\n    return this;\n  }\n\n  /**\n   * Adds the object to extended data. Uses @excludedPropertyNames\n   * to exclude data from being included in the event.\n   * @param name The data object to add.\n   * @param value The name of the object to add.\n   * @param maxDepth The max depth of the object to include.\n   * @param excludedPropertyNames Any property names that should be excluded.\n   */\n  public setProperty(name: string, value: any, maxDepth?: number, excludedPropertyNames?: string[]): EventBuilder {\n    if (!name || (value === undefined || value == null)) {\n      return this;\n    }\n\n    if (!this.target.data) {\n      this.target.data = {};\n    }\n\n    let result = JSON.parse(Utils.stringify(value, this.client.config.dataExclusions.concat(excludedPropertyNames || []), maxDepth));\n    if (!Utils.isEmpty(result)) {\n      this.target.data[name] = result;\n    }\n\n    return this;\n  }\n\n  public markAsCritical(critical: boolean): EventBuilder {\n    if (critical) {\n      this.addTags('Critical');\n    }\n\n    return this;\n  }\n\n  public addRequestInfo(request: Object): EventBuilder {\n    if (!!request) {\n      this.pluginContextData['@request'] = request;\n    }\n\n    return this;\n  }\n\n  public submit(callback?: (context: EventPluginContext) => void): void {\n    this.client.submitEvent(this.target, this.pluginContextData, callback);\n  }\n\n  private isValidIdentifier(value: string): boolean {\n    if (!value) {\n      return true;\n    }\n\n    if (value.length < 8 || value.length > 100) {\n      return false;\n    }\n\n    for (let index = 0; index < value.length; index++) {\n      let code = value.charCodeAt(index);\n      let isDigit = (code >= 48) && (code <= 57);\n      let isLetter = ((code >= 65) && (code <= 90)) || ((code >= 97) && (code <= 122));\n      let isMinus = code === 45;\n\n      if (!(isDigit || isLetter) && !isMinus) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n}\n\nexport interface IUserDescription {\n  email_address?: string;\n  description?: string;\n  data?: any;\n}\n\nexport class ContextData {\n  public setException(exception: Error): void {\n    if (exception) {\n      this['@@_Exception'] = exception;\n    }\n  }\n\n  public get hasException(): boolean {\n    return !!this['@@_Exception'];\n  }\n\n  public getException(): Error {\n    return this['@@_Exception'] || null;\n  }\n\n  public markAsUnhandledError(): void {\n    this['@@_IsUnhandledError'] = true;\n  }\n\n  public get isUnhandledError(): boolean {\n    return !!this['@@_IsUnhandledError'];\n  }\n\n  public setSubmissionMethod(method: string): void {\n    if (method) {\n      this['@@_SubmissionMethod'] = method;\n    }\n  }\n\n  public getSubmissionMethod(): string {\n    return this['@@_SubmissionMethod'] || null;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          \n\nexport class ExceptionlessClient {\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   * @private\n   */\n  private static _instance: ExceptionlessClient = null;\n\n  public config: Configuration;\n\n  private _intervalId: any;\n  private _timeoutId: any;\n\n  constructor();\n  constructor(settings: IConfigurationSettings);\n  constructor(apiKey: string, serverUrl?: string);\n  constructor(settingsOrApiKey?: IConfigurationSettings | string, serverUrl?: string) {\n    if (typeof settingsOrApiKey === 'object') {\n      this.config = new Configuration(settingsOrApiKey);\n    } else {\n      this.config = new Configuration({ apiKey: <string>settingsOrApiKey, serverUrl: serverUrl });\n    }\n\n    this.updateSettingsTimer(5000);\n    this.config.onChanged((config) => this.updateSettingsTimer(this._timeoutId > 0 ? 5000 : 0));\n    this.config.queue.onEventsPosted((events, response) =>  this.updateSettingsTimer());\n  }\n\n  public createException(exception: Error): EventBuilder {\n    let pluginContextData = new ContextData();\n    pluginContextData.setException(exception);\n    return this.createEvent(pluginContextData).setType('error');\n  }\n\n  public submitException(exception: Error, callback?: (context: EventPluginContext) => void): void {\n    this.createException(exception).submit(callback);\n  }\n\n  public createUnhandledException(exception: Error, submissionMethod?: string): EventBuilder {\n    let builder = this.createException(exception);\n    builder.pluginContextData.markAsUnhandledError();\n    builder.pluginContextData.setSubmissionMethod(submissionMethod);\n\n    return builder;\n  }\n\n  public submitUnhandledException(exception: Error, submissionMethod?: string, callback?: (context: EventPluginContext) => void) {\n    this.createUnhandledException(exception, submissionMethod).submit(callback);\n  }\n\n  public createFeatureUsage(feature: string): EventBuilder {\n    return this.createEvent().setType('usage').setSource(feature);\n  }\n\n  public submitFeatureUsage(feature: string, callback?: (context: EventPluginContext) => void): void {\n    this.createFeatureUsage(feature).submit(callback);\n  }\n\n  public createLog(message: string): EventBuilder;\n  public createLog(source: string, message: string): EventBuilder;\n  public createLog(source: string, message: string, level: string): EventBuilder;\n  public createLog(sourceOrMessage: string, message?: string, level?: string): EventBuilder {\n    let builder = this.createEvent().setType('log');\n\n    if (message && level) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message).setProperty('@level', level);\n    } else if (message) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message);\n    } else {\n      // TODO: Look into using https: //www.stevefenton.co.uk/Content/Blog/Date/201304/Blog/Obtaining-A-Class-Name-At-Runtime-In-TypeScript/\n      let caller: any = arguments.callee.caller;\n      builder = builder.setSource(caller && caller.name).setMessage(sourceOrMessage);\n    }\n\n    return builder;\n  }\n\n  public submitLog(message: string): void;\n  public submitLog(source: string, message: string): void;\n  public submitLog(source: string, message: string, level: string, callback?: (context: EventPluginContext) => void): void;\n  public submitLog(sourceOrMessage: string, message?: string, level?: string, callback?: (context: EventPluginContext) => void): void {\n    this.createLog(sourceOrMessage, message, level).submit(callback);\n  }\n\n  public createNotFound(resource: string): EventBuilder {\n    return this.createEvent().setType('404').setSource(resource);\n  }\n\n  public submitNotFound(resource: string, callback?: (context: EventPluginContext) => void): void {\n    this.createNotFound(resource).submit(callback);\n  }\n\n  public createSessionStart(): EventBuilder {\n    return this.createEvent().setType('session');\n  }\n\n  public submitSessionStart(callback?: (context: EventPluginContext) => void): void {\n    this.createSessionStart().submit(callback);\n  }\n\n  public submitSessionEnd(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session end: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, true, this.config);\n    }\n  }\n\n  public submitSessionHeartbeat(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session heartbeat: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, false, this.config);\n    }\n  }\n\n  public createEvent(pluginContextData?: ContextData): EventBuilder {\n    return new EventBuilder({ date: new Date() }, this, pluginContextData);\n  }\n\n  /**\n   * Submits the event to be sent to the server.\n   * @param event The event data.\n   * @param pluginContextData Any contextual data objects to be used by Exceptionless plugins to gather default information for inclusion in the report information.\n   * @param callback\n   */\n  public submitEvent(event: IEvent, pluginContextData?: ContextData, callback?: (context: EventPluginContext) => void): void {\n    function cancelled(context: EventPluginContext) {\n      if (!!context) {\n        context.cancelled = true;\n      }\n\n      return !!callback && callback(context);\n    }\n\n    let context = new EventPluginContext(this, event, pluginContextData);\n    if (!event) {\n      return cancelled(context);\n    }\n\n    if (!this.config.enabled) {\n      this.config.log.info('Event submission is currently disabled.');\n      return cancelled(context);\n    }\n\n    if (!event.data) {\n      event.data = {};\n    }\n\n    if (!event.tags || !event.tags.length) {\n      event.tags = [];\n    }\n\n    EventPluginManager.run(context, function (ctx: EventPluginContext) {\n      let config = ctx.client.config;\n      let ev = ctx.event;\n\n      if (!ctx.cancelled) {\n        // ensure all required data\n        if (!ev.type || ev.type.length === 0) {\n          ev.type = 'log';\n        }\n\n        if (!ev.date) {\n          ev.date = new Date();\n        }\n\n        config.queue.enqueue(ev);\n\n        if (ev.reference_id && ev.reference_id.length > 0) {\n          ctx.log.info(`Setting last reference id '${ev.reference_id}'`);\n          config.lastReferenceIdManager.setLast(ev.reference_id);\n        }\n      }\n\n      !!callback && callback(ctx);\n    });\n  }\n\n  /**\n   * Updates the user's email address and description of an event for the specified reference id.\n   * @param referenceId The reference id of the event to update.\n   * @param email The user's email address to set on the event.\n   * @param description The user's description of the event.\n   * @param callback The submission response.\n   */\n  public updateUserEmailAndDescription(referenceId: string, email: string, description: string, callback?: (response: SubmissionResponse) => void) {\n    if (!referenceId || !email || !description || !this.config.enabled) {\n      return !!callback && callback(new SubmissionResponse(500, 'cancelled'));\n    }\n\n    let userDescription: IUserDescription = { email_address: email, description: description };\n    this.config.submissionClient.postUserDescription(referenceId, userDescription, this.config, (response: SubmissionResponse) => {\n      if (!response.success) {\n        this.config.log.error(`Failed to submit user email and description for event '${referenceId}': ${response.statusCode} ${response.message}`);\n      }\n\n      !!callback && callback(response);\n    });\n  }\n\n  /**\n   * Gets the last event client id that was submitted to the server.\n   * @returns {string} The event client id.\n   */\n  public getLastReferenceId(): string {\n    return this.config.lastReferenceIdManager.getLast();\n  }\n\n  private updateSettingsTimer(initialDelay?: number) {\n    this.config.log.info(`Updating settings timer with delay: ${initialDelay}`);\n\n    this._timeoutId = clearTimeout(this._timeoutId);\n    this._timeoutId = clearInterval(this._intervalId);\n\n    let interval = this.config.updateSettingsWhenIdleInterval;\n    if (interval > 0) {\n      let updateSettings = () => SettingsManager.updateSettings(this.config);\n      if (initialDelay > 0) {\n        this._timeoutId = setTimeout(updateSettings, initialDelay);\n      }\n\n      this._intervalId = setInterval(updateSettings, interval);\n    }\n  }\n\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   */\n  public static get default() {\n    if (ExceptionlessClient._instance === null) {\n      ExceptionlessClient._instance = new ExceptionlessClient(null);\n    }\n\n    return ExceptionlessClient._instance;\n  }\n}\n\nexport interface IManualStackingInfo {\n  title?: string;\n  signature_data?: any;\n}\n\nexport interface IModule {\n  data?: any;\n\n  module_id?: number;\n  name?: string;\n  version?: string;\n  is_entry?: boolean;\n  created_date?: Date;\n  modified_date?: Date;\n}\n\nexport interface IRequestInfo {\n  user_agent?: string;\n  http_method?: string;\n  is_secure?: boolean;\n  host?: string;\n  port?: number;\n  path?: string;\n  referrer?: string;\n  client_ip_address?: string;\n  cookies?: any;\n  post_data?: any;\n  query_string?: any;\n  data?: any;\n}\n\nexport interface IEnvironmentInfo {\n  processor_count?: number;\n  total_physical_memory?: number;\n  available_physical_memory?: number;\n  command_line?: string;\n  process_name?: string;\n  process_id?: string;\n  process_memory_size?: number;\n  thread_id?: string;\n  architecture?: string;\n  o_s_name?: string;\n  o_s_version?: string;\n  ip_address?: string;\n  machine_name?: string;\n  install_id?: string;\n  runtime_version?: string;\n  data?: any;\n}\n\nexport interface IParameter {\n  data?: any;\n  generic_arguments?: string[];\n\n  name?: string;\n  type?: string;\n  type_namespace?: string;\n}\n\n                                          \n\nexport interface IMethod {\n  data?: any;\n  generic_arguments?: string[];\n  parameters?: IParameter[];\n\n  is_signature_target?: boolean;\n  declaring_namespace?: string;\n  declaring_type?: string;\n  name?: string;\n  module_id?: number;\n}\n\n                                    \n\nexport interface IStackFrame extends IMethod {\n  file_name?: string;\n  line_number?: number;\n  column?: number;\n}\n\n                                                                                 \n\nexport interface IInnerError {\n  message?: string;\n  type?: string;\n  code?: string;\n  data?: any;\n  inner?: IInnerError;\n  stack_trace?: IStackFrame[];\n  target_method?: IMethod;\n}\n\n                                                                                                                                                \n\nexport class ConfigurationDefaultsPlugin implements IEventPlugin {\n  public priority: number = 10;\n  public name: string = 'ConfigurationDefaultsPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let config = context.client.config;\n    let defaultTags: string[] = config.defaultTags || [];\n    for (let index = 0; index < defaultTags.length; index++) {\n      let tag = defaultTags[index];\n      if (!!tag && context.event.tags.indexOf(tag) < 0) {\n        context.event.tags.push(tag);\n      }\n    }\n\n    let defaultData: Object = config.defaultData || {};\n    for (let key in defaultData) {\n      if (!!defaultData[key]) {\n        let result = JSON.parse(Utils.stringify(defaultData[key], config.dataExclusions));\n        if (!Utils.isEmpty(result)) {\n          context.event.data[key] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ErrorPlugin implements IEventPlugin {\n  public priority: number = 30;\n  public name: string = 'ErrorPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n    let ignoredProperties: string[] = [\n      'arguments',\n      'column',\n      'columnNumber',\n      'description',\n      'fileName',\n      'message',\n      'name',\n      'number',\n      'line',\n      'lineNumber',\n      'opera#sourceloc',\n      'sourceId',\n      'sourceURL',\n      'stack',\n      'stackArray',\n      'stacktrace'\n    ];\n\n    let exception = context.contextData.getException();\n    if (!!exception) {\n      context.event.type = 'error';\n\n      if (!context.event.data[ERROR_KEY]) {\n        let config = context.client.config;\n        let parser = config.errorParser;\n        if (!parser) {\n          throw new Error('No error parser was defined.');\n        }\n\n        let result = parser.parse(context, exception);\n        if (!!result) {\n          let additionalData = JSON.parse(Utils.stringify(exception, config.dataExclusions.concat(ignoredProperties)));\n          if (!Utils.isEmpty(additionalData)) {\n            if (!result.data) {\n              result.data = {};\n            }\n            result.data['@ext'] = additionalData;\n          }\n\n          context.event.data[ERROR_KEY] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                           \n\nexport class ModuleInfoPlugin implements IEventPlugin {\n  public priority: number = 50;\n  public name: string = 'ModuleInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n\n    let collector = context.client.config.moduleCollector;\n    if (context.event.data[ERROR_KEY] && !context.event.data['@error'].modules && !!collector) {\n      let modules: IModule[] = collector.getModules(context);\n      if (modules && modules.length > 0) {\n        context.event.data[ERROR_KEY].modules = modules;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                          \n\nexport class RequestInfoPlugin implements IEventPlugin {\n  public priority: number = 70;\n  public name: string = 'RequestInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const REQUEST_KEY: string = '@request'; // optimization for minifier.\n\n    let config = context.client.config;\n    let collector = config.requestInfoCollector;\n    if (!context.event.data[REQUEST_KEY] && !!collector) {\n      let requestInfo: IRequestInfo = collector.getRequestInfo(context);\n      if (!!requestInfo) {\n        if (Utils.isMatch(requestInfo.user_agent, config.userAgentBotPatterns)) {\n          context.log.info('Cancelling event as the request user agent matches a known bot pattern');\n          context.cancelled = true;\n        } else {\n          context.event.data[REQUEST_KEY] = requestInfo;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                             \n\nexport class EnvironmentInfoPlugin implements IEventPlugin {\n  public priority: number = 80;\n  public name: string = 'EnvironmentInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ENVIRONMENT_KEY: string = '@environment'; // optimization for minifier.\n\n    let collector = context.client.config.environmentInfoCollector;\n    if (!context.event.data[ENVIRONMENT_KEY] && collector) {\n      let environmentInfo: IEnvironmentInfo = collector.getEnvironmentInfo(context);\n      if (!!environmentInfo) {\n        context.event.data[ENVIRONMENT_KEY] = environmentInfo;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                           \n\nexport class SubmissionMethodPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'SubmissionMethodPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let submissionMethod: string = context.contextData.getSubmissionMethod();\n    if (!!submissionMethod) {\n      context.event.data['@submission_method'] = submissionMethod;\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                   \n\nexport class DuplicateCheckerPlugin implements IEventPlugin {\n  public priority: number = 40;\n  public name: string = 'DuplicateCheckerPlugin';\n\n  private _processedHashcodes: TimestampedHash[] = [];\n  private _getCurrentTime: () => number;\n\n  constructor(getCurrentTime: () => number = () => Date.now()) {\n    this._getCurrentTime = getCurrentTime;\n  }\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function isDuplicate(error: IInnerError, processedHashcodes, now, log: ILog): boolean {\n      while (error) {\n        let hashCode = Utils.getHashCode(error.stack_trace && JSON.stringify(error.stack_trace));\n\n        // Only process the unique errors times within a 2 second window.\n        if (hashCode && processedHashcodes.some(h => h.hash === hashCode && h.timestamp >= (now - 2000))) {\n          log.info(`Ignoring duplicate error event hash: ${hashCode}`);\n          return true;\n        }\n\n        // Add this exception to our list of recent processed errors.\n        processedHashcodes.push({ hash: hashCode, timestamp: now });\n\n        // Only keep the last 20 recent errors.\n        while (processedHashcodes.length > 20) {\n          processedHashcodes.shift();\n        }\n\n        error = error.inner;\n      }\n\n      return false;\n    }\n\n    if (context.event.type === 'error') {\n      if (isDuplicate(context.event.data['@error'], this._processedHashcodes, this._getCurrentTime(), context.log)) {\n        context.cancelled = true;\n        return;\n      }\n    }\n\n    next && next();\n  }\n}\n\ninterface TimestampedHash {\n  hash: number;\n  timestamp: number;\n}\n\n                                                                                                                                                                                                        \n\nexport class EventExclusionPlugin implements IEventPlugin {\n  public priority: number = 45;\n  public name: string = 'EventExclusionPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function getLogLevel(level: string): number {\n      switch ((level || '').toLowerCase().trim()) {\n        case 'trace':\n        case 'true':\n        case '1':\n        case 'yes':\n          return 0;\n        case 'debug':\n          return 1;\n        case 'info':\n          return 2;\n        case 'warn':\n          return 3;\n        case 'error':\n          return 4;\n        case 'fatal':\n          return 5;\n        case 'off':\n        case 'false':\n        case '0':\n        case 'no':\n          return 6;\n        default:\n          return -1;\n      }\n    }\n\n    function getMinLogLevel(settings: Object, loggerName: string = '*'): number {\n      return getLogLevel(getTypeAndSourceSetting(settings, 'log', loggerName, 'Trace') + '');\n    }\n\n    function getTypeAndSourceSetting(settings: Object = {}, type: string, source: string, defaultValue: string|boolean = undefined): string|boolean {\n      if (!type) {\n        return defaultValue;\n      }\n\n      let isLog = type === 'log';\n      let sourcePrefix =  `@@${type}:`;\n\n      let value = settings[sourcePrefix + source];\n      if (value) {\n        return !isLog ? Utils.toBoolean(value) : value;\n      }\n\n      // check for wildcard match\n      for (let key in settings) {\n        if (Utils.startsWith(key.toLowerCase(), sourcePrefix.toLowerCase()) && Utils.isMatch(source, [key.substring(sourcePrefix.length)])) {\n          return !isLog ? Utils.toBoolean(settings[key]) : settings[key];\n        }\n      }\n\n      return defaultValue;\n    }\n\n    let ev = context.event;\n    let log = context.log;\n    let settings = context.client.config.settings;\n\n    if (ev.type === 'log') {\n      let minLogLevel = getMinLogLevel(settings, ev.source);\n      let logLevel = getLogLevel(ev.data['@level']);\n\n      if (logLevel >= 0 && (logLevel > 5 || logLevel < minLogLevel)) {\n        log.info('Cancelling log event due to minimum log level.');\n        context.cancelled = true;\n      }\n    } else if (ev.type === 'error') {\n      let error: IInnerError = ev.data['@error'];\n      while (!context.cancelled && error) {\n        if (getTypeAndSourceSetting(settings, ev.type, error.type, true) === false) {\n          log.info(`Cancelling error from excluded exception type: ${error.type}`);\n          context.cancelled = true;\n        }\n\n        error = error.inner;\n      }\n    } else if (getTypeAndSourceSetting(settings, ev.type, ev.source, true) === false) {\n      log.info(`Cancelling event from excluded type: ${ev.type} and source: ${ev.source}`);\n      context.cancelled = true;\n    }\n\n    next && next();\n  }\n}\n\nexport class SettingsResponse {\n  public success: boolean = false;\n  public settings: any;\n  public settingsVersion: number = -1;\n  public message: string;\n  public exception: any;\n\n  constructor(success: boolean, settings: any, settingsVersion: number = -1, exception: any = null, message: string = null) {\n    this.success = success;\n    this.settings = settings;\n    this.settingsVersion = settingsVersion;\n    this.exception = exception;\n    this.message = message;\n  }\n}\n\n                                                                                 \n\nexport interface IError extends IInnerError {\n  modules?: IModule[];\n}\n\nexport interface IStorageItem {\n  timestamp: number;\n  value: any;\n}\n\n                                              \n\nexport interface IStorage {\n  save(value: any): number;\n  get(limit?: number): IStorageItem[];\n  remove(timestamp: number): void;\n  clear(): void;\n}\n\nexport interface SubmissionCallback {\n  (status: number, message: string, data?: string, headers?: Object): void;\n}\n\nexport interface SubmissionRequest {\n  apiKey: string;\n  userAgent: string;\n  method: string;\n  url: string;\n  data: string;\n}\n\n                                                                                     \n\nexport class InMemoryStorage implements IStorage {\n  private maxItems: number;\n  private items: IStorageItem[] = [];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems: number) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any): number {\n    if (!value) {\n      return null;\n    }\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let item = { timestamp, value };\n\n    if (items.push(item) > this.maxItems) {\n      items.shift();\n    }\n\n    this.lastTimestamp = timestamp;\n    return item.timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    return this.items.slice(0, limit);\n  }\n\n  public remove(timestamp: number): void {\n    let items = this.items;\n    for (let i = 0; i < items.length; i++) {\n      if (items[i].timestamp === timestamp) {\n        items.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n  public clear(): void {\n    this.items = [];\n  }\n}\n\nexport interface IClientConfiguration {\n  settings: Object;\n  version: number;\n}\n\n                                                                                     \n\nexport abstract class KeyValueStorageBase implements IStorage {\n  private maxItems: number;\n  private items: number[];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any, single?: boolean): number {\n    if (!value) {\n      return null;\n    }\n\n    this.ensureIndex();\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let key = this.getKey(timestamp);\n    let json = JSON.stringify(value);\n\n    try {\n      this.write(key, json);\n      this.lastTimestamp = timestamp;\n      if (items.push(timestamp) > this.maxItems) {\n        this.delete(this.getKey(items.shift()));\n      }\n    } catch (e) {\n      return null;\n    }\n\n    return timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    this.ensureIndex();\n\n    return this.items.slice(0, limit)\n      .map(timestamp => {\n        // Read and parse item for this timestamp\n        let key = this.getKey(timestamp);\n        try {\n          let json = this.read(key);\n          let value = JSON.parse(json, parseDate);\n          return { timestamp, value };\n        } catch (error) {\n          // Something went wrong - try to delete the cause.\n          this.safeDelete(key);\n          return null;\n        }\n      })\n      .filter(item => item != null);\n  }\n\n  public remove(timestamp: number): void {\n    this.ensureIndex();\n\n    let items = this.items;\n    let index = items.indexOf(timestamp);\n    if (index >= 0) {\n      let key = this.getKey(timestamp);\n      this.safeDelete(key);\n      items.splice(index, 1);\n    };\n  }\n\n  public clear(): void {\n    this.items.forEach(item => this.safeDelete(this.getKey(item)));\n    this.items = [];\n  }\n\n  protected abstract write(key: string, value: string): void;\n  protected abstract read(key: string): string;\n  protected abstract readAllKeys(): string[];\n  protected abstract delete(key: string);\n  protected abstract getKey(timestamp: number): string;\n  protected abstract getTimestamp(key: string): number;\n\n  private ensureIndex() {\n    if (!this.items) {\n      this.items = this.createIndex();\n      this.lastTimestamp = Math.max(0, ...this.items) + 1;\n    }\n  }\n\n  private safeDelete(key: string): void {\n    try {\n      this.delete(key);\n    } catch (error) {\n    }\n  }\n\n  private createIndex() {\n    try {\n      let keys = this.readAllKeys();\n      return keys.map(key => {\n        try {\n          let timestamp = this.getTimestamp(key);\n          if (!timestamp) {\n            this.safeDelete(key);\n            return null;\n          }\n          return timestamp;\n        } catch (error) {\n          this.safeDelete(key);\n          return null;\n        }\n      }).filter(timestamp => timestamp != null)\n        .sort((a, b) => a - b);\n    } catch (error) {\n      return [];\n    }\n  }\n}\n\nfunction parseDate(key, value) {\n  let dateRegx = /\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/g;\n  if (typeof value === 'string') {\n    let a = dateRegx.exec(value);\n    if (a) {\n      return new Date(value);\n    }\n  }\n  return value;\n};\n\n                                                            \n\nexport class BrowserStorage extends KeyValueStorageBase {\n  private prefix: string;\n\n  public static isAvailable(): boolean {\n    try {\n      let storage = window.localStorage,\n        x = '__storage_test__';\n      storage.setItem(x, x);\n      storage.removeItem(x);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  constructor(namespace: string, prefix: string = 'com.exceptionless.', maxItems: number = 20) {\n    super(maxItems);\n\n    this.prefix = prefix + namespace + '-';\n  }\n\n  public write(key: string, value: string) {\n    window.localStorage.setItem(key, value);\n  }\n\n  public read(key: string) {\n    return window.localStorage.getItem(key);\n  }\n\n  public readAllKeys() {\n    return Object.keys(window.localStorage)\n      .filter(key => key.indexOf(this.prefix) === 0);\n  }\n\n  public delete(key: string) {\n    window.localStorage.removeItem(key);\n  }\n\n  public getKey(timestamp) {\n    return this.prefix + timestamp;\n  }\n\n  public getTimestamp(key) {\n    return parseInt(key.substr(this.prefix.length), 10);\n  }\n}\n\n                                                                                                                                                                                                                                                                                                           \n\nexport class DefaultErrorParser implements IErrorParser {\n  public parse(context: EventPluginContext, exception: Error): IError {\n    function getParameters(parameters: string | string[]): IParameter[] {\n      let params: string[] = (typeof parameters === 'string' ? [parameters] : parameters) || [];\n\n      let result: IParameter[] = [];\n      for (let index = 0; index < params.length; index++) {\n        result.push({ name: params[index] });\n      }\n\n      return result;\n    }\n\n    function getStackFrames(stackFrames: TraceKit.StackFrame[]): IStackFrame[] {\n      const ANONYMOUS: string = '<anonymous>';\n      let frames: IStackFrame[] = [];\n\n      for (let index = 0; index < stackFrames.length; index++) {\n        let frame = stackFrames[index];\n        frames.push({\n          name: (frame.func || ANONYMOUS).replace('?', ANONYMOUS),\n          parameters: getParameters(frame.args),\n          file_name: frame.url,\n          line_number: frame.line || 0,\n          column: frame.column || 0\n        });\n      }\n\n      return frames;\n    }\n\n    const TRACEKIT_STACK_TRACE_KEY: string = '@@_TraceKit.StackTrace'; // optimization for minifier.\n\n    let stackTrace: TraceKit.StackTrace = !!context.contextData[TRACEKIT_STACK_TRACE_KEY]\n      ? context.contextData[TRACEKIT_STACK_TRACE_KEY]\n      : TraceKit.computeStackTrace(exception, 25);\n\n    if (!stackTrace) {\n      throw new Error('Unable to parse the exceptions stack trace.');\n    }\n\n    return {\n      type: stackTrace.name,\n      message: stackTrace.message || exception.message,\n      stack_trace: getStackFrames(stackTrace.stack || [])\n    };\n  }\n}\n\n                                                                                                                                                                                                         \n\nexport class DefaultModuleCollector implements IModuleCollector {\n  public getModules(context: EventPluginContext): IModule[] {\n    if (document && document.getElementsByTagName) {\n      return null;\n    }\n\n    let modules: IModule[] = [];\n    let scripts: NodeListOf<HTMLScriptElement> = document.getElementsByTagName('script');\n    if (scripts && scripts.length > 0) {\n      for (let index = 0; index < scripts.length; index++) {\n        if (scripts[index].src) {\n          modules.push({\n            module_id: index,\n            name: scripts[index].src,\n            version: Utils.parseVersion(scripts[index].src)\n          });\n        } else if (!!scripts[index].innerHTML) {\n          modules.push({\n            module_id: index,\n            name: 'Script Tag',\n            version: Utils.getHashCode(scripts[index].innerHTML).toString()\n          });\n        }\n      }\n    }\n\n    return modules;\n  }\n}\n\n                                                                                                                                                                                                                             \n\nexport class DefaultRequestInfoCollector implements IRequestInfoCollector {\n  public getRequestInfo(context: EventPluginContext): IRequestInfo {\n    if (!document || !navigator || !location) {\n      return null;\n    }\n\n    let exclusions = context.client.config.dataExclusions;\n    let requestInfo: IRequestInfo = {\n      user_agent: navigator.userAgent,\n      is_secure: location.protocol === 'https:',\n      host: location.hostname,\n      port: location.port && location.port !== '' ? parseInt(location.port, 10) : 80,\n      path: location.pathname,\n      // client_ip_address: 'TODO',\n      cookies: Utils.getCookies(document.cookie, exclusions),\n      query_string: Utils.parseQueryString(location.search.substring(1), exclusions)\n    };\n\n    if (document.referrer && document.referrer !== '') {\n      requestInfo.referrer = document.referrer;\n    }\n\n    return requestInfo;\n  }\n}\n\n                                                                                                                                                                              \n\ndeclare var XDomainRequest: { new (); create(); };\n\nexport class DefaultSubmissionAdapter implements ISubmissionAdapter {\n  public sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean) {\n    // TODO: Handle sending events when app is exiting with send beacon.\n    const TIMEOUT: string = 'timeout';  // optimization for minifier.\n    const LOADED: string = 'loaded';  // optimization for minifier.\n    const WITH_CREDENTIALS: string = 'withCredentials';  // optimization for minifier.\n\n    let isCompleted: boolean = false;\n    let useSetTimeout: boolean = false;\n    function complete(mode: string, xhr: XMLHttpRequest) {\n      function parseResponseHeaders(headerStr) {\n        function trim(value) {\n          return value.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n        }\n\n        let headers = {};\n        let headerPairs = (headerStr || '').split('\\u000d\\u000a');\n        for (let index: number = 0; index < headerPairs.length; index++) {\n          let headerPair = headerPairs[index];\n          // Can't use split() here because it does the wrong thing\n          // if the header value has the string \": \" in it.\n          let separator = headerPair.indexOf('\\u003a\\u0020');\n          if (separator > 0) {\n            headers[trim(headerPair.substring(0, separator).toLowerCase())] = headerPair.substring(separator + 2);\n          }\n        }\n\n        return headers;\n      }\n\n      if (isCompleted) {\n        return;\n      }\n\n      isCompleted = true;\n\n      let message: string = xhr.statusText;\n      let responseText: string = xhr.responseText;\n      let status: number = xhr.status;\n\n      if (mode === TIMEOUT || status === 0) {\n        message = 'Unable to connect to server.';\n        status = 0;\n      } else if (mode === LOADED && !status) {\n        status = request.method === 'POST' ? 202 : 200;\n      } else if (status < 200 || status > 299) {\n        let responseBody: any = xhr.responseBody;\n        if (!!responseBody && !!responseBody.message) {\n          message = responseBody.message;\n        } else if (!!responseText && responseText.indexOf('message') !== -1) {\n          try {\n            message = JSON.parse(responseText).message;\n          } catch (e) {\n            message = responseText;\n          }\n        }\n      }\n\n      callback && callback(status || 500, message || '', responseText, parseResponseHeaders(xhr.getAllResponseHeaders && xhr.getAllResponseHeaders()));\n    }\n\n    function createRequest(userAgent: string, method: string, url: string): XMLHttpRequest {\n      let xhr: any = new XMLHttpRequest();\n      if (WITH_CREDENTIALS in xhr) {\n        xhr.open(method, url, true);\n\n        xhr.setRequestHeader('X-Exceptionless-Client', userAgent);\n        if (method === 'POST') {\n          xhr.setRequestHeader('Content-Type', 'application/json');\n        }\n      } else if (typeof XDomainRequest !== 'undefined') {\n        useSetTimeout = true;\n        xhr = new XDomainRequest();\n        xhr.open(method, location.protocol === 'http:' ? url.replace('https:', 'http:') : url);\n      } else {\n        xhr = null;\n      }\n\n      if (xhr) {\n        xhr.timeout = 10000;\n      }\n\n      return xhr;\n    }\n\n    let url = `${request.url}${(request.url.indexOf('?') === -1 ? '?' : '&')}access_token=${encodeURIComponent(request.apiKey)}`;\n    let xhr = createRequest(request.userAgent, request.method || 'POST', url);\n    if (!xhr) {\n      return (callback && callback(503, 'CORS not supported.'));\n    }\n\n    if (WITH_CREDENTIALS in xhr) {\n      xhr.onreadystatechange = () => {\n        // xhr not ready.\n        if (xhr.readyState !== 4) {\n          return;\n        }\n\n        complete(LOADED, xhr);\n      };\n    }\n\n    xhr.onprogress = () => { };\n    xhr.ontimeout = () => complete(TIMEOUT, xhr);\n    xhr.onerror = () => complete('error', xhr);\n    xhr.onload = () => complete(LOADED, xhr);\n\n    if (useSetTimeout) {\n      setTimeout(() => xhr.send(request.data), 500);\n    } else {\n      xhr.send(request.data);\n    }\n  }\n}\n\n                                                                                                                                                \n\nexport class BrowserStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(prefix?: string, maxQueueItems: number = 250) {\n    this.queue = new BrowserStorage('q', prefix, maxQueueItems);\n    this.settings = new BrowserStorage('settings', prefix, 1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    \n\nfunction getDefaultsSettingsFromScriptTag(): IConfigurationSettings {\n  if (!document || !document.getElementsByTagName) {\n    return null;\n  }\n\n  let scripts = document.getElementsByTagName('script');\n  for (let index = 0; index < scripts.length; index++) {\n    if (scripts[index].src && scripts[index].src.indexOf('/exceptionless') > -1) {\n      return Utils.parseQueryString(scripts[index].src.split('?').pop());\n    }\n  }\n  return null;\n}\n\nfunction processUnhandledException(stackTrace: TraceKit.StackTrace, options?: any): void {\n  let builder = ExceptionlessClient.default.createUnhandledException(new Error(stackTrace.message || (options || {}).status || 'Script error'), 'onerror');\n  builder.pluginContextData['@@_TraceKit.StackTrace'] = stackTrace;\n  builder.submit();\n}\n\n/*\nTODO: We currently are unable to parse string exceptions.\nfunction processJQueryAjaxError(event, xhr, settings, error:string): void {\n  let client = ExceptionlessClient.default;\n  if (xhr.status === 404) {\n    client.submitNotFound(settings.url);\n  } else if (xhr.status !== 401) {\n    client.createUnhandledException(error, 'JQuery.ajaxError')\n      .setSource(settings.url)\n      .setProperty('status', xhr.status)\n      .setProperty('request', settings.data)\n      .setProperty('response', xhr.responseText && xhr.responseText.slice && xhr.responseText.slice(0, 1024))\n      .submit();\n  }\n}\n*/\n\nConfiguration.prototype.useLocalStorage = function() {\n  if (BrowserStorage.isAvailable()) {\n    this.storage = new BrowserStorageProvider();\n    SettingsManager.applySavedServerSettings(this);\n    this.changed();\n  }\n};\n\nlet defaults = Configuration.defaults;\nlet settings = getDefaultsSettingsFromScriptTag();\nif (settings && (settings.apiKey || settings.serverUrl)) {\n  defaults.apiKey = settings.apiKey;\n  defaults.serverUrl = settings.serverUrl;\n}\n\ndefaults.errorParser = new DefaultErrorParser();\ndefaults.moduleCollector = new DefaultModuleCollector();\ndefaults.requestInfoCollector = new DefaultRequestInfoCollector();\ndefaults.submissionAdapter = new DefaultSubmissionAdapter();\n\nTraceKit.report.subscribe(processUnhandledException);\nTraceKit.extendToAsynchronousCallbacks();\n\n// window && window.addEventListener && window.addEventListener('beforeunload', function () {\n//   ExceptionlessClient.default.config.queue.process(true);\n// });\n\n// if (typeof $ !== 'undefined' && $(document)) {\n//   $(document).ajaxError(processJQueryAjaxError);\n// }\n\n(<any>Error).stackTraceLimit = Infinity;\n\ndeclare var $;\n\n"],"sourceRoot":"/source/"}
\ No newline at end of file
diff --git a/dist/exceptionless.min.js b/dist/exceptionless.min.js
index aeefb04d..344a03ed 100644
--- a/dist/exceptionless.min.js
+++ b/dist/exceptionless.min.js
@@ -1,3 +1,3 @@
-!function(e,t){function n(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function r(e){return"undefined"==typeof e}if(e){var i={},o=e.TraceKit,s=[].slice,a="?";i.noConflict=function(){return e.TraceKit=o,i},i.wrap=function(e){function t(){try{return e.apply(this,arguments)}catch(t){throw i.report(t),t}}return t},i.report=function(){function t(e){u(),h.push(e)}function r(e){for(var t=h.length-1;t>=0;--t)h[t]===e&&h.splice(t,1)}function o(e,t){var r=null;if(!t||i.collectWindowErrors){for(var o in h)if(n(h,o))try{h[o].apply(null,[e].concat(s.call(arguments,2)))}catch(a){r=a}if(r)throw r}}function a(e,t,n,r,s){var a=null;if(v)i.computeStackTrace.augmentStackTraceWithInitialElement(v,t,n,e),c();else if(s)a=i.computeStackTrace(s),o(a,!0);else{var u={url:t,line:n,column:r};u.func=i.computeStackTrace.guessFunctionName(u.url,u.line),u.context=i.computeStackTrace.gatherContext(u.url,u.line),a={mode:"onerror",message:e,stack:[u]},o(a,!0)}return f?f.apply(this,arguments):!1}function u(){p!==!0&&(f=e.onerror,e.onerror=a,p=!0)}function c(){var e=v,t=d;d=null,v=null,g=null,o.apply(null,[e,!1].concat(t))}function l(t){if(v){if(g===t)return;c()}var n=i.computeStackTrace(t);throw v=n,g=t,d=s.call(arguments,1),e.setTimeout(function(){g===t&&c()},n.incomplete?2e3:0),t}var f,p,h=[],d=null,g=null,v=null;return l.subscribe=t,l.unsubscribe=r,l}(),i.computeStackTrace=function(){function t(t){if(!i.remoteFetching)return"";try{var n=function(){try{return new e.XMLHttpRequest}catch(t){return new e.ActiveXObject("Microsoft.XMLHTTP")}},r=n();return r.open("GET",t,!1),r.send(""),r.responseText}catch(o){return""}}function o(r){if("string"!=typeof r)return[];if(!n(w,r)){var i="",o="";try{o=e.document.domain}catch(s){}var a=/(.*)\:\/\/([^:\/]+)([:\d]*)\/{0,1}([\s\S]*)/.exec(r);a&&a[2]===o&&(i=t(r)),w[r]=i?i.split("\n"):[]}return w[r]}function s(e,t){var n,i=/function ([^(]*)\(([^)]*)\)/,s=/['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/,u="",c=10,l=o(e);if(!l.length)return a;for(var f=0;c>f;++f)if(u=l[t-f]+u,!r(u)){if(n=s.exec(u))return n[1];if(n=i.exec(u))return n[1]}return a}function u(e,t){var n=o(e);if(!n.length)return null;var s=[],a=Math.floor(i.linesOfContext/2),u=a+i.linesOfContext%2,c=Math.max(0,t-a-1),l=Math.min(n.length,t+u-1);t-=1;for(var f=c;l>f;++f)r(n[f])||s.push(n[f]);return s.length>0?s:null}function c(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g,"\\$&")}function l(e){return c(e).replace("<","(?:<|&lt;)").replace(">","(?:>|&gt;)").replace("&","(?:&|&amp;)").replace('"','(?:"|&quot;)').replace(/\s+/g,"\\s+")}function f(e,t){for(var n,r,i=0,s=t.length;s>i;++i)if((n=o(t[i])).length&&(n=n.join("\n"),r=e.exec(n)))return{url:t[i],line:n.substring(0,r.index).split("\n").length,column:r.index-n.lastIndexOf("\n",r.index)-1};return null}function p(e,t,n){var r,i=o(t),s=new RegExp("\\b"+c(e)+"\\b");return n-=1,i&&i.length>n&&(r=s.exec(i[n]))?r.index:null}function h(t){if(!r(e&&e.document)){for(var n,i,o,s,a=[e.location.href],u=e.document.getElementsByTagName("script"),p=""+t,h=/^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,d=/^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,g=0;g<u.length;++g){var v=u[g];v.src&&a.push(v.src)}if(o=h.exec(p)){var m=o[1]?"\\s+"+o[1]:"",y=o[2].split(",").join("\\s*,\\s*");n=c(o[3]).replace(/;$/,";?"),i=new RegExp("function"+m+"\\s*\\(\\s*"+y+"\\s*\\)\\s*{\\s*"+n+"\\s*}")}else i=new RegExp(c(p).replace(/\s+/g,"\\s+"));if(s=f(i,a))return s;if(o=d.exec(p)){var b=o[1];if(n=l(o[2]),i=new RegExp("on"+b+"=[\\'\"]\\s*"+n+"\\s*[\\'\"]","i"),s=f(i,a[0]))return s;if(i=new RegExp(n),s=f(i,a))return s}return null}}function d(e){if(!e.stack)return null;for(var t,n,i=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,o=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|\[native).*?)(?::(\d+))?(?::(\d+))?\s*$/i,c=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:ms-appx|https?|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,l=e.stack.split("\n"),f=[],h=/^(.*) is undefined$/.exec(e.message),d=0,g=l.length;g>d;++d){if(t=i.exec(l[d])){var v=t[2]&&-1!==t[2].indexOf("native");n={url:v?null:t[2],func:t[1]||a,args:v?[t[2]]:[],line:t[3]?+t[3]:null,column:t[4]?+t[4]:null}}else if(t=c.exec(l[d]))n={url:t[2],func:t[1]||a,args:[],line:+t[3],column:t[4]?+t[4]:null};else{if(!(t=o.exec(l[d])))continue;n={url:t[3],func:t[1]||a,args:t[2]?t[2].split(","):[],line:t[4]?+t[4]:null,column:t[5]?+t[5]:null}}!n.func&&n.line&&(n.func=s(n.url,n.line)),n.line&&(n.context=u(n.url,n.line)),f.push(n)}return f.length?(f[0]&&f[0].line&&!f[0].column&&h?f[0].column=p(h[1],f[0].url,f[0].line):f[0].column||r(e.columnNumber)||(f[0].column=e.columnNumber+1),{mode:"stack",name:e.name,message:e.message,stack:f}):null}function g(e){var t=e.stacktrace;if(t){for(var n,r=/ line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i,i=/ line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i,o=t.split("\n"),a=[],c=0;c<o.length;c+=2){var l=null;if((n=r.exec(o[c]))?l={url:n[2],line:+n[1],column:null,func:n[3],args:[]}:(n=i.exec(o[c]))&&(l={url:n[6],line:+n[1],column:+n[2],func:n[3]||n[4],args:n[5]?n[5].split(","):[]}),l){if(!l.func&&l.line&&(l.func=s(l.url,l.line)),l.line)try{l.context=u(l.url,l.line)}catch(f){}l.context||(l.context=[o[c+1]]),a.push(l)}}return a.length?{mode:"stacktrace",name:e.name,message:e.message,stack:a}:null}}function v(t){var r=t.message.split("\n");if(r.length<4)return null;var i,a=/^\s*Line (\d+) of linked script ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i,c=/^\s*Line (\d+) of inline#(\d+) script in ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i,p=/^\s*Line (\d+) of function script\s*$/i,h=[],d=e&&e.document&&e.document.getElementsByTagName("script"),g=[];for(var v in d)n(d,v)&&!d[v].src&&g.push(d[v]);for(var m=2;m<r.length;m+=2){var y=null;if(i=a.exec(r[m]))y={url:i[2],func:i[3],args:[],line:+i[1],column:null};else if(i=c.exec(r[m])){y={url:i[3],func:i[4],args:[],line:+i[1],column:null};var b=+i[1],S=g[i[2]-1];if(S){var x=o(y.url);if(x){x=x.join("\n");var w=x.indexOf(S.innerText);w>=0&&(y.line=b+x.substring(0,w).split("\n").length)}}}else if(i=p.exec(r[m])){var _=e.location.href.replace(/#.*$/,""),E=new RegExp(l(r[m+1])),I=f(E,[_]);y={url:_,func:"",args:[],line:I?I.line:i[1],column:null}}if(y){y.func||(y.func=s(y.url,y.line));var P=u(y.url,y.line),T=P?P[Math.floor(P.length/2)]:null;P&&T.replace(/^\s*/,"")===r[m+1].replace(/^\s*/,"")?y.context=P:y.context=[r[m+1]],h.push(y)}}return h.length?{mode:"multiline",name:t.name,message:r[0],stack:h}:null}function m(e,t,n,r){var i={url:t,line:n};if(i.url&&i.line){e.incomplete=!1,i.func||(i.func=s(i.url,i.line)),i.context||(i.context=u(i.url,i.line));var o=/ '([^']+)' /.exec(r);if(o&&(i.column=p(o[1],i.url,i.line)),e.stack.length>0&&e.stack[0].url===i.url){if(e.stack[0].line===i.line)return!1;if(!e.stack[0].line&&e.stack[0].func===i.func)return e.stack[0].line=i.line,e.stack[0].context=i.context,!1}return e.stack.unshift(i),e.partial=!0,!0}return e.incomplete=!0,!1}function y(e,t){for(var n,r,o,u=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,c=[],l={},f=!1,d=y.caller;d&&!f;d=d.caller)if(d!==b&&d!==i.report){if(r={url:null,func:a,args:[],line:null,column:null},d.name?r.func=d.name:(n=u.exec(d.toString()))&&(r.func=n[1]),"undefined"==typeof r.func)try{r.func=n.input.substring(0,n.input.indexOf("{"))}catch(g){}if(o=h(d)){r.url=o.url,r.line=o.line,r.func===a&&(r.func=s(r.url,r.line));var v=/ '([^']+)' /.exec(e.message||e.description);v&&(r.column=p(v[1],o.url,o.line))}l[""+d]?f=!0:l[""+d]=!0,c.push(r)}t&&c.splice(0,t);var S={mode:"callers",name:e.name,message:e.message,stack:c};return m(S,e.sourceURL||e.fileName,e.line||e.lineNumber,e.message||e.description),S}function b(e,t){var n=null;t=null==t?0:+t;try{if(n=g(e))return n}catch(r){if(x)throw r}try{if(n=d(e))return n}catch(r){if(x)throw r}try{if(n=v(e))return n}catch(r){if(x)throw r}try{if(n=y(e,t+1))return n}catch(r){if(x)throw r}return{mode:"failed"}}function S(e){e=(null==e?0:+e)+1;try{throw new Error}catch(t){return b(t,e+1)}}var x=!1,w={};return b.augmentStackTraceWithInitialElement=m,b.guessFunctionName=s,b.gatherContext=u,b.ofCaller=S,b.getSource=o,b}(),i.extendToAsynchronousCallbacks=function(){var t=function(t){var n=e[t];e[t]=function(){var e=s.call(arguments),t=e[0];return"function"==typeof t&&(e[0]=i.wrap(t)),n.apply?n.apply(this,e):n(e[0],e[1])}};t("setTimeout"),t("setInterval")},i.remoteFetching||(i.remoteFetching=!0),i.collectWindowErrors||(i.collectWindowErrors=!0),(!i.linesOfContext||i.linesOfContext<1)&&(i.linesOfContext=11),"undefined"!=typeof module&&module.exports&&this.module!==module?module.exports=i:"function"==typeof define&&define.amd?define("TraceKit",[],i):e.TraceKit=i}}("undefined"!=typeof window?window:global),function(e,t){"function"==typeof define&&define.amd?define("exceptionless",t):"object"==typeof exports?module.exports=t(require,exports,module):e.exceptionless=t()}(this,function(e,t,n){function r(e,t){var n=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/g;if("string"==typeof t){var r=n.exec(t);if(r)return new Date(t)}return t}function i(){if(!document||!document.getElementsByTagName)return null;for(var e=document.getElementsByTagName("script"),t=0;t<e.length;t++)if(e[t].src&&e[t].src.indexOf("/exceptionless")>-1)return S.parseQueryString(e[t].src.split("?").pop());return null}function o(e,t){var n=E["default"].createUnhandledException(new Error(e.message||(t||{}).status||"Script error"),"onerror");n.pluginContextData["@@_TraceKit.StackTrace"]=e,n.submit()}if(e||(e=function(e){return("undefined"!=typeof window?window:global)[e]}),!t)var t={};var s=this&&this.__extends||function(e,t){function n(){this.constructor=e}for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)},a=e("TraceKit"),u=function(){function e(e,t){this.success=!1,this.badRequest=!1,this.serviceUnavailable=!1,this.paymentRequired=!1,this.unableToAuthenticate=!1,this.notFound=!1,this.requestEntityTooLarge=!1,this.statusCode=e,this.message=t,this.success=e>=200&&299>=e,this.badRequest=400===e,this.serviceUnavailable=503===e,this.paymentRequired=402===e,this.unableToAuthenticate=401===e||403===e,this.notFound=404===e,this.requestEntityTooLarge=413===e}return e}();t.SubmissionResponse=u;var c=function(){function e(){}return e.onChanged=function(e){!!e&&this._handlers.push(e)},e.applySavedServerSettings=function(e){if(e&&e.isValid){var t=this.getSavedServerSettings(e);e.log.info("Applying saved settings: v"+t.version),e.settings=S.merge(e.settings,t.settings),this.changed(e)}},e.getVersion=function(e){if(!e||!e.isValid)return 0;var t=this.getSavedServerSettings(e);return t.version||0},e.checkVersion=function(e,t){var n=this.getVersion(t);n>=e||(t.log.info("Updating settings from v"+n+" to v"+e),this.updateSettings(t,n))},e.updateSettings=function(t,n){var r=this;if(t&&t.enabled){var i="Unable to update settings";if(!t.isValid)return void t.log.error(i+": ApiKey is not set.");(!n||0>n)&&(n=this.getVersion(t)),t.log.info("Checking for updated settings from: v"+n+"."),t.submissionClient.getSettings(t,n,function(n){if(!(t&&n&&n.success&&n.settings))return void t.log.warn(i+": "+n.message);t.settings=S.merge(t.settings,n.settings);var o=e.getSavedServerSettings(t);for(var s in o)n.settings[s]||delete t.settings[s];var a={version:n.settingsVersion,settings:n.settings};t.storage.settings.save(a),t.log.info("Updated settings: v"+a.version),r.changed(t)})}},e.changed=function(e){for(var t=this._handlers,n=0;n<t.length;n++)try{t[n](e)}catch(r){e.log.error("Error calling onChanged handler: "+r)}},e.getSavedServerSettings=function(e){var t=e.storage.settings.get()[0];return t&&t.value&&t.value.version&&t.value.settings?t.value:{version:0,settings:{}}},e._handlers=[],e}();t.SettingsManager=c;var l=function(){function e(){this._lastReferenceId=null}return e.prototype.getLast=function(){return this._lastReferenceId},e.prototype.clearLast=function(){this._lastReferenceId=null},e.prototype.setLast=function(e){this._lastReferenceId=e},e}();t.DefaultLastReferenceIdManager=l;var f=function(){function e(){}return e.prototype.info=function(e){this.log("info",e)},e.prototype.warn=function(e){this.log("warn",e)},e.prototype.error=function(e){this.log("error",e)},e.prototype.log=function(e,t){console&&console[e]&&console[e]("["+e+"] Exceptionless: "+t)},e}();t.ConsoleLog=f;var p=function(){function e(){}return e.prototype.info=function(e){},e.prototype.warn=function(e){},e.prototype.error=function(e){},e}();t.NullLog=p;var h=function(){function e(e,t,n){this.client=e,this.event=t,this.contextData=n?n:new _}return Object.defineProperty(e.prototype,"log",{get:function(){return this.client.config.log},enumerable:!0,configurable:!0}),e}();t.EventPluginContext=h;var d=function(){function e(){}return e.run=function(e,t){var n=function(n,r){return function(){try{e.cancelled||n.run(e,r)}catch(i){e.cancelled=!0,e.log.error("Error running plugin '"+n.name+"': "+i.message+". Discarding Event.")}e.cancelled&&t&&t(e)}},r=e.client.config.plugins,i=[];t&&(i[r.length]=n({name:"cb",priority:9007199254740992,run:t},null));for(var o=r.length-1;o>-1;o--)i[o]=n(r[o],t||o<r.length-1?i[o+1]:null);i[0]()},e.addDefaultPlugins=function(e){e.addPlugin(new I),e.addPlugin(new P),e.addPlugin(new U),e.addPlugin(new q),e.addPlugin(new T),e.addPlugin(new C),e.addPlugin(new R),e.addPlugin(new k)},e}();t.EventPluginManager=d;var g=function(){function e(e){void 0===e&&(e=3e4),this.priority=100,this.name="HeartbeatPlugin",this._interval=e}return e.prototype.run=function(e,t){clearInterval(this._intervalId);var n=e.event.data["@user"];n&&n.identity&&(this._intervalId=setInterval(function(){return e.client.submitSessionHeartbeat(n.identity)},this._interval)),t&&t()},e}();t.HeartbeatPlugin=g;var v=function(){function e(){this.priority=20,this.name="ReferenceIdPlugin"}return e.prototype.run=function(e,t){e.event.reference_id&&0!==e.event.reference_id.length||"error"!==e.event.type||(e.event.reference_id=S.guid().replace("-","").substring(0,10)),t&&t()},e}();t.ReferenceIdPlugin=v;var m=function(){function e(e){this._handlers=[],this._processingQueue=!1,this._config=e}return e.prototype.enqueue=function(e){var t="The event will not be queued.",n=this._config,r=n.log;if(!n.enabled)return void r.info("Configuration is disabled. "+t);if(!n.isValid)return void r.info("Invalid Api Key. "+t);if(this.areQueuedItemsDiscarded())return void r.info("Queue items are currently being discarded. "+t);this.ensureQueueTimer();var i=n.storage.queue.save(e),o="type="+e.type+" "+(e.reference_id?"refid="+e.reference_id:"");i?r.info("Enqueuing event: "+i+" "+o):r.error("Could not enqueue event "+o)},e.prototype.process=function(e){var t=this,n="The queue will not be processed.",r=this._config,i=r.log;if(!this._processingQueue){if(i.info("Processing queue..."),!r.enabled)return void i.info("Configuration is disabled. "+n);if(!r.isValid)return void i.info("Invalid Api Key. "+n);this._processingQueue=!0,this.ensureQueueTimer();try{var o=r.storage.queue.get(r.submissionBatchSize);if(!o||0===o.length)return void(this._processingQueue=!1);i.info("Sending "+o.length+" events to "+r.serverUrl+"."),r.submissionClient.postEvents(o.map(function(e){return e.value}),r,function(e){t.processSubmissionResponse(e,o),t.eventsPosted(o.map(function(e){return e.value}),e),i.info("Finished processing queue."),t._processingQueue=!1},e)}catch(s){i.error("Error processing queue: "+s),this.suspendProcessing(),this._processingQueue=!1}}},e.prototype.suspendProcessing=function(e,t,n){var r=this._config;(!e||0>=e)&&(e=5),r.log.info("Suspending processing for "+e+" minutes."),this._suspendProcessingUntil=new Date((new Date).getTime()+6e4*e),t&&(this._discardQueuedItemsUntil=this._suspendProcessingUntil),n&&r.storage.queue.clear()},e.prototype.onEventsPosted=function(e){!!e&&this._handlers.push(e)},e.prototype.eventsPosted=function(e,t){for(var n=this._handlers,r=0;r<n.length;r++)try{n[r](e,t)}catch(i){this._config.log.error("Error calling onEventsPosted handler: "+i)}},e.prototype.areQueuedItemsDiscarded=function(){return this._discardQueuedItemsUntil&&this._discardQueuedItemsUntil>new Date},e.prototype.ensureQueueTimer=function(){var e=this;this._queueTimer||(this._queueTimer=setInterval(function(){return e.onProcessQueue()},1e4))},e.prototype.isQueueProcessingSuspended=function(){return this._suspendProcessingUntil&&this._suspendProcessingUntil>new Date},e.prototype.onProcessQueue=function(){this.isQueueProcessingSuspended()||this._processingQueue||this.process()},e.prototype.processSubmissionResponse=function(e,t){var n="The event will not be submitted.",r=this._config,i=r.log;if(e.success)return i.info("Sent "+t.length+" events."),void this.removeEvents(t);if(e.serviceUnavailable)return i.error("Server returned service unavailable."),void this.suspendProcessing();if(e.paymentRequired)return i.info("Too many events have been submitted, please upgrade your plan."),void this.suspendProcessing(null,!0,!0);if(e.unableToAuthenticate)return i.info("Unable to authenticate, please check your configuration. "+n),this.suspendProcessing(15),void this.removeEvents(t);if(e.notFound||e.badRequest)return i.error("Error while trying to submit data: "+e.message),this.suspendProcessing(240),void this.removeEvents(t);if(e.requestEntityTooLarge){var o="Event submission discarded for being too large.";return void(r.submissionBatchSize>1?(i.error(o+" Retrying with smaller batch size."),r.submissionBatchSize=Math.max(1,Math.round(r.submissionBatchSize/1.5))):(i.error(o+" "+n),this.removeEvents(t)))}e.success||(i.error("Error submitting events: "+(e.message||"Please check the network tab for more info.")),this.suspendProcessing())},e.prototype.removeEvents=function(e){for(var t=0;t<(e||[]).length;t++)this._config.storage.queue.remove(e[t].timestamp)},e}();t.DefaultEventQueue=m;var y=function(){function e(e){void 0===e&&(e=250),this.queue=new O(e),this.settings=new O(1)}return e}();t.InMemoryStorageProvider=y;var b=function(){function e(){this.configurationVersionHeader="x-exceptionless-configversion"}return e.prototype.postEvents=function(e,t,n,r){var i=JSON.stringify(e),o=this.createRequest(t,"POST",t.serverUrl+"/api/v2/events",i),s=this.createSubmissionCallback(t,n);return t.submissionAdapter.sendRequest(o,s,r)},e.prototype.postUserDescription=function(e,t,n,r){var i=n.serverUrl+"/api/v2/events/by-ref/"+encodeURIComponent(e)+"/user-description",o=JSON.stringify(t),s=this.createRequest(n,"POST",i,o),a=this.createSubmissionCallback(n,r);return n.submissionAdapter.sendRequest(s,a)},e.prototype.getSettings=function(e,t,n){var r=this.createRequest(e,"GET",e.serverUrl+"/api/v2/projects/config?v="+t),i=function(t,r,i,o){if(200!==t)return n(new M(!1,null,-1,null,r));var s;try{s=JSON.parse(i)}catch(a){e.log.error("Unable to parse settings: '"+i+"'")}return!s||isNaN(s.version)?n(new M(!1,null,-1,null,"Invalid configuration settings.")):void n(new M(!0,s.settings||{},s.version))};return e.submissionAdapter.sendRequest(r,i)},e.prototype.sendHeartbeat=function(e,t,n){var r=this.createRequest(n,"GET",n.heartbeatServerUrl+"/api/v2/events/session/heartbeat?id="+e+"&close="+t);n.submissionAdapter.sendRequest(r)},e.prototype.createRequest=function(e,t,n,r){return void 0===r&&(r=null),{method:t,url:n,data:r,apiKey:e.apiKey,userAgent:e.userAgent}},e.prototype.createSubmissionCallback=function(e,t){var n=this;return function(r,i,o,s){var a=s&&parseInt(s[n.configurationVersionHeader],10);c.checkVersion(a,e),t(new u(r,i))}},e}();t.DefaultSubmissionClient=b;var S=function(){function e(){}return e.addRange=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];if(e||(e=[]),!t||0===t.length)return e;for(var r=0;r<t.length;r++)t[r]&&e.indexOf(t[r])<0&&e.push(t[r]);return e},e.getHashCode=function(e){if(!e||0===e.length)return 0;for(var t=0,n=0;n<e.length;n++){var r=e.charCodeAt(n);t=(t<<5)-t+r,t|=0}return t},e.getCookies=function(t,n){for(var r={},i=(t||"").split("; "),o=0;o<i.length;o++){var s=i[o].split("=");e.isMatch(s[0],n)||(r[s[0]]=s[1])}return e.isEmpty(r)?null:r},e.guid=function(){function e(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()},e.merge=function(e,t){var n={};for(var r in e||{})e[r]&&(n[r]=e[r]);for(var r in t||{})t[r]&&(n[r]=t[r]);return n},e.parseVersion=function(e){if(!e)return null;var t=/(v?((\d+)\.(\d+)(\.(\d+))?)(?:-([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?(?:\+([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?)/,n=t.exec(e);return n&&n.length>0?n[0]:null},e.parseQueryString=function(t,n){if(!t||0===t.length)return null;var r=t.split("&");if(0===r.length)return null;for(var i={},o=0;o<r.length;o++){var s=r[o].split("=");e.isMatch(s[0],n)||(i[decodeURIComponent(s[0])]=decodeURIComponent(s[1]))}return e.isEmpty(i)?null:i},e.randomNumber=function(){return Math.floor(9007199254740992*Math.random())},e.isMatch=function(t,n,r){if(void 0===r&&(r=!0),!t||"string"!=typeof t)return!1;var i=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;return t=(r?t.toLowerCase():t).replace(i,""),(n||[]).some(function(n){if("string"!=typeof n)return!1;if(n=(r?n.toLowerCase():n).replace(i,""),n.length<=0)return!1;var o="*"===n[0];o&&(n=n.slice(1));var s="*"===n[n.length-1];return s&&(n=n.substring(0,n.length-1)),o&&s?n.length<=t.length&&-1!==t.indexOf(n,0):o?e.endsWith(t,n):s?e.startsWith(t,n):t===n})},e.isEmpty=function(e){return null===e||"object"==typeof e&&0===Object.keys(e).length},e.startsWith=function(e,t){return e.substring(0,t.length)===t},e.endsWith=function(e,t){return-1!==e.indexOf(t,e.length-t.length)},e.stringify=function(t,n,r){function i(t,n){var r=[];return JSON.stringify(t,function(t,i){if(!e.isMatch(t,n)){if("object"==typeof i&&i){if(-1!==r.indexOf(i))return;r.push(i)}return i}})}if("[object Object]"==={}.toString.call(t)){var o={};for(var s in t){var a=t[s];a!==t&&(o[s]=t[s])}return i(o,n)}if("[object Array]"==={}.toString.call(t)){for(var u=[],c=0;c<t.length;c++)u[c]=JSON.parse(i(t[c],n));return JSON.stringify(u)}return i(t,n)},e.toBoolean=function(e,t){if(void 0===t&&(t=!1),"boolean"==typeof e)return e;if(null===e||"number"!=typeof e&&"string"!=typeof e)return t;switch((e+"").toLowerCase().trim()){case"true":case"yes":case"1":return!0;case"false":case"no":case"0":case null:return!1}return t},e}();t.Utils=S;var x=function(){function e(t){function n(e){return"function"==typeof e?e(this):e}this.defaultTags=[],this.defaultData={},this.enabled=!0,this.lastReferenceIdManager=new l,this.settings={},this._plugins=[],this._handlers=[],this._serverUrl="https://collector.exceptionless.io",this._heartbeatServerUrl="https://heartbeat.exceptionless.io",this._updateSettingsWhenIdleInterval=12e4,this._dataExclusions=[],this._userAgentBotPatterns=[],t=S.merge(e.defaults,t),this.log=n(t.log)||new p,this.apiKey=t.apiKey,this.serverUrl=t.serverUrl,this.heartbeatServerUrl=t.heartbeatServerUrl,this.updateSettingsWhenIdleInterval=t.updateSettingsWhenIdleInterval,this.environmentInfoCollector=n(t.environmentInfoCollector),this.errorParser=n(t.errorParser),this.lastReferenceIdManager=n(t.lastReferenceIdManager)||new l,this.moduleCollector=n(t.moduleCollector),this.requestInfoCollector=n(t.requestInfoCollector),this.submissionBatchSize=n(t.submissionBatchSize)||50,this.submissionAdapter=n(t.submissionAdapter),this.submissionClient=n(t.submissionClient)||new b,this.storage=n(t.storage)||new y,this.queue=n(t.queue)||new m(this),c.applySavedServerSettings(this),d.addDefaultPlugins(this)}return Object.defineProperty(e.prototype,"apiKey",{get:function(){return this._apiKey},set:function(e){this._apiKey=e||null,this.log.info("apiKey: "+this._apiKey),this.changed()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isValid",{get:function(){return!!this.apiKey&&this.apiKey.length>=10},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"serverUrl",{get:function(){return this._serverUrl},set:function(e){e&&(this._serverUrl=e,this._heartbeatServerUrl=e,this.log.info("serverUrl: "+e),this.changed())},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"heartbeatServerUrl",{get:function(){return this._heartbeatServerUrl},set:function(e){e&&(this._heartbeatServerUrl=e,this.log.info("heartbeatServerUrl: "+e),this.changed())},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updateSettingsWhenIdleInterval",{get:function(){return this._updateSettingsWhenIdleInterval},set:function(e){"number"==typeof e&&(0>=e?e=-1:e>0&&15e3>e&&(e=15e3),this._updateSettingsWhenIdleInterval=e,this.log.info("updateSettingsWhenIdleInterval: "+e),this.changed())},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataExclusions",{get:function(){var e=this.settings["@@DataExclusions"];return this._dataExclusions.concat(e&&e.split(",")||[])},enumerable:!0,configurable:!0}),e.prototype.addDataExclusions=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];this._dataExclusions=S.addRange.apply(S,[this._dataExclusions].concat(e))},Object.defineProperty(e.prototype,"userAgentBotPatterns",{get:function(){var e=this.settings["@@UserAgentBotPatterns"];return this._userAgentBotPatterns.concat(e&&e.split(",")||[])},enumerable:!0,configurable:!0}),e.prototype.addUserAgentBotPatterns=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];this._userAgentBotPatterns=S.addRange.apply(S,[this._userAgentBotPatterns].concat(e))},Object.defineProperty(e.prototype,"plugins",{get:function(){return this._plugins.sort(function(e,t){return e.priority<t.priority?-1:e.priority>t.priority?1:0})},enumerable:!0,configurable:!0}),e.prototype.addPlugin=function(e,t,n){var r=n?{name:e,priority:t,run:n}:e;if(!r||!r.run)return void this.log.error("Add plugin failed: Run method not defined");r.name||(r.name=S.guid()),r.priority||(r.priority=0);for(var i=!1,o=this._plugins,s=0;s<o.length;s++)if(o[s].name===r.name){i=!0;break}i||o.push(r)},e.prototype.removePlugin=function(e){var t="string"==typeof e?e:e.name;if(!t)return void this.log.error("Remove plugin failed: Plugin name not defined");for(var n=this._plugins,r=0;r<n.length;r++)if(n[r].name===t){n.splice(r,1);break}},e.prototype.setVersion=function(e){e&&(this.defaultData["@version"]=e)},e.prototype.setUserIdentity=function(e,t){var n="@user",r="string"!=typeof e?e:{identity:e,name:t},i=!r||!r.identity&&!r.name;i?delete this.defaultData[n]:this.defaultData[n]=r,this.log.info("user identity: "+(i?"null":r.identity))},Object.defineProperty(e.prototype,"userAgent",{get:function(){return"exceptionless-js/1.4.1"},enumerable:!0,configurable:!0}),e.prototype.useSessions=function(e,t){void 0===e&&(e=!0),void 0===t&&(t=3e4),e&&this.addPlugin(new g(t))},e.prototype.useReferenceIds=function(){this.addPlugin(new v)},e.prototype.useLocalStorage=function(){},e.prototype.useDebugLogger=function(){this.log=new f},e.prototype.onChanged=function(e){!!e&&this._handlers.push(e)},e.prototype.changed=function(){for(var e=this._handlers,t=0;t<e.length;t++)try{e[t](this)}catch(n){this.log.error("Error calling onChanged handler: "+n)}},Object.defineProperty(e,"defaults",{get:function(){return null===e._defaultSettings&&(e._defaultSettings={}),e._defaultSettings},enumerable:!0,configurable:!0}),e._defaultSettings=null,e}();t.Configuration=x;var w=function(){function e(e,t,n){this._validIdentifierErrorMessage="must contain between 8 and 100 alphanumeric or '-' characters.",this.target=e,this.client=t,this.pluginContextData=n||new _}return e.prototype.setType=function(e){return e&&(this.target.type=e),this},e.prototype.setSource=function(e){return e&&(this.target.source=e),this},e.prototype.setReferenceId=function(e){if(!this.isValidIdentifier(e))throw new Error("ReferenceId "+this._validIdentifierErrorMessage);return this.target.reference_id=e,this},e.prototype.setEventReference=function(e,t){if(!e)throw new Error("Invalid name");if(!t||!this.isValidIdentifier(t))throw new Error("Id "+this._validIdentifierErrorMessage);return this.setProperty("@ref:"+e,t),this},e.prototype.setMessage=function(e){return e&&(this.target.message=e),this},e.prototype.setGeo=function(e,t){if(-90>e||e>90)throw new Error("Must be a valid latitude value between -90.0 and 90.0.");if(-180>t||t>180)throw new Error("Must be a valid longitude value between -180.0 and 180.0.");return this.target.geo=e+","+t,this},e.prototype.setUserIdentity=function(e,t){var n="string"!=typeof e?e:{identity:e,name:t};return n&&(n.identity||n.name)?(this.setProperty("@user",n),this):this},e.prototype.setUserDescription=function(e,t){return e&&t&&this.setProperty("@user_description",{email_address:e,description:t}),this},e.prototype.setManualStackingInfo=function(e,t){if(e){var n={signature_data:e};t&&(n.title=t),this.setProperty("@stack",n)}return this},e.prototype.setManualStackingKey=function(e,t){if(e){var n={ManualStackingKey:e};this.setManualStackingInfo(n,t)}return this},e.prototype.setValue=function(e){return e&&(this.target.value=e),this},e.prototype.addTags=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return this.target.tags=S.addRange.apply(S,[this.target.tags].concat(e)),this},e.prototype.setProperty=function(e,t,n,r){if(!e||void 0===t||null==t)return this;this.target.data||(this.target.data={});var i=JSON.parse(S.stringify(t,this.client.config.dataExclusions.concat(r||[]),n));return S.isEmpty(i)||(this.target.data[e]=i),this},e.prototype.markAsCritical=function(e){return e&&this.addTags("Critical"),this},e.prototype.addRequestInfo=function(e){return e&&(this.pluginContextData["@request"]=e),this},e.prototype.submit=function(e){this.client.submitEvent(this.target,this.pluginContextData,e)},e.prototype.isValidIdentifier=function(e){if(!e)return!0;if(e.length<8||e.length>100)return!1;for(var t=0;t<e.length;t++){var n=e.charCodeAt(t),r=n>=48&&57>=n,i=n>=65&&90>=n||n>=97&&122>=n,o=45===n;if(!r&&!i&&!o)return!1}return!0},e}();t.EventBuilder=w;var _=function(){function e(){}return e.prototype.setException=function(e){e&&(this["@@_Exception"]=e)},Object.defineProperty(e.prototype,"hasException",{get:function(){return!!this["@@_Exception"]},enumerable:!0,configurable:!0}),e.prototype.getException=function(){return this["@@_Exception"]||null},e.prototype.markAsUnhandledError=function(){this["@@_IsUnhandledError"]=!0},Object.defineProperty(e.prototype,"isUnhandledError",{get:function(){return!!this["@@_IsUnhandledError"]},enumerable:!0,configurable:!0}),e.prototype.setSubmissionMethod=function(e){e&&(this["@@_SubmissionMethod"]=e)},e.prototype.getSubmissionMethod=function(){return this["@@_SubmissionMethod"]||null},e}();t.ContextData=_;var E=function(){function e(e,t){var n=this;"object"==typeof e?this.config=new x(e):this.config=new x({apiKey:e,serverUrl:t}),this.updateSettingsTimer(5e3),this.config.onChanged(function(e){return n.updateSettingsTimer(n._timeoutId>0?5e3:0)}),this.config.queue.onEventsPosted(function(e,t){return n.updateSettingsTimer()})}return e.prototype.createException=function(e){var t=new _;return t.setException(e),this.createEvent(t).setType("error")},e.prototype.submitException=function(e,t){this.createException(e).submit(t)},e.prototype.createUnhandledException=function(e,t){var n=this.createException(e);return n.pluginContextData.markAsUnhandledError(),n.pluginContextData.setSubmissionMethod(t),n},e.prototype.submitUnhandledException=function(e,t,n){this.createUnhandledException(e,t).submit(n)},e.prototype.createFeatureUsage=function(e){return this.createEvent().setType("usage").setSource(e)},e.prototype.submitFeatureUsage=function(e,t){this.createFeatureUsage(e).submit(t)},e.prototype.createLog=function(e,t,n){var r=this.createEvent().setType("log");if(t&&n)r=r.setSource(e).setMessage(t).setProperty("@level",n);else if(t)r=r.setSource(e).setMessage(t);else{var i=arguments.callee.caller;
-r=r.setSource(i&&i.name).setMessage(e)}return r},e.prototype.submitLog=function(e,t,n,r){this.createLog(e,t,n).submit(r)},e.prototype.createNotFound=function(e){return this.createEvent().setType("404").setSource(e)},e.prototype.submitNotFound=function(e,t){this.createNotFound(e).submit(t)},e.prototype.createSessionStart=function(){return this.createEvent().setType("session")},e.prototype.submitSessionStart=function(e){this.createSessionStart().submit(e)},e.prototype.submitSessionEnd=function(e){e&&(this.config.log.info("Submitting session end: "+e),this.config.submissionClient.sendHeartbeat(e,!0,this.config))},e.prototype.submitSessionHeartbeat=function(e){e&&(this.config.log.info("Submitting session heartbeat: "+e),this.config.submissionClient.sendHeartbeat(e,!1,this.config))},e.prototype.createEvent=function(e){return new w({date:new Date},this,e)},e.prototype.submitEvent=function(e,t,n){function r(e){return e&&(e.cancelled=!0),!!n&&n(e)}var i=new h(this,e,t);return e?this.config.enabled?(e.data||(e.data={}),e.tags&&e.tags.length||(e.tags=[]),void d.run(i,function(e){var t=e.client.config,r=e.event;e.cancelled||(r.type&&0!==r.type.length||(r.type="log"),r.date||(r.date=new Date),t.queue.enqueue(r),r.reference_id&&r.reference_id.length>0&&(e.log.info("Setting last reference id '"+r.reference_id+"'"),t.lastReferenceIdManager.setLast(r.reference_id))),!!n&&n(e)})):(this.config.log.info("Event submission is currently disabled."),r(i)):r(i)},e.prototype.updateUserEmailAndDescription=function(e,t,n,r){var i=this;if(!(e&&t&&n&&this.config.enabled))return!!r&&r(new u(500,"cancelled"));var o={email_address:t,description:n};this.config.submissionClient.postUserDescription(e,o,this.config,function(t){t.success||i.config.log.error("Failed to submit user email and description for event '"+e+"': "+t.statusCode+" "+t.message),!!r&&r(t)})},e.prototype.getLastReferenceId=function(){return this.config.lastReferenceIdManager.getLast()},e.prototype.updateSettingsTimer=function(e){var t=this;this.config.log.info("Updating settings timer with delay: "+e),this._timeoutId=clearTimeout(this._timeoutId),this._timeoutId=clearInterval(this._intervalId);var n=this.config.updateSettingsWhenIdleInterval;if(n>0){var r=function(){return c.updateSettings(t.config)};e>0&&(this._timeoutId=setTimeout(r,e)),this._intervalId=setInterval(r,n)}},Object.defineProperty(e,"default",{get:function(){return null===e._instance&&(e._instance=new e(null)),e._instance},enumerable:!0,configurable:!0}),e._instance=null,e}();t.ExceptionlessClient=E;var I=function(){function e(){this.priority=10,this.name="ConfigurationDefaultsPlugin"}return e.prototype.run=function(e,t){for(var n=e.client.config,r=n.defaultTags||[],i=0;i<r.length;i++){var o=r[i];o&&e.event.tags.indexOf(o)<0&&e.event.tags.push(o)}var s=n.defaultData||{};for(var a in s)if(s[a]){var u=JSON.parse(S.stringify(s[a],n.dataExclusions));S.isEmpty(u)||(e.event.data[a]=u)}t&&t()},e}();t.ConfigurationDefaultsPlugin=I;var P=function(){function e(){this.priority=30,this.name="ErrorPlugin"}return e.prototype.run=function(e,t){var n="@error",r=["arguments","column","columnNumber","description","fileName","message","name","number","line","lineNumber","opera#sourceloc","sourceId","sourceURL","stack","stackArray","stacktrace"],i=e.contextData.getException();if(i&&(e.event.type="error",!e.event.data[n])){var o=e.client.config,s=o.errorParser;if(!s)throw new Error("No error parser was defined.");var a=s.parse(e,i);if(a){var u=JSON.parse(S.stringify(i,o.dataExclusions.concat(r)));S.isEmpty(u)||(a.data||(a.data={}),a.data["@ext"]=u),e.event.data[n]=a}}t&&t()},e}();t.ErrorPlugin=P;var T=function(){function e(){this.priority=50,this.name="ModuleInfoPlugin"}return e.prototype.run=function(e,t){var n="@error",r=e.client.config.moduleCollector;if(e.event.data[n]&&!e.event.data["@error"].modules&&r){var i=r.getModules(e);i&&i.length>0&&(e.event.data[n].modules=i)}t&&t()},e}();t.ModuleInfoPlugin=T;var C=function(){function e(){this.priority=70,this.name="RequestInfoPlugin"}return e.prototype.run=function(e,t){var n="@request",r=e.client.config,i=r.requestInfoCollector;if(!e.event.data[n]&&i){var o=i.getRequestInfo(e);o&&(S.isMatch(o.user_agent,r.userAgentBotPatterns)?(e.log.info("Cancelling event as the request user agent matches a known bot pattern"),e.cancelled=!0):e.event.data[n]=o)}t&&t()},e}();t.RequestInfoPlugin=C;var R=function(){function e(){this.priority=80,this.name="EnvironmentInfoPlugin"}return e.prototype.run=function(e,t){var n="@environment",r=e.client.config.environmentInfoCollector;if(!e.event.data[n]&&r){var i=r.getEnvironmentInfo(e);i&&(e.event.data[n]=i)}t&&t()},e}();t.EnvironmentInfoPlugin=R;var k=function(){function e(){this.priority=100,this.name="SubmissionMethodPlugin"}return e.prototype.run=function(e,t){var n=e.contextData.getSubmissionMethod();n&&(e.event.data["@submission_method"]=n),t&&t()},e}();t.SubmissionMethodPlugin=k;var U=function(){function e(e){void 0===e&&(e=function(){return Date.now()}),this.priority=40,this.name="DuplicateCheckerPlugin",this._processedHashcodes=[],this._getCurrentTime=e}return e.prototype.run=function(e,t){function n(e,t,n,r){for(var i=function(){var i=S.getHashCode(e.stack_trace&&JSON.stringify(e.stack_trace));if(i&&t.some(function(e){return e.hash===i&&e.timestamp>=n-2e3}))return r.info("Ignoring duplicate error event hash: "+i),{value:!0};for(t.push({hash:i,timestamp:n});t.length>20;)t.shift();e=e.inner};e;){var o=i();if("object"==typeof o)return o.value}return!1}return"error"===e.event.type&&n(e.event.data["@error"],this._processedHashcodes,this._getCurrentTime(),e.log)?void(e.cancelled=!0):void(t&&t())},e}();t.DuplicateCheckerPlugin=U;var q=function(){function e(){this.priority=45,this.name="EventExclusionPlugin"}return e.prototype.run=function(e,t){function n(e){switch((e||"").toLowerCase().trim()){case"trace":case"true":case"1":case"yes":return 0;case"debug":return 1;case"info":return 2;case"warn":return 3;case"error":return 4;case"fatal":return 5;case"off":case"false":case"0":case"no":return 6;default:return-1}}function r(e,t){return void 0===t&&(t="*"),n(i(e,"log",t,"Trace")+"")}function i(e,t,n,r){if(void 0===e&&(e={}),void 0===r&&(r=void 0),!t)return r;var i="log"===t,o="@@"+t+":",s=e[o+n];if(s)return i?s:S.toBoolean(s);for(var a in e)if(S.startsWith(a.toLowerCase(),o.toLowerCase())&&S.isMatch(n,[a.substring(o.length)]))return i?e[a]:S.toBoolean(e[a]);return r}var o=e.event,s=e.log,a=e.client.config.settings;if("log"===o.type){var u=r(a,o.source),c=n(o.data["@level"]);c>=0&&(c>5||u>c)&&(s.info("Cancelling log event due to minimum log level."),e.cancelled=!0)}else if("error"===o.type)for(var l=o.data["@error"];!e.cancelled&&l;)i(a,o.type,l.type,!0)===!1&&(s.info("Cancelling error from excluded exception type: "+l.type),e.cancelled=!0),l=l.inner;else i(a,o.type,o.source,!0)===!1&&(s.info("Cancelling event from excluded type: "+o.type+" and source: "+o.source),e.cancelled=!0);t&&t()},e}();t.EventExclusionPlugin=q;var M=function(){function e(e,t,n,r,i){void 0===n&&(n=-1),void 0===r&&(r=null),void 0===i&&(i=null),this.success=!1,this.settingsVersion=-1,this.success=e,this.settings=t,this.settingsVersion=n,this.exception=r,this.message=i}return e}();t.SettingsResponse=M;var O=function(){function e(e){this.items=[],this.lastTimestamp=0,this.maxItems=e}return e.prototype.save=function(e){if(!e)return null;var t=this.items,n=Math.max(Date.now(),this.lastTimestamp+1),r={timestamp:n,value:e};return t.push(r)>this.maxItems&&t.shift(),this.lastTimestamp=n,r.timestamp},e.prototype.get=function(e){return this.items.slice(0,e)},e.prototype.remove=function(e){for(var t=this.items,n=0;n<t.length;n++)if(t[n].timestamp===e)return void t.splice(n,1)},e.prototype.clear=function(){this.items=[]},e}();t.InMemoryStorage=O;var A=function(){function e(e){this.lastTimestamp=0,this.maxItems=e}return e.prototype.save=function(e,t){if(!e)return null;this.ensureIndex();var n=this.items,r=Math.max(Date.now(),this.lastTimestamp+1),i=this.getKey(r),o=JSON.stringify(e);try{this.write(i,o),this.lastTimestamp=r,n.push(r)>this.maxItems&&this["delete"](this.getKey(n.shift()))}catch(s){return null}return r},e.prototype.get=function(e){var t=this;return this.ensureIndex(),this.items.slice(0,e).map(function(e){var n=t.getKey(e);try{var i=t.read(n),o=JSON.parse(i,r);return{timestamp:e,value:o}}catch(s){return t.safeDelete(n),null}}).filter(function(e){return null!=e})},e.prototype.remove=function(e){this.ensureIndex();var t=this.items,n=t.indexOf(e);if(n>=0){var r=this.getKey(e);this.safeDelete(r),t.splice(n,1)}},e.prototype.clear=function(){var e=this;this.items.forEach(function(t){return e.safeDelete(e.getKey(t))}),this.items=[]},e.prototype.ensureIndex=function(){this.items||(this.items=this.createIndex(),this.lastTimestamp=Math.max.apply(Math,[0].concat(this.items))+1)},e.prototype.safeDelete=function(e){try{this["delete"](e)}catch(t){}},e.prototype.createIndex=function(){var e=this;try{var t=this.readAllKeys();return t.map(function(t){try{var n=e.getTimestamp(t);return n?n:(e.safeDelete(t),null)}catch(r){return e.safeDelete(t),null}}).filter(function(e){return null!=e}).sort(function(e,t){return e-t})}catch(n){return[]}},e}();t.KeyValueStorageBase=A;var D=function(e){function t(t,n,r){void 0===n&&(n="com.exceptionless."),void 0===r&&(r=20),e.call(this,r),this.prefix=n+t+"-"}return s(t,e),t.isAvailable=function(){try{var e=window.localStorage,t="__storage_test__";return e.setItem(t,t),e.removeItem(t),!0}catch(n){return!1}},t.prototype.write=function(e,t){window.localStorage.setItem(e,t)},t.prototype.read=function(e){return window.localStorage.getItem(e)},t.prototype.readAllKeys=function(){var e=this;return Object.keys(window.localStorage).filter(function(t){return 0===t.indexOf(e.prefix)})},t.prototype["delete"]=function(e){window.localStorage.removeItem(e)},t.prototype.getKey=function(e){return this.prefix+e},t.prototype.getTimestamp=function(e){return parseInt(e.substr(this.prefix.length),10)},t}(A);t.BrowserStorage=D;var F=function(){function e(){}return e.prototype.parse=function(e,t){function n(e){for(var t=("string"==typeof e?[e]:e)||[],n=[],r=0;r<t.length;r++)n.push({name:t[r]});return n}function r(e){for(var t="<anonymous>",r=[],i=0;i<e.length;i++){var o=e[i];r.push({name:(o.func||t).replace("?",t),parameters:n(o.args),file_name:o.url,line_number:o.line||0,column:o.column||0})}return r}var i="@@_TraceKit.StackTrace",o=e.contextData[i]?e.contextData[i]:a.computeStackTrace(t,25);if(!o)throw new Error("Unable to parse the exceptions stack trace.");return{type:o.name,message:o.message||t.message,stack_trace:r(o.stack||[])}},e}();t.DefaultErrorParser=F;var K=function(){function e(){}return e.prototype.getModules=function(e){if(document&&document.getElementsByTagName)return null;var t=[],n=document.getElementsByTagName("script");if(n&&n.length>0)for(var r=0;r<n.length;r++)n[r].src?t.push({module_id:r,name:n[r].src,version:S.parseVersion(n[r].src)}):n[r].innerHTML&&t.push({module_id:r,name:"Script Tag",version:S.getHashCode(n[r].innerHTML).toString()});return t},e}();t.DefaultModuleCollector=K;var L=function(){function e(){}return e.prototype.getRequestInfo=function(e){if(!document||!navigator||!location)return null;var t=e.client.config.dataExclusions,n={user_agent:navigator.userAgent,is_secure:"https:"===location.protocol,host:location.hostname,port:location.port&&""!==location.port?parseInt(location.port,10):80,path:location.pathname,cookies:S.getCookies(document.cookie,t),query_string:S.parseQueryString(location.search.substring(1),t)};return document.referrer&&""!==document.referrer&&(n.referrer=document.referrer),n},e}();t.DefaultRequestInfoCollector=L;var N=function(){function e(){}return e.prototype.sendRequest=function(e,t,n){function r(n,r){function i(e){function t(e){return e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}for(var n={},r=(e||"").split("\r\n"),i=0;i<r.length;i++){var o=r[i],s=o.indexOf(": ");s>0&&(n[t(o.substring(0,s).toLowerCase())]=o.substring(s+2))}return n}if(!u){u=!0;var a=r.statusText,c=r.responseText,l=r.status;if(n===o||0===l)a="Unable to connect to server.",l=0;else if(n!==s||l){if(200>l||l>299){var f=r.responseBody;if(f&&f.message)a=f.message;else if(c&&-1!==c.indexOf("message"))try{a=JSON.parse(c).message}catch(p){a=c}}}else l="POST"===e.method?202:200;t&&t(l||500,a||"",c,i(r.getAllResponseHeaders&&r.getAllResponseHeaders()))}}function i(e,t,n){var r=new XMLHttpRequest;return a in r?(r.open(t,n,!0),r.setRequestHeader("X-Exceptionless-Client",e),"POST"===t&&r.setRequestHeader("Content-Type","application/json")):"undefined"!=typeof XDomainRequest?(c=!0,r=new XDomainRequest,r.open(t,"http:"===location.protocol?n.replace("https:","http:"):n)):r=null,r&&(r.timeout=1e4),r}var o="timeout",s="loaded",a="withCredentials",u=!1,c=!1,l=""+e.url+(-1===e.url.indexOf("?")?"?":"&")+"access_token="+encodeURIComponent(e.apiKey),f=i(e.userAgent,e.method||"POST",l);return f?(a in f&&(f.onreadystatechange=function(){4===f.readyState&&r(s,f)}),f.onprogress=function(){},f.ontimeout=function(){return r(o,f)},f.onerror=function(){return r("error",f)},f.onload=function(){return r(s,f)},void(c?setTimeout(function(){return f.send(e.data)},500):f.send(e.data))):t&&t(503,"CORS not supported.")},e}();t.DefaultSubmissionAdapter=N;var j=function(){function e(e,t){void 0===t&&(t=250),this.queue=new D("q",e,t),this.settings=new D("settings",e,1)}return e}();t.BrowserStorageProvider=j,x.prototype.useLocalStorage=function(){D.isAvailable()&&(this.storage=new j,c.applySavedServerSettings(this),this.changed())};var B=x.defaults,Q=i();return Q&&(Q.apiKey||Q.serverUrl)&&(B.apiKey=Q.apiKey,B.serverUrl=Q.serverUrl),B.errorParser=new F,B.moduleCollector=new K,B.requestInfoCollector=new L,B.submissionAdapter=new N,a.report.subscribe(o),a.extendToAsynchronousCallbacks(),Error.stackTraceLimit=1/0,t});
+!function(e,t){function n(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function r(e){return"undefined"==typeof e}if(e){var i={},o=e.TraceKit,s=[].slice,a="?";i.noConflict=function(){return e.TraceKit=o,i},i.wrap=function(e){function t(){try{return e.apply(this,arguments)}catch(t){throw i.report(t),t}}return t},i.report=function(){function t(e){u(),d.push(e)}function r(e){for(var t=d.length-1;t>=0;--t)d[t]===e&&d.splice(t,1)}function o(e,t){var r=null;if(!t||i.collectWindowErrors){for(var o in d)if(n(d,o))try{d[o].apply(null,[e].concat(s.call(arguments,2)))}catch(a){r=a}if(r)throw r}}function a(e,t,n,r,s){var a=null;if(v)i.computeStackTrace.augmentStackTraceWithInitialElement(v,t,n,e),c();else if(s)a=i.computeStackTrace(s),o(a,!0);else{var u={url:t,line:n,column:r};u.func=i.computeStackTrace.guessFunctionName(u.url,u.line),u.context=i.computeStackTrace.gatherContext(u.url,u.line),a={mode:"onerror",message:e,stack:[u]},o(a,!0)}return!!f&&f.apply(this,arguments)}function u(){p!==!0&&(f=e.onerror,e.onerror=a,p=!0)}function c(){var e=v,t=h;h=null,v=null,g=null,o.apply(null,[e,!1].concat(t))}function l(t){if(v){if(g===t)return;c()}var n=i.computeStackTrace(t);throw v=n,g=t,h=s.call(arguments,1),e.setTimeout(function(){g===t&&c()},n.incomplete?2e3:0),t}var f,p,d=[],h=null,g=null,v=null;return l.subscribe=t,l.unsubscribe=r,l}(),i.computeStackTrace=function(){function t(t){if(!i.remoteFetching)return"";try{var n=function(){try{return new e.XMLHttpRequest}catch(t){return new e.ActiveXObject("Microsoft.XMLHTTP")}},r=n();return r.open("GET",t,!1),r.send(""),r.responseText}catch(o){return""}}function o(r){if("string"!=typeof r)return[];if(!n(w,r)){var i="",o="";try{o=e.document.domain}catch(s){}var a=/(.*)\:\/\/([^:\/]+)([:\d]*)\/{0,1}([\s\S]*)/.exec(r);a&&a[2]===o&&(i=t(r)),w[r]=i?i.split("\n"):[]}return w[r]}function s(e,t){var n,i=/function ([^(]*)\(([^)]*)\)/,s=/['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/,u="",c=10,l=o(e);if(!l.length)return a;for(var f=0;f<c;++f)if(u=l[t-f]+u,!r(u)){if(n=s.exec(u))return n[1];if(n=i.exec(u))return n[1]}return a}function u(e,t){var n=o(e);if(!n.length)return null;var s=[],a=Math.floor(i.linesOfContext/2),u=a+i.linesOfContext%2,c=Math.max(0,t-a-1),l=Math.min(n.length,t+u-1);t-=1;for(var f=c;f<l;++f)r(n[f])||s.push(n[f]);return s.length>0?s:null}function c(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g,"\\$&")}function l(e){return c(e).replace("<","(?:<|&lt;)").replace(">","(?:>|&gt;)").replace("&","(?:&|&amp;)").replace('"','(?:"|&quot;)').replace(/\s+/g,"\\s+")}function f(e,t){for(var n,r,i=0,s=t.length;i<s;++i)if((n=o(t[i])).length&&(n=n.join("\n"),r=e.exec(n)))return{url:t[i],line:n.substring(0,r.index).split("\n").length,column:r.index-n.lastIndexOf("\n",r.index)-1};return null}function p(e,t,n){var r,i=o(t),s=new RegExp("\\b"+c(e)+"\\b");return n-=1,i&&i.length>n&&(r=s.exec(i[n]))?r.index:null}function d(t){if(!r(e&&e.document)){for(var n,i,o,s,a=[e.location.href],u=e.document.getElementsByTagName("script"),p=""+t,d=/^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,h=/^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,g=0;g<u.length;++g){var v=u[g];v.src&&a.push(v.src)}if(o=d.exec(p)){var m=o[1]?"\\s+"+o[1]:"",y=o[2].split(",").join("\\s*,\\s*");n=c(o[3]).replace(/;$/,";?"),i=new RegExp("function"+m+"\\s*\\(\\s*"+y+"\\s*\\)\\s*{\\s*"+n+"\\s*}")}else i=new RegExp(c(p).replace(/\s+/g,"\\s+"));if(s=f(i,a))return s;if(o=h.exec(p)){var b=o[1];if(n=l(o[2]),i=new RegExp("on"+b+"=[\\'\"]\\s*"+n+"\\s*[\\'\"]","i"),s=f(i,a[0]))return s;if(i=new RegExp(n),s=f(i,a))return s}return null}}function h(e){if(!e.stack)return null;for(var t,n,i=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,o=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|\[native).*?)(?::(\d+))?(?::(\d+))?\s*$/i,c=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:ms-appx|https?|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,l=e.stack.split("\n"),f=[],d=/^(.*) is undefined$/.exec(e.message),h=0,g=l.length;h<g;++h){if(t=i.exec(l[h])){var v=t[2]&&t[2].indexOf("native")!==-1;n={url:v?null:t[2],func:t[1]||a,args:v?[t[2]]:[],line:t[3]?+t[3]:null,column:t[4]?+t[4]:null}}else if(t=c.exec(l[h]))n={url:t[2],func:t[1]||a,args:[],line:+t[3],column:t[4]?+t[4]:null};else{if(!(t=o.exec(l[h])))continue;n={url:t[3],func:t[1]||a,args:t[2]?t[2].split(","):[],line:t[4]?+t[4]:null,column:t[5]?+t[5]:null}}!n.func&&n.line&&(n.func=s(n.url,n.line)),n.line&&(n.context=u(n.url,n.line)),f.push(n)}return f.length?(f[0]&&f[0].line&&!f[0].column&&d?f[0].column=p(d[1],f[0].url,f[0].line):f[0].column||r(e.columnNumber)||(f[0].column=e.columnNumber+1),{mode:"stack",name:e.name,message:e.message,stack:f}):null}function g(e){var t=e.stacktrace;if(t){for(var n,r=/ line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i,i=/ line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i,o=t.split("\n"),a=[],c=0;c<o.length;c+=2){var l=null;if((n=r.exec(o[c]))?l={url:n[2],line:+n[1],column:null,func:n[3],args:[]}:(n=i.exec(o[c]))&&(l={url:n[6],line:+n[1],column:+n[2],func:n[3]||n[4],args:n[5]?n[5].split(","):[]}),l){if(!l.func&&l.line&&(l.func=s(l.url,l.line)),l.line)try{l.context=u(l.url,l.line)}catch(f){}l.context||(l.context=[o[c+1]]),a.push(l)}}return a.length?{mode:"stacktrace",name:e.name,message:e.message,stack:a}:null}}function v(t){var r=t.message.split("\n");if(r.length<4)return null;var i,a=/^\s*Line (\d+) of linked script ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i,c=/^\s*Line (\d+) of inline#(\d+) script in ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i,p=/^\s*Line (\d+) of function script\s*$/i,d=[],h=e&&e.document&&e.document.getElementsByTagName("script"),g=[];for(var v in h)n(h,v)&&!h[v].src&&g.push(h[v]);for(var m=2;m<r.length;m+=2){var y=null;if(i=a.exec(r[m]))y={url:i[2],func:i[3],args:[],line:+i[1],column:null};else if(i=c.exec(r[m])){y={url:i[3],func:i[4],args:[],line:+i[1],column:null};var b=+i[1],S=g[i[2]-1];if(S){var x=o(y.url);if(x){x=x.join("\n");var w=x.indexOf(S.innerText);w>=0&&(y.line=b+x.substring(0,w).split("\n").length)}}}else if(i=p.exec(r[m])){var _=e.location.href.replace(/#.*$/,""),E=new RegExp(l(r[m+1])),I=f(E,[_]);y={url:_,func:"",args:[],line:I?I.line:i[1],column:null}}if(y){y.func||(y.func=s(y.url,y.line));var P=u(y.url,y.line),T=P?P[Math.floor(P.length/2)]:null;P&&T.replace(/^\s*/,"")===r[m+1].replace(/^\s*/,"")?y.context=P:y.context=[r[m+1]],d.push(y)}}return d.length?{mode:"multiline",name:t.name,message:r[0],stack:d}:null}function m(e,t,n,r){var i={url:t,line:n};if(i.url&&i.line){e.incomplete=!1,i.func||(i.func=s(i.url,i.line)),i.context||(i.context=u(i.url,i.line));var o=/ '([^']+)' /.exec(r);if(o&&(i.column=p(o[1],i.url,i.line)),e.stack.length>0&&e.stack[0].url===i.url){if(e.stack[0].line===i.line)return!1;if(!e.stack[0].line&&e.stack[0].func===i.func)return e.stack[0].line=i.line,e.stack[0].context=i.context,!1}return e.stack.unshift(i),e.partial=!0,!0}return e.incomplete=!0,!1}function y(e,t){for(var n,r,o,u=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,c=[],l={},f=!1,h=y.caller;h&&!f;h=h.caller)if(h!==b&&h!==i.report){if(r={url:null,func:a,args:[],line:null,column:null},h.name?r.func=h.name:(n=u.exec(h.toString()))&&(r.func=n[1]),"undefined"==typeof r.func)try{r.func=n.input.substring(0,n.input.indexOf("{"))}catch(g){}if(o=d(h)){r.url=o.url,r.line=o.line,r.func===a&&(r.func=s(r.url,r.line));var v=/ '([^']+)' /.exec(e.message||e.description);v&&(r.column=p(v[1],o.url,o.line))}l[""+h]?f=!0:l[""+h]=!0,c.push(r)}t&&c.splice(0,t);var S={mode:"callers",name:e.name,message:e.message,stack:c};return m(S,e.sourceURL||e.fileName,e.line||e.lineNumber,e.message||e.description),S}function b(e,t){var n=null;t=null==t?0:+t;try{if(n=g(e))return n}catch(r){if(x)throw r}try{if(n=h(e))return n}catch(r){if(x)throw r}try{if(n=v(e))return n}catch(r){if(x)throw r}try{if(n=y(e,t+1))return n}catch(r){if(x)throw r}return{mode:"failed"}}function S(e){e=(null==e?0:+e)+1;try{throw new Error}catch(t){return b(t,e+1)}}var x=!1,w={};return b.augmentStackTraceWithInitialElement=m,b.guessFunctionName=s,b.gatherContext=u,b.ofCaller=S,b.getSource=o,b}(),i.extendToAsynchronousCallbacks=function(){var t=function(t){var n=e[t];e[t]=function(){var e=s.call(arguments),t=e[0];return"function"==typeof t&&(e[0]=i.wrap(t)),n.apply?n.apply(this,e):n(e[0],e[1])}};t("setTimeout"),t("setInterval")},i.remoteFetching||(i.remoteFetching=!0),i.collectWindowErrors||(i.collectWindowErrors=!0),(!i.linesOfContext||i.linesOfContext<1)&&(i.linesOfContext=11),"undefined"!=typeof module&&module.exports&&this.module!==module?module.exports=i:"function"==typeof define&&define.amd?define("TraceKit",[],i):e.TraceKit=i}}("undefined"!=typeof window?window:global),function(e,t){"function"==typeof define&&define.amd?define("exceptionless",["require","exports","module","TraceKit"],t):"object"==typeof exports?module.exports=t(require,exports,module,require("TraceKit")):e.exceptionless=t(require,exports,module,e.TraceKit)}(this,function(e,t,n,r){function i(e,t){var n=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/g;if("string"==typeof t){var r=n.exec(t);if(r)return new Date(t)}return t}function o(){if(!document||!document.getElementsByTagName)return null;for(var e=document.getElementsByTagName("script"),t=0;t<e.length;t++)if(e[t].src&&e[t].src.indexOf("/exceptionless")>-1)return S.parseQueryString(e[t].src.split("?").pop());return null}function s(e,t){var n=E["default"].createUnhandledException(new Error(e.message||(t||{}).status||"Script error"),"onerror");n.pluginContextData["@@_TraceKit.StackTrace"]=e,n.submit()}if(e||(e=function(e){return("undefined"!=typeof window?window:global)[e]}),!t)var t={};var a=this&&this.__extends||function(e,t){function n(){this.constructor=e}for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)},r=e("TraceKit"),u=function(){function e(e,t){this.success=!1,this.badRequest=!1,this.serviceUnavailable=!1,this.paymentRequired=!1,this.unableToAuthenticate=!1,this.notFound=!1,this.requestEntityTooLarge=!1,this.statusCode=e,this.message=t,this.success=e>=200&&e<=299,this.badRequest=400===e,this.serviceUnavailable=503===e,this.paymentRequired=402===e,this.unableToAuthenticate=401===e||403===e,this.notFound=404===e,this.requestEntityTooLarge=413===e}return e}();t.SubmissionResponse=u;var c=function(){function e(){}return e.onChanged=function(e){!!e&&this._handlers.push(e)},e.applySavedServerSettings=function(e){if(e&&e.isValid){var t=this.getSavedServerSettings(e);e.log.info("Applying saved settings: v"+t.version),e.settings=S.merge(e.settings,t.settings),this.changed(e)}},e.getVersion=function(e){if(!e||!e.isValid)return 0;var t=this.getSavedServerSettings(e);return t.version||0},e.checkVersion=function(e,t){var n=this.getVersion(t);e<=n||(t.log.info("Updating settings from v"+n+" to v"+e),this.updateSettings(t,n))},e.updateSettings=function(t,n){var r=this;if(t&&t.enabled){var i="Unable to update settings";if(!t.isValid)return void t.log.error(i+": ApiKey is not set.");(!n||n<0)&&(n=this.getVersion(t)),t.log.info("Checking for updated settings from: v"+n+"."),t.submissionClient.getSettings(t,n,function(n){if(!(t&&n&&n.success&&n.settings))return void t.log.warn(i+": "+n.message);t.settings=S.merge(t.settings,n.settings);var o=e.getSavedServerSettings(t);for(var s in o)n.settings[s]||delete t.settings[s];var a={version:n.settingsVersion,settings:n.settings};t.storage.settings.save(a),t.log.info("Updated settings: v"+a.version),r.changed(t)})}},e.changed=function(e){for(var t=this._handlers,n=0;n<t.length;n++)try{t[n](e)}catch(r){e.log.error("Error calling onChanged handler: "+r)}},e.getSavedServerSettings=function(e){var t=e.storage.settings.get()[0];return t&&t.value&&t.value.version&&t.value.settings?t.value:{version:0,settings:{}}},e._handlers=[],e}();t.SettingsManager=c;var l=function(){function e(){this._lastReferenceId=null}return e.prototype.getLast=function(){return this._lastReferenceId},e.prototype.clearLast=function(){this._lastReferenceId=null},e.prototype.setLast=function(e){this._lastReferenceId=e},e}();t.DefaultLastReferenceIdManager=l;var f=function(){function e(){}return e.prototype.info=function(e){this.log("info",e)},e.prototype.warn=function(e){this.log("warn",e)},e.prototype.error=function(e){this.log("error",e)},e.prototype.log=function(e,t){console&&console[e]&&console[e]("["+e+"] Exceptionless: "+t)},e}();t.ConsoleLog=f;var p=function(){function e(){}return e.prototype.info=function(e){},e.prototype.warn=function(e){},e.prototype.error=function(e){},e}();t.NullLog=p;var d=function(){function e(e,t,n){this.client=e,this.event=t,this.contextData=n?n:new _}return Object.defineProperty(e.prototype,"log",{get:function(){return this.client.config.log},enumerable:!0,configurable:!0}),e}();t.EventPluginContext=d;var h=function(){function e(){}return e.run=function(e,t){var n=function(n,r){return function(){try{e.cancelled||n.run(e,r)}catch(i){e.cancelled=!0,e.log.error("Error running plugin '"+n.name+"': "+i.message+". Discarding Event.")}e.cancelled&&t&&t(e)}},r=e.client.config.plugins,i=[];t&&(i[r.length]=n({name:"cb",priority:9007199254740992,run:t},null));for(var o=r.length-1;o>-1;o--)i[o]=n(r[o],t||o<r.length-1?i[o+1]:null);i[0]()},e.addDefaultPlugins=function(e){e.addPlugin(new I),e.addPlugin(new P),e.addPlugin(new U),e.addPlugin(new q),e.addPlugin(new T),e.addPlugin(new C),e.addPlugin(new R),e.addPlugin(new k)},e}();t.EventPluginManager=h;var g=function(){function e(e){void 0===e&&(e=3e4),this.priority=100,this.name="HeartbeatPlugin",this._interval=e}return e.prototype.run=function(e,t){clearInterval(this._intervalId);var n=e.event.data["@user"];n&&n.identity&&(this._intervalId=setInterval(function(){return e.client.submitSessionHeartbeat(n.identity)},this._interval)),t&&t()},e}();t.HeartbeatPlugin=g;var v=function(){function e(){this.priority=20,this.name="ReferenceIdPlugin"}return e.prototype.run=function(e,t){e.event.reference_id&&0!==e.event.reference_id.length||"error"!==e.event.type||(e.event.reference_id=S.guid().replace("-","").substring(0,10)),t&&t()},e}();t.ReferenceIdPlugin=v;var m=function(){function e(e){this._handlers=[],this._processingQueue=!1,this._config=e}return e.prototype.enqueue=function(e){var t="The event will not be queued.",n=this._config,r=n.log;if(!n.enabled)return void r.info("Configuration is disabled. "+t);if(!n.isValid)return void r.info("Invalid Api Key. "+t);if(this.areQueuedItemsDiscarded())return void r.info("Queue items are currently being discarded. "+t);this.ensureQueueTimer();var i=n.storage.queue.save(e),o="type="+e.type+" "+(e.reference_id?"refid="+e.reference_id:"");i?r.info("Enqueuing event: "+i+" "+o):r.error("Could not enqueue event "+o)},e.prototype.process=function(e){var t=this,n="The queue will not be processed.",r=this._config,i=r.log;if(!this._processingQueue){if(i.info("Processing queue..."),!r.enabled)return void i.info("Configuration is disabled. "+n);if(!r.isValid)return void i.info("Invalid Api Key. "+n);this._processingQueue=!0,this.ensureQueueTimer();try{var o=r.storage.queue.get(r.submissionBatchSize);if(!o||0===o.length)return void(this._processingQueue=!1);i.info("Sending "+o.length+" events to "+r.serverUrl+"."),r.submissionClient.postEvents(o.map(function(e){return e.value}),r,function(e){t.processSubmissionResponse(e,o),t.eventsPosted(o.map(function(e){return e.value}),e),i.info("Finished processing queue."),t._processingQueue=!1},e)}catch(s){i.error("Error processing queue: "+s),this.suspendProcessing(),this._processingQueue=!1}}},e.prototype.suspendProcessing=function(e,t,n){var r=this._config;(!e||e<=0)&&(e=5),r.log.info("Suspending processing for "+e+" minutes."),this._suspendProcessingUntil=new Date((new Date).getTime()+6e4*e),t&&(this._discardQueuedItemsUntil=this._suspendProcessingUntil),n&&r.storage.queue.clear()},e.prototype.onEventsPosted=function(e){!!e&&this._handlers.push(e)},e.prototype.eventsPosted=function(e,t){for(var n=this._handlers,r=0;r<n.length;r++)try{n[r](e,t)}catch(i){this._config.log.error("Error calling onEventsPosted handler: "+i)}},e.prototype.areQueuedItemsDiscarded=function(){return this._discardQueuedItemsUntil&&this._discardQueuedItemsUntil>new Date},e.prototype.ensureQueueTimer=function(){var e=this;this._queueTimer||(this._queueTimer=setInterval(function(){return e.onProcessQueue()},1e4))},e.prototype.isQueueProcessingSuspended=function(){return this._suspendProcessingUntil&&this._suspendProcessingUntil>new Date},e.prototype.onProcessQueue=function(){this.isQueueProcessingSuspended()||this._processingQueue||this.process()},e.prototype.processSubmissionResponse=function(e,t){var n="The event will not be submitted.",r=this._config,i=r.log;if(e.success)return i.info("Sent "+t.length+" events."),void this.removeEvents(t);if(e.serviceUnavailable)return i.error("Server returned service unavailable."),void this.suspendProcessing();if(e.paymentRequired)return i.info("Too many events have been submitted, please upgrade your plan."),void this.suspendProcessing(null,!0,!0);if(e.unableToAuthenticate)return i.info("Unable to authenticate, please check your configuration. "+n),this.suspendProcessing(15),void this.removeEvents(t);if(e.notFound||e.badRequest)return i.error("Error while trying to submit data: "+e.message),this.suspendProcessing(240),void this.removeEvents(t);if(e.requestEntityTooLarge){var o="Event submission discarded for being too large.";return void(r.submissionBatchSize>1?(i.error(o+" Retrying with smaller batch size."),r.submissionBatchSize=Math.max(1,Math.round(r.submissionBatchSize/1.5))):(i.error(o+" "+n),this.removeEvents(t)))}e.success||(i.error("Error submitting events: "+(e.message||"Please check the network tab for more info.")),this.suspendProcessing())},e.prototype.removeEvents=function(e){for(var t=0;t<(e||[]).length;t++)this._config.storage.queue.remove(e[t].timestamp)},e}();t.DefaultEventQueue=m;var y=function(){function e(e){void 0===e&&(e=250),this.queue=new O(e),this.settings=new O(1)}return e}();t.InMemoryStorageProvider=y;var b=function(){function e(){this.configurationVersionHeader="x-exceptionless-configversion"}return e.prototype.postEvents=function(e,t,n,r){var i=JSON.stringify(e),o=this.createRequest(t,"POST",t.serverUrl+"/api/v2/events",i),s=this.createSubmissionCallback(t,n);return t.submissionAdapter.sendRequest(o,s,r)},e.prototype.postUserDescription=function(e,t,n,r){var i=n.serverUrl+"/api/v2/events/by-ref/"+encodeURIComponent(e)+"/user-description",o=JSON.stringify(t),s=this.createRequest(n,"POST",i,o),a=this.createSubmissionCallback(n,r);return n.submissionAdapter.sendRequest(s,a)},e.prototype.getSettings=function(e,t,n){var r=this.createRequest(e,"GET",e.serverUrl+"/api/v2/projects/config?v="+t),i=function(t,r,i,o){if(200!==t)return n(new M((!1),null,(-1),null,r));var s;try{s=JSON.parse(i)}catch(a){e.log.error("Unable to parse settings: '"+i+"'")}return!s||isNaN(s.version)?n(new M((!1),null,(-1),null,"Invalid configuration settings.")):void n(new M((!0),s.settings||{},s.version))};return e.submissionAdapter.sendRequest(r,i)},e.prototype.sendHeartbeat=function(e,t,n){var r=this.createRequest(n,"GET",n.heartbeatServerUrl+"/api/v2/events/session/heartbeat?id="+e+"&close="+t);n.submissionAdapter.sendRequest(r)},e.prototype.createRequest=function(e,t,n,r){return void 0===r&&(r=null),{method:t,url:n,data:r,apiKey:e.apiKey,userAgent:e.userAgent}},e.prototype.createSubmissionCallback=function(e,t){var n=this;return function(r,i,o,s){var a=s&&parseInt(s[n.configurationVersionHeader],10);c.checkVersion(a,e),t(new u(r,i))}},e}();t.DefaultSubmissionClient=b;var S=function(){function e(){}return e.addRange=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];if(e||(e=[]),!t||0===t.length)return e;for(var r=0;r<t.length;r++)t[r]&&e.indexOf(t[r])<0&&e.push(t[r]);return e},e.getHashCode=function(e){if(!e||0===e.length)return 0;for(var t=0,n=0;n<e.length;n++){var r=e.charCodeAt(n);t=(t<<5)-t+r,t|=0}return t},e.getCookies=function(t,n){for(var r={},i=(t||"").split("; "),o=0;o<i.length;o++){var s=i[o].split("=");e.isMatch(s[0],n)||(r[s[0]]=s[1])}return e.isEmpty(r)?null:r},e.guid=function(){function e(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()},e.merge=function(e,t){var n={};for(var r in e||{})e[r]&&(n[r]=e[r]);for(var r in t||{})t[r]&&(n[r]=t[r]);return n},e.parseVersion=function(e){if(!e)return null;var t=/(v?((\d+)\.(\d+)(\.(\d+))?)(?:-([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?(?:\+([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?)/,n=t.exec(e);return n&&n.length>0?n[0]:null},e.parseQueryString=function(t,n){if(!t||0===t.length)return null;var r=t.split("&");if(0===r.length)return null;for(var i={},o=0;o<r.length;o++){var s=r[o].split("=");e.isMatch(s[0],n)||(i[decodeURIComponent(s[0])]=decodeURIComponent(s[1]))}return e.isEmpty(i)?null:i},e.randomNumber=function(){return Math.floor(9007199254740992*Math.random())},e.isMatch=function(t,n,r){if(void 0===r&&(r=!0),!t||"string"!=typeof t)return!1;var i=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;return t=(r?t.toLowerCase():t).replace(i,""),(n||[]).some(function(n){if("string"!=typeof n)return!1;if(n=(r?n.toLowerCase():n).replace(i,""),n.length<=0)return!1;var o="*"===n[0];o&&(n=n.slice(1));var s="*"===n[n.length-1];return s&&(n=n.substring(0,n.length-1)),o&&s?n.length<=t.length&&t.indexOf(n,0)!==-1:o?e.endsWith(t,n):s?e.startsWith(t,n):t===n})},e.isEmpty=function(e){return null===e||"object"==typeof e&&0===Object.keys(e).length},e.startsWith=function(e,t){return e.substring(0,t.length)===t},e.endsWith=function(e,t){return e.indexOf(t,e.length-t.length)!==-1},e.stringify=function(t,n,r){function i(t,n){var r=[];return JSON.stringify(t,function(t,i){if(!e.isMatch(t,n)){if("object"==typeof i&&i){if(r.indexOf(i)!==-1)return;r.push(i)}return i}})}if("[object Object]"==={}.toString.call(t)){var o={};for(var s in t){var a=t[s];a!==t&&(o[s]=t[s])}return i(o,n)}if("[object Array]"==={}.toString.call(t)){for(var u=[],c=0;c<t.length;c++)u[c]=JSON.parse(i(t[c],n));return JSON.stringify(u)}return i(t,n)},e.toBoolean=function(e,t){if(void 0===t&&(t=!1),"boolean"==typeof e)return e;if(null===e||"number"!=typeof e&&"string"!=typeof e)return t;switch((e+"").toLowerCase().trim()){case"true":case"yes":case"1":return!0;case"false":case"no":case"0":case null:return!1}return t},e}();t.Utils=S;var x=function(){function e(t){function n(e){return"function"==typeof e?e(this):e}this.defaultTags=[],this.defaultData={},this.enabled=!0,this.lastReferenceIdManager=new l,this.settings={},this._serverUrl="https://collector.exceptionless.io",this._heartbeatServerUrl="https://heartbeat.exceptionless.io",this._updateSettingsWhenIdleInterval=12e4,this._dataExclusions=[],this._userAgentBotPatterns=[],this._plugins=[],this._handlers=[],t=S.merge(e.defaults,t),this.log=n(t.log)||new p,this.apiKey=t.apiKey,this.serverUrl=t.serverUrl,this.heartbeatServerUrl=t.heartbeatServerUrl,this.updateSettingsWhenIdleInterval=t.updateSettingsWhenIdleInterval,this.environmentInfoCollector=n(t.environmentInfoCollector),this.errorParser=n(t.errorParser),this.lastReferenceIdManager=n(t.lastReferenceIdManager)||new l,this.moduleCollector=n(t.moduleCollector),this.requestInfoCollector=n(t.requestInfoCollector),this.submissionBatchSize=n(t.submissionBatchSize)||50,this.submissionAdapter=n(t.submissionAdapter),this.submissionClient=n(t.submissionClient)||new b,this.storage=n(t.storage)||new y,this.queue=n(t.queue)||new m(this),c.applySavedServerSettings(this),h.addDefaultPlugins(this)}return Object.defineProperty(e.prototype,"apiKey",{get:function(){return this._apiKey},set:function(e){this._apiKey=e||null,this.log.info("apiKey: "+this._apiKey),this.changed()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isValid",{get:function(){return!!this.apiKey&&this.apiKey.length>=10},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"serverUrl",{get:function(){return this._serverUrl},set:function(e){e&&(this._serverUrl=e,this._heartbeatServerUrl=e,this.log.info("serverUrl: "+e),this.changed())},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"heartbeatServerUrl",{get:function(){return this._heartbeatServerUrl},set:function(e){e&&(this._heartbeatServerUrl=e,this.log.info("heartbeatServerUrl: "+e),this.changed())},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updateSettingsWhenIdleInterval",{get:function(){return this._updateSettingsWhenIdleInterval},set:function(e){"number"==typeof e&&(e<=0?e=-1:e>0&&e<15e3&&(e=15e3),this._updateSettingsWhenIdleInterval=e,this.log.info("updateSettingsWhenIdleInterval: "+e),this.changed())},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataExclusions",{get:function(){var e=this.settings["@@DataExclusions"];return this._dataExclusions.concat(e&&e.split(",")||[])},enumerable:!0,configurable:!0}),e.prototype.addDataExclusions=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];this._dataExclusions=S.addRange.apply(S,[this._dataExclusions].concat(e))},Object.defineProperty(e.prototype,"userAgentBotPatterns",{get:function(){var e=this.settings["@@UserAgentBotPatterns"];return this._userAgentBotPatterns.concat(e&&e.split(",")||[])},enumerable:!0,configurable:!0}),e.prototype.addUserAgentBotPatterns=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];this._userAgentBotPatterns=S.addRange.apply(S,[this._userAgentBotPatterns].concat(e))},Object.defineProperty(e.prototype,"plugins",{get:function(){return this._plugins.sort(function(e,t){return e.priority<t.priority?-1:e.priority>t.priority?1:0})},enumerable:!0,configurable:!0}),e.prototype.addPlugin=function(e,t,n){var r=n?{name:e,priority:t,run:n}:e;if(!r||!r.run)return void this.log.error("Add plugin failed: Run method not defined");r.name||(r.name=S.guid()),r.priority||(r.priority=0);for(var i=!1,o=this._plugins,s=0;s<o.length;s++)if(o[s].name===r.name){i=!0;break}i||o.push(r)},e.prototype.removePlugin=function(e){var t="string"==typeof e?e:e.name;if(!t)return void this.log.error("Remove plugin failed: Plugin name not defined");for(var n=this._plugins,r=0;r<n.length;r++)if(n[r].name===t){n.splice(r,1);break}},e.prototype.setVersion=function(e){e&&(this.defaultData["@version"]=e)},e.prototype.setUserIdentity=function(e,t){var n="@user",r="string"!=typeof e?e:{identity:e,name:t},i=!r||!r.identity&&!r.name;i?delete this.defaultData[n]:this.defaultData[n]=r,this.log.info("user identity: "+(i?"null":r.identity))},Object.defineProperty(e.prototype,"userAgent",{get:function(){return"exceptionless-js/1.4.1"},enumerable:!0,configurable:!0}),e.prototype.useSessions=function(e,t){void 0===e&&(e=!0),void 0===t&&(t=3e4),e&&this.addPlugin(new g(t))},e.prototype.useReferenceIds=function(){this.addPlugin(new v)},e.prototype.useLocalStorage=function(){},e.prototype.useDebugLogger=function(){this.log=new f},e.prototype.onChanged=function(e){!!e&&this._handlers.push(e)},e.prototype.changed=function(){for(var e=this._handlers,t=0;t<e.length;t++)try{e[t](this)}catch(n){this.log.error("Error calling onChanged handler: "+n)}},Object.defineProperty(e,"defaults",{get:function(){return null===e._defaultSettings&&(e._defaultSettings={}),e._defaultSettings},enumerable:!0,configurable:!0}),e._defaultSettings=null,e}();t.Configuration=x;var w=function(){function e(e,t,n){this._validIdentifierErrorMessage="must contain between 8 and 100 alphanumeric or '-' characters.",this.target=e,this.client=t,this.pluginContextData=n||new _}return e.prototype.setType=function(e){return e&&(this.target.type=e),this},e.prototype.setSource=function(e){return e&&(this.target.source=e),this},e.prototype.setReferenceId=function(e){if(!this.isValidIdentifier(e))throw new Error("ReferenceId "+this._validIdentifierErrorMessage);return this.target.reference_id=e,this},e.prototype.setEventReference=function(e,t){if(!e)throw new Error("Invalid name");if(!t||!this.isValidIdentifier(t))throw new Error("Id "+this._validIdentifierErrorMessage);return this.setProperty("@ref:"+e,t),this},e.prototype.setMessage=function(e){return e&&(this.target.message=e),this},e.prototype.setGeo=function(e,t){if(e<-90||e>90)throw new Error("Must be a valid latitude value between -90.0 and 90.0.");if(t<-180||t>180)throw new Error("Must be a valid longitude value between -180.0 and 180.0.");return this.target.geo=e+","+t,this},e.prototype.setUserIdentity=function(e,t){var n="string"!=typeof e?e:{identity:e,name:t};return n&&(n.identity||n.name)?(this.setProperty("@user",n),this):this},e.prototype.setUserDescription=function(e,t){return e&&t&&this.setProperty("@user_description",{email_address:e,description:t}),this},e.prototype.setManualStackingInfo=function(e,t){if(e){var n={signature_data:e};t&&(n.title=t),this.setProperty("@stack",n)}return this},e.prototype.setManualStackingKey=function(e,t){if(e){var n={ManualStackingKey:e};this.setManualStackingInfo(n,t)}return this},e.prototype.setValue=function(e){return e&&(this.target.value=e),this},e.prototype.addTags=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return this.target.tags=S.addRange.apply(S,[this.target.tags].concat(e)),this},e.prototype.setProperty=function(e,t,n,r){if(!e||void 0===t||null==t)return this;this.target.data||(this.target.data={});var i=JSON.parse(S.stringify(t,this.client.config.dataExclusions.concat(r||[]),n));return S.isEmpty(i)||(this.target.data[e]=i),this},e.prototype.markAsCritical=function(e){return e&&this.addTags("Critical"),this},e.prototype.addRequestInfo=function(e){return e&&(this.pluginContextData["@request"]=e),this},e.prototype.submit=function(e){this.client.submitEvent(this.target,this.pluginContextData,e)},e.prototype.isValidIdentifier=function(e){if(!e)return!0;if(e.length<8||e.length>100)return!1;for(var t=0;t<e.length;t++){var n=e.charCodeAt(t),r=n>=48&&n<=57,i=n>=65&&n<=90||n>=97&&n<=122,o=45===n;if(!r&&!i&&!o)return!1}return!0},e}();t.EventBuilder=w;var _=function(){function e(){}return e.prototype.setException=function(e){e&&(this["@@_Exception"]=e)},Object.defineProperty(e.prototype,"hasException",{get:function(){return!!this["@@_Exception"]},enumerable:!0,configurable:!0}),e.prototype.getException=function(){return this["@@_Exception"]||null},e.prototype.markAsUnhandledError=function(){this["@@_IsUnhandledError"]=!0},Object.defineProperty(e.prototype,"isUnhandledError",{get:function(){return!!this["@@_IsUnhandledError"]},enumerable:!0,configurable:!0}),e.prototype.setSubmissionMethod=function(e){e&&(this["@@_SubmissionMethod"]=e)},e.prototype.getSubmissionMethod=function(){return this["@@_SubmissionMethod"]||null},e}();t.ContextData=_;var E=function(){function e(e,t){var n=this;"object"==typeof e?this.config=new x(e):this.config=new x({apiKey:e,serverUrl:t}),this.updateSettingsTimer(5e3),this.config.onChanged(function(e){return n.updateSettingsTimer(n._timeoutId>0?5e3:0)}),this.config.queue.onEventsPosted(function(e,t){return n.updateSettingsTimer()})}return e.prototype.createException=function(e){var t=new _;return t.setException(e),this.createEvent(t).setType("error")},e.prototype.submitException=function(e,t){this.createException(e).submit(t)},e.prototype.createUnhandledException=function(e,t){var n=this.createException(e);return n.pluginContextData.markAsUnhandledError(),n.pluginContextData.setSubmissionMethod(t),n},e.prototype.submitUnhandledException=function(e,t,n){this.createUnhandledException(e,t).submit(n)},e.prototype.createFeatureUsage=function(e){return this.createEvent().setType("usage").setSource(e)},e.prototype.submitFeatureUsage=function(e,t){this.createFeatureUsage(e).submit(t)},e.prototype.createLog=function(e,t,n){var r=this.createEvent().setType("log");if(t&&n)r=r.setSource(e).setMessage(t).setProperty("@level",n);else if(t)r=r.setSource(e).setMessage(t);else{
+var i=arguments.callee.caller;r=r.setSource(i&&i.name).setMessage(e)}return r},e.prototype.submitLog=function(e,t,n,r){this.createLog(e,t,n).submit(r)},e.prototype.createNotFound=function(e){return this.createEvent().setType("404").setSource(e)},e.prototype.submitNotFound=function(e,t){this.createNotFound(e).submit(t)},e.prototype.createSessionStart=function(){return this.createEvent().setType("session")},e.prototype.submitSessionStart=function(e){this.createSessionStart().submit(e)},e.prototype.submitSessionEnd=function(e){e&&(this.config.log.info("Submitting session end: "+e),this.config.submissionClient.sendHeartbeat(e,!0,this.config))},e.prototype.submitSessionHeartbeat=function(e){e&&(this.config.log.info("Submitting session heartbeat: "+e),this.config.submissionClient.sendHeartbeat(e,!1,this.config))},e.prototype.createEvent=function(e){return new w({date:new Date},this,e)},e.prototype.submitEvent=function(e,t,n){function r(e){return e&&(e.cancelled=!0),!!n&&n(e)}var i=new d(this,e,t);return e?this.config.enabled?(e.data||(e.data={}),e.tags&&e.tags.length||(e.tags=[]),void h.run(i,function(e){var t=e.client.config,r=e.event;e.cancelled||(r.type&&0!==r.type.length||(r.type="log"),r.date||(r.date=new Date),t.queue.enqueue(r),r.reference_id&&r.reference_id.length>0&&(e.log.info("Setting last reference id '"+r.reference_id+"'"),t.lastReferenceIdManager.setLast(r.reference_id))),!!n&&n(e)})):(this.config.log.info("Event submission is currently disabled."),r(i)):r(i)},e.prototype.updateUserEmailAndDescription=function(e,t,n,r){var i=this;if(!(e&&t&&n&&this.config.enabled))return!!r&&r(new u(500,"cancelled"));var o={email_address:t,description:n};this.config.submissionClient.postUserDescription(e,o,this.config,function(t){t.success||i.config.log.error("Failed to submit user email and description for event '"+e+"': "+t.statusCode+" "+t.message),!!r&&r(t)})},e.prototype.getLastReferenceId=function(){return this.config.lastReferenceIdManager.getLast()},e.prototype.updateSettingsTimer=function(e){var t=this;this.config.log.info("Updating settings timer with delay: "+e),this._timeoutId=clearTimeout(this._timeoutId),this._timeoutId=clearInterval(this._intervalId);var n=this.config.updateSettingsWhenIdleInterval;if(n>0){var r=function(){return c.updateSettings(t.config)};e>0&&(this._timeoutId=setTimeout(r,e)),this._intervalId=setInterval(r,n)}},Object.defineProperty(e,"default",{get:function(){return null===e._instance&&(e._instance=new e(null)),e._instance},enumerable:!0,configurable:!0}),e._instance=null,e}();t.ExceptionlessClient=E;var I=function(){function e(){this.priority=10,this.name="ConfigurationDefaultsPlugin"}return e.prototype.run=function(e,t){for(var n=e.client.config,r=n.defaultTags||[],i=0;i<r.length;i++){var o=r[i];o&&e.event.tags.indexOf(o)<0&&e.event.tags.push(o)}var s=n.defaultData||{};for(var a in s)if(s[a]){var u=JSON.parse(S.stringify(s[a],n.dataExclusions));S.isEmpty(u)||(e.event.data[a]=u)}t&&t()},e}();t.ConfigurationDefaultsPlugin=I;var P=function(){function e(){this.priority=30,this.name="ErrorPlugin"}return e.prototype.run=function(e,t){var n="@error",r=["arguments","column","columnNumber","description","fileName","message","name","number","line","lineNumber","opera#sourceloc","sourceId","sourceURL","stack","stackArray","stacktrace"],i=e.contextData.getException();if(i&&(e.event.type="error",!e.event.data[n])){var o=e.client.config,s=o.errorParser;if(!s)throw new Error("No error parser was defined.");var a=s.parse(e,i);if(a){var u=JSON.parse(S.stringify(i,o.dataExclusions.concat(r)));S.isEmpty(u)||(a.data||(a.data={}),a.data["@ext"]=u),e.event.data[n]=a}}t&&t()},e}();t.ErrorPlugin=P;var T=function(){function e(){this.priority=50,this.name="ModuleInfoPlugin"}return e.prototype.run=function(e,t){var n="@error",r=e.client.config.moduleCollector;if(e.event.data[n]&&!e.event.data["@error"].modules&&r){var i=r.getModules(e);i&&i.length>0&&(e.event.data[n].modules=i)}t&&t()},e}();t.ModuleInfoPlugin=T;var C=function(){function e(){this.priority=70,this.name="RequestInfoPlugin"}return e.prototype.run=function(e,t){var n="@request",r=e.client.config,i=r.requestInfoCollector;if(!e.event.data[n]&&i){var o=i.getRequestInfo(e);o&&(S.isMatch(o.user_agent,r.userAgentBotPatterns)?(e.log.info("Cancelling event as the request user agent matches a known bot pattern"),e.cancelled=!0):e.event.data[n]=o)}t&&t()},e}();t.RequestInfoPlugin=C;var R=function(){function e(){this.priority=80,this.name="EnvironmentInfoPlugin"}return e.prototype.run=function(e,t){var n="@environment",r=e.client.config.environmentInfoCollector;if(!e.event.data[n]&&r){var i=r.getEnvironmentInfo(e);i&&(e.event.data[n]=i)}t&&t()},e}();t.EnvironmentInfoPlugin=R;var k=function(){function e(){this.priority=100,this.name="SubmissionMethodPlugin"}return e.prototype.run=function(e,t){var n=e.contextData.getSubmissionMethod();n&&(e.event.data["@submission_method"]=n),t&&t()},e}();t.SubmissionMethodPlugin=k;var U=function(){function e(e){void 0===e&&(e=function(){return Date.now()}),this.priority=40,this.name="DuplicateCheckerPlugin",this._processedHashcodes=[],this._getCurrentTime=e}return e.prototype.run=function(e,t){function n(e,t,n,r){for(var i=function(){var i=S.getHashCode(e.stack_trace&&JSON.stringify(e.stack_trace));if(i&&t.some(function(e){return e.hash===i&&e.timestamp>=n-2e3}))return r.info("Ignoring duplicate error event hash: "+i),{value:!0};for(t.push({hash:i,timestamp:n});t.length>20;)t.shift();e=e.inner};e;){var o=i();if("object"==typeof o)return o.value}return!1}return"error"===e.event.type&&n(e.event.data["@error"],this._processedHashcodes,this._getCurrentTime(),e.log)?void(e.cancelled=!0):void(t&&t())},e}();t.DuplicateCheckerPlugin=U;var q=function(){function e(){this.priority=45,this.name="EventExclusionPlugin"}return e.prototype.run=function(e,t){function n(e){switch((e||"").toLowerCase().trim()){case"trace":case"true":case"1":case"yes":return 0;case"debug":return 1;case"info":return 2;case"warn":return 3;case"error":return 4;case"fatal":return 5;case"off":case"false":case"0":case"no":return 6;default:return-1}}function r(e,t){return void 0===t&&(t="*"),n(i(e,"log",t,"Trace")+"")}function i(e,t,n,r){if(void 0===e&&(e={}),void 0===r&&(r=void 0),!t)return r;var i="log"===t,o="@@"+t+":",s=e[o+n];if(s)return i?s:S.toBoolean(s);for(var a in e)if(S.startsWith(a.toLowerCase(),o.toLowerCase())&&S.isMatch(n,[a.substring(o.length)]))return i?e[a]:S.toBoolean(e[a]);return r}var o=e.event,s=e.log,a=e.client.config.settings;if("log"===o.type){var u=r(a,o.source),c=n(o.data["@level"]);c>=0&&(c>5||c<u)&&(s.info("Cancelling log event due to minimum log level."),e.cancelled=!0)}else if("error"===o.type)for(var l=o.data["@error"];!e.cancelled&&l;)i(a,o.type,l.type,!0)===!1&&(s.info("Cancelling error from excluded exception type: "+l.type),e.cancelled=!0),l=l.inner;else i(a,o.type,o.source,!0)===!1&&(s.info("Cancelling event from excluded type: "+o.type+" and source: "+o.source),e.cancelled=!0);t&&t()},e}();t.EventExclusionPlugin=q;var M=function(){function e(e,t,n,r,i){void 0===n&&(n=-1),void 0===r&&(r=null),void 0===i&&(i=null),this.success=!1,this.settingsVersion=-1,this.success=e,this.settings=t,this.settingsVersion=n,this.exception=r,this.message=i}return e}();t.SettingsResponse=M;var O=function(){function e(e){this.items=[],this.lastTimestamp=0,this.maxItems=e}return e.prototype.save=function(e){if(!e)return null;var t=this.items,n=Math.max(Date.now(),this.lastTimestamp+1),r={timestamp:n,value:e};return t.push(r)>this.maxItems&&t.shift(),this.lastTimestamp=n,r.timestamp},e.prototype.get=function(e){return this.items.slice(0,e)},e.prototype.remove=function(e){for(var t=this.items,n=0;n<t.length;n++)if(t[n].timestamp===e)return void t.splice(n,1)},e.prototype.clear=function(){this.items=[]},e}();t.InMemoryStorage=O;var A=function(){function e(e){this.lastTimestamp=0,this.maxItems=e}return e.prototype.save=function(e,t){if(!e)return null;this.ensureIndex();var n=this.items,r=Math.max(Date.now(),this.lastTimestamp+1),i=this.getKey(r),o=JSON.stringify(e);try{this.write(i,o),this.lastTimestamp=r,n.push(r)>this.maxItems&&this["delete"](this.getKey(n.shift()))}catch(s){return null}return r},e.prototype.get=function(e){var t=this;return this.ensureIndex(),this.items.slice(0,e).map(function(e){var n=t.getKey(e);try{var r=t.read(n),o=JSON.parse(r,i);return{timestamp:e,value:o}}catch(s){return t.safeDelete(n),null}}).filter(function(e){return null!=e})},e.prototype.remove=function(e){this.ensureIndex();var t=this.items,n=t.indexOf(e);if(n>=0){var r=this.getKey(e);this.safeDelete(r),t.splice(n,1)}},e.prototype.clear=function(){var e=this;this.items.forEach(function(t){return e.safeDelete(e.getKey(t))}),this.items=[]},e.prototype.ensureIndex=function(){this.items||(this.items=this.createIndex(),this.lastTimestamp=Math.max.apply(Math,[0].concat(this.items))+1)},e.prototype.safeDelete=function(e){try{this["delete"](e)}catch(t){}},e.prototype.createIndex=function(){var e=this;try{var t=this.readAllKeys();return t.map(function(t){try{var n=e.getTimestamp(t);return n?n:(e.safeDelete(t),null)}catch(r){return e.safeDelete(t),null}}).filter(function(e){return null!=e}).sort(function(e,t){return e-t})}catch(n){return[]}},e}();t.KeyValueStorageBase=A;var D=function(e){function t(t,n,r){void 0===n&&(n="com.exceptionless."),void 0===r&&(r=20),e.call(this,r),this.prefix=n+t+"-"}return a(t,e),t.isAvailable=function(){try{var e=window.localStorage,t="__storage_test__";return e.setItem(t,t),e.removeItem(t),!0}catch(n){return!1}},t.prototype.write=function(e,t){window.localStorage.setItem(e,t)},t.prototype.read=function(e){return window.localStorage.getItem(e)},t.prototype.readAllKeys=function(){var e=this;return Object.keys(window.localStorage).filter(function(t){return 0===t.indexOf(e.prefix)})},t.prototype["delete"]=function(e){window.localStorage.removeItem(e)},t.prototype.getKey=function(e){return this.prefix+e},t.prototype.getTimestamp=function(e){return parseInt(e.substr(this.prefix.length),10)},t}(A);t.BrowserStorage=D;var K=function(){function e(){}return e.prototype.parse=function(e,t){function n(e){for(var t=("string"==typeof e?[e]:e)||[],n=[],r=0;r<t.length;r++)n.push({name:t[r]});return n}function i(e){for(var t="<anonymous>",r=[],i=0;i<e.length;i++){var o=e[i];r.push({name:(o.func||t).replace("?",t),parameters:n(o.args),file_name:o.url,line_number:o.line||0,column:o.column||0})}return r}var o="@@_TraceKit.StackTrace",s=e.contextData[o]?e.contextData[o]:r.computeStackTrace(t,25);if(!s)throw new Error("Unable to parse the exceptions stack trace.");return{type:s.name,message:s.message||t.message,stack_trace:i(s.stack||[])}},e}();t.DefaultErrorParser=K;var F=function(){function e(){}return e.prototype.getModules=function(e){if(document&&document.getElementsByTagName)return null;var t=[],n=document.getElementsByTagName("script");if(n&&n.length>0)for(var r=0;r<n.length;r++)n[r].src?t.push({module_id:r,name:n[r].src,version:S.parseVersion(n[r].src)}):n[r].innerHTML&&t.push({module_id:r,name:"Script Tag",version:S.getHashCode(n[r].innerHTML).toString()});return t},e}();t.DefaultModuleCollector=F;var L=function(){function e(){}return e.prototype.getRequestInfo=function(e){if(!document||!navigator||!location)return null;var t=e.client.config.dataExclusions,n={user_agent:navigator.userAgent,is_secure:"https:"===location.protocol,host:location.hostname,port:location.port&&""!==location.port?parseInt(location.port,10):80,path:location.pathname,cookies:S.getCookies(document.cookie,t),query_string:S.parseQueryString(location.search.substring(1),t)};return document.referrer&&""!==document.referrer&&(n.referrer=document.referrer),n},e}();t.DefaultRequestInfoCollector=L;var N=function(){function e(){}return e.prototype.sendRequest=function(e,t,n){function r(n,r){function i(e){function t(e){return e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}for(var n={},r=(e||"").split("\r\n"),i=0;i<r.length;i++){var o=r[i],s=o.indexOf(": ");s>0&&(n[t(o.substring(0,s).toLowerCase())]=o.substring(s+2))}return n}if(!u){u=!0;var a=r.statusText,c=r.responseText,l=r.status;if(n===o||0===l)a="Unable to connect to server.",l=0;else if(n!==s||l){if(l<200||l>299){var f=r.responseBody;if(f&&f.message)a=f.message;else if(c&&c.indexOf("message")!==-1)try{a=JSON.parse(c).message}catch(p){a=c}}}else l="POST"===e.method?202:200;t&&t(l||500,a||"",c,i(r.getAllResponseHeaders&&r.getAllResponseHeaders()))}}function i(e,t,n){var r=new XMLHttpRequest;return a in r?(r.open(t,n,!0),r.setRequestHeader("X-Exceptionless-Client",e),"POST"===t&&r.setRequestHeader("Content-Type","application/json")):"undefined"!=typeof XDomainRequest?(c=!0,r=new XDomainRequest,r.open(t,"http:"===location.protocol?n.replace("https:","http:"):n)):r=null,r&&(r.timeout=1e4),r}var o="timeout",s="loaded",a="withCredentials",u=!1,c=!1,l=""+e.url+(e.url.indexOf("?")===-1?"?":"&")+"access_token="+encodeURIComponent(e.apiKey),f=i(e.userAgent,e.method||"POST",l);return f?(a in f&&(f.onreadystatechange=function(){4===f.readyState&&r(s,f)}),f.onprogress=function(){},f.ontimeout=function(){return r(o,f)},f.onerror=function(){return r("error",f)},f.onload=function(){return r(s,f)},void(c?setTimeout(function(){return f.send(e.data)},500):f.send(e.data))):t&&t(503,"CORS not supported.")},e}();t.DefaultSubmissionAdapter=N;var j=function(){function e(e,t){void 0===t&&(t=250),this.queue=new D("q",e,t),this.settings=new D("settings",e,1)}return e}();t.BrowserStorageProvider=j,x.prototype.useLocalStorage=function(){D.isAvailable()&&(this.storage=new j,c.applySavedServerSettings(this),this.changed())};var B=x.defaults,Q=o();return Q&&(Q.apiKey||Q.serverUrl)&&(B.apiKey=Q.apiKey,B.serverUrl=Q.serverUrl),B.errorParser=new K,B.moduleCollector=new F,B.requestInfoCollector=new L,B.submissionAdapter=new N,r.report.subscribe(s),r.extendToAsynchronousCallbacks(),Error.stackTraceLimit=1/0,t});
 //# sourceMappingURL=exceptionless.min.js.map
diff --git a/dist/exceptionless.min.js.map b/dist/exceptionless.min.js.map
index 44423b0a..42c2a9eb 100644
--- a/dist/exceptionless.min.js.map
+++ b/dist/exceptionless.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["tracekit.js","exceptionless.min.js","/source/exceptionless.ts"],"names":["window","undefined","_has","object","key","Object","prototype","hasOwnProperty","call","_isUndefined","what","TraceKit","_oldTraceKit","_slice","slice","UNKNOWN_FUNCTION","noConflict","wrap","func","wrapped","apply","this","arguments","e","report","subscribe","handler","installGlobalHandler","handlers","push","unsubscribe","i","length","splice","notifyHandlers","stack","isWindowError","exception","collectWindowErrors","concat","inner","traceKitWindowOnError","message","url","lineNo","columnNo","errorObj","lastExceptionStack","computeStackTrace","augmentStackTraceWithInitialElement","processLastException","location","line","column","guessFunctionName","context","gatherContext","mode","_oldOnerrorHandler","_onErrorHandlerInstalled","onerror","_lastExceptionStack","_lastArgs","lastArgs","lastException","ex","setTimeout","incomplete","loadSource","remoteFetching","getXHR","XMLHttpRequest","ActiveXObject","request","open","send","responseText","getSource","sourceCache","source","domain","document","match","exec","split","m","reFunctionArgNames","reGuessFunction","maxLines","linesBefore","Math","floor","linesOfContext","linesAfter","start","max","end","min","escapeRegExp","text","replace","escapeCodeAsRegExpForMatchingInsideHTML","body","findSourceInUrls","re","urls","j","join","substring","index","lastIndexOf","findSourceInLine","fragment","RegExp","findSourceByFunctionBody","parts","result","href","scripts","getElementsByTagName","code","codeRE","eventRE","script","src","name","args","event","computeStackTraceFromStackProp","element","chrome","gecko","winjs","lines","reference","isNative","indexOf","columnNumber","computeStackTraceFromStacktraceProp","stacktrace","opera10Regex","opera11Regex","exc","computeStackTraceFromOperaMultiLineMessage","lineRE1","lineRE2","lineRE3","inlineScriptBlocks","s","item","relativeLine","pos","innerText","midline","stackInfo","initial","unshift","partial","computeStackTraceByWalkingCallerChain","depth","functionName","funcs","recursion","curr","caller","toString","input","description","sourceURL","fileName","lineNumber","debug","computeStackTraceOfCaller","Error","ofCaller","extendToAsynchronousCallbacks","_helper","fnName","originalFn","originalCallback","module","exports","define","amd","global","root","factory","require","exceptionless","parseDate","value","dateRegx","a","Date","getDefaultsSettingsFromScriptTag","Utils","parseQueryString","pop","processUnhandledException","stackTrace","options","builder","ExceptionlessClient","createUnhandledException","status","pluginContextData","submit","__extends","d","b","__","constructor","p","create","SubmissionResponse","statusCode","success","badRequest","serviceUnavailable","paymentRequired","unableToAuthenticate","notFound","requestEntityTooLarge","SettingsManager","onChanged","_handlers","applySavedServerSettings","config","isValid","savedSettings","getSavedServerSettings","log","info","version","settings","merge","changed","getVersion","checkVersion","currentVersion","updateSettings","_this","enabled","unableToUpdateMessage","error","submissionClient","getSettings","response","warn","savedServerSettings","newSettings","settingsVersion","storage","save","get","DefaultLastReferenceIdManager","_lastReferenceId","getLast","clearLast","setLast","eventId","ConsoleLog","level","console","NullLog","EventPluginContext","client","contextData","ContextData","defineProperty","enumerable","configurable","EventPluginManager","run","callback","plugin","next","cancelled","plugins","wrappedPlugins","priority","addDefaultPlugins","addPlugin","ConfigurationDefaultsPlugin","ErrorPlugin","DuplicateCheckerPlugin","EventExclusionPlugin","ModuleInfoPlugin","RequestInfoPlugin","EnvironmentInfoPlugin","SubmissionMethodPlugin","HeartbeatPlugin","heartbeatInterval","_interval","clearInterval","_intervalId","user","data","identity","setInterval","submitSessionHeartbeat","ReferenceIdPlugin","reference_id","type","guid","DefaultEventQueue","_processingQueue","_config","enqueue","eventWillNotBeQueued","areQueuedItemsDiscarded","ensureQueueTimer","timestamp","queue","logText","process","isAppExiting","queueNotProcessed","events_1","submissionBatchSize","serverUrl","postEvents","map","processSubmissionResponse","eventsPosted","suspendProcessing","durationInMinutes","discardFutureQueuedItems","clearQueue","_suspendProcessingUntil","getTime","_discardQueuedItemsUntil","clear","onEventsPosted","events","_queueTimer","onProcessQueue","isQueueProcessingSuspended","noSubmission","removeEvents","round","remove","InMemoryStorageProvider","maxQueueItems","InMemoryStorage","DefaultSubmissionClient","configurationVersionHeader","JSON","stringify","createRequest","cb","createSubmissionCallback","submissionAdapter","sendRequest","postUserDescription","referenceId","path","encodeURIComponent","headers","SettingsResponse","parse","isNaN","sendHeartbeat","sessionIdOrUserId","closeSession","heartbeatServerUrl","method","apiKey","userAgent","parseInt","addRange","target","values","_i","getHashCode","hash","character","charCodeAt","getCookies","cookies","exclusions","cookie","isMatch","isEmpty","s4","random","defaultValues","parseVersion","versionRegex","matches","query","pairs","pair","decodeURIComponent","randomNumber","patterns","ignoreCase","trim","toLowerCase","some","pattern","startsWithWildcard","endsWithWildcard","endsWith","startsWith","keys","prefix","suffix","maxDepth","stringifyImpl","obj","excludedKeys","cache","flattened","prop","toBoolean","defaultValue","Configuration","configSettings","inject","fn","defaultTags","defaultData","lastReferenceIdManager","_plugins","_serverUrl","_heartbeatServerUrl","_updateSettingsWhenIdleInterval","_dataExclusions","_userAgentBotPatterns","defaults","updateSettingsWhenIdleInterval","environmentInfoCollector","errorParser","moduleCollector","requestInfoCollector","_apiKey","set","addDataExclusions","addUserAgentBotPatterns","userAgentBotPatterns","sort","p1","p2","pluginOrName","pluginAction","pluginExists","removePlugin","setVersion","setUserIdentity","userInfoOrIdentity","USER_KEY","userInfo","shouldRemove","useSessions","sendHeartbeats","useReferenceIds","useLocalStorage","useDebugLogger","_defaultSettings","EventBuilder","_validIdentifierErrorMessage","setType","setSource","setReferenceId","isValidIdentifier","setEventReference","id","setProperty","setMessage","setGeo","latitude","longitude","geo","setUserDescription","emailAddress","email_address","setManualStackingInfo","signatureData","title","signature_data","setManualStackingKey","manualStackingKey","ManualStackingKey","setValue","addTags","tags","excludedPropertyNames","dataExclusions","markAsCritical","critical","addRequestInfo","submitEvent","isDigit","isLetter","isMinus","setException","getException","markAsUnhandledError","setSubmissionMethod","getSubmissionMethod","settingsOrApiKey","updateSettingsTimer","_timeoutId","createException","createEvent","submitException","submissionMethod","submitUnhandledException","createFeatureUsage","feature","submitFeatureUsage","createLog","sourceOrMessage","callee","submitLog","createNotFound","resource","submitNotFound","createSessionStart","submitSessionStart","submitSessionEnd","date","ctx","ev","updateUserEmailAndDescription","email","userDescription","getLastReferenceId","initialDelay","clearTimeout","interval","_instance","tag","ERROR_KEY","ignoredProperties","parser","additionalData","collector","modules","getModules","REQUEST_KEY","requestInfo","getRequestInfo","user_agent","ENVIRONMENT_KEY","environmentInfo","getEnvironmentInfo","getCurrentTime","now","_processedHashcodes","_getCurrentTime","isDuplicate","processedHashcodes","_loop_1","hashCode","stack_trace","h","shift","state_1","getLogLevel","getMinLogLevel","loggerName","getTypeAndSourceSetting","isLog","sourcePrefix","minLogLevel","logLevel","maxItems","items","lastTimestamp","limit","KeyValueStorageBase","single","ensureIndex","getKey","json","write","read","safeDelete","filter","forEach","createIndex","readAllKeys","getTimestamp","BrowserStorage","_super","namespace","isAvailable","localStorage","x","setItem","removeItem","getItem","substr","DefaultErrorParser","getParameters","parameters","params","getStackFrames","stackFrames","ANONYMOUS","frames","frame","file_name","line_number","TRACEKIT_STACK_TRACE_KEY","DefaultModuleCollector","module_id","innerHTML","DefaultRequestInfoCollector","navigator","is_secure","protocol","host","hostname","port","pathname","query_string","search","referrer","DefaultSubmissionAdapter","complete","xhr","parseResponseHeaders","headerStr","headerPairs","headerPair","separator","isCompleted","statusText","TIMEOUT","LOADED","responseBody","getAllResponseHeaders","WITH_CREDENTIALS","setRequestHeader","XDomainRequest","useSetTimeout","timeout","onreadystatechange","readyState","onprogress","ontimeout","onload","BrowserStorageProvider","stackTraceLimit","Infinity"],"mappings":"CAKA,SAAAA,EAAAC,GAoBA,QAAAC,GAAAC,EAAAC,GACA,MAAAC,QAAAC,UAAAC,eAAAC,KAAAL,EAAAC,GAUA,QAAAK,GAAAC,GACA,MAAA,mBAAAA,GA/BA,GAAAV,EAAA,CAIA,GAAAW,MACAC,EAAAZ,EAAAW,SAGAE,KAAAC,MACAC,EAAA,GA+BAJ,GAAAK,WAAA,WAEA,MADAhB,GAAAW,SAAAC,EACAD,GAWAA,EAAAM,KAAA,SAAAC,GACA,QAAAC,KACA,IACA,MAAAD,GAAAE,MAAAC,KAAAC,WACA,MAAAC,GAEA,KADAZ,GAAAa,OAAAD,GACAA,GAGA,MAAAJ,IA+CAR,EAAAa,OAAA,WAWA,QAAAC,GAAAC,GACAC,IACAC,EAAAC,KAAAH,GAQA,QAAAI,GAAAJ,GACA,IAAA,GAAAK,GAAAH,EAAAI,OAAA,EAAAD,GAAA,IAAAA,EACAH,EAAAG,KAAAL,GACAE,EAAAK,OAAAF,EAAA,GAYA,QAAAG,GAAAC,EAAAC,GACA,GAAAC,GAAA,IACA,KAAAD,GAAAzB,EAAA2B,oBAAA,CAGA,IAAA,GAAAP,KAAAH,GACA,GAAA1B,EAAA0B,EAAAG,GACA,IACAH,EAAAG,GAAAX,MAAA,MAAAe,GAAAI,OAAA1B,EAAAL,KAAAc,UAAA,KACA,MAAAkB,GACAH,EAAAG,EAKA,GAAAH,EACA,KAAAA,IAgBA,QAAAI,GAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GACA,GAAAX,GAAA,IAEA,IAAAY,EACApC,EAAAqC,kBAAAC,oCAAAF,EAAAJ,EAAAC,EAAAF,GACAQ,QACA,IAAAJ,EACAX,EAAAxB,EAAAqC,kBAAAF,GACAZ,EAAAC,GAAA,OACA,CACA,GAAAgB,IACAR,IAAAA,EACAS,KAAAR,EACAS,OAAAR,EAEAM,GAAAjC,KAAAP,EAAAqC,kBAAAM,kBAAAH,EAAAR,IAAAQ,EAAAC,MACAD,EAAAI,QAAA5C,EAAAqC,kBAAAQ,cAAAL,EAAAR,IAAAQ,EAAAC,MACAjB,GACAsB,KAAA,UACAf,QAAAA,EACAP,OAAAgB,IAGAjB,EAAAC,GAAA,GAGA,MAAAuB,GACAA,EAAAtC,MAAAC,KAAAC,YAGA,EAOA,QAAAK,KACAgC,KAAA,IAGAD,EAAA1D,EAAA4D,QACA5D,EAAA4D,QAAAnB,EACAkB,GAAA,GAOA,QAAAT,KACA,GAAAW,GAAAd,EACAe,EAAAC,CACAA,GAAA,KACAhB,EAAA,KACAiB,EAAA,KACA9B,EAAAd,MAAA,MAAAyC,GAAA,GAAAtB,OAAAuB,IASA,QAAAtC,GAAAyC,GACA,GAAAlB,EAAA,CACA,GAAAiB,IAAAC,EACA,MAEAf,KAIA,GAAAf,GAAAxB,EAAAqC,kBAAAiB,EAeA,MAdAlB,GAAAZ,EACA6B,EAAAC,EACAF,EAAAlD,EAAAL,KAAAc,UAAA,GAMAtB,EAAAkE,WAAA,WACAF,IAAAC,GACAf,KAEAf,EAAAgC,WAAA,IAAA,GAEAF,EA5JA,GAuDAP,GAAAC,EAvDA/B,KACAmC,EAAA,KACAC,EAAA,KACAjB,EAAA,IA8JA,OAFAvB,GAAAC,UAAAA,EACAD,EAAAM,YAAAA,EACAN,KAwFAb,EAAAqC,kBAAA,WAWA,QAAAoB,GAAAzB,GACA,IAAAhC,EAAA0D,eACA,MAAA,EAEA,KACA,GAAAC,GAAA,WACA,IACA,MAAA,IAAAtE,GAAAuE,eACA,MAAAhD,GAEA,MAAA,IAAAvB,GAAAwE,cAAA,uBAIAC,EAAAH,GAGA,OAFAG,GAAAC,KAAA,MAAA/B,GAAA,GACA8B,EAAAE,KAAA,IACAF,EAAAG,aACA,MAAArD,GACA,MAAA,IAUA,QAAAsD,GAAAlC,GACA,GAAA,gBAAAA,GACA,QAGA,KAAAzC,EAAA4E,EAAAnC,GAAA,CAWA,GAAAoC,GAAA,GACAC,EAAA,EACA,KAAAA,EAAAhF,EAAAiF,SAAAD,OAAA,MAAAzD,IACA,GAAA2D,GAAA,8CAAAC,KAAAxC,EACAuC,IAAAA,EAAA,KAAAF,IACAD,EAAAX,EAAAzB,IAEAmC,EAAAnC,GAAAoC,EAAAA,EAAAK,MAAA,SAGA,MAAAN,GAAAnC,GAYA,QAAAW,GAAAX,EAAAC,GACA,GAKAyC,GALAC,EAAA,8BACAC,EAAA,mEACAnC,EAAA,GACAoC,EAAA,GACAT,EAAAF,EAAAlC,EAGA,KAAAoC,EAAA/C,OACA,MAAAjB,EAKA,KAAA,GAAAgB,GAAA,EAAAyD,EAAAzD,IAAAA,EAGA,GAFAqB,EAAA2B,EAAAnC,EAAAb,GAAAqB,GAEA3C,EAAA2C,GAAA,CACA,GAAAiC,EAAAE,EAAAJ,KAAA/B,GACA,MAAAiC,GAAA,EACA,IAAAA,EAAAC,EAAAH,KAAA/B,GACA,MAAAiC,GAAA,GAKA,MAAAtE,GAWA,QAAAyC,GAAAb,EAAAS,GACA,GAAA2B,GAAAF,EAAAlC,EAEA,KAAAoC,EAAA/C,OACA,MAAA,KAGA,IAAAuB,MAIAkC,EAAAC,KAAAC,MAAAhF,EAAAiF,eAAA,GAEAC,EAAAJ,EAAA9E,EAAAiF,eAAA,EACAE,EAAAJ,KAAAK,IAAA,EAAA3C,EAAAqC,EAAA,GACAO,EAAAN,KAAAO,IAAAlB,EAAA/C,OAAAoB,EAAAyC,EAAA,EAEAzC,IAAA,CAEA,KAAA,GAAArB,GAAA+D,EAAAE,EAAAjE,IAAAA,EACAtB,EAAAsE,EAAAhD,KACAwB,EAAA1B,KAAAkD,EAAAhD,GAIA,OAAAwB,GAAAvB,OAAA,EAAAuB,EAAA,KAUA,QAAA2C,GAAAC,GACA,MAAAA,GAAAC,QAAA,4BAAA,QAWA,QAAAC,GAAAC,GACA,MAAAJ,GAAAI,GAAAF,QAAA,IAAA,cAAAA,QAAA,IAAA,cAAAA,QAAA,IAAA,eAAAA,QAAA,IAAA,gBAAAA,QAAA,OAAA,QAWA,QAAAG,GAAAC,EAAAC,GAEA,IAAA,GADA1B,GAAAM,EACAtD,EAAA,EAAA2E,EAAAD,EAAAzE,OAAA0E,EAAA3E,IAAAA,EAEA,IAAAgD,EAAAF,EAAA4B,EAAA1E,KAAAC,SACA+C,EAAAA,EAAA4B,KAAA,MACAtB,EAAAmB,EAAArB,KAAAJ,IAGA,OACApC,IAAA8D,EAAA1E,GACAqB,KAAA2B,EAAA6B,UAAA,EAAAvB,EAAAwB,OAAAzB,MAAA,MAAApD,OACAqB,OAAAgC,EAAAwB,MAAA9B,EAAA+B,YAAA,KAAAzB,EAAAwB,OAAA,EAQA,OAAA,MAYA,QAAAE,GAAAC,EAAArE,EAAAS,GACA,GAEAiC,GAFAN,EAAAF,EAAAlC,GACA6D,EAAA,GAAAS,QAAA,MAAAf,EAAAc,GAAA,MAKA,OAFA5D,IAAA,EAEA2B,GAAAA,EAAA/C,OAAAoB,IAAAiC,EAAAmB,EAAArB,KAAAJ,EAAA3B,KACAiC,EAAAwB,MAGA,KAWA,QAAAK,GAAAhG,GACA,IAAAT,EAAAT,GAAAA,EAAAiF,UAAA,CAcA,IAAA,GARAqB,GAIAE,EACAW,EACAC,EARAX,GAAAzG,EAAAmD,SAAAkE,MACAC,EAAAtH,EAAAiF,SAAAsC,qBAAA,UAEAC,EAAA,GAAAtG,EACAuG,EAAA,2EACAC,EAAA,iEAKA3F,EAAA,EAAAA,EAAAuF,EAAAtF,SAAAD,EAAA,CACA,GAAA4F,GAAAL,EAAAvF,EACA4F,GAAAC,KACAnB,EAAA5E,KAAA8F,EAAAC,KAIA,GAAAT,EAAAM,EAAAtC,KAAAqC,GAMA,CACA,GAAAK,GAAAV,EAAA,GAAA,OAAAA,EAAA,GAAA,GACAW,EAAAX,EAAA,GAAA/B,MAAA,KAAAuB,KAAA,YAEAL,GAAAJ,EAAAiB,EAAA,IAAAf,QAAA,KAAA,MACAI,EAAA,GAAAS,QAAA,WAAAY,EAAA,cAAAC,EAAA,mBAAAxB,EAAA,aAVAE,GAAA,GAAAS,QAAAf,EAAAsB,GAAApB,QAAA,OAAA,QAcA,IAAAgB,EAAAb,EAAAC,EAAAC,GACA,MAAAW,EAIA,IAAAD,EAAAO,EAAAvC,KAAAqC,GAAA,CACA,GAAAO,GAAAZ,EAAA,EAMA,IALAb,EAAAD,EAAAc,EAAA,IAGAX,EAAA,GAAAS,QAAA,KAAAc,EAAA,eAAAzB,EAAA,cAAA,KAEAc,EAAAb,EAAAC,EAAAC,EAAA,IACA,MAAAW,EAMA,IAFAZ,EAAA,GAAAS,QAAAX,GAEAc,EAAAb,EAAAC,EAAAC,GACA,MAAAW,GAIA,MAAA,OA+CA,QAAAY,GAAA/D,GACA,IAAAA,EAAA9B,MACA,MAAA,KAYA,KAAA,GAJAgF,GACAc,EANAC,EAAA,uGACAC,EAAA,qGACAC,EAAA,mGACAC,EAAApE,EAAA9B,MAAAiD,MAAA,MACAjD,KAGAmG,EAAA,sBAAAnD,KAAAlB,EAAAvB,SAEAX,EAAA,EAAA2E,EAAA2B,EAAArG,OAAA0E,EAAA3E,IAAAA,EAAA,CACA,GAAAoF,EAAAe,EAAA/C,KAAAkD,EAAAtG,IAAA,CACA,GAAAwG,GAAApB,EAAA,IAAA,KAAAA,EAAA,GAAAqB,QAAA,SACAP,IACAtF,IAAA4F,EAAA,KAAApB,EAAA,GACAjG,KAAAiG,EAAA,IAAApG,EACA+G,KAAAS,GAAApB,EAAA,OACA/D,KAAA+D,EAAA,IAAAA,EAAA,GAAA,KACA9D,OAAA8D,EAAA,IAAAA,EAAA,GAAA,UAEA,IAAAA,EAAAiB,EAAAjD,KAAAkD,EAAAtG,IACAkG,GACAtF,IAAAwE,EAAA,GACAjG,KAAAiG,EAAA,IAAApG,EACA+G,QACA1E,MAAA+D,EAAA,GACA9D,OAAA8D,EAAA,IAAAA,EAAA,GAAA,UAEA,CAAA,KAAAA,EAAAgB,EAAAhD,KAAAkD,EAAAtG,KASA,QARAkG,IACAtF,IAAAwE,EAAA,GACAjG,KAAAiG,EAAA,IAAApG,EACA+G,KAAAX,EAAA,GAAAA,EAAA,GAAA/B,MAAA,QACAhC,KAAA+D,EAAA,IAAAA,EAAA,GAAA,KACA9D,OAAA8D,EAAA,IAAAA,EAAA,GAAA,OAMAc,EAAA/G,MAAA+G,EAAA7E,OACA6E,EAAA/G,KAAAoC,EAAA2E,EAAAtF,IAAAsF,EAAA7E,OAGA6E,EAAA7E,OACA6E,EAAA1E,QAAAC,EAAAyE,EAAAtF,IAAAsF,EAAA7E,OAGAjB,EAAAN,KAAAoG,GAGA,MAAA9F,GAAAH,QAIAG,EAAA,IAAAA,EAAA,GAAAiB,OAAAjB,EAAA,GAAAkB,QAAAiF,EACAnG,EAAA,GAAAkB,OAAA0D,EAAAuB,EAAA,GAAAnG,EAAA,GAAAQ,IAAAR,EAAA,GAAAiB,MACAjB,EAAA,GAAAkB,QAAA5C,EAAAwD,EAAAwE,gBAIAtG,EAAA,GAAAkB,OAAAY,EAAAwE,aAAA,IAIAhF,KAAA,QACAoE,KAAA5D,EAAA4D,KACAnF,QAAAuB,EAAAvB,QACAP,MAAAA,IAhBA,KA2BA,QAAAuG,GAAAzE,GAIA,GAAA0E,GAAA1E,EAAA0E,UACA,IAAAA,EAAA,CAUA,IAAA,GAFAxB,GAJAyB,EAAA,8DACAC,EAAA,uGACAR,EAAAM,EAAAvD,MAAA,MACAjD,KAGAiB,EAAA,EAAAA,EAAAiF,EAAArG,OAAAoB,GAAA,EAAA,CACA,GAAA6E,GAAA,IAmBA,KAlBAd,EAAAyB,EAAAzD,KAAAkD,EAAAjF,KACA6E,GACAtF,IAAAwE,EAAA,GACA/D,MAAA+D,EAAA,GACA9D,OAAA,KACAnC,KAAAiG,EAAA,GACAW,UAEAX,EAAA0B,EAAA1D,KAAAkD,EAAAjF,OACA6E,GACAtF,IAAAwE,EAAA,GACA/D,MAAA+D,EAAA,GACA9D,QAAA8D,EAAA,GACAjG,KAAAiG,EAAA,IAAAA,EAAA,GACAW,KAAAX,EAAA,GAAAA,EAAA,GAAA/B,MAAA,UAIA6C,EAAA,CAIA,IAHAA,EAAA/G,MAAA+G,EAAA7E,OACA6E,EAAA/G,KAAAoC,EAAA2E,EAAAtF,IAAAsF,EAAA7E,OAEA6E,EAAA7E,KACA,IACA6E,EAAA1E,QAAAC,EAAAyE,EAAAtF,IAAAsF,EAAA7E,MACA,MAAA0F,IAGAb,EAAA1E,UACA0E,EAAA1E,SAAA8E,EAAAjF,EAAA,KAGAjB,EAAAN,KAAAoG,IAIA,MAAA9F,GAAAH,QAKAyB,KAAA,aACAoE,KAAA5D,EAAA4D,KACAnF,QAAAuB,EAAAvB,QACAP,MAAAA,GAPA,MAqBA,QAAA4G,GAAA9E,GAgBA,GAAAoE,GAAApE,EAAAvB,QAAA0C,MAAA,KACA,IAAAiD,EAAArG,OAAA,EACA,MAAA,KAGA,IAMAmF,GANA6B,EAAA,yFACAC,EAAA,kGACAC,EAAA,yCACA/G,KACAmF,EAAAtH,GAAAA,EAAAiF,UAAAjF,EAAAiF,SAAAsC,qBAAA,UACA4B,IAGA,KAAA,GAAAC,KAAA9B,GACApH,EAAAoH,EAAA8B,KAAA9B,EAAA8B,GAAAxB,KACAuB,EAAAtH,KAAAyF,EAAA8B,GAIA,KAAA,GAAAhG,GAAA,EAAAA,EAAAiF,EAAArG,OAAAoB,GAAA,EAAA,CACA,GAAAiG,GAAA,IACA,IAAAlC,EAAA6B,EAAA7D,KAAAkD,EAAAjF,IACAiG,GACA1G,IAAAwE,EAAA,GACAjG,KAAAiG,EAAA,GACAW,QACA1E,MAAA+D,EAAA,GACA9D,OAAA,UAEA,IAAA8D,EAAA8B,EAAA9D,KAAAkD,EAAAjF,IAAA,CACAiG,GACA1G,IAAAwE,EAAA,GACAjG,KAAAiG,EAAA,GACAW,QACA1E,MAAA+D,EAAA,GACA9D,OAAA,KAEA,IAAAiG,IAAAnC,EAAA,GACAQ,EAAAwB,EAAAhC,EAAA,GAAA,EACA,IAAAQ,EAAA,CACA,GAAA5C,GAAAF,EAAAwE,EAAA1G,IACA,IAAAoC,EAAA,CACAA,EAAAA,EAAA4B,KAAA,KACA,IAAA4C,GAAAxE,EAAAyD,QAAAb,EAAA6B,UACAD,IAAA,IACAF,EAAAjG,KAAAkG,EAAAvE,EAAA6B,UAAA,EAAA2C,GAAAnE,MAAA,MAAApD,cAIA,IAAAmF,EAAA+B,EAAA/D,KAAAkD,EAAAjF,IAAA,CACA,GAAAT,GAAA3C,EAAAmD,SAAAkE,KAAAjB,QAAA,OAAA,IACAI,EAAA,GAAAS,QAAAZ,EAAAgC,EAAAjF,EAAA,KACAwE,EAAArB,EAAAC,GAAA7D,GACA0G,IACA1G,IAAAA,EACAzB,KAAA,GACA4G,QACA1E,KAAAwE,EAAAA,EAAAxE,KAAA+D,EAAA,GACA9D,OAAA,MAIA,GAAAgG,EAAA,CACAA,EAAAnI,OACAmI,EAAAnI,KAAAoC,EAAA+F,EAAA1G,IAAA0G,EAAAjG,MAEA,IAAAG,GAAAC,EAAA6F,EAAA1G,IAAA0G,EAAAjG,MACAqG,EAAAlG,EAAAA,EAAAmC,KAAAC,MAAApC,EAAAvB,OAAA,IAAA,IACAuB,IAAAkG,EAAArD,QAAA,OAAA,MAAAiC,EAAAjF,EAAA,GAAAgD,QAAA,OAAA,IACAiD,EAAA9F,QAAAA,EAGA8F,EAAA9F,SAAA8E,EAAAjF,EAAA,IAEAjB,EAAAN,KAAAwH,IAGA,MAAAlH,GAAAH,QAKAyB,KAAA,YACAoE,KAAA5D,EAAA4D,KACAnF,QAAA2F,EAAA,GACAlG,MAAAA,GAPA,KAyBA,QAAAc,GAAAyG,EAAA/G,EAAAC,EAAAF,GACA,GAAAiH,IACAhH,IAAAA,EACAS,KAAAR,EAGA,IAAA+G,EAAAhH,KAAAgH,EAAAvG,KAAA,CACAsG,EAAAvF,YAAA,EAEAwF,EAAAzI,OACAyI,EAAAzI,KAAAoC,EAAAqG,EAAAhH,IAAAgH,EAAAvG,OAGAuG,EAAApG,UACAoG,EAAApG,QAAAC,EAAAmG,EAAAhH,IAAAgH,EAAAvG,MAGA,IAAAkF,GAAA,cAAAnD,KAAAzC,EAKA,IAJA4F,IACAqB,EAAAtG,OAAA0D,EAAAuB,EAAA,GAAAqB,EAAAhH,IAAAgH,EAAAvG,OAGAsG,EAAAvH,MAAAH,OAAA,GACA0H,EAAAvH,MAAA,GAAAQ,MAAAgH,EAAAhH,IAAA,CACA,GAAA+G,EAAAvH,MAAA,GAAAiB,OAAAuG,EAAAvG,KACA,OAAA,CACA,KAAAsG,EAAAvH,MAAA,GAAAiB,MAAAsG,EAAAvH,MAAA,GAAAjB,OAAAyI,EAAAzI,KAGA,MAFAwI,GAAAvH,MAAA,GAAAiB,KAAAuG,EAAAvG,KACAsG,EAAAvH,MAAA,GAAAoB,QAAAoG,EAAApG,SACA,EAOA,MAFAmG,GAAAvH,MAAAyH,QAAAD,GACAD,EAAAG,SAAA,GACA,EAKA,MAHAH,GAAAvF,YAAA,GAGA,EAaA,QAAA2F,GAAA7F,EAAA8F,GASA,IAAA,GAJA5C,GACAkC,EACAtE,EANAiF,EAAA,qEACA7H,KACA8H,KACAC,GAAA,EAKAC,EAAAL,EAAAM,OAAAD,IAAAD,EAAAC,EAAAA,EAAAC,OACA,GAAAD,IAAAnH,GAAAmH,IAAAxJ,EAAAa,OAAA,CAmBA,GAdA6H,GACA1G,IAAA,KACAzB,KAAAH,EACA+G,QACA1E,KAAA,KACAC,OAAA,MAGA8G,EAAAtC,KACAwB,EAAAnI,KAAAiJ,EAAAtC,MACAV,EAAA6C,EAAA7E,KAAAgF,EAAAE,eACAhB,EAAAnI,KAAAiG,EAAA,IAGA,mBAAAkC,GAAAnI,KACA,IACAmI,EAAAnI,KAAAiG,EAAAmD,MAAA1D,UAAA,EAAAO,EAAAmD,MAAA9B,QAAA,MACA,MAAAjH,IAGA,GAAAwD,EAAAmC,EAAAiD,GAAA,CACAd,EAAA1G,IAAAoC,EAAApC,IACA0G,EAAAjG,KAAA2B,EAAA3B,KAEAiG,EAAAnI,OAAAH,IACAsI,EAAAnI,KAAAoC,EAAA+F,EAAA1G,IAAA0G,EAAAjG,MAGA,IAAAkF,GAAA,cAAAnD,KAAAlB,EAAAvB,SAAAuB,EAAAsG,YACAjC,KACAe,EAAAhG,OAAA0D,EAAAuB,EAAA,GAAAvD,EAAApC,IAAAoC,EAAA3B,OAIA6G,EAAA,GAAAE,GACAD,GAAA,EAEAD,EAAA,GAAAE,IAAA,EAGAhI,EAAAN,KAAAwH,GAGAU,GAGA5H,EAAAF,OAAA,EAAA8H,EAGA,IAAA3C,IACA3D,KAAA,UACAoE,KAAA5D,EAAA4D,KACAnF,QAAAuB,EAAAvB,QACAP,MAAAA,EAGA,OADAc,GAAAmE,EAAAnD,EAAAuG,WAAAvG,EAAAwG,SAAAxG,EAAAb,MAAAa,EAAAyG,WAAAzG,EAAAvB,SAAAuB,EAAAsG,aACAnD,EASA,QAAApE,GAAAiB,EAAA8F,GACA,GAAA5H,GAAA,IACA4H,GAAA,MAAAA,EAAA,GAAAA,CAEA,KAKA,GADA5H,EAAAuG,EAAAzE,GAEA,MAAA9B,GAEA,MAAAZ,GACA,GAAAoJ,EACA,KAAApJ,GAIA,IAEA,GADAY,EAAA6F,EAAA/D,GAEA,MAAA9B,GAEA,MAAAZ,GACA,GAAAoJ,EACA,KAAApJ,GAIA,IAEA,GADAY,EAAA4G,EAAA9E,GAEA,MAAA9B,GAEA,MAAAZ,GACA,GAAAoJ,EACA,KAAApJ,GAIA,IAEA,GADAY,EAAA2H,EAAA7F,EAAA8F,EAAA,GAEA,MAAA5H,GAEA,MAAAZ,GACA,GAAAoJ,EACA,KAAApJ,GAIA,OACAkC,KAAA,UAUA,QAAAmH,GAAAb,GACAA,GAAA,MAAAA,EAAA,GAAAA,GAAA,CACA,KACA,KAAA,IAAAc,OACA,MAAA5G,GACA,MAAAjB,GAAAiB,EAAA8F,EAAA,IA7yBA,GAAAY,IAAA,EACA7F,IAszBA,OANA9B,GAAAC,oCAAAA,EACAD,EAAAM,kBAAAA,EACAN,EAAAQ,cAAAA,EACAR,EAAA8H,SAAAF,EACA5H,EAAA6B,UAAAA,EAEA7B,KAQArC,EAAAoK,8BAAA,WACA,GAAAC,GAAA,SAAAC,GACA,GAAAC,GAAAlL,EAAAiL,EACAjL,GAAAiL,GAAA,WAEA,GAAAnD,GAAAjH,EAAAL,KAAAc,WACA6J,EAAArD,EAAA,EAOA,OANA,kBAAA,KACAA,EAAA,GAAAnH,EAAAM,KAAAkK,IAKAD,EAAA9J,MACA8J,EAAA9J,MAAAC,KAAAyG,GAEAoD,EAAApD,EAAA,GAAAA,EAAA,KAKAkD,GAAA,cACAA,EAAA,gBAIArK,EAAA0D,iBACA1D,EAAA0D,gBAAA,GAEA1D,EAAA2B,sBACA3B,EAAA2B,qBAAA,KAEA3B,EAAAiF,gBAAAjF,EAAAiF,eAAA,KAEAjF,EAAAiF,eAAA,IAIA,mBAAAwF,SAAAA,OAAAC,SAAAhK,KAAA+J,SAAAA,OACAA,OAAAC,QAAA1K,EACA,kBAAA2K,SAAAA,OAAAC,IACAD,OAAA,cAAA3K,GAEAX,EAAAW,SAAAA,IAGA,mBAAAX,QAAAA,OAAAwL,QCGC,SAASC,EAAMC,GACQ,kBAAXJ,SAAyBA,OAAOC,IACzCD,OAAO,gBAAiBI,GACI,gBAAZL,SAChBD,OAAOC,QAAUK,EAAQC,QAASN,QAASD,QCrtC/CK,EAAAG,cAAAF,KDytCErK,KCxtCO,SAAAsK,EAAmBN,EAAMD,GDq6FlC,QClYgBS,GAAAzL,EAAA0L,GDmYZ,GClYAC,GAAK,2EDmYL,IClYa,gBAAXD,GAAqB,CDmYnB,GCjYFE,GAAAD,EAAQ5G,KAAS2G,EDkYf,ICjYFE,EACA,MAAO,IAAIC,MAACH,GDoYd,MAAOA,GAkQX,QCpUII,KDqUA,ICpUAjH,WAAAA,SAAgBsC,qBAChB,MAAK,KAIL,KAAA,GAFFD,GAAArC,SAAAsC,qBAAA,UAEUV,EAAG,EAAAA,EAAcS,EAAStF,OAAA6E,IAClC,GAAQS,EAAGT,GAAAe,KAAAN,EAAAT,GAAkCe,IAACY,QAAA,kBAAA,GACtC,MAAK2D,GAAQC,iBAAW9E,EAAST,GAAYe,IAACxC,MAAA,KAAAiH,MAGzD,OAAA,MAGD,QAASC,GAAsBC,EAAAC,GAC/B,GAAQC,GAACC,EAAAA,WAA2BC,yBAA8B,GAAA9B,OAAA0B,EAAA7J,UAAA8J,OAAAI,QAAA,gBAAA,UAClEH,GAASI,kBAAoB,0BAA4BN,EAEzDE,EAASK,SD/pDT,GALKnB,IACJA,ECxtCQ,SAAA9D,GDytCP,OCxtCsB,mBAAf7H,QAAiCA,OAAAwL,QAAA3D,MD2tCrCwD,EACJ,GAAIA,KAIL,IAAI0B,GCntCK1L,MAAAA,KAAA0L,WAA+B,SAASC,EAAAC,GDqtC7C,QCntCKC,KAAA7L,KAAA8L,YAAuBH,EDktC5B,ICntCA,GAAKI,KAAAH,GAAAA,EAAA1M,eAA4B6M,KAAKJ,EAAAI,GAAIH,EAAAG,GDqtC1CJ,GAAE1M,UCntCc,OAAX2M,EAAW5M,OAAUgN,OAASJ,IAAAC,EAAA5M,UAAA2M,EAAA3M,UAAA,GAAA4M,KAErCvM,EAACgL,EAAA,YACH2B,EAAA,WAvBA,QAuBCA,GAAAC,EAAA7K,GAvBYrB,KAAAmM,SAAA,EAuHbnM,KAAAoM,YAAA,EAAApM,KAAAqM,oBAAA,EA4GCrM,KAAAsM,iBAAA,EApGetM,KAAAuM,sBAAd,EACEvM,KAAEwM,UAAW,EACdxM,KAAAyM,uBAAA,EAEazM,KAAAkM,WAAAA,EACZlM,KAAKqB,QAAUA,EDinCXrB,KChnCFmM,QAAOD,GAAA,KAAA,KAAAA,EACTlM,KAACoM,WAAA,MAAAF,EAEDlM,KAAIqM,mBAAqB,MAAAH,EACzBlM,KAAAsM,gBAAgB,MAAAJ,EAChBlM,KAAAuM,qBAAqC,MAAbL,GAAqC,MAAdA,EAC/ClM,KAAKwM,SAAgB,MAARN,EACdlM,KAAAyM,sBAAA,MAAAP,EDinCC,MC9mCGD,KDgnCPjC,GC9mCIiC,mBAACA,CD+mCL,IAAIS,GC7mCI,WD8mCJ,QC7mCAA,MAqHJ,MAlHgBA,GAAAC,UAAY,SAA1BtM,KACEA,GAAIL,KAAc4M,UAAgBpM,KAAAH,ID8mClCqM,EC5mCSG,yBAAA,SAAAC,GACT,GAACA,GAAAA,EAAAC,QAAD,CAID,GAAAC,GAAAhN,KAAAiN,uBAAAH,EAEaA,GAAAI,IAAAC,KAAA,6BAAsCH,EAAgBI,SAApEN,EAAAO,SA6CCvC,EAAAwC,MAAAR,EAAAO,SAAAL,EAAAK,UA5CCrN,KAAKuN,QAAMT,KD6mCXJ,EC3mCCc,WAAA,SAAAV,GAED,IAAIA,IAAAA,EAAAC,QACA,MAAO,ED4mCP,IC1mCFC,GAAOhN,KAAAiN,uBAAAH,EACT,OAACE,GAAAI,SAAA,GD4mCDV,ECzmCSe,aAAQ,SAAkBL,EAACN,GACpC,GAACY,GAAA1N,KAAAwN,WAAAV,EAEcY,IAAfN,ID2mCIN,EAAOI,ICxmCPC,KAAO,2BAAiCO,EAAK,QAAmBN,GDymChEpN,KAAK2N,eCxmCEb,EAAAY,KD0mCXhB,ECvmCSiB,eAAiB,SAAMb,EAAOM,GDwmCnC,GCpmCFQ,GAAI5N,IDqmCF,ICpmCF8M,GAAYA,EAAIe,QDomCd,CAGA,GAAIC,GCpmCH,2BDqmCD,KAAKhB,ECnmCLC,QAGF,WAFAD,GAACI,IAAAa,MAAAD,EAAA,0BDsmCMV,GClmCa,EAAVA,KDmmCJA,EClmCJpN,KAAAwN,WAAAV,IDomCAA,EChmCFI,IAAOC,KAAI,wCAAuCC,EAAW,KDimC3DN,EChmCFkB,iBAAmBC,YAAEnB,EAAAM,EAAA,SAAAc,GACpB,KAAApB,GAAAoB,GAAAA,EAAA/B,SAAA+B,EAAAb,UAGU,WAFdP,GAAAI,IAAAiB,KAAAL,EAAA,KAAAI,EAAA7M,QAIKyL,GAAKO,SAAWvC,EAAQwC,MAAAR,EAASO,SAAaa,EAAKb,SACrD,IAAIe,GAAC1B,EAAAO,uBAAAH,EDgmCC,KC/lCJ,GAAA/N,KAASqP,GACTF,EAAAb,SAAAtO,UAED+N,GAAAO,SAAAtO,EAEJ,IAAAsP,IAEcjB,QAAAc,EAAAI,gBACLjB,SAAUa,EAAQb,SAExBP,GAAOyB,QAAKlB,SAAMmB,KAAAH,GACnBvB,EAAAI,IAAAC,KAAA,sBAAAkB,EAAAjB,SAEDQ,EAASL,QAAST,OAEtBJ,EAAAa,QAAC,SAAAT,GA5GY,IAAA,GA4GZvM,GAAAP,KAAA4M,UA5GYpH,EAAe,EAAAA,EAAAjF,EA4G3BI,OAAA6E,IAID,IAAAjF,EAAAiF,GAAAsH,GA8BC,MAAAlK,GAlBQkK,EAAAI,IAAAa,MAAA,oCAAPnL,KD0lCE8J,ECllCKO,uBAAwB,SAAAH,GAC9B,GAAA9E,GAAA8E,EAAAyB,QAAAlB,SAAAoB,MAAA,EAMM,OAAAzG,IAAAA,EAAAyC,OAAAzC,EAAAyC,MAAA2C,SAAPpF,EAAAyC,MAAe4C,SACRrF,EAAAyC,OAET2C,QAAA,EAAAC,cA9BaX,EAAAE,aAkCbF,ID8kCA1C,GC5jCC0C,gBAAAA,CD6jCD,IC9kCSgC,GAAP,WD+kCE,QC9kCKA,KACN1O,KAAA2O,iBAAA,KAcD,MDkkCED,GC7kC0BzP,UAAA2P,QAAA,WAC3B,MAAA5O,MAAA2O,kBD+kCCD,EC5kC0BzP,UAAC4P,UAAA,WAC5B7O,KAAA2O,iBAAA,MD8kCCD,EC3kCuBzP,UAAS6P,QAAA,SAAAC,GD4kC5B/O,KC3kCF2O,iBAAeI,GAElBL,IACH1E,GAAC0E,8BAAAA,CAlBY,IAAAM,GAAU,WAsBvB,QAAAA,MD0lCI,MCtlCJA,GAAC/P,UAAAkO,KAAA,SAAA9L,GAHQrB,KAAAkN,IAAA,OAAA7L,IAEA2N,EAAA/P,UAAAkP,KAAP,SAAa9M,GACfrB,KAAAkN,IAAA,OAAC7L,IAJY2N,EAAO/P,UAInB8O,MAAA,SAAA1M,GAkBDrB,KAAAkN,IAAA,QAAA7L,ID+jCI2N,ECxjCK/P,UAASiO,IAAO,SAAA+B,EAAA5N,GACjB6N,SAASA,QAAMD,IACfC,QAACD,GAAc,IAAAA,EAAc,oBAAkB5N,ID2jC5C2N,IAEXhF,GCxjCEgF,WAACA,CDyjCH,IAAIG,GAAW,WACX,QAASA,MCrjCb,MAJAA,GAAAlQ,UAAAkO,KAAC,SAAA9L,KAfD8N,EAeClQ,UAAAkP,KAAA,SAAA9M,KAfY8N,EAAAlQ,UAAA8O,MAAkB,SAAA1M,KAmB/B8N,ID4jCAnF,GClhCCmF,QAAAA,CDmhCD,IC5jCgBC,GAAG,WD6jCf,QC5jCIA,GAAgBC,EAAsB3I,EAAiB4I,GD6jCvDtP,KC5jCFqP,OAAOA,ED6jCLrP,KAAK0G,MC5jCAA,ED6jCL1G,KAAKsP,YC5jCEA,EAAQA,EAAY,GAAAC,GDqkC/B,MAPAvQ,QAAOwQ,eC5jCAJ,EAAAnQ,UAAA,OD6jCHwP,IAAK,WACD,MC7jCFzO,MAAOqP,OAAKvC,OAAAI,KD+jCduC,YC7jCE,ED8jCFC,cC7jCC,ID+jCEN,IAEXpF,GAAQoF,mBC5jCAA,CD6jCR,IAAIO,GC5jCE,WD6jCF,QC3jCIA,MA2BR,MDkiCIA,GC3jCeC,IAAE,SAAA1N,EAAA2N,GD4jCb,GC3jCFjQ,GAAA,SAAekQ,EAAQC,GACxB,MAAA,YAEI,IACH7N,EAAqB8N,WACtBF,EAAAF,IAAA1N,EAAA6N,GAKW,MAAAnN,GACLV,EAAU8N,WAAI,EACd9N,EAAUgL,IAAIa,MAAA,yBAAe+B,EAAAtJ,KAAA,MAAA5D,EAAAvB,QAAA,uBAE7Ba,EAAU8N,WAAIH,GACdA,EAAc3N,KAItB+N,EAAA/N,EAAAmN,OAAAvC,OAAAmD,QACHC,IAACL,KA1CYK,EAAkBD,EAAAtP,QAAAf,GA0C9B4G,KAAA,KAAA2J,SAAA,iBAAAP,IAAAC,GAAA,MAWC,KAAA,GAAArK,GAAAyK,EAAatP,OAAA,EAAA6E,EAAiC,GAAAA,IAAjC0K,EAAA1K,GAAA5F,EAAiCqQ,EAAjCzK,GAAAqK,GAAiCrK,EAAAyK,EAAAtP,OAAA,EAAAuP,EAAA1K,EAAA,GAAA,KALvC0K,GAAe,MAOtBP,EAACS,kBAAA,SAAAtD,GAGMA,EAAAuD,UAAA,GAAAC,IACLxD,EAAAuD,UAAc,GAAKE,IAEnBzD,EAAIuD,UAAkB,GAAQG,IAC9B1D,EAAIuD,UAAa,GAAAI,IDkjCb3D,ECjjCFuD,UAAK,GAAWK,IAClB5D,EAACuD,UAAA,GAAAM,IAED7D,EAAIuD,UAAW,GAAAO,IAChB9D,EAAAuD,UAAA,GAAAQ,KACFlB,IAID3F,GAAA2F,mBAAAA,CDgjCA,IChjCAmB,GAAA,WDijCI,QChjCKA,GAAsBC,GACP,SAAfA,IAAmCA,EAAA,KAS3C/Q,KAAAmQ,SAAA,IAPQnQ,KAAAwG,KAAA,kBACLxG,KAAKgR,UAASD,ED0jCd,MARAD,GChjCC7R,UAAA2Q,IAAA,SAAA1N,EAAA6N,GAEDkB,cAAcjR,KAACkR,YAChB,IAAAC,GAAAjP,EAAAwE,MAAA0K,KAAA,QACHD,IAAAA,EAAAE,WAACrR,KAAAkR,YAAAI,YAAA,WAAA,MAAApP,GAAAmN,OAAAkC,uBAAAJ,EAAAE,WAAArR,KAAAgR,YAIDjB,GAAAA,KAaUe,IDqiCV9G,GCtgCI8G,gBAAeA,CDugCnB,ICtgCEU,GAAC,WAEM,QAAAA,KACLxR,KAAMmQ,SAAA,GACNnQ,KAAIwG,KAAM,oBD6gCV,MANAgL,GCpgCYvS,UAAU2Q,IAAA,SAAA1N,EAAA6N,GACpB7N,EAASwE,MAAA+K,cAAsD,IAAtDvP,EAAAwE,MAA8B+K,aAAA9Q,QAAwB,UAAAuB,EAAAwE,MAAAgL,OAC/DxP,EAAOwE,MAAA+K,aAAA3G,EAAA6G,OAAA5M,QAAA,IAAA,IAAAQ,UAAA,EAAA,KAGTwK,GAAKA,KDqgCEyB,IAEXxH,GClgCIwH,kBAASA,CDmgCb,IAAII,GClgCW,WDmgCX,QClgCEA,GAAO9E,GACT9M,KAAC4M,aAED5M,KAAK6R,kBAAmB,EAExB7R,KAAI8R,QAAShF,EDqqCb,MAnKA8E,GChgCc3S,UAAE8S,QAAA,SAAArL,GDigCZ,GChgCFsL,GAAS,gCACVlF,EAAA9M,KAAA8R,QAAK5E,EAAEJ,EAAAI,GDkgCJ,KCjgCFJ,EAAIe,QAEP,WADEX,GAAAC,KAAA,8BAAA6E,EAGH,KAAAlF,EAAAC,QAEM,WADEG,GAAAC,KAAA,oBAA4B6E,EAIlC,IAAIhS,KAAKiS,0BAER,WADC/E,GAAAC,KAAO,8CAAA6E,EAIThS,MAAKkS,kBDggCD,IC//BFC,GAASrF,EAAAyB,QAAA6D,MAAA5D,KAAA9H,GACT2L,EAAO,QAAA3L,EAAAgL,KAAA,KAAAhL,EAAA+K,aAAA,SAAA/K,EAAA+K,aAAA,GACRU,GAEGjF,EAACC,KAAO,oBAAUgF,EAAA,IAAAE,GAGrBnF,EAAAa,MAAA,2BAAAsE,IDigCDT,EC5/BK3S,UAAAqT,QAAA,SAAAC,GD6/BD,GC5/BF3E,GAAI5N,KACJwS,EAAe,mCD6/BT1F,EC5/BC9M,KAAA8R,QD6/BD5E,EC5/BJJ,EAAOI,GD6/BP,KC5/BFlN,KAAC6R,iBD4/BC,CAIA,GADA3E,EAAIC,KC3/BJ,wBD4/BKL,EC3/BLe,QD6/BI,WADAX,GC3/BJC,KAAI,8BAAiCqF,EAGzC,KAAE1F,EAAAC,QACA,WADAG,GAAOC,KAAK,oBAAAqF,ED+/BVxS,MC5/BF6R,kBAAK,EACP7R,KAACkS,kBACF,KAEM,GAAAO,GAAA3F,EAAAyB,QAAA6D,MAAA3D,IAAP3B,EAAA4F,oBACM,KAAAD,GAAqC,IAARA,EAAQ9R,OAGvC,YADGX,KAAA6R,kBAAqB,EAI1B3E,GAAOC,KAAI,WAAKsF,EAAA9R,OAAA,cAA6BmM,EAAiB6F,UAAY,KACtE7F,EAACkB,iBAAuB4E,WAAWH,EAASI,IAAG,SAAS3S,GAAI,MAAAA,GAAAuK,QAAoBqC,EAAQ,SAAAoB,GAExFN,EAAAkF,0BAA2B5E,EAAAuE,GACzB7E,EAACmF,aAAAN,EAA2BI,IAAI,SAAC3S,GAAA,MAAAA,GAAuBuK,QAACyD,GAC9DhB,EAAAC,KAAA,8BAEGS,EAAUiE,kBAAG,GAEfU,GAEH,MAAA3P,GAEMsK,EAAAa,MAAA,2BAAPnL,GACI5C,KAAOgT,oBACVhT,KAAA6R,kBAAA,KDw/BCD,ECp/Bc3S,UAAM+T,kBAAuB,SAAWC,EAACC,EAAAC,GDq/BnD,GCp/BFrG,GAAK9M,KAAA8R,UDq/BEmB,GCp/B6B,GAAlBA,KAClBA,EAAE,GDs/BAnG,EAAOI,ICr/BPC,KAAK,6BAAkB8F,EAAA,aDs/BvBjT,KCr/BDoT,wBAAA,GAAAxI,OAAA,GAAAA,OAAAyI,UAAA,IAAAJ,GACFC,IACFlT,KAAAsT,yBAAAtT,KAAAoT,yBAGCD,GACDrG,EAAAyB,QAAA6D,MAAAmB,SDu/BC3B,ECp/BU3S,UAAcuU,eAAA,SAAAnT,KDq/BlBA,GCp/BCL,KAAA4M,UAAcpM,KAAAH,IAEvBuR,EAAC3S,UAAA8T,aAAA,SAAAU,EAAAvF,GAGC,IAAA,GADM3N,GAAAP,KAAA4M,UACCpH,EAAK,EAAAA,EAAAjF,EAAuBI,OAAS6E,IAC7C,IAEOjF,EAAAiF,GAAAiO,EAAAvF,GAEJ,MAAKtL,GACN5C,KAAA8R,QAAA5E,IAAAa,MAAA,yCAAAnL,KDs/BDgP,ECj/B4B3S,UAAKgT,wBAAQ,WACzC,MAAOjS,MAASsT,0BAAWtT,KAAAsT,yBAAA,GAAA1I,ODm/B3BgH,ECh/BW3S,UAAQiT,iBAAa,WDi/B5B,GCh/BFtE,GAAK5N,IACLA,MAAM0T,cACP1T,KAAA0T,YAAApC,YAAA,WAAA,MAAA1D,GAAA+F,kBAAA,ODm/BD/B,EC9+BO3S,UAAA2U,2BAAoB,WD++BvB,MC9+BF5T,MAAOoT,yBAAApT,KAAAoT,wBAAA,GAAAxI,ODg/BTgH,EC7+Ba3S,UAAA0U,eAAkB,WAE7B3T,KAAI4T,8BAAK5T,KAAA6R,kBACT7R,KAAKsS,WD++BPV,EC3+Ba3S,UAAA6T,0BAAuB,SAAA5E,EAAAuF,GD4+BhC,GC1+BFI,GAAS,mCACT/G,EAAK9M,KAAA8R,QACL5E,EAAKJ,EAAAI,GD2+BH,IC1+BFgB,EAAO/B,QAKP,MAJDe,GAAAC,KAAA,QAAAsG,EAAA9S,OAAA,gBAEGX,MAAA8T,aAAiBL,ED4+BjB,ICx+BFvF,EAAK7B,mBAIH,MAHFa,GAAAa,MAAO,4CACR/N,MAAAgT,mBD2+BG,ICv+BF9E,EAAI5B,gBAGJ,MDq+BMY,GCv+BJC,KAAI,sEDw+BAnN,MCv+BJgT,kBAAO,MAAA,GAAsB,ED0+B7B,IAAI9E,ECx+BA3B,qBAKP,MDo+BOW,GCx+BJC,KAAK,4DAAqB0G,GAC5B7T,KAACgT,kBAAA,QAEDhT,MAAA8T,aAAOL,ED0+BL,ICt+BFvF,EAAS1B,UAAC0B,EAAA9B,WAKN,MAJJc,GAAIa,MAAC,sCAAoBG,EAAA7M,SAC1BrB,KAAAgT,kBAAA,SACFhT,MAAA8T,aAAAL,EDy+BK,ICr+BFvF,EAAKzB,sBAAsB,CAC5B,GAAApL,GAAA,iDAYG,aAXLyL,EAAA4F,oBAAA,GACHxF,EAAAa,MAAA1M,EAAC,sCAAAyL,EAAA4F,oBAAArO,KAAAK,IAAA,EAAAL,KAAA0P,MAAAjH,EAAA4F,oBAAA,QAQCxF,EAAAa,MAAA1M,EAAA,IAAYwS,GAAA7T,KAAA8T,aAAAL,KAKdvF,EAAA/B,UAACe,EAAAa,MAAA,6BAAAG,EAAA7M,SAAA,gDATYrB,KAAAgT,sBD++BTpB,EC/9BK3S,UAAA6U,aAAqC,SAAAL,GAkE7C,IAAA,GAAAjO,GAAA,EAAAA,GAAAiO,OAAA9S,OAAA6E,IAhEQxF,KAAA8R,QAAAvD,QAAA6D,MAAA4B,OAAAP,EAAPjO,GAAA2M,YAGEP,IDi+BJ5H,GC99BG4H,kBAAAA,CD+9BH,IC79BSqC,GAAA,WD89BL,QC79BIA,GAA0BC,GACd,SAAZA,IAAsBA,EAAa,KACvClU,KAAIoS,MAAO,GAAG+B,GAAmBD,GACjClU,KAAIqN,SAAU,GAAA8G,GAAA,GAGhB,MAACF,KD89BHjK,GC39BIiK,wBAAmBA,CD49BvB,IAAIG,GC39BU,WD49BV,QC39BEA,KD49BEpU,KAAKqU,2BC39Be,gCDohCxB,MAvDAD,GC19BqCnV,UAAA2T,WAAA,SAAAa,EAAA3G,EAAA+C,EAAA0C,GD29BjC,GC19BFnB,GAAKkD,KAAAC,UAAAd,GD29BCrQ,EC19BJpD,KAAWwU,cAAW1H,EAAM,OAAAA,EAAA6F,UAAA,iBAAAvB,GAC9BqD,EAAEzU,KAAA0U,yBAAA5H,EAAA+C,ED29BA,OC39BA/C,GAAU6H,kBAACC,YAAAxR,EAAAqR,EAAAlC,ID69Bf6B,EC39BGnV,UAAA4V,oBAAA,SAAAC,EAAA5L,EAAA4D,EAAA+C,GD49BC,GC19BFkF,GAAKjI,EAAQ6F,UAAU,yBAAoBqC,mBAAAF,GAAA,oBD29BrC1D,EC19BJkD,KAAOC,UAASrL,GAClB9F,EAACpD,KAAAwU,cAAA1H,EAAA,OAAAiI,EAAA3D,GAEDqD,EAAAzU,KAAS0U,yBAAyB5H,EAAE+C,EACtC,OAAE/C,GAAA6H,kBAAAC,YAAAxR,EAAAqR,IAGJL,EAACnV,UAAAgP,YAAA,SAAAnB,EAAAM,EAAAyC,GAEM,GAAAzM,GAAApD,KAAAwU,cAAA1H,EAAA,MAAPA,EAAA6F,UAAqB,6BAAuEvF,GACtFqH,EAAA,SAAelJ,EAAAlK,EAAc+P,EAAQ6D,GACzC,GAAO,MAAA1J,EACR,MAAAsE,GAAA,GAAAqF,IAAA,EAAA,KAAA,GAAA,KAAA7T,GAEyE,IAAAgM,EACxE,KACEA,EAAMiH,KAAAa,MAAA/D,GAEN,MAAAlR,GACA4M,EAAQI,IAAOa,MAAM,8BAAAqD,EAAA,KAErB,OAAA/D,GAAA+H,MAAA/H,EAAAD,SACHyC,EAAA,GAAAqF,IAAA,EAAA,KAAA,GAAA,KAAA,wCAEDrF,GAAA,GAOCqF,IAAA,EAAA7H,EAAAA,aAAAA,EAAAD,UDk9BK,OCv9BFN,GAAI6H,kBAA0BC,YAAWxR,EAAgBqR,IDy9B3DL,ECt9BenV,UAAAoW,cAA2B,SAAUC,EAAAC,EAAAzI,GACpD,GAAE1J,GAAApD,KAAAwU,cAAA1H,EAAA,MAAAA,EAAA0I,mBAAA,uCAAAF,EAAA,UAAAC,EACHzI,GAAA6H,kBAAAC,YAAAxR,IAlEHgR,EAmECnV,UAAAuV,cAAA,SAAA1H,EAAA2I,EAAAnU,EAAA8P,GAED,MArEa,UAAAA,IAAuBA,EAAA,OAqEpCqE,OAAAA,EAoPCnU,IAAAA,EAnPe8P,KAAQA,EAAiBsE,OAAA5I,EAAc4I,OD29B3CC,UC39B6B7I,EAAA6I,YD89BrCvB,EC79BcnV,UAAAyV,yBAAA,SAAA5H,EAAA+C,GD89BV,GC79BFjC,GAAM5N,IACR,OAAC,UAAAuL,EAAAlK,EAAA+P,EAAA6D,GAEG,GAAC3G,GAAiB2G,GAAeW,SAAAX,EAAArH,EAAAyG,4BAAA,GACnC3H,GAAce,aAAAa,EAAAxB,GACf+C,EAAA,GAAA5D,GAAAV,EAAAlK,MD+9BM+S,IAEXpK,GC39BIoK,wBAACA,CD49BL,IAAItJ,GC19BA,WACF,QAACA,MD2pCC,MA/LAA,GCz9BE+K,SAAS,SAAWC,GAEtB,IAAC,GADCC,MACDC,EAAA,EAAAA,EAAA/V,UAAAU,OAAAqV,IAEGD,EAAeC,EAAE,GAAA/V,UAAA+V,EAKrB,IAHEF,IACAA,OAEDC,GAAA,IAAAA,EAAApV,OAED,MAAWmV,EAGC,KAAA,GAAAtQ,GAAd,EAAAA,EAAyBuQ,EAAiBpV,OAAA6E,IACpCuQ,EAAmBvQ,IAACsQ,EAAA3O,QAAA4O,EAAAvQ,IAAA,GAEpBsQ,EAAmBtV,KAAOuV,EAAOvQ,GDw9BjC,OCr9BCsQ,IDu9BLhL,EAAMmL,YCr9BH,SAAAvS,GACH,IAACA,GAAA,IAAAA,EAAA/C,OAED,MAAQ,EAIR,KAAA,GADYuV,GAAd,EACE1Q,EAAA,EAAAA,EAAA9B,EAAA/C,OAAA6E,IAAA,CACE,GAAA2Q,GAAYzS,EAAW0S,WAAW5Q,EACnC0Q,IAAAA,GAAA,GAAAA,EAAAC,EAEDD,GAAW,EAGC,MAAKA,IDm9BjBpL,ECh9BAuL,WAAY,SAAIC,EAAiBC,GDm9B7B,ICh9BD,GAFDxQ,MDi9BMD,GCh9BJwQ,GAAc,IAAAvS,MAAA,MACfyB,EAAA,EAAAA,EAAAM,EAAAnF,OAAA6E,IAAA,CACF,GAAAgR,GAAA1Q,EAAAN,GAAAzB,MAAA,IAEQ+G,GAAG2L,QAAUD,EAAQ,GAACD,KACzBxQ,EAAEyQ,EAAY,IAAEA,EAAA,IAGtB,MAAC1L,GAAA4L,QAAA3Q,GAAA,KAAAA,GAGH+E,EAAC6G,KAAA,WAEa,QAAAgF,KACR,MAAOtS,MAAGC,MAAA,OAAA,EAAAD,KAAAuS,WAAA5N,SAAA,IAAAzD,UAAA,GAEd,MAACoR,KAAAA,IAAA,IAAAA,IAAA,IAAAA,IAAA,IAAAA,IAAA,IAAAA,IAAAA,IAAAA,KD+8BD7L,EC58BAwC,MAAI,SAAUuJ,EAAkBd,GAChC,GAAIhQ,KD68BA,KC58BF,GAAAhH,KAAO8X,OACRA,EAAA9X,KAEMgH,EAAKhH,GAAA8X,EAAA9X,GAIZ,KAAK,GAAAA,KAASgX,OACNA,EAAMhX,KACbgH,EAAAhH,GAAAgX,EAAAhX,GD68BG,OCz8BFgH,ID28BF+E,ECx8BAgM,aAAwB,SAAApT,GACxB,IAAKA,EACH,MAAI,KD08BF,IAAIqT,GCx8BG,kHACTC,EAACD,EAAAjT,KAAAJ,EACH,OAACsT,IAAAA,EAAArW,OAAA,EAEOqW,EAAM,GAGF,MAEdlM,EAACC,iBAAA,SAAAkM,EAAAV,GAOa,IAAAU,GAAuB,IAArCA,EAAAtW,OAAyD,MAAA,KDm8BnD,ICj8BFuW,GAAOD,EAAMlT,MAAA,IACf,IAAC,IAAAmT,EAAAvW,OAEG,MAAO,KDm8BP,KC/7BF,GADFoF,MACMP,EAAO,EAAAA,EAAY0R,EAAAvW,OAAW6E,IAAA,CDg8B5B,GC/7BJ2R,GAAOD,EAAM1R,GAAAzB,MAAA,IACd+G,GAAA2L,QAAAU,EAAA,GAAAZ,KAEDxQ,EAAWqR,mBAAaD,EAAQ,KAAAC,mBAAyBD,EAAQ,KDi8B/D,MC97BDrM,GAAA4L,QAAA3Q,GAAA,KAAAA,GDg8BH+E,EAAMuM,aC77BA,WD87BF,MAAOhT,MC77BPC,MAA0B,iBAAhBD,KAAAuS,WD+7Bd9L,EAAM2L,QC57BA,SAAAxN,EAA4BqO,EAAQC,GD87BtC,GC77BE,SAAJA,IAAuBA,GAAA,ID67BhBtO,GC57Ba,gBAARA,GACZ,OAAC,CD87BC,IAAIuO,GC37BJ,oCD67BA,OADAvO,IC37BDsO,EAAAtO,EAAAwO,cAAAxO,GAAAlE,QAAAyS,EAAA,KAEGF,OAAAI,KAAqB,SAAAC,GD27BnB,GC17BS,gBAANA,GACR,OAAA,CAID,IDw7BMA,GCz7BGJ,EAAMI,EAAWF,cAAgBE,GAAA5S,QAAAyS,EAAA,IACzCG,EAAAhX,QAAA,EAED,OAAO,CAEV,IAAAiX,GAAA,MAAAD,EAAA,EAEaC,KACLD,EAAUA,EAASlY,MAAA,GAGd,IAAAoY,GAAwC,MAA7BF,EAAeA,EAAchX,OAAA,EAKpD,OAJOkX,KACRF,EAAAA,EAAApS,UAAA,EAAAoS,EAAAhX,OAAA,IAGQiX,GAAsBC,EAC9BF,EAAAhX,QAAAsI,EAAAtI,QAAA,KAAAsI,EAAA9B,QAAAwQ,EAAA,GASCC,EACW9M,EAAgBgN,SAAA7O,EAAA0O,GAEvBE,EACE/M,EAAOiN,WAAA9O,EAAA0O,GAGN1O,IAAQ0O,KDg7Bf7M,EAAM4L,QC56BA,SAACzN,GD66BH,MC36BO,QD26BAA,GC36Ba,gBAAA,IAAA,IAAAjK,OAAAgZ,KAAA/O,GAAAtI,QD66BxBmK,EAAMiN,WC16BK,SAAM9O,EAAAgP,GD26Bb,MC16BChP,GAAA1D,UAAA,EAAA0S,EAAAtX,UAAAsX,GD46BLnN,ECz6BEgN,SAAO,SAAc7O,EAAKiP,GD06BxB,MCz6BiB,KAAnBjP,EAAI9B,QAAY+Q,EAAGjP,EAAAtI,OAAAuX,EAAAvX,SD26BrBmK,EAAMyJ,UCx6BE,SAAYnD,EAAMmF,EAAC4B,GDy6BvB,QCx6BAC,GAAcC,EAAMC,GDy6BhB,GAAIC,KACJ,OCx6BHjE,MAAAC,UAAA8D,EAAA,SAAAtZ,EAAA0L,GACD,IAAAK,EAAU2L,QAAQ1X,EAAKuZ,GAAvB,CAKH,GAAA,gBAAA7N,IAAAA,EAAA,CAEQ,GAAwB,KAAxB8N,EAAapR,QAAMsD,GAChB,MAER8N,GAAO/X,KAAMiK,GAGf,MAAWA,MAId,GAAA,uBAAAzB,SAAA7J,KAAAiS,GAAA,CAEa,GAAAoH,KAAiB,KAAA,GAAAC,KAAArH,GAAA,CACzB,GAAO3G,GAAK2G,EAAKqH,EACZhO,KAAM2G,IAIboH,EAAOC,GAAarH,EAAAqH,IAGtB,MAASL,GAAYI,EAAcjC,GDm6B/B,GCl6BsB,sBAANvN,SAAM7J,KAAAiS,GAAA,CACxB,IAAK,GADoBrL,MACpBP,EAAQ,EAAAA,EAAA4L,EAAAzQ,OAAA6E,IAACO,EAAUP,GAAA8O,KAAAa,MAAAiD,EAAAhH,EAAA5L,GAAA+Q,GAAW,OAAKjC,MAAMC,UAAOxO,GAGvD,MAAOqS,GAAahH,EAAAmF,IAExBzL,EAAA4N,UAAC,SAAAzP,EAAA0P,GApPY,GAoPZ,SAAAA,IAAAA,GAAA,GAAA,iBApPiB1P,GAwPlB,MAAAA,EAcS,IAAA,OAAAA,GAA2B,gBAAAA,IAAA,gBAAAA,GAQ3B,MAAA0P,EAYA,SAAA1P,EAAA,IAAAwO,cAAsDD,QAgBtD,IAAA,OAWC,IAAA,MAOA,IAAA,IAAS,OAA2C,CAoEpD,KAAA,QA4BA,IAAA,KA2BA,IAAA,IAmCA,IAAA,MAAA,OAAe,EA3JrB,MAAAmB,IAEC7N,ID62BLd,GCz2BIc,MAAQA,CD02BZ,IAAI8N,GCz2BW,WD02BX,QCz2BKA,GAAYC,GAejB,QAAAC,GAAgBC,GAChB,MAAmB,kBAADA,GAAmBA,EAAI/Y,MAAE+Y,EAf3C/Y,KAAKgZ,eACLhZ,KAAKiZ,eAELjZ,KAAK6N,SAAA,EACL7N,KAAKkZ,uBAAqB,GAAAxK,GAC1B1O,KAAKqN,YACLrN,KAAKmZ,YACLnZ,KAAK4M,aACL5M,KAAKoZ,WAAA,qCACLpZ,KAAKqZ,oBAAoB,qCACzBrZ,KAAKsZ,gCAA0B,KAC/BtZ,KAAKuZ,mBACLvZ,KAAKwZ,yBAiBPX,EAAA/N,EAAWwC,MAAAsL,EAAAa,SAAMZ,GD41BX7Y,KC51BNkN,IAAA4L,EAAAD,EAAA3L,MAAA,GAAAiC,GD61BMnP,KC51BJ0V,OAAOmD,EAAanD,OACtB1V,KAAC2S,UAAAkG,EAAAlG,UD61BK3S,KCv1BNwV,mBAA+BqD,EAAArD,mBDw1BzBxV,KCv1BJ0Z,+BAA6Bb,EAAAa,+BDw1BzB1Z,KCv1BJ2Z,yBAAyBb,EAAKD,EAAWc,0BDw1BrC3Z,KCv1BJ4Z,YAAed,EAAAD,EAAAe,aACjB5Z,KAACkZ,uBAAAJ,EAAAD,EAAAK,yBAAA,GAAAxK,GDw1BK1O,KAAK6Z,gBAAkBf,EAAOD,EAAegB,iBAC7C7Z,KAAK8Z,qBAAuBhB,EAAOD,EAAeiB,sBCn2BvD9Z,KAAA0S,oBAAAoG,EAAAD,EAAAnG,sBAAA,GAgBD1S,KAAA2U,kBAAWmE,EAAAD,EAAAlE,mBDs1BL3U,KCt1BNgO,iBAAA8K,EAAAD,EAAA7K,mBAAA,GAAAoG,GDu1BMpU,KCt1BJuO,QAASuK,EAAKD,EAAetK,UAAa,GAAO0F,GACnDjU,KAACoS,MAAA0G,EAAAD,EAAAzG,QAAA,GAAAR,GAAA5R,MDu1BK0M,EAAgBG,yBAAyB7M,MACzC2P,EAAmBS,kBAAkBpQ,MAoNzC,MC/hCFhB,QAAAwQ,eAAWoJ,EAAA3Z,UAAA,UD80BLwP,IC90BN,WACE,MAAOzO,MAAK+Z,SDg1BRC,ICz0BN,SAAqBvP,GACnBzK,KAAK+Z,QAAStP,GAAA,KD00BNzK,KCz0BNkN,IAAKC,KAAA,WAAkBnN,KAAC+Z,SD00BlB/Z,KCz0BNuN,WD20BEkC,YCz0BE,ED00BFC,cCz0BH,ID20BD1Q,OAAOwQ,eAAeoJ,EAAc3Z,UAAW,WAC3CwP,IAAK,WCx1BV,QAAAzO,KAAA0V,QAAA1V,KAAA0V,OAAA/U,QAAA,ID21BK8O,YCj0BN,EDk0BMC,cCj0BG,IDm0BP1Q,OAAOwQ,eC5zBqBoJ,EAAa3Z,UAAA,aD6zBrCwP,IC5zBJ,WD6zBQ,MC5zBNzO,MAAKoZ,YD8zBHY,IAAK,SC5zBFvP,GACNA,IACFzK,KAAAoZ,WAAA3O,ED6zBazK,KAAKqZ,oBAAsB5O,EAC3BzK,KAAKkN,IAAIC,KAAK,cAAgB1C,GC10B3CzK,KAAAuN,YD80BKkC,YCpzBG,EACTC,cAAC,IDszBC1Q,OAAOwQ,eC/yBIoJ,EAAU3Z,UAAW,sBDgzB5BwP,IAAK,WC9yBT,MAACzO,MAAAqZ,qBDizBGW,IAAK,SC9yBFvP,GACNA,IAAKzK,KAAKqZ,oBAAqB5O,EAC9BzK,KAAKkN,IAAGC,KAAM,uBAAA1C,GACfzK,KAAAuN,YDkzBGkC,YC9yBC,EACPC,cAAC,IDgzBC1Q,OAAOwQ,eAAeoJ,EAAc3Z,UAAW,kCCp0BhDwP,IAAA,WA6CD,MAAAzO,MAAAsZ,iCD2xBMU,IC1xBJ,SAAIvP,GACQ,gBAADA,KD6xBU,GAATA,EC5xBbA,EAAA,GAWwBA,EAAuB,GAAA,KAAAA,IAAvBA,EAAuB,MDuxBtCzK,KAAKsZ,gCAAkC7O,ECtxB3CzK,KAACkN,IAAAC,KAAA,mCAAyC1C,GAC/CzK,KAAAuN,YDyxBKkC,YChxBN,EDixBMC,cChxBA,IDkxBJ1Q,OChxBDwQ,eAAAoJ,EAAA3Z,UAAA,kBDixBKwP,IAAK,WACD,GAAI8H,GAAavW,KAAKqN,SAAS,mBClxBxC,OAAArN,MAAAuZ,gBAAArY,OAAAqV,GAAAA,EAAAxS,MAAA,WAS8B0L,YAAA,ED6wBzBC,cC7wByB,ID+wB7BkJ,EAAc3Z,UAAUgb,kBAAoB,WC7wB7C,IAAA,GADK1D,MACLP,EAAA,EAAAA,EAAA/V,UAAAU,OAAAqV,IAMDO,EAAAP,EAAW,GAAA/V,UAAA+V,ED4wBLhW,MC3wBJuZ,gBAAYzO,EAAa+K,SAAC9V,MAAmB+K,GAAgB9K,KAAAuZ,iBAAArY,OAAAqV,KD6wB7DvX,OAAOwQ,eC3wBJoJ,EAAA3Z,UAAA,wBACLwP,IAAC,WD4wBS,GAAI6I,GAAWtX,KAAKqN,SAAS,yBAC7B,OAAOrN,MAAKwZ,sBAAsBtY,OAAOoW,GAAYA,EAASvT,MAAM,WC9vBvE0L,YAAA,EACLC,cAA4B,IDkwB5BkJ,EChwBO3Z,UAAUib,wBAAA,WAEjB,IAAC,GADCC,MACDnE,EAAA,EAAAA,EAAA/V,UAAAU,OAAAqV,IAEGmE,EAAenE,EAAA,GAAA/V,UAAA+V,EAEnBhW,MAACwZ,sBAAA1O,EAAA+K,SAAA9V,MAAA+K,GAAA9K,KAAAwZ,uBAAAtY,OAAAiZ,KDiwBDnb,OAAOwQ,eC9vBEoJ,EAAa3Z,UAAA,WACtBwP,IAAC,WAEG,MAAAzO,MAAYmZ,SAAkBiB,KAAA,SAAAC,EAAAC,GAC9B,MAAUD,GAAKlK,SAASmK,EAAAnK,SAAA,GAAAkK,EAAAlK,SAAAmK,EAAAnK,SAAA,EAAA,KDgwBxBV,YC7vBA,ED8vBAC,cC7vBM,ID+vBVkJ,EC7vBC3Z,UAAAoR,UAAA,SAAAkK,EAAApK,EAAAqK,GAED,GAAI1K,GAAC0K,GAAehU,KAAA+T,EAAApK,SAAAA,EAAAP,IAAA4K,GAAAD,CD6vBhB,KC5vBFzK,IAAYA,EAAOF,IAEtB,WADE5P,MAAAkN,IAAAa,MAAA,4CAeG+B,GAAetJ,OACfsJ,EAAOtJ,KAACsE,EAAA6G,QAEV7B,EAAOK,WACRL,EAAAK,SAAA,EDovBG,KAAK,GCjvBLsK,IAAc,EAChBxK,EAAIjQ,KAAQmZ,SACV3T,EAAQ,EAAAA,EAAYyK,EAAKtP,OAAA6E,IDgvBrB,GC/uBJyK,EAAMzK,GAAAgB,OAAAsJ,EAAAtJ,KAAA,CACPiU,GAAA,CACF,OAQIA,GACHxK,EAAKzP,KAAAsP,IAOF8I,EAAA3Z,UAAAyb,aAAe,SAAtBH,GACE,GAAM/T,GAA2B,gBAAR+T,GAAQA,EAAAA,EAAA/T,IACjC,KAAIA,EAGA,WADAxG,MAAAkN,IAAAa,MAAwB,gDAG1B,KAAK,GAANkC,GAAAjQ,KAAAmZ,SAAO3T,EAAA,EAAAA,EAAAyK,EAAAtP,OAAA6E,IACN,GAAIyK,EAACzK,GAAYgB,OAASA,EAAG,CAC9ByJ,EAAArP,OAAA4E,EAAA,EAEO,SDyuBRoT,ECjuBM3Z,UAAC0b,WAAA,SAA2BvN,GACnCA,IDkuBSpN,KAAKiZ,YAAY,YAAc7L,IC7tBlCwL,EAAA3Z,UAAA2b,gBAAP,SAAmBC,EAAgCrU,GAAhC,GAAAsU,GAAA,QAAgCC,EAAA,gBAAAF,GAAAA,GAAiCxJ,SAAAwJ,EAAArU,KAAAA,GAC9EwU,GAAgBD,IAACA,EAAA1J,WAAA0J,EAAAvU,IACnBwU,SACDhb,MAAAiZ,YAAA6B,GAOG9a,KAACiZ,YAAc6B,GAAAC,EAGd/a,KAAAkN,IAAAC,KAAA,mBAAe6N,EAAtB,OAAAD,EAAA1J,YAKOrS,OAAAwQ,eAAAoJ,EAAA3Z,UAAP,aACEwP,IAAK,WACN,MAAA,0BAGCgB,YAAS,EACVC,cAAA,ID2tBCkJ,ECxtBI3Z,UAAgBgc,YAAU,SAAAC,EAAAnK,GACV,SAAhBmK,IAAwBA,GAAsB,GAC3C,SAALnK,IAAKA,EAAA,KDytBCmK,GCvtBNlb,KAAEqQ,UAAA,GAAAS,GAAAC,KD2tBJ6H,ECztBG3Z,UAAAkc,gBAAA,WACHnb,KAACqQ,UAAA,GAAAmB,KAOHoH,EAAA3Z,UAAkBmc,gBAAA,aDstBhBxC,ECrtBI3Z,UAAAoc,eAAc,WDstBdrb,KAAKkN,ICrtBP,GAAA8B,IDutBF4J,ECptBM3Z,UAAC0N,UAAc,SAAiBtM,KACvCA,GAAAL,KAAA4M,UAAApM,KAAAH,IDstBCuY,EAAc3Z,UAAUsO,QAAU,WCjpCrB,IAAA,GA2bdhN,GAAAP,KAAA4M,UA3bcpH,EAAA,EAAAA,EAAgBjF,EAAgCI,OAAA6E,IA4bjE,IAACjF,EAAAiF,GAAAxF,MAID,MAAA4C,GAOE5C,KAAAkN,IAAAa,MAAyB,oCAA8DnL,KDqtBrF5D,OCltBAwQ,eAAKoJ,EAAoB,YAC1BnK,IAAA,WAKE,MAHwB,QAApBmK,EAAA0C,mBACC1C,EAAO0C,qBAEZ1C,EAAA0C,kBAGF7L,YAAA,EAEMC,cAAA,IDitBLkJ,EC/sBO0C,iBAAgB,KACtB1C,IDitBL5O,GC9sBG4O,cAAAA,CD+sBH,IC7sBS2C,GAAA,WD8sBL,QC7sBKA,GAAK7U,EAAA2I,EAAkB7D,GD8sBxBxL,KC7sBFwb,6BAAgB,iEAClBxb,KAAC8V,OAAApP,EAED1G,KAAKqP,OAAOA,EACZrP,KAAAwL,kBAAYA,GAAA,GAAA+D,GD01BZ,MCj1BKgM,GAAAtc,UAAAwc,QAAA,SAAP/J,GAKE,MAJKA,KACH1R,KAAA8V,OAAUpE,KAAMA,GAGX1R,MDssBPub,ECpsBCtc,UAAAyc,UAAA,SAAAhY,GAMI,MAJAA,KACL1D,KAAO8V,OAAKpS,OAAAA,GAGP1D,MDosBLub,EClsBOtc,UAAO0c,eAAkB,SAAA7G,GAChC,IAAC9U,KAAA4b,kBAAA9G,GAED,KAAO,IAAKtL,OAAA,eAAAxJ,KAAAwb,6BAIZ,OADKxb,MAAA8V,OAAArE,aAAMqD,EACP9U,MDksBJub,EChsBCtc,UAAA4c,kBAAA,SAAArV,EAAAsV,GAED,IAAItV,EACF,KAAM,IAAIgD,OAAM,eAGlB,KAAKsS,IAAO9b,KAAG4b,kBAAkBE,GACjC,KAAO,IAAKtS,OAAA,MAAAxJ,KAAAwb,6BAOZ,OADKxb,MAAA+b,YAAA,QAAAvV,EAAAsV,GACD9b,MD4rBJub,EC1rBEtc,UAAY+c,WAAA,SAAA3a,GAKf,MAJEA,KAEGrB,KAAC8V,OAAWzU,QAAUA,GAE3BrB,MD2rBCub,ECjrBItc,UAAYgd,OAAI,SAAcC,EAAAC,GDkrB9B,GCjrBG,IAALD,GAAiBA,EAAA,GAClB,KAAA,IAAA1S,OAAA,yDAGF,IAAA,KAAA2S,GAAAA,EAAA,IASM,KAAA,IAAA3S,OAAA,4DD2qBD,OADAxJ,MCxqBF8V,OAAIsG,IAA6BF,EAAA,IAAAC,EDyqBxBnc,MAEXub,ECxqBMtc,UAAQ2b,gBAAA,SAAAC,EAAArU,GDyqBV,GAAIuU,GCxqBgB,gBAANF,GAAMA,GAAAxJ,SAAAwJ,EAAArU,KAAAA,EDyqBpB,OCxqBDuU,KAAAA,EAAA1J,UAAA0J,EAAAvU,OAIHxG,KAAA+b,YAAY,QAAAhB,GACb/a,MAJQA,MD6qBPub,EChqBItc,UAAAod,mBAAoB,SAAAC,EAAApT,GDoqBpB,MCnqBFoT,IAAWpT,GDiqBLlJ,KChqBJ+b,YAAA,qBAAqBQ,cAAiBD,EAAApT,YAAAA,IAExClJ,MDkqBFub,EC/pBOtc,UAAKud,sBAAA,SAAAC,EAAAC,GACb,GAAAD,EAAA,CAEM,GAAA3b,IACC6b,eAAQF,EAEbC,KAEM5b,EAAK4b,MAAAA,GAGP1c,KAAA+b,YAAA,SAAPjb,GD8pBM,MC9pBSd,ODgqBbub,EAAatc,UAAU2d,qBAAuB,SAAUC,EAAmBH,GC/pB3E,GAAIG,EAAe,CACnB,GAAOzL,IACR0L,kBAAAD,EAWK7c,MAAKwc,sBAAepL,EAAasL,GAErC,MAAC1c,ODypBDub,ECtpBOtc,UAAO8d,SAAU,SAAAtS,GD0pBpB,MCzpBHA,KAEGzK,KAAA8V,OAASrL,MAAWA,GAEtBzK,MDupBFub,ECppBOtc,UAAK+d,QAAA,WAGP,IAAA,GAFNC,MAEMjH,EAAA,EAAAA,EAAA/V,UAAAU,OAAPqV,IACMiH,EAAAjH,EAAU,GAAC/V,UAAA+V,EAIf,OAFAhW,MAAC8V,OAAAmH,KAAAnS,EAAA+K,SAAA9V,MAAA+K,GAAA9K,KAAA8V,OAAAmH,MAAA/b,OAAA+b,IAEMjd,MAGFub,EAAAtc,UAAA8c,YAAc,SAArBvV,EAAsBiE,EAAe0N,EAAA+E,GACnC,IAAK1W,GAAW5H,SAAF6L,GAAE,MAAAA,EACd,MAAKzK,KAGPA,MAAO8V,OAAK1E,OACbpR,KAAA8V,OAAA1E,QAGC,IAAIrL,GAAQuO,KAAAa,MAAYrK,EAAKyJ,UAAQ9J,EAAKzK,KAAAqP,OAAiBvC,OAAEqQ,eAAUjc,OAAAgc,OAAA/E,GDmpBnE,OClpBLrN,GAAA4L,QAAA3Q,KAEO/F,KAAA8V,OAAA1E,KAAA5K,GAAAT,GAEJ/F,MDgpBFub,EC7oBStc,UAAUme,eAAiB,SAASC,GDipBzC,MChpBFA,IACDrd,KAAAgd,QAAA,YAGChd,MD8oBFub,EC5oBMtc,UAAWqe,eAAiB,SAASla,GDgpBvC,MC/oBFA,KAEApD,KAAKwL,kBAAY,YAAcpI,GAE9BpD,MD6oBHub,EC1oBOtc,UAAKwM,OAAA,SAAAoE,GACb7P,KAAAqP,OAAAkO,YAAAvd,KAAA8V,OAAA9V,KAAAwL,kBAAAqE,IA/NH0L,EAgOCtc,UAAA2c,kBAAA,SAAAnR,GAhOY,IAAAA,EAwOb,OAAA,CAgCC,IAAAA,EAAA9J,OAAA,GAAA8J,EAAA9J,OAAA,IA/BQ,OAAA,CDyoBD,KCvoBF,GAAK6E,GAAA,EAAAA,EAAkBiF,EAAA9J,OAAU6E,IAAA,CAClC,GAAAW,GAAAsE,EAAA2L,WAAA5Q,GACFgY,EAAArX,GAAA,IAAA,IAAAA,EAEDsX,EAAWtX,GAAA,IAAA,IAAAA,GAAYA,GAAA,IAAA,KAAAA,EAAvBuX,EAAA,KAAAvX,CACE,KAAMqX,IAAQC,IAAgBC,EAC/B,OAAA,EAAA,OAAA,GAGCnC,ID2oBJvR,GCxoBSuR,aAAAA,CDyoBT,IAAIhM,GCxoBK,WACP,QAACA,MD2qBC,MAjCAA,GCxoBFtQ,UAAA0e,aAAA,SAAA3c,GACEA,IACDhB,KAAA,gBAAAgB,ID2oBChC,OC3oBDwQ,eAAAD,EAAAtQ,UAAA,gBAEMwP,IAAA,WACD,QAASzO,KAAA,iBAEbyP,YAAC,EACFC,cAAA,ID4oBCH,ECzoBOtQ,UAAK2e,aAAqB,WAClC,MAAA5d,MAAA,iBAAA,MA/BHuP,EAgCCtQ,UAAA4e,qBAAA,WAhCY7d,KAAA,wBAgCZ,GAoBChB,OAAAwQ,eAAAD,EAAYtQ,UAAkD,oBAhBhEwP,IAAA,WAiBQ,QAAOzO,KAAA,wBAEXyP,YAAC,EAACC,cAAM,ID6nBRH,EC3nBCtQ,UAAA6e,oBAAA,SAAArI,GAEGA,IACAzV,KAAC,uBAAkByV,IAIlBlG,EAAAtQ,UAAA8e,oBAAA,WACL,MAAI/d,MAAA,wBAAwB,MAE5BuP,ID2nBJvF,GCxnBSuF,YAAAA,CDynBT,IAAIlE,GCxnBK,WACP,QAACA,GAAA2S,EAAArL,GAEM,GAAA/E,GAAA5N,IACc,iBAARge,GACXhe,KAAQ8M,OAAA,GAAA8L,GAAkBoF,GAI3Bhe,KAAA8M,OAAA,GAAA8L,IAAAlD,OAAAsI,EAAArL,UAAAA,IAGC3S,KAAKie,oBAAA,KACNje,KAAA8M,OAAAH,UAAA,SAAAG,GAAA,MAAAc,GAAAqQ,oBAAArQ,EAAAsQ,WAAA,EAAA,IAAA,KAEMle,KAAA8M,OAAAsF,MAAAoB,eAAA,SAAAC,EAAPvF,GAA0B,MAAeN,GAAAqQ,wBD0wBvC,MCxwBF5S,GAACpM,UAAAkf,gBAAA,SAAAnd,GAEM,GAAAwK,GAAA,GAAA+D,EAEN,OADC/D,GAAKmS,aAA0B3c,GAChChB,KAAAoe,YAAA5S,GAAAiQ,QAAA,UDqnBCpQ,EC/mBcpM,UAAKof,gBAAsB,SAAOrd,EAAA6O,GAEhD7P,KAAIme,gBAAiBnd,GAAEyK,OAAAoE,IDgnBvBxE,EC9mBCpM,UAAAqM,yBAAA,SAAAtK,EAAAsd,GAAC,GAAIlT,GAAKpL,KAAUme,gBAAAnd,EAEnB,OD8mBEoK,GC/mBFI,kBAAkBqS,uBACpBzS,EAACI,kBAAAsS,oBAAAQ,GAAOlT,GDknBRC,EC/mBYpM,UAAQsf,yBAA+B,SAAEvd,EAAWsd,EAAiBzO,GACjF7P,KAACsL,yBAAAtK,EAAAsd,GAAA7S,OAAAoE,IAGHxE,EAACpM,UAAAuf,mBAAA,SAAAC,GAKM,MAAAze,MAAAoe,cAAA3C,QAAA,SAAPC,UAAiB+C,IAEjBpT,EAACpM,UAAAyf,mBAAA,SAAAD,EAAA5O,GAEM7P,KAAAwe,mBAAAC,GAAAhT,OAAcoE,IAErBxE,EAACpM,UAAA0f,UAAA,SAAAC,EAAAvd,EAAA4N,GAEM,GAAA7D,GAAApL,KAAAoe,cAAA3C,QAAc,MACnB,IAAIpa,GAAC4N,EACN7D,EAAAA,EAAAsQ,UAAAkD,GAAA5C,WAAA3a,GAAA0a,YAAA,SAAA9M,OAGC,IAAO5N,EACR+J,EAAAA,EAAAsQ,UAAAkD,GAAA5C,WAAA3a,OAGM,CACN,GAAA0H,GAAA9I,UAAA4e,OAAA9V;AAEMqC,EAAAA,EAAAsQ,UAAA3S,GAAgBA,EAAvBvC,MAAwBwV,WAAA4C,GDumBlB,MCrmBFxT,IDumBFC,ECrmBCpM,UAAA6f,UAAA,SAAAF,EAAAvd,EAAA4N,EAAAY,GACF7P,KAAA2e,UAAAC,EAAAvd,EAAA4N,GAAAxD,OAAAoE,IDumBCxE,ECpmBIpM,UAAoB8f,eAAA,SAAAC,GDqmBpB,MCpmBFhf,MAAKoe,cAAgB3C,QAAA,OAAAC,UAAAsD,IDsmBvB3T,ECpmBCpM,UAAAggB,eAAA,SAAAD,EAAAnP,GACF7P,KAAA+e,eAAAC,GAAAvT,OAAAoE,IDsmBCxE,ECnmBWpM,UAAeigB,mBAAoB,WAC/C,MAAAlf,MAAAoe,cAAA3C,QAAA,YDqmBCpQ,EC5lBApM,UAA8CkgB,mBAAA,SAAAtP,GD6lB1C7P,KC5lBFkf,qBAAgBzT,OAAAoE,ID8lBlBxE,EC5lBGpM,UAAAmgB,iBAAA,SAAA9J,GAEDA,IACDtV,KAAA8M,OAAAI,IAAAC,KAAA,2BAAAmI,GAEGtV,KAAA8M,OAAUkB,iBAAIqH,cAAyBC,GAAO,EAAmBtV,KAAA8M,UD6lBrEzB,EC1lBCpM,UAAAsS,uBAAA,SAAA+D,GAEGA,IACFtV,KAAK8M,OAAOI,IAAIC,KAAK,iCAAAmI,GACrBtV,KAAA8M,OAAOkB,iBAAmBqH,cAAAC,GAAA,EAAAtV,KAAA8M,UD4lB5BzB,ECxlBYpM,UAAMmf,YAAA,SAAA5S,GAClB,MAAC,IAAA+P,IAAA8D,KAAA,GAAAzU,OAAA5K,KAAAwL,ID0lBDH,ECvlBYpM,UAAMse,YAAA,SAAA7W,EAAA8E,EAAAqE,GAClB,QAACG,GAAA9N,GAMC,MAJFA,KACMA,EAAM8N,WAAc,KAGfH,GAAYA,EAAA3N,GDulBnB,GAAIA,GCplBA,GAACkN,GAAapP,KAAA0G,EAAA8E,EDqlBlB,OAAK9E,GAGA1G,KCnlBJ8M,OAAAe,SDulBInH,EAAM0K,OACP1K,ECjlBH0K,SAGF1K,EAACuW,MAAYvW,EAAQuW,KAAKtc,SAC1B+F,EAAAuW,aAUEtN,GAAAC,IAAA1N,EAAA,SAAAod,GAAP,GAAAxS,GAaCwS,EAAAjQ,OAAAvC,OAZMyS,EAAAD,EAAW5Y,KACd4Y,GAAStP,YACVuP,EAAA7N,MAAA,IAAA6N,EAAA7N,KAAA/Q,SAEG4e,EAAA7N,KAAoC,OAEjC6N,EAAAF,OACHE,EAAKF,KAAO,GAAIzU,OAGhBkC,EAAQsF,MAAIL,QAASwN,GACtBA,EAAA9N,cAAA8N,EAAA9N,aAAA9Q,OAAA,IACJ2e,EAAApS,IAAAC,KAAA,8BAAAoS,EAAA9N,aAAA,KAMM3E,EAAAoM,uBAAApK,QAAPyQ,EAAA9N,kBAIQ5B,GAAAA,EAAAyP,ODwiBEtf,KCllBJ8M,OAAOI,IAAKC,KAAC,2CAEV6C,EAAI9N,IANJ8N,EAAU9N,IDknBjBmJ,ECjkBepM,UAAGugB,8BAA8B,SAAA1K,EAAA2K,EAAAvW,EAAA2G,GAChD,GAAIjC,GAAC5N,IAEL,MAAI8U,GAAgB2K,GAAOvW,GAAAlJ,KAAA8M,OAA+Be,SACtD,QAAQgC,GAAOA,EAAA,GAAA5D,GAAA,IAAA,aDkkBf,IChkBFyT,IAAoBnD,cAAGkD,EAAAvW,YAAAA,EDikBrBlJ,MAAK8M,OChkBDkB,iBAAc6G,oBAAWC,EAAgB4K,EAAc1f,KAAA8M,OAAA,SAAAoB,GAC5DA,EAAA/B,SAEGyB,EAACd,OAAWI,IAAGa,MAAA,0DAAsC+G,EAAA,MAAA5G,EAAAhC,WAAA,IAAAgC,EAAA7M,WAE5DwO,GAAAA,EAAA3B,MDkkBC7C,EC3jBIpM,UAAA0gB,mBAAuC,WD4jBvC,MAAO3f,MC3jBT8M,OAAAoM,uBAAgCtK,WD6jBlCvD,EC1jBOpM,UAAAgf,oBAA8B,SAAA2B,GACvC,GAAChS,GAAA5N,ID2jBKA,MAAK8M,OAAOI,IAAIC,KAAK,uCAAyCyS,GAC9D5f,KAAKke,WAAa2B,aAAa7f,KAAKke,YC5jBzCle,KAAAke,WAAAjN,cAAAjR,KAAAkR,YApOc,IAAA4O,GAAA9f,KAAA8M,OAAS4M,8BAqO1B,IAAAoG,EAAA,EAAA,CAAC,GAAAnS,GAAA,WAAA,MAAAjB,GAAAiB,eAAAC,EAAAd,QA3OY8S,GAAmB,IA4UhC5f,KAAAke,WAAArb,WAAA8K,EAAAiS,IACS5f,KAAAkR,YAAsBI,YAAA3D,EAAAmS,KAGtB9gB,OAAAwQ,eAAAnE,EAAG,WACRoD,IAAI,WAIF,MAHkD,QAAhDpD,EAA+B0U,YAC9B1U,EAAuB0U,UAAY,GAAA1U,GAAkB,OAElDA,EAAqB0U,WDmezBtQ,YCjeD,EACHC,cAAC,IDmeDrE,EChegB0U,UAAY,KDierB1U,IAEXrB,GAAQqB,oBCheWA,CDienB,IAAIiF,GCheoB,WDiepB,QAASA,KACLtQ,KCheDmQ,SAAA,GACHnQ,KAACwG,KAAA,8BDsfD,MCnfF8J,GAACrR,UAAA2Q,IAAA,SAAA1N,EAAA6N,GAzBU,IAAA,GA0BbjD,GAAA5K,EAAAmN,OAAAvC,OAACkM,EAAAlM,EAAAkM,gBA1BYxT,EAAA,EAAAA,EAA2BwT,EAAArY,OAAA6E,IA0BvC,CAID,GAAAwa,GAAAhH,EAAAxT,EAAAwa,IAAA9d,EAAAwE,MAAAuW,KAAA9V,QAAA6Y,GAAA,GACS9d,EAAmBwE,MAAGuW,KAAAzc,KAAAwf,GAGtB,GAAA/G,GAAAnM,EAAPmM,eACE,KAAM,GAAAla,KAAoBka,GACtB,GAAAA,EAAiBla,GAAa,CAChC,GAAAgH,GAAWuO,KAAAa,MAAArK,EAAAyJ,UAAA0E,EAAAla,GAAA+N,EAAAqQ,gBACHrS,GAAA4L,QAAA3Q,KACR7D,EAAcwE,MAAA0K,KAAArS,GAAAgH,GDmeZgK,GC/dFA,KDieKO,IAEXtG,GAAQsG,4BC/deA,CDgevB,IAAIC,GC/dE,WDgeF,QC/dEA,KDgeEvQ,KC/dFmQ,SAAO,GDgeLnQ,KC/dFwG,KAAA,cAqDN,MD4aI+J,GC/dEtR,UAAA2Q,IAAA,SAAA1N,EAAA6N,GAEF,GAAIkQ,GAAY,SACZC,GACF,YAEA,SD8dM,eACA,cACA,WACA,UACA,OACA,SACA,OACA,aACA,kBACA,WACA,YACA,QACA,aACA,cAEAlf,EC3dHkB,EAAAoN,YAAAsO,cD4dD,IC3dD5c,IACFkB,EAAAwE,MAAAgL,KAAA,SAEOxP,EAAOwE,MAAA0K,KAAA6O,IAAA,CAChB,GAAAnT,GAAA5K,EAAAmN,OAAAvC,OACHqT,EAACrT,EAAA8M,WAAA,KAAAuG,EArDuB,KAAA,IAAA3W,OAqDvB,+BAID,IAAAzD,GAAAoa,EAAAhL,MAAAjT,EAAAlB,EACS,IAAQ+E,EAAc,CACP,GAAAqa,GAAmB9L,KAAAa,MAAArK,EAAAyJ,UAAAvT,EAAA8L,EAAAqQ,eAAAjc,OAAAgf,IAe1CpV,GAAA4L,QAAA0J,KAbQra,EAAGqL,OACkBrL,EAASqL,SAGvBrL,EAAWqL,KAAA,QAAegP,GAEhCle,EAAWwE,MAAO0K,KAAC6O,GAAala,GAKtCgK,GAAQA,KAEZQ,IAjBavG,GAAAuG,YAAAA,CAqBb,IAAAG,GAAA,WAAA,QAAAA,KACS1Q,KAAAmQ,SAAmB,GACnBnQ,KAAAwG,KAAe,mBDqepB,MCneKkK,GAAAzR,UAAA2Q,IAAG,SAAV1N,EAAsC6N,GACpC,GAAMkQ,GAAW,SAEbI,EAASne,EAAQmN,OAAOvC,OAAO+M,eACnC,IAAI3X,EAAAwE,MAAY0K,KAAO6O,KAAA/d,EAAqBwE,MAAA0K,KAAA,UAAAkP,SAAAD,EAAA,CACxC,GAACC,GAAaD,EAAME,WAAYre,EAC9Boe,IAAWA,EAAiB3f,OAAU,IACtCuB,EAAEwE,MAAY0K,KAAE6O,GAAAK,QAAAA,GD0dlBvQ,GAAQA,KAELW,IAEX1G,GAAQ0G,iBCxdCA,CDydT,IAAIC,GCxdG,WDydH,QCxdCA,KAED3Q,KAAImQ,SAAW,GAChBnQ,KAAAwG,KAAA,oBAsBH,MA5CAmK,GAuBC1R,UAAA2Q,IAAA,SAAA1N,EAAA6N,GAvBY,GAAAyQ,GAAiB,WA2B9B1T,EAAA5K,EAAAmN,OAAAvC,OAAAuT,EAAAvT,EAAAgN,oBACS,KAAA5X,EAAQwE,MAAc0K,KAAAoP,IAAAH,EAAA,CACtB,GAAAI,GAAeJ,EAAAK,eAAwBxe,EAe/Cue,KAbQ3V,EAAA2L,QAAAgK,EAAPE,WAAW7T,EAA8CqN,uBACjDjY,EAAegL,IAAWC,KAAA,0EAE5BjL,EAAY8N,WAAe,GAGvB9N,EAAAwE,MAAgB0K,KAAEoP,GAAAC,GAK1B1Q,GAAQA,KAEZY,IAjBa3G,GAAA2G,kBAAAA,CAqBb,IAAAC,GAAA,WAAA,QAAAA,KACS5Q,KAAAmQ,SAAmB,GACnBnQ,KAAAwG,KAAe,wBAqBtB,MAnBOoK,GAAA3R,UAAA2Q,IAAG,SAAV1N,EAAsC6N,GACpC,GAAI6Q,GAAgB,eAChBP,EAAEne,EAAkBmN,OAACvC,OAAA6M,wBDsdrB,KCrdFzX,EAAQwE,MAAM0K,KAAKwP,IAAqBP,EAAG,CAC5C,GAAAQ,GAAAR,EAAAS,mBAAA5e,EAEO2e,KACT3e,EAAAwE,MAAA0K,KAAAwP,GAAAC,GAXU9Q,GAAAA,KAuBXa,ID+cF5G,GCrdS4G,sBAAsBA,CDsd/B,IAAIC,GCrdoB,WDsdpB,QCpdMA,KAIN7Q,KAAKmQ,SAAA,IACNnQ,KAAAwG,KAAA,yBD0dC,MAPAqK,GChdA5R,UAAyC2Q,IAAA,SAAA1N,EAAyB6N,GDid9D,GChdFuO,GAAApc,EAAAoN,YAAAyO,qBDidQO,KACFpc,EC9cAwE,MAAA0K,KAAQ,sBAA2BkN,GDgdvCvO,GAAQA,KAELc,IAEX7G,GAAQ6G,uBC1cEA,CD2cV,IAAIL,GC1cK,WD2cL,QAASA,GCzceuQ,GD0cG,SAAnBA,IAA6BA,EAAiB,WAAc,MAAOnW,MAAKoW,QAC5EhhB,KAAKmQ,SC5dK,GD6dVnQ,KAAKwG,KAAO,yBACZxG,KAAKihB,uBACLjhB,KC7cDkhB,gBAAAH,ED2eH,MA5BAvQ,GC5cCvR,UAAA2Q,IAAA,SAAA1N,EAAA6N,GAED,QAAIoR,GAAcpT,EAASqT,EAAUJ,EAAA9T,GAmBhC,IAlBH,GAAImU,GAAA,WACF,GAAAC,GAAQxW,EAAYmL,YAAKlI,EAAAwT,aAAAjN,KAAAC,UAAAxG,EAAAwT,aACzB,IAAAD,GAAOF,EAAA1J,KAAA,SAAA8J,GAAA,MAAAA,GAAAtL,OAAAoL,GAAAE,EAAArP,WAAA6O,EAAA,MAEV,MADE9T,GAAAC,KAAA,wCAAAmU,IACF7W,OAAA,EAIL,KADG2W,EAAA5gB,MAAA0V,KAAAoL,EAAAnP,UAAA6O,IACHI,EAACzgB,OAAA,IAAAygB,EAAAK,OASD1T,GAAAA,EAAA5M,OACS4M,GAAqB,CACrB,GAAe2T,GAAAL,GAsFvB,IAAA,gBAAAK,GAAA,MAAAA,GAAAjX,MAnFG,OAAA,EDucI,MCrca,UDqcTvI,ECrcJwE,MAAKgL,MACLyP,EAAYjf,EAAAwE,MAAA0K,KAAA,UAAApR,KAAAihB,oBAAAjhB,KAAAkhB,kBAAAhf,EAAAgL,UACZhL,EAAQ8N,WAAC,QDycTD,GAAQA,MAELS,IAEXxG,GAAQwG,uBCrcWA,CDscnB,IAAIC,GCrcgB,WDschB,QAASA,KACLzQ,KAAKmQ,SCrcA,GDscLnQ,KAAKwG,KCrcH,uBAuHV,MDgVIiK,GCrcSxR,UAAQ2Q,IAAA,SAAA1N,EAAA6N,GDscb,QCrcA4R,GAAS1S,GDscL,QCrcCA,GAAI,IAAAwI,cAAAD,QDscD,ICrcN,QACF,IAAA,ODscQ,ICrcN,IACH,IAAA,MACF,MAAA,EAED,KAAA,QAA0C,MAAA,EACxC,KAAO,OACR,MAAA,EAED,KAAA,OAAiC,MAAA,EAAqD,KAAA,QAC/E,MAAO,EACV,KAAA,QACD,MAAA,EAEG,KAAK,MACL,IAAA,QAEA,IAAK,IACL,IAAK,KACP,MAAQ,EACT,SAGI,MAAO,IDqcV,QClcCoK,GAAAvU,EAAAwU,GAGH,MAFC,UAAAA,IAAAA,EAAA,KAEMF,EAAYG,EAACzU,EAAA,MAAAwU,EAAA,SAAA,IAGtB,QAASC,GAAczU,EAAAqE,EAAAhO,EAAAiV,GAInB,GAHiB,SAAdtL,IAAeA,MACC,SAAnBsL,IAA0BA,EAAgB/Z,SAEvC8S,EACD,MAAAiH,EAGJ,IAAIoJ,GAAiB,QAATrQ,EACVsQ,EAAS,KAAAtQ,EAAA,IACTjH,EAAQ4C,EAAS2U,EAAQte,EAC3B,IAAC+G,EACF,MAAAsX,GAAAtX,EAAAK,EAAA4N,UAAAjO,EACC,KAAI,GAAK1L,KAAmBsO,GAC5B,GAAQvC,EAAAiN,WAAiBhZ,EAAI0Y,cAAQuK,EAAAvK,gBAAA3M,EAAA2L,QAAA/S,GAAA3E,EAAAwG,UAAAyc,EAAArhB,UAC/B,MAAAohB,GAAiD1U,EAAMtO,GAAvD+L,EAAA4N,UAAgCrL,EAAStO,GDkczC,OC/bH4Z,GDicD,GC9bF4G,GAACrd,EAAAwE,MACFwG,EAAAhL,EAAAgL,IAAKG,EAAKnL,EAAAmN,OAAAvC,OAAwBO,QDgc/B,IC/bO,QAATkS,EAAG7N,KAAM,CACT,GAAAuQ,GAAiBL,EAAQvU,EAAAkS,EAAA7b,QAC1Bwe,EAAAP,EAAApC,EAAAnO,KAAA,UAEO8Q,IAAO,IAAAA,EAAA,GAAAD,EAAAC,KAChBhV,EAAAC,KAAA,kDACHjL,EAAA8N,WAAC,OAED,IAAA,UAAAuP,EAAA7N,KAO+C,IAA7C,GAAA3D,GAAAwR,EAAAnO,KAAY,WAAiClP,EAAA8N,WAA4BjC,GAAE+T,EAAAzU,EAAqBkS,EAAA7N,KAAA3D,EAAA2D,MAAA,MAAA,IAAExE,EAAAC,KAAA,kDAAsBY,EAAA2D,MAN1GxP,EAAiB8N,WAAC,GAOzBjC,EAAUA,EAAO5M,UAGjB2gB,GAAsBzU,EAAAkS,EAAA7N,KAAA6N,EAAA7b,QAAA,MAAA,IACvBwJ,EAACC,KAAO,wCAAWoS,EAAA7N,KAAA,gBAAA6N,EAAA7b,QACxBxB,EAAA8N,WAAA,EACFD,IAAAA,KAoCDU,ID+ZAzG,GC7ZUyG,qBAA2BA,CD8ZrC,IAAIyE,GC7ZM,WD8ZN,QC3ZKA,GAAW/I,EAASkB,EAAAiB,EAAAtN,EAAAK,GAC1B,SAAAiN,IAAAA,EAAA,IAEM,SAAAtN,IAAIA,EAAC,MACG,SAATK,IAASA,EAAA,MD2ZTrB,KC1ZFmM,SAAW,EACbnM,KAACsO,gBAAA,GAEDtO,KAAImM,QAAQA,EACZnM,KAAIqN,SAAYA,EAChBrN,KAAIsO,gBAASA,EAEbtO,KAAIgB,UAAWA,EDyZXhB,KCxZFqB,QAAWA,ED0Zb,MCvZA6T,KDyZJlL,GCvZGkL,iBAAAA,CDwZH,ICtZSf,GAAA,WDuZL,QCtZAA,GAAkBgO,GACnBniB,KAAAoiB,SAEMpiB,KAAAqiB,cAAA,EACLriB,KAAImiB,SAAYA,EDmbhB,MA5BAhO,GCrZMlV,UAASuP,KAAS,SAAK/D,GDsZzB,IAAKA,EACD,MCrZJ,KAEJ,IAAC2X,GAAApiB,KAAAoiB,MACFjQ,EAAA9N,KAAAK,IAAAkG,KAAAoW,MAAAhhB,KAAAqiB,cAAA,GAEMra,GAAAmK,UAAAA,EAAP1H,MAAAA,EAxCW,OAyCL2X,GAAM5hB,KAAKwH,GAAChI,KAAAmiB,UACjBC,EAAAX,QACFzhB,KAAAqiB,cAAAlQ,EA3CYnK,EAAAmK,WAyDXgC,EAAAlV,UAAAwP,IAAY,SAAQ6T,GAFZ,MAAAtiB,MAAAoiB,MAAa3iB,MAAa,EAAA6iB,IAIlCnO,EAAClV,UAAA+U,OAAA,SAAA7B,GAGC,IAAK,GADAiQ,GAAApiB,KAAAoiB,MACA1hB,EAAQ,EAAAA,EAAA0hB,EAAAzhB,OAAAD,IACX,GAAA0hB,EAAO1hB,GAAKyR,YAAAA,EAGT,WAFJiQ,GAAAxhB,OAAAF,EAAA,ID+YDyT,ECxYWlV,UAAKsU,MAAU,WAE1BvT,KAAKoiB,UDyYEjO,IAEXnK,GAAQmK,gBCvYKA,CDwYb,IAAIoO,GCvYG,WDwYH,QCvYEA,GAAAJ,GAAAniB,KAAKqiB,cAAM,EDyYTriB,KCxYFmiB,SAAYA,EDsed,MA5FAI,GCvYgBtjB,UAACuP,KAAA,SAAA/D,EAAA+X,GAClB,IAAA/X,EAEM,MAAA,KACLzK,MAAKyiB,aAEL,IAAAL,GAAYpiB,KAAKoiB,MDuYTjQ,ECtYD9N,KAAAK,IAAAkG,KAASoW,MAAAhhB,KAAAqiB,cAAA,GAEZtjB,EAAIiB,KAAM0iB,OAAKvQ,GACfwQ,EAAKrO,KAAAC,UAAA9J,EDsYL,KACIzK,KCrYF4iB,MAAI7jB,EAAQ4jB,GDsYV3iB,KCrYFqiB,cAASlQ,EACTiQ,EAAA5hB,KAAA2R,GAAAnS,KAAAmiB,UAAAniB,KAAAA,UAAeA,KAAA0iB,OAAAN,EAAAX,UDyYjB,MCrYCvhB,GACD,MAAA,MAEL,MAAAiS,IDuYCoQ,ECpYgBtjB,UAAGwP,IAAA,SAAA6T,GAEnB,GAAI1U,GAAQ5N,IAEZ,OADAA,MAAIyiB,cACAziB,KAAKoiB,MAAQ3iB,MAAA,EAAA6iB,GACfzP,IAAI,SAAWV,GACf,GAAIpT,GAAC6O,EAAW8U,OAAKvQ,EACrB,KACD,GAAAwQ,GAAA/U,EAAAiV,KAAA9jB,GAAC0L,EAAA6J,KAAAa,MAAAwN,EAAAnY,EACH,QAAA2H,UAAAA,EAAA1H,MAAAA,GAED,MAAAsD,GAEO,MADAH,GAAMkV,WAAQ/jB,GACJ,QAWVgkB,OAAK,SAAQ/a,GAAA,MAAA,OAAAA,KD8XlBua,EC5XOtjB,UAAgB+U,OAAQ,SAAJ7B,GAC3BnS,KAACyiB,aACF,IAAAL,GAAApiB,KAAAoiB,MAEO5c,EAAA4c,EAAAjb,QAAAgL,EACN,IAAI3M,GAAC,EAAA,CACH,GAAIzG,GAACiB,KAAU0iB,OAAEvQ,EACjBnS,MAAA8iB,WAAA/jB,GAAAqjB,EAAOxhB,OAAQ4E,EAAA,KDgYjB+c,EC5XFtjB,UAoBCsU,MAAA,WAnBC,GAAI3F,GAAC5N,ID6XDA,MC5XFoiB,MAAIY,QAAW,SAAChb,GAAc,MAAA4F,GAAAkV,WAAAlV,EAAA8U,OAAA1a,MD6X5BhI,KC5XFoiB,UD8XFG,EC5XUtjB,UAASwjB,YAAQ,WD6XlBziB,KAAKoiB,QACNpiB,KAAKoiB,MC5XLpiB,KAAKijB,cD6XLjjB,KAAKqiB,cC5XEhe,KAAKK,IAAA3E,MAAAsE,MAAA,GAAAnD,OAAAlB,KAAAoiB,QAAA,ID+XpBG,EC5XMtjB,UAAA6jB,WAAA,SAAA/jB,GD6XF,IACIiB,KAAAA,UC7XFjB,GD+XF,MAAOgP,MAGXwU,EC7XEtjB,UAAAgkB,YAAA,WAAA,GAAArV,GAAY5N,ID+XV,KC7XH,GAAAgY,GAAAhY,KAAAkjB,aACF,OAAAlL,GAAAnF,IAAA,SAAA9T,GACH,IAAC,GAAAoT,GAAAvE,EAAAuV,aAAApkB,EAjHqB,OAAAoT,GAsHDA,GAHGvE,EAAKkV,WAAA/jB,GACZ,MAIX,MAAWgP,GAEd,MADEH,GAAAkV,WAAA/jB,GACF,QAEFgkB,OAAA,SAAA5Q,GAAA,MAAA,OAAAA,IAACiI,KAAA,SAAAzP,EAAAiB,GAAA,MAAAjB,GAAAiB,IAIkC,MAAAmC,GAelC,WACEwU,IDoXJvY,GCjXGuY,oBAAAA,CD6XH,IC3XSa,GAAA,SAAAC,GAEP,QAACD,GAAAE,EAAArL,EAAAkK,GAEM,SAAAlK,IAAIA,EAAX,sBACgB,SAAdkK,IAA2BA,EAAW,IACvCkB,EAAAlkB,KAAAa,KAAAmiB,GAEMniB,KAAAiY,OAAAA,EAAAqL,EAAP,ID0ZE,MAtCA5X,GC3XM0X,EAAcC,GDkYpBD,EC1XOG,YAAkB,WD2XrB,ICzXL,GAAAhV,GAAA5P,OAAA6kB,aAAAC,EAAA,kBAIA,OAFMlV,GAAAmV,QAAAD,EAAAA,GACLlV,EAAOoV,WAAaF,IACrB,EAGC,MAAOvjB,GACR,OAAA,IAIDkjB,EAACnkB,UAAA2jB,MAAA,SAAA7jB,EAAA0L,GACH9L,OAAA6kB,aAACE,QAAA3kB,EAAA0L,IA7CY2Y,EAAAnkB,UAAc4jB,KAAA,SA6C1B9jB,GAID,MAAAJ,QAAA6kB,aAAAI,QAAA7kB,IA+CAqkB,EAACnkB,UAAAikB,YAAA,WA9CQ,GAAAtV,GAAA5N,IACL,OAAAhB,QAAAgZ,KAAArZ,OAAuB6kB,cACrBT,OAAI,SAAoBhkB,GAAO,MAAyC,KAA/BA,EAAKoI,QAAQyG,EAAIqK,WD0X5DmL,ECvXOnkB,UDuXPmkB,UCvX2B,SAAUrkB,GDwXjCJ,OAAO6kB,aCvXKG,WAAQ5kB,IDyXxBqkB,ECtXSnkB,UAAOyjB,OAAA,SAAAvQ,GAChB,MAACnS,MAAAiY,OAAA9F,GDwXDiR,ECrXQnkB,UAAoBkkB,aAAc,SAAApkB,GDsXtC,MCrXF6W,UAAU7W,EAAqB8kB,OAAA7jB,KAAAiY,OAAAtX,QAAA,KDuX1ByiB,GACTb,EACFvY,GAAQoZ,eCpXMA,CDqXd,IAAIU,GCpXM,WDqXN,QAASA,MAuCT,MArCAA,GCpXM7kB,UAAakW,MAAO,SAAKjT,EAAAlB,GDqX3B,QCpXC+iB,GAAEC,GAIN,IAAA,GAHEC,IAAA,gBAAAD,IAAAA,GAAAA,OAEDje,KACDP,EAAA,EAAAA,EAAAye,EAAAtjB,OAAA6E,IAEKO,EAAAvF,MAAAgG,KAAwByd,EAAWze,IDoXjC,OCjXJO,GAGJ,QAAKme,GAAaC,GAIlB,IAAO,GAHLC,GAAgB,cACjBC,KAEM7e,EAAA,EAAAA,EAAA2e,EAAAxjB,OAAA6E,IAAA,CACD,GAAE8e,GAAUH,EAAK3e,EACrB6e,GAAS7jB,MACTgG,MAAa8d,EAAAzkB,MAAeukB,GAAWrf,QAAS,IAAGqf,GACnDJ,WAAAD,EAAAO,EAAA7d,MACH8d,UAAAD,EAAAhjB,IACHkjB,YAACF,EAAAviB,MAAA,EAAAC,OAAAsiB,EAAAtiB,QAAA,IAID,MAAAqiB,GACS,GAAAI,GAAA,yBACDvZ,EAAYhJ,EAASoN,YAAAmV,GACvBviB,EAAOoN,YAAKmV,GACbnlB,EAAAqC,kBAAAX,EAAA,GAED,KAAIkK,EACA,KAAA,IAAyC1B,OAAA,8CDiXzC,QACIkI,KC/WFxG,EAAU1E,KDgXRnF,QC/WF6J,EAAY7J,SAACL,EAAAK,QDgXXkgB,YC/WA2C,EAAgBhZ,EAAApK,aDkXjBgjB,IAEX9Z,GAAQ8Z,mBChXaA,CDiXrB,IAAIY,GChXc,WDiXd,QAASA,MA4BT,MA1BAA,GChXQzlB,UAASshB,WAAiB,SAASre,GDiXvC,GAAI0B,UChXCA,SAAAsC,qBDiXD,MChXH,KAEL,IAACoa,MAEDra,EAAcrC,SAACsC,qBAAA,SAChB,IAAAD,GAAAA,EAAAtF,OAAA,EACH,IAAA,GAAA6E,GAAA,EAAAA,EAACS,EAAAtF,OAAA6E,IAAAS,EAAAT,GAAAe,IA5BY+Z,EAAA9f,MAgCbmkB,UAAAnf,EAAAgB,KAAAP,EAAAT,GAAAe,IAwBC6G,QAAAtC,EAAAgM,aAAA7Q,EAAAT,GAAAe,OArBiBN,EAAAT,GAAAof,WACbtE,EAAA9f,MAEamkB,UAAWnf,EACVgB,KAAiB,aAClB4G,QAAStC,EAACmL,YAAShQ,EAAAT,GAAAof,WAAA5b,YDoX7B,OC9WFsX,IAEAoE,IDgXN1a,GAAQ0a,uBC7WkBA,CD8W1B,IAAIG,GC7WC,WD8WD,QC5WAA,MDiYA,MC/XJA,GAAA5lB,UAACyhB,eAAA,SAAAxe,GAAA,IAAA0B,WAAAkhB,YAAAhjB,SAxBY,MAAA,KA8Bb,IAAAyU,GAAArU,EAAAmN,OAAAvC,OAAAqQ,eAiHCsD,GAhHQE,WAAAmE,UAAAnP,UAECoP,UAA4B,WAAVjjB,SAAUkjB,SAC5BC,KAAMnjB,SAAWojB,SACjBC,KAAArjB,SAAAqjB,MAA6C,KAAlBrjB,SAAAqjB,KAAkBvP,SAAA9T,SAAAqjB,KAAA,IAAA,GAE/CpQ,KAAAjT,SAAuBsjB,SACvB9O,QAAAxL,EAAauL,WAAkBzS,SAAA4S,OAAAD,GACnC8O,aAAkBva,EAAcC,iBAAmBjJ,SAAAwjB,OAAA/f,UAAA,GAAAgR,GD8W/C,OAHI3S,UCzWJ2hB,UAAmB,KAAL3hB,SAAK2hB,WD0Wf9E,ECzWF8E,SAAa3hB,SAAQ2hB,UD2WhB9E,GAEJoE,IAEX7a,GAAQ6a,4BCtWkBA,CDuW1B,IAAIW,GCtWU,WDuWV,QAASA,MAoGT,MAlGAA,GCtWKvmB,UAAA2V,YAAA,SAAAxR,EAAAyM,EAAA0C,GD4WD,QCnWFkT,GAAcrjB,EAAKsjB,GAEnB,QAAIC,GAAiCC,GACjC,QAAApO,GAAY/M,GACZ,MAAiBA,GAAI1F,QAAO,qCAAA,IAK/B,IAAA,GAFCkQ,MACA4Q,GAAWD,GAAA,IAAA7hB,MAAA,QACZyB,EAAA,EAAAA,EAAAqgB,EAAAllB,OAAA6E,IAAA,CAAS,GAACsgB,GAAeD,EAAargB,GAC/BugB,EAAWD,EAAW3e,QAAS,KACtC4e,GAAA,IAAU9Q,EAASuC,EAAOsO,EAASvgB,UAAM,EAAAwgB,GAAAtO,gBAAAqO,EAAAvgB,UAAAwgB,EAAA,IDsWhC,MCnWN9Q,GDqWE,ICpWF+Q,EDoWE,CAGAA,GCpWA,CDqWA,IAAI3kB,GCrWEqkB,EAAIO,WDsWN1iB,ECrWGmiB,EAAGniB,aDsWNgI,ECrWLma,EAAAna,MDsWC,ICrWJnJ,IAAC8jB,GAAA,IAAA3a,EACFlK,EAAA,+BAEDkK,EAAY,MAGd,IAAAnJ,IAAA+jB,GAAwC5a,GAGpC,GAAS,IAALA,GAAgBA,EAAQ,IAAA,CAE5B,GAAI6a,GAAAV,EAAiBU,YACrB,IAAIA,GAAoBA,EAAA/kB,QACtBA,EAAI+kB,EAAiB/kB,YAExB,IAAAkC,GAAA,KAAAA,EAAA4D,QAAA,WAAS,IACR9F,EAAgBiT,KAAKa,MAAA5R,GAAAlC,QAEjB,MAAKnB,GACVmB,EAAAkC,QAZGgI,GAAgC,SAArBnI,EAAIqS,OAAiB,IAAA,GAgBpC5F,IAAUA,EAAAtE,GAAA,IAAAlK,GAAA,GAAAkC,EAAAoiB,EAAAD,EAAAW,uBAAAX,EAAAW,2BDqWR,QCnWD7R,GAAAmB,EAAAF,EAAAnU,GAED,GAAAokB,GAAU,GAACxiB,eAyBT,OAxBHojB,KAAAZ,IAEMA,EAAGriB,KAAGoS,EAAQnU,GAAO,GACrBokB,EAAGa,iBAAc,yBAA2B5Q,GACxC,SAAAF,GACDiQ,EAAAa,iBAAqB,eAAK,qBAIT,mBAArBC,iBAEFC,GAAQ,EDgWAf,EC/VN,GAAMc,gBACRd,EAACriB,KAAAoS,EAAA,UAAA3T,SAAAkjB,SAAA1jB,EAAAyD,QAAA,SAAA,SAAAzD,IAIJokB,EAAA,KAGGA,IACAA,EAAOgB,QAAG,KAGVhB,EDqRA,GAAIQ,GCrWE,UACRC,EAAC,SAEDG,EAAkB,kBDqWZN,GCpWG,EACTS,GAAC,EA6EFnlB,EAAA,GAAA8B,EAAA9B,KAAA,KAAA8B,EAAA9B,IAAA6F,QAAA,KAAA,IAAA,KAAA,gBAAA6N,mBAAA5R,EAAAsS,QAAKgQ,EAAElR,EAAApR,EAAAuS,UAAAvS,EAAAqS,QAAA,OAAAnU,ED8VJ,OC7VFokB,IAGNY,IAAAZ,KAACA,EAAAiB,mBAAA,WAjHoC,IAAxBjB,EAAAkB,YAyHkBnB,EAAAU,EAAAT,KAG5BA,EAAAmB,WAAA,aAEHnB,EAAAoB,UAAA,WAAC,MAAArB,GAAAS,EAAAR,IAAAA,EAAAnjB,QAAA,WAAA,MAAAkjB,GAAA,QAAAC,IATYA,EAAAqB,OAAA,WAAsB,MAAAtB,GAAAU,EASlCT,SAIDe,EACO5jB,WAAa,WAAS,MAAA6iB,GAAApiB,KAAsBF,EAACgO,OAAA,KAI9CsU,EAAOpiB,KAAGF,EAASgO,QAxBpBvB,GAAAA,EAAA,IAAA,wBDkXM2V,IAEXxb,GCvVGwb,yBAAAA,CDwVH,ICvVEwB,GAAY,WACb,QAAAA,GAAA/O,EAAA/D,GAED,SAAAA,IAAmCA,EAA8C,KAC3ElU,KAAAoS,MAAU,GAAAgR,GAAoB,IAAOnL,EAAC/D,GAC1ClU,KAAQqN,SAAA,GAAA+V,GAAkB,WAAyBnL,EAAG,GAEvD,MAAA+O,KDwVDhd,GCpUMgd,uBAAeA,EA8BfpO,EAAO3Z,UAAkBmc,gBAAS,WDyThCgI,EAAeG,gBACfvjB,KAAKuO,QAAU,GAAIyY,GACnBta,EAAgBG,yBAAyB7M,MACzCA,KAAKuN,WAGb,IAAIkM,GAAWb,EAAca,SACzBpM,EAAWxC,GAaf,OAZIwC,KAAaA,EAASqI,QAAUrI,EAASsF,aACzC8G,EAAS/D,OAASrI,EAASqI,OAC3B+D,EAAS9G,UAAYtF,EAASsF,WAElC8G,EAASG,YAAc,GAAIkK,GAC3BrK,EAASI,gBAAkB,GAAI6K,GAC/BjL,EAASK,qBAAuB,GAAI+K,GACpCpL,EAAS9E,kBAAoB,GAAI6Q,GACjClmB,EAASa,OAAOC,UAAU6K,GAC1B3L,EAASoK,gCACTF,MAAMyd,gBAAkBC,EAAAA,EAEjBld","file":"exceptionless.min.js","sourcesContent":["/**\n * https://github.com/csnover/TraceKit\n * @license MIT\n * @namespace TraceKit\n */\n(function(window, undefined) {\nif (!window) {\n    return;\n}\n\nvar TraceKit = {};\nvar _oldTraceKit = window.TraceKit;\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n/**\n * A better form of hasOwnProperty<br/>\n * Example: `_has(MainHostObject, property) === true/false`\n *\n * @param {Object} object to check property\n * @param {string} key to check\n * @return {Boolean} true if the object has the key and it is not inherited\n */\nfunction _has(object, key) {\n    return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/**\n * Returns true if the parameter is undefined<br/>\n * Example: `_isUndefined(val) === true/false`\n *\n * @param {*} what Value to check\n * @return {Boolean} true if undefined and false otherwise\n */\nfunction _isUndefined(what) {\n    return typeof what === 'undefined';\n}\n\n/**\n * Export TraceKit out to another variable<br/>\n * Example: `var TK = TraceKit.noConflict()`\n * @return {Object} The TraceKit object\n * @memberof TraceKit\n */\nTraceKit.noConflict = function noConflict() {\n    window.TraceKit = _oldTraceKit;\n    return TraceKit;\n};\n\n/**\n * Wrap any function in a TraceKit reporter<br/>\n * Example: `func = TraceKit.wrap(func);`\n *\n * @param {Function} func Function to be wrapped\n * @return {Function} The wrapped func\n * @memberof TraceKit\n */\nTraceKit.wrap = function traceKitWrapper(func) {\n    function wrapped() {\n        try {\n            return func.apply(this, arguments);\n        } catch (e) {\n            TraceKit.report(e);\n            throw e;\n        }\n    }\n    return wrapped;\n};\n\n/**\n * Cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * ```js\n *   TraceKit.report.subscribe(function(stackInfo) { ... })\n *   TraceKit.report.unsubscribe(function(stackInfo) { ... })\n *   TraceKit.report(exception)\n *   try { ...code... } catch(ex) { TraceKit.report(ex); }\n * ```\n *\n * Supports:\n *   - Firefox: full stack trace with line numbers, plus column number\n *     on top frame; column number is not guaranteed\n *   - Opera: full stack trace with line and column numbers\n *   - Chrome: full stack trace with line and column numbers\n *   - Safari: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *   - IE: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n *   - IE5.5+ (only 8.0 tested)\n *   - Firefox 0.9+ (only 3.5+ tested)\n *   - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n *     Exceptions Have Stacktrace to be enabled in opera:config)\n *   - Safari 3+ (only 4+ tested)\n *   - Chrome 1+ (only 5+ tested)\n *   - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a TraceKit.StackTrace object as described in the\n * TraceKit.computeStackTrace docs.\n *\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.report = (function reportModuleWrapper() {\n    var handlers = [],\n        lastArgs = null,\n        lastException = null,\n        lastExceptionStack = null;\n\n    /**\n     * Add a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function subscribe(handler) {\n        installGlobalHandler();\n        handlers.push(handler);\n    }\n\n    /**\n     * Remove a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function unsubscribe(handler) {\n        for (var i = handlers.length - 1; i >= 0; --i) {\n            if (handlers[i] === handler) {\n                handlers.splice(i, 1);\n            }\n        }\n    }\n\n    /**\n     * Dispatch stack information to all handlers.\n     * @param {TraceKit.StackTrace} stack\n     * @param {boolean} isWindowError Is this a top-level window error?\n     * @memberof TraceKit.report\n     * @throws An exception if an error occurs while calling an handler.\n     */\n    function notifyHandlers(stack, isWindowError) {\n        var exception = null;\n        if (isWindowError && !TraceKit.collectWindowErrors) {\n          return;\n        }\n        for (var i in handlers) {\n            if (_has(handlers, i)) {\n                try {\n                    handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n                } catch (inner) {\n                    exception = inner;\n                }\n            }\n        }\n\n        if (exception) {\n            throw exception;\n        }\n    }\n\n    var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n    /**\n     * Ensures all global unhandled exceptions are recorded.\n     * Supported by Gecko and IE.\n     * @param {string} message Error message.\n     * @param {string} url URL of script that generated the exception.\n     * @param {(number|string)} lineNo The line number at which the error occurred.\n     * @param {(number|string)=} columnNo The column number at which the error occurred.\n     * @param {Error=} errorObj The actual Error object.\n     * @memberof TraceKit.report\n     */\n    function traceKitWindowOnError(message, url, lineNo, columnNo, errorObj) {\n        var stack = null;\n\n        if (lastExceptionStack) {\n            TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message);\n    \t    processLastException();\n\t    } else if (errorObj) {\n            stack = TraceKit.computeStackTrace(errorObj);\n            notifyHandlers(stack, true);\n        } else {\n            var location = {\n              'url': url,\n              'line': lineNo,\n              'column': columnNo\n            };\n            location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line);\n            location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line);\n            stack = {\n              'mode': 'onerror',\n              'message': message,\n              'stack': [location]\n            };\n\n            notifyHandlers(stack, true);\n        }\n\n        if (_oldOnerrorHandler) {\n            return _oldOnerrorHandler.apply(this, arguments);\n        }\n\n        return false;\n    }\n\n    /**\n     * Install a global onerror handler\n     * @memberof TraceKit.report\n     */\n    function installGlobalHandler () {\n        if (_onErrorHandlerInstalled === true) {\n            return;\n        }\n        _oldOnerrorHandler = window.onerror;\n        window.onerror = traceKitWindowOnError;\n        _onErrorHandlerInstalled = true;\n    }\n\n    /**\n     * Process the most recent exception\n     * @memberof TraceKit.report\n     */\n    function processLastException() {\n        var _lastExceptionStack = lastExceptionStack,\n            _lastArgs = lastArgs;\n        lastArgs = null;\n        lastExceptionStack = null;\n        lastException = null;\n        notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n    }\n\n    /**\n     * Reports an unhandled Error to TraceKit.\n     * @param {Error} ex\n     * @memberof TraceKit.report\n     * @throws An exception if an incomplete stack trace is detected (old IE browsers).\n     */\n    function report(ex) {\n        if (lastExceptionStack) {\n            if (lastException === ex) {\n                return; // already caught by an inner catch block, ignore\n            } else {\n              processLastException();\n            }\n        }\n\n        var stack = TraceKit.computeStackTrace(ex);\n        lastExceptionStack = stack;\n        lastException = ex;\n        lastArgs = _slice.call(arguments, 1);\n\n        // If the stack trace is incomplete, wait for 2 seconds for\n        // slow slow IE to see if onerror occurs or not before reporting\n        // this exception; otherwise, we will end up with an incomplete\n        // stack trace\n        window.setTimeout(function () {\n            if (lastException === ex) {\n                processLastException();\n            }\n        }, (stack.incomplete ? 2000 : 0));\n\n        throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n    }\n\n    report.subscribe = subscribe;\n    report.unsubscribe = unsubscribe;\n    return report;\n}());\n\n/**\n * An object representing a single stack frame.\n * @typedef {Object} StackFrame\n * @property {string} url The JavaScript or HTML file URL.\n * @property {string} func The function name, or empty for anonymous functions (if guessing did not work).\n * @property {string[]?} args The arguments passed to the function, if known.\n * @property {number=} line The line number, if known.\n * @property {number=} column The column number, if known.\n * @property {string[]} context An array of source code lines; the middle element corresponds to the correct line#.\n * @memberof TraceKit\n */\n\n/**\n * An object representing a JavaScript stack trace.\n * @typedef {Object} StackTrace\n * @property {string} name The name of the thrown exception.\n * @property {string} message The exception error message.\n * @property {TraceKit.StackFrame[]} stack An array of stack frames.\n * @property {string} mode 'stack', 'stacktrace', 'multiline', 'callers', 'onerror', or 'failed' -- method used to collect the stack trace.\n * @memberof TraceKit\n */\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n *   ```js\n *   s = TraceKit.computeStackTrace.ofCaller([depth])\n *   s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n *   ```\n *\n * Supports:\n *   - Firefox:  full stack trace with line numbers and unreliable column\n *               number on top frame\n *   - Opera 10: full stack trace with line and column numbers\n *   - Opera 9-: full stack trace with line numbers\n *   - Chrome:   full stack trace with line and column numbers\n *   - Safari:   line and column number for the topmost stacktrace element\n *               only\n *   - IE:       no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n *  * in Safari, some methods may be missing from the stack trace;\n *  * in IE, the topmost function in the stack trace will always be the\n *    caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n * Tracing example:\n *  ```js\n *     function trace(message) {\n *         var stackInfo = TraceKit.computeStackTrace.ofCaller();\n *         var data = message + \"\\n\";\n *         for(var i in stackInfo.stack) {\n *             var item = stackInfo.stack[i];\n *             data += (item.func || '[anonymous]') + \"() in \" + item.url + \":\" + (item.line || '0') + \"\\n\";\n *         }\n *         if (window.console)\n *             console.info(data);\n *         else\n *             alert(data);\n *     }\n * ```\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n    var debug = false,\n        sourceCache = {};\n\n    /**\n     * Attempts to retrieve source code via XMLHttpRequest, which is used\n     * to look up anonymous function names.\n     * @param {string} url URL of source code.\n     * @return {string} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function loadSource(url) {\n        if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on.\n            return '';\n        }\n        try {\n            var getXHR = function() {\n                try {\n                    return new window.XMLHttpRequest();\n                } catch (e) {\n                    // explicitly bubble up the exception if not found\n                    return new window.ActiveXObject('Microsoft.XMLHTTP');\n                }\n            };\n\n            var request = getXHR();\n            request.open('GET', url, false);\n            request.send('');\n            return request.responseText;\n        } catch (e) {\n            return '';\n        }\n    }\n\n    /**\n     * Retrieves source code from the source code cache.\n     * @param {string} url URL of source code.\n     * @return {Array.<string>} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function getSource(url) {\n        if (typeof url !== 'string') {\n            return [];\n        }\n\n        if (!_has(sourceCache, url)) {\n            // URL needs to be able to fetched within the acceptable domain.  Otherwise,\n            // cross-domain errors will be triggered.\n            /*\n                Regex matches:\n                0 - Full Url\n                1 - Protocol\n                2 - Domain\n                3 - Port (Useful for internal applications)\n                4 - Path\n            */\n            var source = '';\n            var domain = '';\n            try { domain = window.document.domain; } catch (e) { }\n            var match = /(.*)\\:\\/\\/([^:\\/]+)([:\\d]*)\\/{0,1}([\\s\\S]*)/.exec(url);\n            if (match && match[2] === domain) {\n                source = loadSource(url);\n            }\n            sourceCache[url] = source ? source.split('\\n') : [];\n        }\n\n        return sourceCache[url];\n    }\n\n    /**\n     * Tries to use an externally loaded copy of source code to determine\n     * the name of a function by looking at the name of the variable it was\n     * assigned to, if any.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} lineNo Line number in source code.\n     * @return {string} The function name, if discoverable.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function guessFunctionName(url, lineNo) {\n        var reFunctionArgNames = /function ([^(]*)\\(([^)]*)\\)/,\n            reGuessFunction = /['\"]?([0-9A-Za-z$_]+)['\"]?\\s*[:=]\\s*(function|eval|new Function)/,\n            line = '',\n            maxLines = 10,\n            source = getSource(url),\n            m;\n\n        if (!source.length) {\n            return UNKNOWN_FUNCTION;\n        }\n\n        // Walk backwards from the first line in the function until we find the line which\n        // matches the pattern above, which is the function definition\n        for (var i = 0; i < maxLines; ++i) {\n            line = source[lineNo - i] + line;\n\n            if (!_isUndefined(line)) {\n                if ((m = reGuessFunction.exec(line))) {\n                    return m[1];\n                } else if ((m = reFunctionArgNames.exec(line))) {\n                    return m[1];\n                }\n            }\n        }\n\n        return UNKNOWN_FUNCTION;\n    }\n\n    /**\n     * Retrieves the surrounding lines from where an exception occurred.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} line Line number in source code to centre\n     * around for context.\n     * @return {?Array.<string>} Lines of source code.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function gatherContext(url, line) {\n        var source = getSource(url);\n\n        if (!source.length) {\n            return null;\n        }\n\n        var context = [],\n            // linesBefore & linesAfter are inclusive with the offending line.\n            // if linesOfContext is even, there will be one extra line\n            //   *before* the offending line.\n            linesBefore = Math.floor(TraceKit.linesOfContext / 2),\n            // Add one extra line if linesOfContext is odd\n            linesAfter = linesBefore + (TraceKit.linesOfContext % 2),\n            start = Math.max(0, line - linesBefore - 1),\n            end = Math.min(source.length, line + linesAfter - 1);\n\n        line -= 1; // convert to 0-based index\n\n        for (var i = start; i < end; ++i) {\n            if (!_isUndefined(source[i])) {\n                context.push(source[i]);\n            }\n        }\n\n        return context.length > 0 ? context : null;\n    }\n\n    /**\n     * Escapes special characters, except for whitespace, in a string to be\n     * used inside a regular expression as a string literal.\n     * @param {string} text The string.\n     * @return {string} The escaped string literal.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeRegExp(text) {\n        return text.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#]/g, '\\\\$&');\n    }\n\n    /**\n     * Escapes special characters in a string to be used inside a regular\n     * expression as a string literal. Also ensures that HTML entities will\n     * be matched the same as their literal friends.\n     * @param {string} body The string.\n     * @return {string} The escaped string.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeCodeAsRegExpForMatchingInsideHTML(body) {\n        return escapeRegExp(body).replace('<', '(?:<|&lt;)').replace('>', '(?:>|&gt;)').replace('&', '(?:&|&amp;)').replace('\"', '(?:\"|&quot;)').replace(/\\s+/g, '\\\\s+');\n    }\n\n    /**\n     * Determines where a code fragment occurs in the source code.\n     * @param {RegExp} re The function definition.\n     * @param {Array.<string>} urls A list of URLs to search.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInUrls(re, urls) {\n        var source, m;\n        for (var i = 0, j = urls.length; i < j; ++i) {\n            // console.log('searching', urls[i]);\n            if ((source = getSource(urls[i])).length) {\n                source = source.join('\\n');\n                if ((m = re.exec(source))) {\n                    // console.log('Found function in ' + urls[i]);\n\n                    return {\n                        'url': urls[i],\n                        'line': source.substring(0, m.index).split('\\n').length,\n                        'column': m.index - source.lastIndexOf('\\n', m.index) - 1\n                    };\n                }\n            }\n        }\n\n        // console.log('no match');\n\n        return null;\n    }\n\n    /**\n     * Determines at which column a code fragment occurs on a line of the\n     * source code.\n     * @param {string} fragment The code fragment.\n     * @param {string} url The URL to search.\n     * @param {(string|number)} line The line number to examine.\n     * @return {?number} The column number.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInLine(fragment, url, line) {\n        var source = getSource(url),\n            re = new RegExp('\\\\b' + escapeRegExp(fragment) + '\\\\b'),\n            m;\n\n        line -= 1;\n\n        if (source && source.length > line && (m = re.exec(source[line]))) {\n            return m.index;\n        }\n\n        return null;\n    }\n\n    /**\n     * Determines where a function was defined within the source code.\n     * @param {(Function|string)} func A function reference or serialized\n     * function definition.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceByFunctionBody(func) {\n        if (_isUndefined(window && window.document)) {\n            return;\n        }\n\n        var urls = [window.location.href],\n            scripts = window.document.getElementsByTagName('script'),\n            body,\n            code = '' + func,\n            codeRE = /^function(?:\\s+([\\w$]+))?\\s*\\(([\\w\\s,]*)\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            eventRE = /^function on([\\w$]+)\\s*\\(event\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            re,\n            parts,\n            result;\n\n        for (var i = 0; i < scripts.length; ++i) {\n            var script = scripts[i];\n            if (script.src) {\n                urls.push(script.src);\n            }\n        }\n\n        if (!(parts = codeRE.exec(code))) {\n            re = new RegExp(escapeRegExp(code).replace(/\\s+/g, '\\\\s+'));\n        }\n\n        // not sure if this is really necessary, but I don’t have a test\n        // corpus large enough to confirm that and it was in the original.\n        else {\n            var name = parts[1] ? '\\\\s+' + parts[1] : '',\n                args = parts[2].split(',').join('\\\\s*,\\\\s*');\n\n            body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\\s+/g, '\\\\s+');\n            re = new RegExp('function' + name + '\\\\s*\\\\(\\\\s*' + args + '\\\\s*\\\\)\\\\s*{\\\\s*' + body + '\\\\s*}');\n        }\n\n        // look for a normal function definition\n        if ((result = findSourceInUrls(re, urls))) {\n            return result;\n        }\n\n        // look for an old-school event handler function\n        if ((parts = eventRE.exec(code))) {\n            var event = parts[1];\n            body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]);\n\n            // look for a function defined in HTML as an onXXX handler\n            re = new RegExp('on' + event + '=[\\\\\\'\"]\\\\s*' + body + '\\\\s*[\\\\\\'\"]', 'i');\n\n            if ((result = findSourceInUrls(re, urls[0]))) {\n                return result;\n            }\n\n            // look for ???\n            re = new RegExp(body);\n\n            if ((result = findSourceInUrls(re, urls))) {\n                return result;\n            }\n        }\n\n        return null;\n    }\n\n    // Contents of Exception in various browsers.\n    //\n    // SAFARI:\n    // ex.message = Can't find variable: qq\n    // ex.line = 59\n    // ex.sourceId = 580238192\n    // ex.sourceURL = http://...\n    // ex.expressionBeginOffset = 96\n    // ex.expressionCaretOffset = 98\n    // ex.expressionEndOffset = 98\n    // ex.name = ReferenceError\n    //\n    // FIREFOX:\n    // ex.message = qq is not defined\n    // ex.fileName = http://...\n    // ex.lineNumber = 59\n    // ex.columnNumber = 69\n    // ex.stack = ...stack trace... (see the example below)\n    // ex.name = ReferenceError\n    //\n    // CHROME:\n    // ex.message = qq is not defined\n    // ex.name = ReferenceError\n    // ex.type = not_defined\n    // ex.arguments = ['aa']\n    // ex.stack = ...stack trace...\n    //\n    // INTERNET EXPLORER:\n    // ex.message = ...\n    // ex.name = ReferenceError\n    //\n    // OPERA:\n    // ex.message = ...message... (see the example below)\n    // ex.name = ReferenceError\n    // ex.opera#sourceloc = 11  (pretty much useless, duplicates the info in ex.message)\n    // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n    /**\n     * Computes stack trace information from the stack property.\n     * Chrome and Gecko use this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStackProp(ex) {\n        if (!ex.stack) {\n            return null;\n        }\n\n        var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n            gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|\\[native).*?)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n            winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:ms-appx|https?|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n            lines = ex.stack.split('\\n'),\n            stack = [],\n            parts,\n            element,\n            reference = /^(.*) is undefined$/.exec(ex.message);\n\n        for (var i = 0, j = lines.length; i < j; ++i) {\n            if ((parts = chrome.exec(lines[i]))) {\n                var isNative = parts[2] && parts[2].indexOf('native') !== -1;\n                element = {\n                    'url': !isNative ? parts[2] : null,\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': isNative ? [parts[2]] : [],\n                    'line': parts[3] ? +parts[3] : null,\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ( parts = winjs.exec(lines[i]) ) {\n                element = {\n                    'url': parts[2],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': [],\n                    'line': +parts[3],\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ((parts = gecko.exec(lines[i]))) {\n                element = {\n                    'url': parts[3],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': parts[2] ? parts[2].split(',') : [],\n                    'line': parts[4] ? +parts[4] : null,\n                    'column': parts[5] ? +parts[5] : null\n                };\n            } else {\n                continue;\n            }\n\n            if (!element.func && element.line) {\n                element.func = guessFunctionName(element.url, element.line);\n            }\n\n            if (element.line) {\n                element.context = gatherContext(element.url, element.line);\n            }\n\n            stack.push(element);\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        if (stack[0] && stack[0].line && !stack[0].column && reference) {\n            stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line);\n        } else if (!stack[0].column && !_isUndefined(ex.columnNumber)) {\n            // FireFox uses this awesome columnNumber property for its top frame\n            // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n            // so adding 1\n            stack[0].column = ex.columnNumber + 1;\n        }\n\n        return {\n            'mode': 'stack',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * Computes stack trace information from the stacktrace property.\n     * Opera 10+ uses this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStacktraceProp(ex) {\n        // Access and store the stacktrace property before doing ANYTHING\n        // else to it because Opera is not very good at providing it\n        // reliably in other circumstances.\n        var stacktrace = ex.stacktrace;\n        if (!stacktrace) {\n            return;\n        }\n\n        var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i,\n            opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i,\n            lines = stacktrace.split('\\n'),\n            stack = [],\n            parts;\n\n        for (var line = 0; line < lines.length; line += 2) {\n            var element = null;\n            if ((parts = opera10Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[2],\n                    'line': +parts[1],\n                    'column': null,\n                    'func': parts[3],\n                    'args':[]\n                };\n            } else if ((parts = opera11Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[6],\n                    'line': +parts[1],\n                    'column': +parts[2],\n                    'func': parts[3] || parts[4],\n                    'args': parts[5] ? parts[5].split(',') : []\n                };\n            }\n\n            if (element) {\n                if (!element.func && element.line) {\n                    element.func = guessFunctionName(element.url, element.line);\n                }\n                if (element.line) {\n                    try {\n                        element.context = gatherContext(element.url, element.line);\n                    } catch (exc) {}\n                }\n\n                if (!element.context) {\n                    element.context = [lines[line + 1]];\n                }\n\n                stack.push(element);\n            }\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        return {\n            'mode': 'stacktrace',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * NOT TESTED.\n     * Computes stack trace information from an error message that includes\n     * the stack trace.\n     * Opera 9 and earlier use this method if the option to show stack\n     * traces is turned on in opera:config.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromOperaMultiLineMessage(ex) {\n        // TODO: Clean this function up\n        // Opera includes a stack trace into the exception message. An example is:\n        //\n        // Statement on line 3: Undefined variable: undefinedFunc\n        // Backtrace:\n        //   Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz\n        //         undefinedFunc(a);\n        //   Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy\n        //           zzz(x, y, z);\n        //   Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx\n        //           yyy(a, a, a);\n        //   Line 1 of function script\n        //     try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); }\n        //   ...\n\n        var lines = ex.message.split('\\n');\n        if (lines.length < 4) {\n            return null;\n        }\n\n        var lineRE1 = /^\\s*Line (\\d+) of linked script ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE2 = /^\\s*Line (\\d+) of inline#(\\d+) script in ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE3 = /^\\s*Line (\\d+) of function script\\s*$/i,\n            stack = [],\n            scripts = (window && window.document && window.document.getElementsByTagName('script')),\n            inlineScriptBlocks = [],\n            parts;\n\n        for (var s in scripts) {\n            if (_has(scripts, s) && !scripts[s].src) {\n                inlineScriptBlocks.push(scripts[s]);\n            }\n        }\n\n        for (var line = 2; line < lines.length; line += 2) {\n            var item = null;\n            if ((parts = lineRE1.exec(lines[line]))) {\n                item = {\n                    'url': parts[2],\n                    'func': parts[3],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null\n                };\n            } else if ((parts = lineRE2.exec(lines[line]))) {\n                item = {\n                    'url': parts[3],\n                    'func': parts[4],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null // TODO: Check to see if inline#1 (+parts[2]) points to the script number or column number.\n                };\n                var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block\n                var script = inlineScriptBlocks[parts[2] - 1];\n                if (script) {\n                    var source = getSource(item.url);\n                    if (source) {\n                        source = source.join('\\n');\n                        var pos = source.indexOf(script.innerText);\n                        if (pos >= 0) {\n                            item.line = relativeLine + source.substring(0, pos).split('\\n').length;\n                        }\n                    }\n                }\n            } else if ((parts = lineRE3.exec(lines[line]))) {\n                var url = window.location.href.replace(/#.*$/, '');\n                var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[line + 1]));\n                var src = findSourceInUrls(re, [url]);\n                item = {\n                    'url': url,\n                    'func': '',\n                    'args': [],\n                    'line': src ? src.line : parts[1],\n                    'column': null\n                };\n            }\n\n            if (item) {\n                if (!item.func) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n                var context = gatherContext(item.url, item.line);\n                var midline = (context ? context[Math.floor(context.length / 2)] : null);\n                if (context && midline.replace(/^\\s*/, '') === lines[line + 1].replace(/^\\s*/, '')) {\n                    item.context = context;\n                } else {\n                    // if (context) alert(\"Context mismatch. Correct midline:\\n\" + lines[i+1] + \"\\n\\nMidline:\\n\" + midline + \"\\n\\nContext:\\n\" + context.join(\"\\n\") + \"\\n\\nURL:\\n\" + item.url);\n                    item.context = [lines[line + 1]];\n                }\n                stack.push(item);\n            }\n        }\n        if (!stack.length) {\n            return null; // could not parse multiline exception message as Opera stack trace\n        }\n\n        return {\n            'mode': 'multiline',\n            'name': ex.name,\n            'message': lines[0],\n            'stack': stack\n        };\n    }\n\n    /**\n     * Adds information about the first frame to incomplete stack traces.\n     * Safari and IE require this to get complete data on the first frame.\n     * @param {TraceKit.StackTrace} stackInfo Stack trace information from\n     * one of the compute* methods.\n     * @param {string} url The URL of the script that caused an error.\n     * @param {(number|string)} lineNo The line number of the script that\n     * caused an error.\n     * @param {string=} message The error generated by the browser, which\n     * hopefully contains the name of the object that caused the error.\n     * @return {boolean} Whether or not the stack information was\n     * augmented.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n        var initial = {\n            'url': url,\n            'line': lineNo\n        };\n\n        if (initial.url && initial.line) {\n            stackInfo.incomplete = false;\n\n            if (!initial.func) {\n                initial.func = guessFunctionName(initial.url, initial.line);\n            }\n\n            if (!initial.context) {\n                initial.context = gatherContext(initial.url, initial.line);\n            }\n\n            var reference = / '([^']+)' /.exec(message);\n            if (reference) {\n                initial.column = findSourceInLine(reference[1], initial.url, initial.line);\n            }\n\n            if (stackInfo.stack.length > 0) {\n                if (stackInfo.stack[0].url === initial.url) {\n                    if (stackInfo.stack[0].line === initial.line) {\n                        return false; // already in stack trace\n                    } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) {\n                        stackInfo.stack[0].line = initial.line;\n                        stackInfo.stack[0].context = initial.context;\n                        return false;\n                    }\n                }\n            }\n\n            stackInfo.stack.unshift(initial);\n            stackInfo.partial = true;\n            return true;\n        } else {\n            stackInfo.incomplete = true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Computes stack trace information by walking the arguments.caller\n     * chain at the time the exception occurred. This will cause earlier\n     * frames to be missed but is the only way to get any stack trace in\n     * Safari and IE. The top frame is restored by\n     * {@link augmentStackTraceWithInitialElement}.\n     * @param {Error} ex\n     * @return {TraceKit.StackTrace=} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceByWalkingCallerChain(ex, depth) {\n        var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n            stack = [],\n            funcs = {},\n            recursion = false,\n            parts,\n            item,\n            source;\n\n        for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {\n            if (curr === computeStackTrace || curr === TraceKit.report) {\n                // console.log('skipping internal function');\n                continue;\n            }\n\n            item = {\n                'url': null,\n                'func': UNKNOWN_FUNCTION,\n                'args': [],\n                'line': null,\n                'column': null\n            };\n\n            if (curr.name) {\n                item.func = curr.name;\n            } else if ((parts = functionName.exec(curr.toString()))) {\n                item.func = parts[1];\n            }\n\n            if (typeof item.func === 'undefined') {\n              try {\n                item.func = parts.input.substring(0, parts.input.indexOf('{'));\n              } catch (e) { }\n            }\n\n            if ((source = findSourceByFunctionBody(curr))) {\n                item.url = source.url;\n                item.line = source.line;\n\n                if (item.func === UNKNOWN_FUNCTION) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n\n                var reference = / '([^']+)' /.exec(ex.message || ex.description);\n                if (reference) {\n                    item.column = findSourceInLine(reference[1], source.url, source.line);\n                }\n            }\n\n            if (funcs['' + curr]) {\n                recursion = true;\n            }else{\n                funcs['' + curr] = true;\n            }\n\n            stack.push(item);\n        }\n\n        if (depth) {\n            // console.log('depth is ' + depth);\n            // console.log('stack is ' + stack.length);\n            stack.splice(0, depth);\n        }\n\n        var result = {\n            'mode': 'callers',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n        augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description);\n        return result;\n    }\n\n    /**\n     * Computes a stack trace for an exception.\n     * @param {Error} ex\n     * @param {(string|number)=} depth\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTrace(ex, depth) {\n        var stack = null;\n        depth = (depth == null ? 0 : +depth);\n\n        try {\n            // This must be tried first because Opera 10 *destroys*\n            // its stacktrace property if you try to access the stack\n            // property first!!\n            stack = computeStackTraceFromStacktraceProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromStackProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromOperaMultiLineMessage(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        return {\n            'mode': 'failed'\n        };\n    }\n\n    /**\n     * Logs a stacktrace starting from the previous call and working down.\n     * @param {(number|string)=} depth How many frames deep to trace.\n     * @return {TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceOfCaller(depth) {\n        depth = (depth == null ? 0 : +depth) + 1; // \"+ 1\" because \"ofCaller\" should drop one frame\n        try {\n            throw new Error();\n        } catch (ex) {\n            return computeStackTrace(ex, depth + 1);\n        }\n    }\n\n    computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n    computeStackTrace.guessFunctionName = guessFunctionName;\n    computeStackTrace.gatherContext = gatherContext;\n    computeStackTrace.ofCaller = computeStackTraceOfCaller;\n    computeStackTrace.getSource = getSource;\n\n    return computeStackTrace;\n}());\n\n/**\n * Extends support for global error handling for asynchronous browser\n * functions. Adopted from Closure Library's errorhandler.js\n * @memberof TraceKit\n */\nTraceKit.extendToAsynchronousCallbacks = function () {\n    var _helper = function _helper(fnName) {\n        var originalFn = window[fnName];\n        window[fnName] = function traceKitAsyncExtension() {\n            // Make a copy of the arguments\n            var args = _slice.call(arguments);\n            var originalCallback = args[0];\n            if (typeof (originalCallback) === 'function') {\n                args[0] = TraceKit.wrap(originalCallback);\n            }\n            // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n            // also only supports 2 argument and doesn't care what \"this\" is, so we\n            // can just call the original function directly.\n            if (originalFn.apply) {\n                return originalFn.apply(this, args);\n            } else {\n                return originalFn(args[0], args[1]);\n            }\n        };\n    };\n\n    _helper('setTimeout');\n    _helper('setInterval');\n};\n\n//Default options:\nif (!TraceKit.remoteFetching) {\n    TraceKit.remoteFetching = true;\n}\nif (!TraceKit.collectWindowErrors) {\n    TraceKit.collectWindowErrors = true;\n}\nif (!TraceKit.linesOfContext || TraceKit.linesOfContext < 1) {\n    // 5 lines before, the offending line, 5 lines after\n    TraceKit.linesOfContext = 11;\n}\n\n// UMD export\nif (typeof module !== 'undefined' && module.exports && this.module !== module) {\n    module.exports = TraceKit;\n} else if (typeof define === 'function' && define.amd) {\n    define('TraceKit', [], TraceKit);\n} else {\n    window.TraceKit = TraceKit;\n}\n\n}(typeof window !== 'undefined' ? window : global));\n","/**\n * https://github.com/csnover/TraceKit\n * @license MIT\n * @namespace TraceKit\n */\n(function(window, undefined) {\nif (!window) {\n    return;\n}\n\nvar TraceKit = {};\nvar _oldTraceKit = window.TraceKit;\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n/**\n * A better form of hasOwnProperty<br/>\n * Example: `_has(MainHostObject, property) === true/false`\n *\n * @param {Object} object to check property\n * @param {string} key to check\n * @return {Boolean} true if the object has the key and it is not inherited\n */\nfunction _has(object, key) {\n    return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/**\n * Returns true if the parameter is undefined<br/>\n * Example: `_isUndefined(val) === true/false`\n *\n * @param {*} what Value to check\n * @return {Boolean} true if undefined and false otherwise\n */\nfunction _isUndefined(what) {\n    return typeof what === 'undefined';\n}\n\n/**\n * Export TraceKit out to another variable<br/>\n * Example: `var TK = TraceKit.noConflict()`\n * @return {Object} The TraceKit object\n * @memberof TraceKit\n */\nTraceKit.noConflict = function noConflict() {\n    window.TraceKit = _oldTraceKit;\n    return TraceKit;\n};\n\n/**\n * Wrap any function in a TraceKit reporter<br/>\n * Example: `func = TraceKit.wrap(func);`\n *\n * @param {Function} func Function to be wrapped\n * @return {Function} The wrapped func\n * @memberof TraceKit\n */\nTraceKit.wrap = function traceKitWrapper(func) {\n    function wrapped() {\n        try {\n            return func.apply(this, arguments);\n        } catch (e) {\n            TraceKit.report(e);\n            throw e;\n        }\n    }\n    return wrapped;\n};\n\n/**\n * Cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * ```js\n *   TraceKit.report.subscribe(function(stackInfo) { ... })\n *   TraceKit.report.unsubscribe(function(stackInfo) { ... })\n *   TraceKit.report(exception)\n *   try { ...code... } catch(ex) { TraceKit.report(ex); }\n * ```\n *\n * Supports:\n *   - Firefox: full stack trace with line numbers, plus column number\n *     on top frame; column number is not guaranteed\n *   - Opera: full stack trace with line and column numbers\n *   - Chrome: full stack trace with line and column numbers\n *   - Safari: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *   - IE: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n *   - IE5.5+ (only 8.0 tested)\n *   - Firefox 0.9+ (only 3.5+ tested)\n *   - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n *     Exceptions Have Stacktrace to be enabled in opera:config)\n *   - Safari 3+ (only 4+ tested)\n *   - Chrome 1+ (only 5+ tested)\n *   - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a TraceKit.StackTrace object as described in the\n * TraceKit.computeStackTrace docs.\n *\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.report = (function reportModuleWrapper() {\n    var handlers = [],\n        lastArgs = null,\n        lastException = null,\n        lastExceptionStack = null;\n\n    /**\n     * Add a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function subscribe(handler) {\n        installGlobalHandler();\n        handlers.push(handler);\n    }\n\n    /**\n     * Remove a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function unsubscribe(handler) {\n        for (var i = handlers.length - 1; i >= 0; --i) {\n            if (handlers[i] === handler) {\n                handlers.splice(i, 1);\n            }\n        }\n    }\n\n    /**\n     * Dispatch stack information to all handlers.\n     * @param {TraceKit.StackTrace} stack\n     * @param {boolean} isWindowError Is this a top-level window error?\n     * @memberof TraceKit.report\n     * @throws An exception if an error occurs while calling an handler.\n     */\n    function notifyHandlers(stack, isWindowError) {\n        var exception = null;\n        if (isWindowError && !TraceKit.collectWindowErrors) {\n          return;\n        }\n        for (var i in handlers) {\n            if (_has(handlers, i)) {\n                try {\n                    handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n                } catch (inner) {\n                    exception = inner;\n                }\n            }\n        }\n\n        if (exception) {\n            throw exception;\n        }\n    }\n\n    var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n    /**\n     * Ensures all global unhandled exceptions are recorded.\n     * Supported by Gecko and IE.\n     * @param {string} message Error message.\n     * @param {string} url URL of script that generated the exception.\n     * @param {(number|string)} lineNo The line number at which the error occurred.\n     * @param {(number|string)=} columnNo The column number at which the error occurred.\n     * @param {Error=} errorObj The actual Error object.\n     * @memberof TraceKit.report\n     */\n    function traceKitWindowOnError(message, url, lineNo, columnNo, errorObj) {\n        var stack = null;\n\n        if (lastExceptionStack) {\n            TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message);\n    \t    processLastException();\n\t    } else if (errorObj) {\n            stack = TraceKit.computeStackTrace(errorObj);\n            notifyHandlers(stack, true);\n        } else {\n            var location = {\n              'url': url,\n              'line': lineNo,\n              'column': columnNo\n            };\n            location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line);\n            location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line);\n            stack = {\n              'mode': 'onerror',\n              'message': message,\n              'stack': [location]\n            };\n\n            notifyHandlers(stack, true);\n        }\n\n        if (_oldOnerrorHandler) {\n            return _oldOnerrorHandler.apply(this, arguments);\n        }\n\n        return false;\n    }\n\n    /**\n     * Install a global onerror handler\n     * @memberof TraceKit.report\n     */\n    function installGlobalHandler () {\n        if (_onErrorHandlerInstalled === true) {\n            return;\n        }\n        _oldOnerrorHandler = window.onerror;\n        window.onerror = traceKitWindowOnError;\n        _onErrorHandlerInstalled = true;\n    }\n\n    /**\n     * Process the most recent exception\n     * @memberof TraceKit.report\n     */\n    function processLastException() {\n        var _lastExceptionStack = lastExceptionStack,\n            _lastArgs = lastArgs;\n        lastArgs = null;\n        lastExceptionStack = null;\n        lastException = null;\n        notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n    }\n\n    /**\n     * Reports an unhandled Error to TraceKit.\n     * @param {Error} ex\n     * @memberof TraceKit.report\n     * @throws An exception if an incomplete stack trace is detected (old IE browsers).\n     */\n    function report(ex) {\n        if (lastExceptionStack) {\n            if (lastException === ex) {\n                return; // already caught by an inner catch block, ignore\n            } else {\n              processLastException();\n            }\n        }\n\n        var stack = TraceKit.computeStackTrace(ex);\n        lastExceptionStack = stack;\n        lastException = ex;\n        lastArgs = _slice.call(arguments, 1);\n\n        // If the stack trace is incomplete, wait for 2 seconds for\n        // slow slow IE to see if onerror occurs or not before reporting\n        // this exception; otherwise, we will end up with an incomplete\n        // stack trace\n        window.setTimeout(function () {\n            if (lastException === ex) {\n                processLastException();\n            }\n        }, (stack.incomplete ? 2000 : 0));\n\n        throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n    }\n\n    report.subscribe = subscribe;\n    report.unsubscribe = unsubscribe;\n    return report;\n}());\n\n/**\n * An object representing a single stack frame.\n * @typedef {Object} StackFrame\n * @property {string} url The JavaScript or HTML file URL.\n * @property {string} func The function name, or empty for anonymous functions (if guessing did not work).\n * @property {string[]?} args The arguments passed to the function, if known.\n * @property {number=} line The line number, if known.\n * @property {number=} column The column number, if known.\n * @property {string[]} context An array of source code lines; the middle element corresponds to the correct line#.\n * @memberof TraceKit\n */\n\n/**\n * An object representing a JavaScript stack trace.\n * @typedef {Object} StackTrace\n * @property {string} name The name of the thrown exception.\n * @property {string} message The exception error message.\n * @property {TraceKit.StackFrame[]} stack An array of stack frames.\n * @property {string} mode 'stack', 'stacktrace', 'multiline', 'callers', 'onerror', or 'failed' -- method used to collect the stack trace.\n * @memberof TraceKit\n */\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n *   ```js\n *   s = TraceKit.computeStackTrace.ofCaller([depth])\n *   s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n *   ```\n *\n * Supports:\n *   - Firefox:  full stack trace with line numbers and unreliable column\n *               number on top frame\n *   - Opera 10: full stack trace with line and column numbers\n *   - Opera 9-: full stack trace with line numbers\n *   - Chrome:   full stack trace with line and column numbers\n *   - Safari:   line and column number for the topmost stacktrace element\n *               only\n *   - IE:       no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n *  * in Safari, some methods may be missing from the stack trace;\n *  * in IE, the topmost function in the stack trace will always be the\n *    caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n * Tracing example:\n *  ```js\n *     function trace(message) {\n *         var stackInfo = TraceKit.computeStackTrace.ofCaller();\n *         var data = message + \"\\n\";\n *         for(var i in stackInfo.stack) {\n *             var item = stackInfo.stack[i];\n *             data += (item.func || '[anonymous]') + \"() in \" + item.url + \":\" + (item.line || '0') + \"\\n\";\n *         }\n *         if (window.console)\n *             console.info(data);\n *         else\n *             alert(data);\n *     }\n * ```\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n    var debug = false,\n        sourceCache = {};\n\n    /**\n     * Attempts to retrieve source code via XMLHttpRequest, which is used\n     * to look up anonymous function names.\n     * @param {string} url URL of source code.\n     * @return {string} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function loadSource(url) {\n        if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on.\n            return '';\n        }\n        try {\n            var getXHR = function() {\n                try {\n                    return new window.XMLHttpRequest();\n                } catch (e) {\n                    // explicitly bubble up the exception if not found\n                    return new window.ActiveXObject('Microsoft.XMLHTTP');\n                }\n            };\n\n            var request = getXHR();\n            request.open('GET', url, false);\n            request.send('');\n            return request.responseText;\n        } catch (e) {\n            return '';\n        }\n    }\n\n    /**\n     * Retrieves source code from the source code cache.\n     * @param {string} url URL of source code.\n     * @return {Array.<string>} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function getSource(url) {\n        if (typeof url !== 'string') {\n            return [];\n        }\n\n        if (!_has(sourceCache, url)) {\n            // URL needs to be able to fetched within the acceptable domain.  Otherwise,\n            // cross-domain errors will be triggered.\n            /*\n                Regex matches:\n                0 - Full Url\n                1 - Protocol\n                2 - Domain\n                3 - Port (Useful for internal applications)\n                4 - Path\n            */\n            var source = '';\n            var domain = '';\n            try { domain = window.document.domain; } catch (e) { }\n            var match = /(.*)\\:\\/\\/([^:\\/]+)([:\\d]*)\\/{0,1}([\\s\\S]*)/.exec(url);\n            if (match && match[2] === domain) {\n                source = loadSource(url);\n            }\n            sourceCache[url] = source ? source.split('\\n') : [];\n        }\n\n        return sourceCache[url];\n    }\n\n    /**\n     * Tries to use an externally loaded copy of source code to determine\n     * the name of a function by looking at the name of the variable it was\n     * assigned to, if any.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} lineNo Line number in source code.\n     * @return {string} The function name, if discoverable.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function guessFunctionName(url, lineNo) {\n        var reFunctionArgNames = /function ([^(]*)\\(([^)]*)\\)/,\n            reGuessFunction = /['\"]?([0-9A-Za-z$_]+)['\"]?\\s*[:=]\\s*(function|eval|new Function)/,\n            line = '',\n            maxLines = 10,\n            source = getSource(url),\n            m;\n\n        if (!source.length) {\n            return UNKNOWN_FUNCTION;\n        }\n\n        // Walk backwards from the first line in the function until we find the line which\n        // matches the pattern above, which is the function definition\n        for (var i = 0; i < maxLines; ++i) {\n            line = source[lineNo - i] + line;\n\n            if (!_isUndefined(line)) {\n                if ((m = reGuessFunction.exec(line))) {\n                    return m[1];\n                } else if ((m = reFunctionArgNames.exec(line))) {\n                    return m[1];\n                }\n            }\n        }\n\n        return UNKNOWN_FUNCTION;\n    }\n\n    /**\n     * Retrieves the surrounding lines from where an exception occurred.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} line Line number in source code to centre\n     * around for context.\n     * @return {?Array.<string>} Lines of source code.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function gatherContext(url, line) {\n        var source = getSource(url);\n\n        if (!source.length) {\n            return null;\n        }\n\n        var context = [],\n            // linesBefore & linesAfter are inclusive with the offending line.\n            // if linesOfContext is even, there will be one extra line\n            //   *before* the offending line.\n            linesBefore = Math.floor(TraceKit.linesOfContext / 2),\n            // Add one extra line if linesOfContext is odd\n            linesAfter = linesBefore + (TraceKit.linesOfContext % 2),\n            start = Math.max(0, line - linesBefore - 1),\n            end = Math.min(source.length, line + linesAfter - 1);\n\n        line -= 1; // convert to 0-based index\n\n        for (var i = start; i < end; ++i) {\n            if (!_isUndefined(source[i])) {\n                context.push(source[i]);\n            }\n        }\n\n        return context.length > 0 ? context : null;\n    }\n\n    /**\n     * Escapes special characters, except for whitespace, in a string to be\n     * used inside a regular expression as a string literal.\n     * @param {string} text The string.\n     * @return {string} The escaped string literal.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeRegExp(text) {\n        return text.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#]/g, '\\\\$&');\n    }\n\n    /**\n     * Escapes special characters in a string to be used inside a regular\n     * expression as a string literal. Also ensures that HTML entities will\n     * be matched the same as their literal friends.\n     * @param {string} body The string.\n     * @return {string} The escaped string.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeCodeAsRegExpForMatchingInsideHTML(body) {\n        return escapeRegExp(body).replace('<', '(?:<|&lt;)').replace('>', '(?:>|&gt;)').replace('&', '(?:&|&amp;)').replace('\"', '(?:\"|&quot;)').replace(/\\s+/g, '\\\\s+');\n    }\n\n    /**\n     * Determines where a code fragment occurs in the source code.\n     * @param {RegExp} re The function definition.\n     * @param {Array.<string>} urls A list of URLs to search.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInUrls(re, urls) {\n        var source, m;\n        for (var i = 0, j = urls.length; i < j; ++i) {\n            // console.log('searching', urls[i]);\n            if ((source = getSource(urls[i])).length) {\n                source = source.join('\\n');\n                if ((m = re.exec(source))) {\n                    // console.log('Found function in ' + urls[i]);\n\n                    return {\n                        'url': urls[i],\n                        'line': source.substring(0, m.index).split('\\n').length,\n                        'column': m.index - source.lastIndexOf('\\n', m.index) - 1\n                    };\n                }\n            }\n        }\n\n        // console.log('no match');\n\n        return null;\n    }\n\n    /**\n     * Determines at which column a code fragment occurs on a line of the\n     * source code.\n     * @param {string} fragment The code fragment.\n     * @param {string} url The URL to search.\n     * @param {(string|number)} line The line number to examine.\n     * @return {?number} The column number.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInLine(fragment, url, line) {\n        var source = getSource(url),\n            re = new RegExp('\\\\b' + escapeRegExp(fragment) + '\\\\b'),\n            m;\n\n        line -= 1;\n\n        if (source && source.length > line && (m = re.exec(source[line]))) {\n            return m.index;\n        }\n\n        return null;\n    }\n\n    /**\n     * Determines where a function was defined within the source code.\n     * @param {(Function|string)} func A function reference or serialized\n     * function definition.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceByFunctionBody(func) {\n        if (_isUndefined(window && window.document)) {\n            return;\n        }\n\n        var urls = [window.location.href],\n            scripts = window.document.getElementsByTagName('script'),\n            body,\n            code = '' + func,\n            codeRE = /^function(?:\\s+([\\w$]+))?\\s*\\(([\\w\\s,]*)\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            eventRE = /^function on([\\w$]+)\\s*\\(event\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            re,\n            parts,\n            result;\n\n        for (var i = 0; i < scripts.length; ++i) {\n            var script = scripts[i];\n            if (script.src) {\n                urls.push(script.src);\n            }\n        }\n\n        if (!(parts = codeRE.exec(code))) {\n            re = new RegExp(escapeRegExp(code).replace(/\\s+/g, '\\\\s+'));\n        }\n\n        // not sure if this is really necessary, but I don’t have a test\n        // corpus large enough to confirm that and it was in the original.\n        else {\n            var name = parts[1] ? '\\\\s+' + parts[1] : '',\n                args = parts[2].split(',').join('\\\\s*,\\\\s*');\n\n            body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\\s+/g, '\\\\s+');\n            re = new RegExp('function' + name + '\\\\s*\\\\(\\\\s*' + args + '\\\\s*\\\\)\\\\s*{\\\\s*' + body + '\\\\s*}');\n        }\n\n        // look for a normal function definition\n        if ((result = findSourceInUrls(re, urls))) {\n            return result;\n        }\n\n        // look for an old-school event handler function\n        if ((parts = eventRE.exec(code))) {\n            var event = parts[1];\n            body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]);\n\n            // look for a function defined in HTML as an onXXX handler\n            re = new RegExp('on' + event + '=[\\\\\\'\"]\\\\s*' + body + '\\\\s*[\\\\\\'\"]', 'i');\n\n            if ((result = findSourceInUrls(re, urls[0]))) {\n                return result;\n            }\n\n            // look for ???\n            re = new RegExp(body);\n\n            if ((result = findSourceInUrls(re, urls))) {\n                return result;\n            }\n        }\n\n        return null;\n    }\n\n    // Contents of Exception in various browsers.\n    //\n    // SAFARI:\n    // ex.message = Can't find variable: qq\n    // ex.line = 59\n    // ex.sourceId = 580238192\n    // ex.sourceURL = http://...\n    // ex.expressionBeginOffset = 96\n    // ex.expressionCaretOffset = 98\n    // ex.expressionEndOffset = 98\n    // ex.name = ReferenceError\n    //\n    // FIREFOX:\n    // ex.message = qq is not defined\n    // ex.fileName = http://...\n    // ex.lineNumber = 59\n    // ex.columnNumber = 69\n    // ex.stack = ...stack trace... (see the example below)\n    // ex.name = ReferenceError\n    //\n    // CHROME:\n    // ex.message = qq is not defined\n    // ex.name = ReferenceError\n    // ex.type = not_defined\n    // ex.arguments = ['aa']\n    // ex.stack = ...stack trace...\n    //\n    // INTERNET EXPLORER:\n    // ex.message = ...\n    // ex.name = ReferenceError\n    //\n    // OPERA:\n    // ex.message = ...message... (see the example below)\n    // ex.name = ReferenceError\n    // ex.opera#sourceloc = 11  (pretty much useless, duplicates the info in ex.message)\n    // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n    /**\n     * Computes stack trace information from the stack property.\n     * Chrome and Gecko use this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStackProp(ex) {\n        if (!ex.stack) {\n            return null;\n        }\n\n        var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n            gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|\\[native).*?)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n            winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:ms-appx|https?|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n            lines = ex.stack.split('\\n'),\n            stack = [],\n            parts,\n            element,\n            reference = /^(.*) is undefined$/.exec(ex.message);\n\n        for (var i = 0, j = lines.length; i < j; ++i) {\n            if ((parts = chrome.exec(lines[i]))) {\n                var isNative = parts[2] && parts[2].indexOf('native') !== -1;\n                element = {\n                    'url': !isNative ? parts[2] : null,\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': isNative ? [parts[2]] : [],\n                    'line': parts[3] ? +parts[3] : null,\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ( parts = winjs.exec(lines[i]) ) {\n                element = {\n                    'url': parts[2],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': [],\n                    'line': +parts[3],\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ((parts = gecko.exec(lines[i]))) {\n                element = {\n                    'url': parts[3],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': parts[2] ? parts[2].split(',') : [],\n                    'line': parts[4] ? +parts[4] : null,\n                    'column': parts[5] ? +parts[5] : null\n                };\n            } else {\n                continue;\n            }\n\n            if (!element.func && element.line) {\n                element.func = guessFunctionName(element.url, element.line);\n            }\n\n            if (element.line) {\n                element.context = gatherContext(element.url, element.line);\n            }\n\n            stack.push(element);\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        if (stack[0] && stack[0].line && !stack[0].column && reference) {\n            stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line);\n        } else if (!stack[0].column && !_isUndefined(ex.columnNumber)) {\n            // FireFox uses this awesome columnNumber property for its top frame\n            // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n            // so adding 1\n            stack[0].column = ex.columnNumber + 1;\n        }\n\n        return {\n            'mode': 'stack',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * Computes stack trace information from the stacktrace property.\n     * Opera 10+ uses this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStacktraceProp(ex) {\n        // Access and store the stacktrace property before doing ANYTHING\n        // else to it because Opera is not very good at providing it\n        // reliably in other circumstances.\n        var stacktrace = ex.stacktrace;\n        if (!stacktrace) {\n            return;\n        }\n\n        var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i,\n            opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i,\n            lines = stacktrace.split('\\n'),\n            stack = [],\n            parts;\n\n        for (var line = 0; line < lines.length; line += 2) {\n            var element = null;\n            if ((parts = opera10Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[2],\n                    'line': +parts[1],\n                    'column': null,\n                    'func': parts[3],\n                    'args':[]\n                };\n            } else if ((parts = opera11Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[6],\n                    'line': +parts[1],\n                    'column': +parts[2],\n                    'func': parts[3] || parts[4],\n                    'args': parts[5] ? parts[5].split(',') : []\n                };\n            }\n\n            if (element) {\n                if (!element.func && element.line) {\n                    element.func = guessFunctionName(element.url, element.line);\n                }\n                if (element.line) {\n                    try {\n                        element.context = gatherContext(element.url, element.line);\n                    } catch (exc) {}\n                }\n\n                if (!element.context) {\n                    element.context = [lines[line + 1]];\n                }\n\n                stack.push(element);\n            }\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        return {\n            'mode': 'stacktrace',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * NOT TESTED.\n     * Computes stack trace information from an error message that includes\n     * the stack trace.\n     * Opera 9 and earlier use this method if the option to show stack\n     * traces is turned on in opera:config.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromOperaMultiLineMessage(ex) {\n        // TODO: Clean this function up\n        // Opera includes a stack trace into the exception message. An example is:\n        //\n        // Statement on line 3: Undefined variable: undefinedFunc\n        // Backtrace:\n        //   Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz\n        //         undefinedFunc(a);\n        //   Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy\n        //           zzz(x, y, z);\n        //   Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx\n        //           yyy(a, a, a);\n        //   Line 1 of function script\n        //     try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); }\n        //   ...\n\n        var lines = ex.message.split('\\n');\n        if (lines.length < 4) {\n            return null;\n        }\n\n        var lineRE1 = /^\\s*Line (\\d+) of linked script ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE2 = /^\\s*Line (\\d+) of inline#(\\d+) script in ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE3 = /^\\s*Line (\\d+) of function script\\s*$/i,\n            stack = [],\n            scripts = (window && window.document && window.document.getElementsByTagName('script')),\n            inlineScriptBlocks = [],\n            parts;\n\n        for (var s in scripts) {\n            if (_has(scripts, s) && !scripts[s].src) {\n                inlineScriptBlocks.push(scripts[s]);\n            }\n        }\n\n        for (var line = 2; line < lines.length; line += 2) {\n            var item = null;\n            if ((parts = lineRE1.exec(lines[line]))) {\n                item = {\n                    'url': parts[2],\n                    'func': parts[3],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null\n                };\n            } else if ((parts = lineRE2.exec(lines[line]))) {\n                item = {\n                    'url': parts[3],\n                    'func': parts[4],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null // TODO: Check to see if inline#1 (+parts[2]) points to the script number or column number.\n                };\n                var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block\n                var script = inlineScriptBlocks[parts[2] - 1];\n                if (script) {\n                    var source = getSource(item.url);\n                    if (source) {\n                        source = source.join('\\n');\n                        var pos = source.indexOf(script.innerText);\n                        if (pos >= 0) {\n                            item.line = relativeLine + source.substring(0, pos).split('\\n').length;\n                        }\n                    }\n                }\n            } else if ((parts = lineRE3.exec(lines[line]))) {\n                var url = window.location.href.replace(/#.*$/, '');\n                var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[line + 1]));\n                var src = findSourceInUrls(re, [url]);\n                item = {\n                    'url': url,\n                    'func': '',\n                    'args': [],\n                    'line': src ? src.line : parts[1],\n                    'column': null\n                };\n            }\n\n            if (item) {\n                if (!item.func) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n                var context = gatherContext(item.url, item.line);\n                var midline = (context ? context[Math.floor(context.length / 2)] : null);\n                if (context && midline.replace(/^\\s*/, '') === lines[line + 1].replace(/^\\s*/, '')) {\n                    item.context = context;\n                } else {\n                    // if (context) alert(\"Context mismatch. Correct midline:\\n\" + lines[i+1] + \"\\n\\nMidline:\\n\" + midline + \"\\n\\nContext:\\n\" + context.join(\"\\n\") + \"\\n\\nURL:\\n\" + item.url);\n                    item.context = [lines[line + 1]];\n                }\n                stack.push(item);\n            }\n        }\n        if (!stack.length) {\n            return null; // could not parse multiline exception message as Opera stack trace\n        }\n\n        return {\n            'mode': 'multiline',\n            'name': ex.name,\n            'message': lines[0],\n            'stack': stack\n        };\n    }\n\n    /**\n     * Adds information about the first frame to incomplete stack traces.\n     * Safari and IE require this to get complete data on the first frame.\n     * @param {TraceKit.StackTrace} stackInfo Stack trace information from\n     * one of the compute* methods.\n     * @param {string} url The URL of the script that caused an error.\n     * @param {(number|string)} lineNo The line number of the script that\n     * caused an error.\n     * @param {string=} message The error generated by the browser, which\n     * hopefully contains the name of the object that caused the error.\n     * @return {boolean} Whether or not the stack information was\n     * augmented.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n        var initial = {\n            'url': url,\n            'line': lineNo\n        };\n\n        if (initial.url && initial.line) {\n            stackInfo.incomplete = false;\n\n            if (!initial.func) {\n                initial.func = guessFunctionName(initial.url, initial.line);\n            }\n\n            if (!initial.context) {\n                initial.context = gatherContext(initial.url, initial.line);\n            }\n\n            var reference = / '([^']+)' /.exec(message);\n            if (reference) {\n                initial.column = findSourceInLine(reference[1], initial.url, initial.line);\n            }\n\n            if (stackInfo.stack.length > 0) {\n                if (stackInfo.stack[0].url === initial.url) {\n                    if (stackInfo.stack[0].line === initial.line) {\n                        return false; // already in stack trace\n                    } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) {\n                        stackInfo.stack[0].line = initial.line;\n                        stackInfo.stack[0].context = initial.context;\n                        return false;\n                    }\n                }\n            }\n\n            stackInfo.stack.unshift(initial);\n            stackInfo.partial = true;\n            return true;\n        } else {\n            stackInfo.incomplete = true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Computes stack trace information by walking the arguments.caller\n     * chain at the time the exception occurred. This will cause earlier\n     * frames to be missed but is the only way to get any stack trace in\n     * Safari and IE. The top frame is restored by\n     * {@link augmentStackTraceWithInitialElement}.\n     * @param {Error} ex\n     * @return {TraceKit.StackTrace=} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceByWalkingCallerChain(ex, depth) {\n        var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n            stack = [],\n            funcs = {},\n            recursion = false,\n            parts,\n            item,\n            source;\n\n        for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {\n            if (curr === computeStackTrace || curr === TraceKit.report) {\n                // console.log('skipping internal function');\n                continue;\n            }\n\n            item = {\n                'url': null,\n                'func': UNKNOWN_FUNCTION,\n                'args': [],\n                'line': null,\n                'column': null\n            };\n\n            if (curr.name) {\n                item.func = curr.name;\n            } else if ((parts = functionName.exec(curr.toString()))) {\n                item.func = parts[1];\n            }\n\n            if (typeof item.func === 'undefined') {\n              try {\n                item.func = parts.input.substring(0, parts.input.indexOf('{'));\n              } catch (e) { }\n            }\n\n            if ((source = findSourceByFunctionBody(curr))) {\n                item.url = source.url;\n                item.line = source.line;\n\n                if (item.func === UNKNOWN_FUNCTION) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n\n                var reference = / '([^']+)' /.exec(ex.message || ex.description);\n                if (reference) {\n                    item.column = findSourceInLine(reference[1], source.url, source.line);\n                }\n            }\n\n            if (funcs['' + curr]) {\n                recursion = true;\n            }else{\n                funcs['' + curr] = true;\n            }\n\n            stack.push(item);\n        }\n\n        if (depth) {\n            // console.log('depth is ' + depth);\n            // console.log('stack is ' + stack.length);\n            stack.splice(0, depth);\n        }\n\n        var result = {\n            'mode': 'callers',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n        augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description);\n        return result;\n    }\n\n    /**\n     * Computes a stack trace for an exception.\n     * @param {Error} ex\n     * @param {(string|number)=} depth\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTrace(ex, depth) {\n        var stack = null;\n        depth = (depth == null ? 0 : +depth);\n\n        try {\n            // This must be tried first because Opera 10 *destroys*\n            // its stacktrace property if you try to access the stack\n            // property first!!\n            stack = computeStackTraceFromStacktraceProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromStackProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromOperaMultiLineMessage(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        return {\n            'mode': 'failed'\n        };\n    }\n\n    /**\n     * Logs a stacktrace starting from the previous call and working down.\n     * @param {(number|string)=} depth How many frames deep to trace.\n     * @return {TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceOfCaller(depth) {\n        depth = (depth == null ? 0 : +depth) + 1; // \"+ 1\" because \"ofCaller\" should drop one frame\n        try {\n            throw new Error();\n        } catch (ex) {\n            return computeStackTrace(ex, depth + 1);\n        }\n    }\n\n    computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n    computeStackTrace.guessFunctionName = guessFunctionName;\n    computeStackTrace.gatherContext = gatherContext;\n    computeStackTrace.ofCaller = computeStackTraceOfCaller;\n    computeStackTrace.getSource = getSource;\n\n    return computeStackTrace;\n}());\n\n/**\n * Extends support for global error handling for asynchronous browser\n * functions. Adopted from Closure Library's errorhandler.js\n * @memberof TraceKit\n */\nTraceKit.extendToAsynchronousCallbacks = function () {\n    var _helper = function _helper(fnName) {\n        var originalFn = window[fnName];\n        window[fnName] = function traceKitAsyncExtension() {\n            // Make a copy of the arguments\n            var args = _slice.call(arguments);\n            var originalCallback = args[0];\n            if (typeof (originalCallback) === 'function') {\n                args[0] = TraceKit.wrap(originalCallback);\n            }\n            // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n            // also only supports 2 argument and doesn't care what \"this\" is, so we\n            // can just call the original function directly.\n            if (originalFn.apply) {\n                return originalFn.apply(this, args);\n            } else {\n                return originalFn(args[0], args[1]);\n            }\n        };\n    };\n\n    _helper('setTimeout');\n    _helper('setInterval');\n};\n\n//Default options:\nif (!TraceKit.remoteFetching) {\n    TraceKit.remoteFetching = true;\n}\nif (!TraceKit.collectWindowErrors) {\n    TraceKit.collectWindowErrors = true;\n}\nif (!TraceKit.linesOfContext || TraceKit.linesOfContext < 1) {\n    // 5 lines before, the offending line, 5 lines after\n    TraceKit.linesOfContext = 11;\n}\n\n// UMD export\nif (typeof module !== 'undefined' && module.exports && this.module !== module) {\n    module.exports = TraceKit;\n} else if (typeof define === 'function' && define.amd) {\n    define('TraceKit', [], TraceKit);\n} else {\n    window.TraceKit = TraceKit;\n}\n\n}(typeof window !== 'undefined' ? window : global));\n\n\n(function(root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    define('exceptionless', factory);\n  } else if (typeof exports === 'object') {\n    module.exports = factory(require, exports, module);\n  } else {\n    root.exceptionless = factory();\n  }\n}(this, function(require, exports, module) {\nif (!require) {\n\trequire = function(name) {\n\t\treturn (typeof window !== \"undefined\" ? window : global)[name];\n\t}\n}\nif (!exports) {\n\tvar exports = {};\n}\n\n\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar TraceKit = require('TraceKit');\nvar SubmissionResponse = (function () {\n    function SubmissionResponse(statusCode, message) {\n        this.success = false;\n        this.badRequest = false;\n        this.serviceUnavailable = false;\n        this.paymentRequired = false;\n        this.unableToAuthenticate = false;\n        this.notFound = false;\n        this.requestEntityTooLarge = false;\n        this.statusCode = statusCode;\n        this.message = message;\n        this.success = statusCode >= 200 && statusCode <= 299;\n        this.badRequest = statusCode === 400;\n        this.serviceUnavailable = statusCode === 503;\n        this.paymentRequired = statusCode === 402;\n        this.unableToAuthenticate = statusCode === 401 || statusCode === 403;\n        this.notFound = statusCode === 404;\n        this.requestEntityTooLarge = statusCode === 413;\n    }\n    return SubmissionResponse;\n}());\nexports.SubmissionResponse = SubmissionResponse;\nvar SettingsManager = (function () {\n    function SettingsManager() {\n    }\n    SettingsManager.onChanged = function (handler) {\n        !!handler && this._handlers.push(handler);\n    };\n    SettingsManager.applySavedServerSettings = function (config) {\n        if (!config || !config.isValid) {\n            return;\n        }\n        var savedSettings = this.getSavedServerSettings(config);\n        config.log.info(\"Applying saved settings: v\" + savedSettings.version);\n        config.settings = Utils.merge(config.settings, savedSettings.settings);\n        this.changed(config);\n    };\n    SettingsManager.getVersion = function (config) {\n        if (!config || !config.isValid) {\n            return 0;\n        }\n        var savedSettings = this.getSavedServerSettings(config);\n        return savedSettings.version || 0;\n    };\n    SettingsManager.checkVersion = function (version, config) {\n        var currentVersion = this.getVersion(config);\n        if (version <= currentVersion) {\n            return;\n        }\n        config.log.info(\"Updating settings from v\" + currentVersion + \" to v\" + version);\n        this.updateSettings(config, currentVersion);\n    };\n    SettingsManager.updateSettings = function (config, version) {\n        var _this = this;\n        if (!config || !config.enabled) {\n            return;\n        }\n        var unableToUpdateMessage = 'Unable to update settings';\n        if (!config.isValid) {\n            config.log.error(unableToUpdateMessage + \": ApiKey is not set.\");\n            return;\n        }\n        if (!version || version < 0) {\n            version = this.getVersion(config);\n        }\n        config.log.info(\"Checking for updated settings from: v\" + version + \".\");\n        config.submissionClient.getSettings(config, version, function (response) {\n            if (!config || !response || !response.success || !response.settings) {\n                config.log.warn(unableToUpdateMessage + \": \" + response.message);\n                return;\n            }\n            config.settings = Utils.merge(config.settings, response.settings);\n            var savedServerSettings = SettingsManager.getSavedServerSettings(config);\n            for (var key in savedServerSettings) {\n                if (response.settings[key]) {\n                    continue;\n                }\n                delete config.settings[key];\n            }\n            var newSettings = {\n                version: response.settingsVersion,\n                settings: response.settings\n            };\n            config.storage.settings.save(newSettings);\n            config.log.info(\"Updated settings: v\" + newSettings.version);\n            _this.changed(config);\n        });\n    };\n    SettingsManager.changed = function (config) {\n        var handlers = this._handlers;\n        for (var index = 0; index < handlers.length; index++) {\n            try {\n                handlers[index](config);\n            }\n            catch (ex) {\n                config.log.error(\"Error calling onChanged handler: \" + ex);\n            }\n        }\n    };\n    SettingsManager.getSavedServerSettings = function (config) {\n        var item = config.storage.settings.get()[0];\n        if (item && item.value && item.value.version && item.value.settings) {\n            return item.value;\n        }\n        return { version: 0, settings: {} };\n    };\n    SettingsManager._handlers = [];\n    return SettingsManager;\n}());\nexports.SettingsManager = SettingsManager;\nvar DefaultLastReferenceIdManager = (function () {\n    function DefaultLastReferenceIdManager() {\n        this._lastReferenceId = null;\n    }\n    DefaultLastReferenceIdManager.prototype.getLast = function () {\n        return this._lastReferenceId;\n    };\n    DefaultLastReferenceIdManager.prototype.clearLast = function () {\n        this._lastReferenceId = null;\n    };\n    DefaultLastReferenceIdManager.prototype.setLast = function (eventId) {\n        this._lastReferenceId = eventId;\n    };\n    return DefaultLastReferenceIdManager;\n}());\nexports.DefaultLastReferenceIdManager = DefaultLastReferenceIdManager;\nvar ConsoleLog = (function () {\n    function ConsoleLog() {\n    }\n    ConsoleLog.prototype.info = function (message) {\n        this.log('info', message);\n    };\n    ConsoleLog.prototype.warn = function (message) {\n        this.log('warn', message);\n    };\n    ConsoleLog.prototype.error = function (message) {\n        this.log('error', message);\n    };\n    ConsoleLog.prototype.log = function (level, message) {\n        if (console && console[level]) {\n            console[level](\"[\" + level + \"] Exceptionless: \" + message);\n        }\n    };\n    return ConsoleLog;\n}());\nexports.ConsoleLog = ConsoleLog;\nvar NullLog = (function () {\n    function NullLog() {\n    }\n    NullLog.prototype.info = function (message) { };\n    NullLog.prototype.warn = function (message) { };\n    NullLog.prototype.error = function (message) { };\n    return NullLog;\n}());\nexports.NullLog = NullLog;\nvar EventPluginContext = (function () {\n    function EventPluginContext(client, event, contextData) {\n        this.client = client;\n        this.event = event;\n        this.contextData = contextData ? contextData : new ContextData();\n    }\n    Object.defineProperty(EventPluginContext.prototype, \"log\", {\n        get: function () {\n            return this.client.config.log;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    return EventPluginContext;\n}());\nexports.EventPluginContext = EventPluginContext;\nvar EventPluginManager = (function () {\n    function EventPluginManager() {\n    }\n    EventPluginManager.run = function (context, callback) {\n        var wrap = function (plugin, next) {\n            return function () {\n                try {\n                    if (!context.cancelled) {\n                        plugin.run(context, next);\n                    }\n                }\n                catch (ex) {\n                    context.cancelled = true;\n                    context.log.error(\"Error running plugin '\" + plugin.name + \"': \" + ex.message + \". Discarding Event.\");\n                }\n                if (context.cancelled && !!callback) {\n                    callback(context);\n                }\n            };\n        };\n        var plugins = context.client.config.plugins;\n        var wrappedPlugins = [];\n        if (!!callback) {\n            wrappedPlugins[plugins.length] = wrap({ name: 'cb', priority: 9007199254740992, run: callback }, null);\n        }\n        for (var index = plugins.length - 1; index > -1; index--) {\n            wrappedPlugins[index] = wrap(plugins[index], !!callback || (index < plugins.length - 1) ? wrappedPlugins[index + 1] : null);\n        }\n        wrappedPlugins[0]();\n    };\n    EventPluginManager.addDefaultPlugins = function (config) {\n        config.addPlugin(new ConfigurationDefaultsPlugin());\n        config.addPlugin(new ErrorPlugin());\n        config.addPlugin(new DuplicateCheckerPlugin());\n        config.addPlugin(new EventExclusionPlugin());\n        config.addPlugin(new ModuleInfoPlugin());\n        config.addPlugin(new RequestInfoPlugin());\n        config.addPlugin(new EnvironmentInfoPlugin());\n        config.addPlugin(new SubmissionMethodPlugin());\n    };\n    return EventPluginManager;\n}());\nexports.EventPluginManager = EventPluginManager;\nvar HeartbeatPlugin = (function () {\n    function HeartbeatPlugin(heartbeatInterval) {\n        if (heartbeatInterval === void 0) { heartbeatInterval = 30000; }\n        this.priority = 100;\n        this.name = 'HeartbeatPlugin';\n        this._interval = heartbeatInterval;\n    }\n    HeartbeatPlugin.prototype.run = function (context, next) {\n        clearInterval(this._intervalId);\n        var user = context.event.data['@user'];\n        if (user && user.identity) {\n            this._intervalId = setInterval(function () { return context.client.submitSessionHeartbeat(user.identity); }, this._interval);\n        }\n        next && next();\n    };\n    return HeartbeatPlugin;\n}());\nexports.HeartbeatPlugin = HeartbeatPlugin;\nvar ReferenceIdPlugin = (function () {\n    function ReferenceIdPlugin() {\n        this.priority = 20;\n        this.name = 'ReferenceIdPlugin';\n    }\n    ReferenceIdPlugin.prototype.run = function (context, next) {\n        if ((!context.event.reference_id || context.event.reference_id.length === 0) && context.event.type === 'error') {\n            context.event.reference_id = Utils.guid().replace('-', '').substring(0, 10);\n        }\n        next && next();\n    };\n    return ReferenceIdPlugin;\n}());\nexports.ReferenceIdPlugin = ReferenceIdPlugin;\nvar DefaultEventQueue = (function () {\n    function DefaultEventQueue(config) {\n        this._handlers = [];\n        this._processingQueue = false;\n        this._config = config;\n    }\n    DefaultEventQueue.prototype.enqueue = function (event) {\n        var eventWillNotBeQueued = 'The event will not be queued.';\n        var config = this._config;\n        var log = config.log;\n        if (!config.enabled) {\n            log.info(\"Configuration is disabled. \" + eventWillNotBeQueued);\n            return;\n        }\n        if (!config.isValid) {\n            log.info(\"Invalid Api Key. \" + eventWillNotBeQueued);\n            return;\n        }\n        if (this.areQueuedItemsDiscarded()) {\n            log.info(\"Queue items are currently being discarded. \" + eventWillNotBeQueued);\n            return;\n        }\n        this.ensureQueueTimer();\n        var timestamp = config.storage.queue.save(event);\n        var logText = \"type=\" + event.type + \" \" + (!!event.reference_id ? 'refid=' + event.reference_id : '');\n        if (timestamp) {\n            log.info(\"Enqueuing event: \" + timestamp + \" \" + logText);\n        }\n        else {\n            log.error(\"Could not enqueue event \" + logText);\n        }\n    };\n    DefaultEventQueue.prototype.process = function (isAppExiting) {\n        var _this = this;\n        var queueNotProcessed = 'The queue will not be processed.';\n        var config = this._config;\n        var log = config.log;\n        if (this._processingQueue) {\n            return;\n        }\n        log.info('Processing queue...');\n        if (!config.enabled) {\n            log.info(\"Configuration is disabled. \" + queueNotProcessed);\n            return;\n        }\n        if (!config.isValid) {\n            log.info(\"Invalid Api Key. \" + queueNotProcessed);\n            return;\n        }\n        this._processingQueue = true;\n        this.ensureQueueTimer();\n        try {\n            var events_1 = config.storage.queue.get(config.submissionBatchSize);\n            if (!events_1 || events_1.length === 0) {\n                this._processingQueue = false;\n                return;\n            }\n            log.info(\"Sending \" + events_1.length + \" events to \" + config.serverUrl + \".\");\n            config.submissionClient.postEvents(events_1.map(function (e) { return e.value; }), config, function (response) {\n                _this.processSubmissionResponse(response, events_1);\n                _this.eventsPosted(events_1.map(function (e) { return e.value; }), response);\n                log.info('Finished processing queue.');\n                _this._processingQueue = false;\n            }, isAppExiting);\n        }\n        catch (ex) {\n            log.error(\"Error processing queue: \" + ex);\n            this.suspendProcessing();\n            this._processingQueue = false;\n        }\n    };\n    DefaultEventQueue.prototype.suspendProcessing = function (durationInMinutes, discardFutureQueuedItems, clearQueue) {\n        var config = this._config;\n        if (!durationInMinutes || durationInMinutes <= 0) {\n            durationInMinutes = 5;\n        }\n        config.log.info(\"Suspending processing for \" + durationInMinutes + \" minutes.\");\n        this._suspendProcessingUntil = new Date(new Date().getTime() + (durationInMinutes * 60000));\n        if (discardFutureQueuedItems) {\n            this._discardQueuedItemsUntil = this._suspendProcessingUntil;\n        }\n        if (clearQueue) {\n            config.storage.queue.clear();\n        }\n    };\n    DefaultEventQueue.prototype.onEventsPosted = function (handler) {\n        !!handler && this._handlers.push(handler);\n    };\n    DefaultEventQueue.prototype.eventsPosted = function (events, response) {\n        var handlers = this._handlers;\n        for (var index = 0; index < handlers.length; index++) {\n            try {\n                handlers[index](events, response);\n            }\n            catch (ex) {\n                this._config.log.error(\"Error calling onEventsPosted handler: \" + ex);\n            }\n        }\n    };\n    DefaultEventQueue.prototype.areQueuedItemsDiscarded = function () {\n        return this._discardQueuedItemsUntil && this._discardQueuedItemsUntil > new Date();\n    };\n    DefaultEventQueue.prototype.ensureQueueTimer = function () {\n        var _this = this;\n        if (!this._queueTimer) {\n            this._queueTimer = setInterval(function () { return _this.onProcessQueue(); }, 10000);\n        }\n    };\n    DefaultEventQueue.prototype.isQueueProcessingSuspended = function () {\n        return this._suspendProcessingUntil && this._suspendProcessingUntil > new Date();\n    };\n    DefaultEventQueue.prototype.onProcessQueue = function () {\n        if (!this.isQueueProcessingSuspended() && !this._processingQueue) {\n            this.process();\n        }\n    };\n    DefaultEventQueue.prototype.processSubmissionResponse = function (response, events) {\n        var noSubmission = 'The event will not be submitted.';\n        var config = this._config;\n        var log = config.log;\n        if (response.success) {\n            log.info(\"Sent \" + events.length + \" events.\");\n            this.removeEvents(events);\n            return;\n        }\n        if (response.serviceUnavailable) {\n            log.error('Server returned service unavailable.');\n            this.suspendProcessing();\n            return;\n        }\n        if (response.paymentRequired) {\n            log.info('Too many events have been submitted, please upgrade your plan.');\n            this.suspendProcessing(null, true, true);\n            return;\n        }\n        if (response.unableToAuthenticate) {\n            log.info(\"Unable to authenticate, please check your configuration. \" + noSubmission);\n            this.suspendProcessing(15);\n            this.removeEvents(events);\n            return;\n        }\n        if (response.notFound || response.badRequest) {\n            log.error(\"Error while trying to submit data: \" + response.message);\n            this.suspendProcessing(60 * 4);\n            this.removeEvents(events);\n            return;\n        }\n        if (response.requestEntityTooLarge) {\n            var message = 'Event submission discarded for being too large.';\n            if (config.submissionBatchSize > 1) {\n                log.error(message + \" Retrying with smaller batch size.\");\n                config.submissionBatchSize = Math.max(1, Math.round(config.submissionBatchSize / 1.5));\n            }\n            else {\n                log.error(message + \" \" + noSubmission);\n                this.removeEvents(events);\n            }\n            return;\n        }\n        if (!response.success) {\n            log.error(\"Error submitting events: \" + (response.message || 'Please check the network tab for more info.'));\n            this.suspendProcessing();\n        }\n    };\n    DefaultEventQueue.prototype.removeEvents = function (events) {\n        for (var index = 0; index < (events || []).length; index++) {\n            this._config.storage.queue.remove(events[index].timestamp);\n        }\n    };\n    return DefaultEventQueue;\n}());\nexports.DefaultEventQueue = DefaultEventQueue;\nvar InMemoryStorageProvider = (function () {\n    function InMemoryStorageProvider(maxQueueItems) {\n        if (maxQueueItems === void 0) { maxQueueItems = 250; }\n        this.queue = new InMemoryStorage(maxQueueItems);\n        this.settings = new InMemoryStorage(1);\n    }\n    return InMemoryStorageProvider;\n}());\nexports.InMemoryStorageProvider = InMemoryStorageProvider;\nvar DefaultSubmissionClient = (function () {\n    function DefaultSubmissionClient() {\n        this.configurationVersionHeader = 'x-exceptionless-configversion';\n    }\n    DefaultSubmissionClient.prototype.postEvents = function (events, config, callback, isAppExiting) {\n        var data = JSON.stringify(events);\n        var request = this.createRequest(config, 'POST', config.serverUrl + \"/api/v2/events\", data);\n        var cb = this.createSubmissionCallback(config, callback);\n        return config.submissionAdapter.sendRequest(request, cb, isAppExiting);\n    };\n    DefaultSubmissionClient.prototype.postUserDescription = function (referenceId, description, config, callback) {\n        var path = config.serverUrl + \"/api/v2/events/by-ref/\" + encodeURIComponent(referenceId) + \"/user-description\";\n        var data = JSON.stringify(description);\n        var request = this.createRequest(config, 'POST', path, data);\n        var cb = this.createSubmissionCallback(config, callback);\n        return config.submissionAdapter.sendRequest(request, cb);\n    };\n    DefaultSubmissionClient.prototype.getSettings = function (config, version, callback) {\n        var request = this.createRequest(config, 'GET', config.serverUrl + \"/api/v2/projects/config?v=\" + version);\n        var cb = function (status, message, data, headers) {\n            if (status !== 200) {\n                return callback(new SettingsResponse(false, null, -1, null, message));\n            }\n            var settings;\n            try {\n                settings = JSON.parse(data);\n            }\n            catch (e) {\n                config.log.error(\"Unable to parse settings: '\" + data + \"'\");\n            }\n            if (!settings || isNaN(settings.version)) {\n                return callback(new SettingsResponse(false, null, -1, null, 'Invalid configuration settings.'));\n            }\n            callback(new SettingsResponse(true, settings.settings || {}, settings.version));\n        };\n        return config.submissionAdapter.sendRequest(request, cb);\n    };\n    DefaultSubmissionClient.prototype.sendHeartbeat = function (sessionIdOrUserId, closeSession, config) {\n        var request = this.createRequest(config, 'GET', config.heartbeatServerUrl + \"/api/v2/events/session/heartbeat?id=\" + sessionIdOrUserId + \"&close=\" + closeSession);\n        config.submissionAdapter.sendRequest(request);\n    };\n    DefaultSubmissionClient.prototype.createRequest = function (config, method, url, data) {\n        if (data === void 0) { data = null; }\n        return {\n            method: method,\n            url: url,\n            data: data,\n            apiKey: config.apiKey,\n            userAgent: config.userAgent\n        };\n    };\n    DefaultSubmissionClient.prototype.createSubmissionCallback = function (config, callback) {\n        var _this = this;\n        return function (status, message, data, headers) {\n            var settingsVersion = headers && parseInt(headers[_this.configurationVersionHeader], 10);\n            SettingsManager.checkVersion(settingsVersion, config);\n            callback(new SubmissionResponse(status, message));\n        };\n    };\n    return DefaultSubmissionClient;\n}());\nexports.DefaultSubmissionClient = DefaultSubmissionClient;\nvar Utils = (function () {\n    function Utils() {\n    }\n    Utils.addRange = function (target) {\n        var values = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            values[_i - 1] = arguments[_i];\n        }\n        if (!target) {\n            target = [];\n        }\n        if (!values || values.length === 0) {\n            return target;\n        }\n        for (var index = 0; index < values.length; index++) {\n            if (values[index] && target.indexOf(values[index]) < 0) {\n                target.push(values[index]);\n            }\n        }\n        return target;\n    };\n    Utils.getHashCode = function (source) {\n        if (!source || source.length === 0) {\n            return 0;\n        }\n        var hash = 0;\n        for (var index = 0; index < source.length; index++) {\n            var character = source.charCodeAt(index);\n            hash = ((hash << 5) - hash) + character;\n            hash |= 0;\n        }\n        return hash;\n    };\n    Utils.getCookies = function (cookies, exclusions) {\n        var result = {};\n        var parts = (cookies || '').split('; ');\n        for (var index = 0; index < parts.length; index++) {\n            var cookie = parts[index].split('=');\n            if (!Utils.isMatch(cookie[0], exclusions)) {\n                result[cookie[0]] = cookie[1];\n            }\n        }\n        return !Utils.isEmpty(result) ? result : null;\n    };\n    Utils.guid = function () {\n        function s4() {\n            return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n        }\n        return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n    };\n    Utils.merge = function (defaultValues, values) {\n        var result = {};\n        for (var key in defaultValues || {}) {\n            if (!!defaultValues[key]) {\n                result[key] = defaultValues[key];\n            }\n        }\n        for (var key in values || {}) {\n            if (!!values[key]) {\n                result[key] = values[key];\n            }\n        }\n        return result;\n    };\n    Utils.parseVersion = function (source) {\n        if (!source) {\n            return null;\n        }\n        var versionRegex = /(v?((\\d+)\\.(\\d+)(\\.(\\d+))?)(?:-([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?(?:\\+([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?)/;\n        var matches = versionRegex.exec(source);\n        if (matches && matches.length > 0) {\n            return matches[0];\n        }\n        return null;\n    };\n    Utils.parseQueryString = function (query, exclusions) {\n        if (!query || query.length === 0) {\n            return null;\n        }\n        var pairs = query.split('&');\n        if (pairs.length === 0) {\n            return null;\n        }\n        var result = {};\n        for (var index = 0; index < pairs.length; index++) {\n            var pair = pairs[index].split('=');\n            if (!Utils.isMatch(pair[0], exclusions)) {\n                result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n            }\n        }\n        return !Utils.isEmpty(result) ? result : null;\n    };\n    Utils.randomNumber = function () {\n        return Math.floor(Math.random() * 9007199254740992);\n    };\n    Utils.isMatch = function (input, patterns, ignoreCase) {\n        if (ignoreCase === void 0) { ignoreCase = true; }\n        if (!input || typeof input !== 'string') {\n            return false;\n        }\n        var trim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n        input = (ignoreCase ? input.toLowerCase() : input).replace(trim, '');\n        return (patterns || []).some(function (pattern) {\n            if (typeof pattern !== 'string') {\n                return false;\n            }\n            pattern = (ignoreCase ? pattern.toLowerCase() : pattern).replace(trim, '');\n            if (pattern.length <= 0) {\n                return false;\n            }\n            var startsWithWildcard = pattern[0] === '*';\n            if (startsWithWildcard) {\n                pattern = pattern.slice(1);\n            }\n            var endsWithWildcard = pattern[pattern.length - 1] === '*';\n            if (endsWithWildcard) {\n                pattern = pattern.substring(0, pattern.length - 1);\n            }\n            if (startsWithWildcard && endsWithWildcard) {\n                return pattern.length <= input.length && input.indexOf(pattern, 0) !== -1;\n            }\n            if (startsWithWildcard) {\n                return Utils.endsWith(input, pattern);\n            }\n            if (endsWithWildcard) {\n                return Utils.startsWith(input, pattern);\n            }\n            return input === pattern;\n        });\n    };\n    Utils.isEmpty = function (input) {\n        return input === null || (typeof (input) === 'object' && Object.keys(input).length === 0);\n    };\n    Utils.startsWith = function (input, prefix) {\n        return input.substring(0, prefix.length) === prefix;\n    };\n    Utils.endsWith = function (input, suffix) {\n        return input.indexOf(suffix, input.length - suffix.length) !== -1;\n    };\n    Utils.stringify = function (data, exclusions, maxDepth) {\n        function stringifyImpl(obj, excludedKeys) {\n            var cache = [];\n            return JSON.stringify(obj, function (key, value) {\n                if (Utils.isMatch(key, excludedKeys)) {\n                    return;\n                }\n                if (typeof value === 'object' && !!value) {\n                    if (cache.indexOf(value) !== -1) {\n                        return;\n                    }\n                    cache.push(value);\n                }\n                return value;\n            });\n        }\n        if (({}).toString.call(data) === '[object Object]') {\n            var flattened = {};\n            for (var prop in data) {\n                var value = data[prop];\n                if (value === data) {\n                    continue;\n                }\n                flattened[prop] = data[prop];\n            }\n            return stringifyImpl(flattened, exclusions);\n        }\n        if (({}).toString.call(data) === '[object Array]') {\n            var result = [];\n            for (var index = 0; index < data.length; index++) {\n                result[index] = JSON.parse(stringifyImpl(data[index], exclusions));\n            }\n            return JSON.stringify(result);\n        }\n        return stringifyImpl(data, exclusions);\n    };\n    Utils.toBoolean = function (input, defaultValue) {\n        if (defaultValue === void 0) { defaultValue = false; }\n        if (typeof input === 'boolean') {\n            return input;\n        }\n        if (input === null || typeof input !== 'number' && typeof input !== 'string') {\n            return defaultValue;\n        }\n        switch ((input + '').toLowerCase().trim()) {\n            case 'true':\n            case 'yes':\n            case '1': return true;\n            case 'false':\n            case 'no':\n            case '0':\n            case null: return false;\n        }\n        return defaultValue;\n    };\n    return Utils;\n}());\nexports.Utils = Utils;\nvar Configuration = (function () {\n    function Configuration(configSettings) {\n        this.defaultTags = [];\n        this.defaultData = {};\n        this.enabled = true;\n        this.lastReferenceIdManager = new DefaultLastReferenceIdManager();\n        this.settings = {};\n        this._plugins = [];\n        this._handlers = [];\n        this._serverUrl = 'https://collector.exceptionless.io';\n        this._heartbeatServerUrl = 'https://heartbeat.exceptionless.io';\n        this._updateSettingsWhenIdleInterval = 120000;\n        this._dataExclusions = [];\n        this._userAgentBotPatterns = [];\n        function inject(fn) {\n            return typeof fn === 'function' ? fn(this) : fn;\n        }\n        configSettings = Utils.merge(Configuration.defaults, configSettings);\n        this.log = inject(configSettings.log) || new NullLog();\n        this.apiKey = configSettings.apiKey;\n        this.serverUrl = configSettings.serverUrl;\n        this.heartbeatServerUrl = configSettings.heartbeatServerUrl;\n        this.updateSettingsWhenIdleInterval = configSettings.updateSettingsWhenIdleInterval;\n        this.environmentInfoCollector = inject(configSettings.environmentInfoCollector);\n        this.errorParser = inject(configSettings.errorParser);\n        this.lastReferenceIdManager = inject(configSettings.lastReferenceIdManager) || new DefaultLastReferenceIdManager();\n        this.moduleCollector = inject(configSettings.moduleCollector);\n        this.requestInfoCollector = inject(configSettings.requestInfoCollector);\n        this.submissionBatchSize = inject(configSettings.submissionBatchSize) || 50;\n        this.submissionAdapter = inject(configSettings.submissionAdapter);\n        this.submissionClient = inject(configSettings.submissionClient) || new DefaultSubmissionClient();\n        this.storage = inject(configSettings.storage) || new InMemoryStorageProvider();\n        this.queue = inject(configSettings.queue) || new DefaultEventQueue(this);\n        SettingsManager.applySavedServerSettings(this);\n        EventPluginManager.addDefaultPlugins(this);\n    }\n    Object.defineProperty(Configuration.prototype, \"apiKey\", {\n        get: function () {\n            return this._apiKey;\n        },\n        set: function (value) {\n            this._apiKey = value || null;\n            this.log.info(\"apiKey: \" + this._apiKey);\n            this.changed();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Configuration.prototype, \"isValid\", {\n        get: function () {\n            return !!this.apiKey && this.apiKey.length >= 10;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Configuration.prototype, \"serverUrl\", {\n        get: function () {\n            return this._serverUrl;\n        },\n        set: function (value) {\n            if (!!value) {\n                this._serverUrl = value;\n                this._heartbeatServerUrl = value;\n                this.log.info(\"serverUrl: \" + value);\n                this.changed();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Configuration.prototype, \"heartbeatServerUrl\", {\n        get: function () {\n            return this._heartbeatServerUrl;\n        },\n        set: function (value) {\n            if (!!value) {\n                this._heartbeatServerUrl = value;\n                this.log.info(\"heartbeatServerUrl: \" + value);\n                this.changed();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Configuration.prototype, \"updateSettingsWhenIdleInterval\", {\n        get: function () {\n            return this._updateSettingsWhenIdleInterval;\n        },\n        set: function (value) {\n            if (typeof value !== 'number') {\n                return;\n            }\n            if (value <= 0) {\n                value = -1;\n            }\n            else if (value > 0 && value < 15000) {\n                value = 15000;\n            }\n            this._updateSettingsWhenIdleInterval = value;\n            this.log.info(\"updateSettingsWhenIdleInterval: \" + value);\n            this.changed();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Configuration.prototype, \"dataExclusions\", {\n        get: function () {\n            var exclusions = this.settings['@@DataExclusions'];\n            return this._dataExclusions.concat(exclusions && exclusions.split(',') || []);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Configuration.prototype.addDataExclusions = function () {\n        var exclusions = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            exclusions[_i - 0] = arguments[_i];\n        }\n        this._dataExclusions = Utils.addRange.apply(Utils, [this._dataExclusions].concat(exclusions));\n    };\n    Object.defineProperty(Configuration.prototype, \"userAgentBotPatterns\", {\n        get: function () {\n            var patterns = this.settings['@@UserAgentBotPatterns'];\n            return this._userAgentBotPatterns.concat(patterns && patterns.split(',') || []);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Configuration.prototype.addUserAgentBotPatterns = function () {\n        var userAgentBotPatterns = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            userAgentBotPatterns[_i - 0] = arguments[_i];\n        }\n        this._userAgentBotPatterns = Utils.addRange.apply(Utils, [this._userAgentBotPatterns].concat(userAgentBotPatterns));\n    };\n    Object.defineProperty(Configuration.prototype, \"plugins\", {\n        get: function () {\n            return this._plugins.sort(function (p1, p2) {\n                return (p1.priority < p2.priority) ? -1 : (p1.priority > p2.priority) ? 1 : 0;\n            });\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Configuration.prototype.addPlugin = function (pluginOrName, priority, pluginAction) {\n        var plugin = !!pluginAction ? { name: pluginOrName, priority: priority, run: pluginAction } : pluginOrName;\n        if (!plugin || !plugin.run) {\n            this.log.error('Add plugin failed: Run method not defined');\n            return;\n        }\n        if (!plugin.name) {\n            plugin.name = Utils.guid();\n        }\n        if (!plugin.priority) {\n            plugin.priority = 0;\n        }\n        var pluginExists = false;\n        var plugins = this._plugins;\n        for (var index = 0; index < plugins.length; index++) {\n            if (plugins[index].name === plugin.name) {\n                pluginExists = true;\n                break;\n            }\n        }\n        if (!pluginExists) {\n            plugins.push(plugin);\n        }\n    };\n    Configuration.prototype.removePlugin = function (pluginOrName) {\n        var name = typeof pluginOrName === 'string' ? pluginOrName : pluginOrName.name;\n        if (!name) {\n            this.log.error('Remove plugin failed: Plugin name not defined');\n            return;\n        }\n        var plugins = this._plugins;\n        for (var index = 0; index < plugins.length; index++) {\n            if (plugins[index].name === name) {\n                plugins.splice(index, 1);\n                break;\n            }\n        }\n    };\n    Configuration.prototype.setVersion = function (version) {\n        if (!!version) {\n            this.defaultData['@version'] = version;\n        }\n    };\n    Configuration.prototype.setUserIdentity = function (userInfoOrIdentity, name) {\n        var USER_KEY = '@user';\n        var userInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n        var shouldRemove = !userInfo || (!userInfo.identity && !userInfo.name);\n        if (shouldRemove) {\n            delete this.defaultData[USER_KEY];\n        }\n        else {\n            this.defaultData[USER_KEY] = userInfo;\n        }\n        this.log.info(\"user identity: \" + (shouldRemove ? 'null' : userInfo.identity));\n    };\n    Object.defineProperty(Configuration.prototype, \"userAgent\", {\n        get: function () {\n            return 'exceptionless-js/1.4.1';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Configuration.prototype.useSessions = function (sendHeartbeats, heartbeatInterval) {\n        if (sendHeartbeats === void 0) { sendHeartbeats = true; }\n        if (heartbeatInterval === void 0) { heartbeatInterval = 30000; }\n        if (sendHeartbeats) {\n            this.addPlugin(new HeartbeatPlugin(heartbeatInterval));\n        }\n    };\n    Configuration.prototype.useReferenceIds = function () {\n        this.addPlugin(new ReferenceIdPlugin());\n    };\n    Configuration.prototype.useLocalStorage = function () {\n    };\n    Configuration.prototype.useDebugLogger = function () {\n        this.log = new ConsoleLog();\n    };\n    Configuration.prototype.onChanged = function (handler) {\n        !!handler && this._handlers.push(handler);\n    };\n    Configuration.prototype.changed = function () {\n        var handlers = this._handlers;\n        for (var index = 0; index < handlers.length; index++) {\n            try {\n                handlers[index](this);\n            }\n            catch (ex) {\n                this.log.error(\"Error calling onChanged handler: \" + ex);\n            }\n        }\n    };\n    Object.defineProperty(Configuration, \"defaults\", {\n        get: function () {\n            if (Configuration._defaultSettings === null) {\n                Configuration._defaultSettings = {};\n            }\n            return Configuration._defaultSettings;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Configuration._defaultSettings = null;\n    return Configuration;\n}());\nexports.Configuration = Configuration;\nvar EventBuilder = (function () {\n    function EventBuilder(event, client, pluginContextData) {\n        this._validIdentifierErrorMessage = 'must contain between 8 and 100 alphanumeric or \\'-\\' characters.';\n        this.target = event;\n        this.client = client;\n        this.pluginContextData = pluginContextData || new ContextData();\n    }\n    EventBuilder.prototype.setType = function (type) {\n        if (!!type) {\n            this.target.type = type;\n        }\n        return this;\n    };\n    EventBuilder.prototype.setSource = function (source) {\n        if (!!source) {\n            this.target.source = source;\n        }\n        return this;\n    };\n    EventBuilder.prototype.setReferenceId = function (referenceId) {\n        if (!this.isValidIdentifier(referenceId)) {\n            throw new Error(\"ReferenceId \" + this._validIdentifierErrorMessage);\n        }\n        this.target.reference_id = referenceId;\n        return this;\n    };\n    EventBuilder.prototype.setEventReference = function (name, id) {\n        if (!name) {\n            throw new Error('Invalid name');\n        }\n        if (!id || !this.isValidIdentifier(id)) {\n            throw new Error(\"Id \" + this._validIdentifierErrorMessage);\n        }\n        this.setProperty('@ref:' + name, id);\n        return this;\n    };\n    EventBuilder.prototype.setMessage = function (message) {\n        if (!!message) {\n            this.target.message = message;\n        }\n        return this;\n    };\n    EventBuilder.prototype.setGeo = function (latitude, longitude) {\n        if (latitude < -90.0 || latitude > 90.0) {\n            throw new Error('Must be a valid latitude value between -90.0 and 90.0.');\n        }\n        if (longitude < -180.0 || longitude > 180.0) {\n            throw new Error('Must be a valid longitude value between -180.0 and 180.0.');\n        }\n        this.target.geo = latitude + \",\" + longitude;\n        return this;\n    };\n    EventBuilder.prototype.setUserIdentity = function (userInfoOrIdentity, name) {\n        var userInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n        if (!userInfo || (!userInfo.identity && !userInfo.name)) {\n            return this;\n        }\n        this.setProperty('@user', userInfo);\n        return this;\n    };\n    EventBuilder.prototype.setUserDescription = function (emailAddress, description) {\n        if (emailAddress && description) {\n            this.setProperty('@user_description', { email_address: emailAddress, description: description });\n        }\n        return this;\n    };\n    EventBuilder.prototype.setManualStackingInfo = function (signatureData, title) {\n        if (signatureData) {\n            var stack = {\n                signature_data: signatureData\n            };\n            if (title) {\n                stack.title = title;\n            }\n            this.setProperty('@stack', stack);\n        }\n        return this;\n    };\n    EventBuilder.prototype.setManualStackingKey = function (manualStackingKey, title) {\n        if (manualStackingKey) {\n            var data = {\n                'ManualStackingKey': manualStackingKey\n            };\n            this.setManualStackingInfo(data, title);\n        }\n        return this;\n    };\n    EventBuilder.prototype.setValue = function (value) {\n        if (!!value) {\n            this.target.value = value;\n        }\n        return this;\n    };\n    EventBuilder.prototype.addTags = function () {\n        var tags = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            tags[_i - 0] = arguments[_i];\n        }\n        this.target.tags = Utils.addRange.apply(Utils, [this.target.tags].concat(tags));\n        return this;\n    };\n    EventBuilder.prototype.setProperty = function (name, value, maxDepth, excludedPropertyNames) {\n        if (!name || (value === undefined || value == null)) {\n            return this;\n        }\n        if (!this.target.data) {\n            this.target.data = {};\n        }\n        var result = JSON.parse(Utils.stringify(value, this.client.config.dataExclusions.concat(excludedPropertyNames || []), maxDepth));\n        if (!Utils.isEmpty(result)) {\n            this.target.data[name] = result;\n        }\n        return this;\n    };\n    EventBuilder.prototype.markAsCritical = function (critical) {\n        if (critical) {\n            this.addTags('Critical');\n        }\n        return this;\n    };\n    EventBuilder.prototype.addRequestInfo = function (request) {\n        if (!!request) {\n            this.pluginContextData['@request'] = request;\n        }\n        return this;\n    };\n    EventBuilder.prototype.submit = function (callback) {\n        this.client.submitEvent(this.target, this.pluginContextData, callback);\n    };\n    EventBuilder.prototype.isValidIdentifier = function (value) {\n        if (!value) {\n            return true;\n        }\n        if (value.length < 8 || value.length > 100) {\n            return false;\n        }\n        for (var index = 0; index < value.length; index++) {\n            var code = value.charCodeAt(index);\n            var isDigit = (code >= 48) && (code <= 57);\n            var isLetter = ((code >= 65) && (code <= 90)) || ((code >= 97) && (code <= 122));\n            var isMinus = code === 45;\n            if (!(isDigit || isLetter) && !isMinus) {\n                return false;\n            }\n        }\n        return true;\n    };\n    return EventBuilder;\n}());\nexports.EventBuilder = EventBuilder;\nvar ContextData = (function () {\n    function ContextData() {\n    }\n    ContextData.prototype.setException = function (exception) {\n        if (exception) {\n            this['@@_Exception'] = exception;\n        }\n    };\n    Object.defineProperty(ContextData.prototype, \"hasException\", {\n        get: function () {\n            return !!this['@@_Exception'];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ContextData.prototype.getException = function () {\n        return this['@@_Exception'] || null;\n    };\n    ContextData.prototype.markAsUnhandledError = function () {\n        this['@@_IsUnhandledError'] = true;\n    };\n    Object.defineProperty(ContextData.prototype, \"isUnhandledError\", {\n        get: function () {\n            return !!this['@@_IsUnhandledError'];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ContextData.prototype.setSubmissionMethod = function (method) {\n        if (method) {\n            this['@@_SubmissionMethod'] = method;\n        }\n    };\n    ContextData.prototype.getSubmissionMethod = function () {\n        return this['@@_SubmissionMethod'] || null;\n    };\n    return ContextData;\n}());\nexports.ContextData = ContextData;\nvar ExceptionlessClient = (function () {\n    function ExceptionlessClient(settingsOrApiKey, serverUrl) {\n        var _this = this;\n        if (typeof settingsOrApiKey === 'object') {\n            this.config = new Configuration(settingsOrApiKey);\n        }\n        else {\n            this.config = new Configuration({ apiKey: settingsOrApiKey, serverUrl: serverUrl });\n        }\n        this.updateSettingsTimer(5000);\n        this.config.onChanged(function (config) { return _this.updateSettingsTimer(_this._timeoutId > 0 ? 5000 : 0); });\n        this.config.queue.onEventsPosted(function (events, response) { return _this.updateSettingsTimer(); });\n    }\n    ExceptionlessClient.prototype.createException = function (exception) {\n        var pluginContextData = new ContextData();\n        pluginContextData.setException(exception);\n        return this.createEvent(pluginContextData).setType('error');\n    };\n    ExceptionlessClient.prototype.submitException = function (exception, callback) {\n        this.createException(exception).submit(callback);\n    };\n    ExceptionlessClient.prototype.createUnhandledException = function (exception, submissionMethod) {\n        var builder = this.createException(exception);\n        builder.pluginContextData.markAsUnhandledError();\n        builder.pluginContextData.setSubmissionMethod(submissionMethod);\n        return builder;\n    };\n    ExceptionlessClient.prototype.submitUnhandledException = function (exception, submissionMethod, callback) {\n        this.createUnhandledException(exception, submissionMethod).submit(callback);\n    };\n    ExceptionlessClient.prototype.createFeatureUsage = function (feature) {\n        return this.createEvent().setType('usage').setSource(feature);\n    };\n    ExceptionlessClient.prototype.submitFeatureUsage = function (feature, callback) {\n        this.createFeatureUsage(feature).submit(callback);\n    };\n    ExceptionlessClient.prototype.createLog = function (sourceOrMessage, message, level) {\n        var builder = this.createEvent().setType('log');\n        if (message && level) {\n            builder = builder.setSource(sourceOrMessage).setMessage(message).setProperty('@level', level);\n        }\n        else if (message) {\n            builder = builder.setSource(sourceOrMessage).setMessage(message);\n        }\n        else {\n            var caller = arguments.callee.caller;\n            builder = builder.setSource(caller && caller.name).setMessage(sourceOrMessage);\n        }\n        return builder;\n    };\n    ExceptionlessClient.prototype.submitLog = function (sourceOrMessage, message, level, callback) {\n        this.createLog(sourceOrMessage, message, level).submit(callback);\n    };\n    ExceptionlessClient.prototype.createNotFound = function (resource) {\n        return this.createEvent().setType('404').setSource(resource);\n    };\n    ExceptionlessClient.prototype.submitNotFound = function (resource, callback) {\n        this.createNotFound(resource).submit(callback);\n    };\n    ExceptionlessClient.prototype.createSessionStart = function () {\n        return this.createEvent().setType('session');\n    };\n    ExceptionlessClient.prototype.submitSessionStart = function (callback) {\n        this.createSessionStart().submit(callback);\n    };\n    ExceptionlessClient.prototype.submitSessionEnd = function (sessionIdOrUserId) {\n        if (sessionIdOrUserId) {\n            this.config.log.info(\"Submitting session end: \" + sessionIdOrUserId);\n            this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, true, this.config);\n        }\n    };\n    ExceptionlessClient.prototype.submitSessionHeartbeat = function (sessionIdOrUserId) {\n        if (sessionIdOrUserId) {\n            this.config.log.info(\"Submitting session heartbeat: \" + sessionIdOrUserId);\n            this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, false, this.config);\n        }\n    };\n    ExceptionlessClient.prototype.createEvent = function (pluginContextData) {\n        return new EventBuilder({ date: new Date() }, this, pluginContextData);\n    };\n    ExceptionlessClient.prototype.submitEvent = function (event, pluginContextData, callback) {\n        function cancelled(context) {\n            if (!!context) {\n                context.cancelled = true;\n            }\n            return !!callback && callback(context);\n        }\n        var context = new EventPluginContext(this, event, pluginContextData);\n        if (!event) {\n            return cancelled(context);\n        }\n        if (!this.config.enabled) {\n            this.config.log.info('Event submission is currently disabled.');\n            return cancelled(context);\n        }\n        if (!event.data) {\n            event.data = {};\n        }\n        if (!event.tags || !event.tags.length) {\n            event.tags = [];\n        }\n        EventPluginManager.run(context, function (ctx) {\n            var config = ctx.client.config;\n            var ev = ctx.event;\n            if (!ctx.cancelled) {\n                if (!ev.type || ev.type.length === 0) {\n                    ev.type = 'log';\n                }\n                if (!ev.date) {\n                    ev.date = new Date();\n                }\n                config.queue.enqueue(ev);\n                if (ev.reference_id && ev.reference_id.length > 0) {\n                    ctx.log.info(\"Setting last reference id '\" + ev.reference_id + \"'\");\n                    config.lastReferenceIdManager.setLast(ev.reference_id);\n                }\n            }\n            !!callback && callback(ctx);\n        });\n    };\n    ExceptionlessClient.prototype.updateUserEmailAndDescription = function (referenceId, email, description, callback) {\n        var _this = this;\n        if (!referenceId || !email || !description || !this.config.enabled) {\n            return !!callback && callback(new SubmissionResponse(500, 'cancelled'));\n        }\n        var userDescription = { email_address: email, description: description };\n        this.config.submissionClient.postUserDescription(referenceId, userDescription, this.config, function (response) {\n            if (!response.success) {\n                _this.config.log.error(\"Failed to submit user email and description for event '\" + referenceId + \"': \" + response.statusCode + \" \" + response.message);\n            }\n            !!callback && callback(response);\n        });\n    };\n    ExceptionlessClient.prototype.getLastReferenceId = function () {\n        return this.config.lastReferenceIdManager.getLast();\n    };\n    ExceptionlessClient.prototype.updateSettingsTimer = function (initialDelay) {\n        var _this = this;\n        this.config.log.info(\"Updating settings timer with delay: \" + initialDelay);\n        this._timeoutId = clearTimeout(this._timeoutId);\n        this._timeoutId = clearInterval(this._intervalId);\n        var interval = this.config.updateSettingsWhenIdleInterval;\n        if (interval > 0) {\n            var updateSettings = function () { return SettingsManager.updateSettings(_this.config); };\n            if (initialDelay > 0) {\n                this._timeoutId = setTimeout(updateSettings, initialDelay);\n            }\n            this._intervalId = setInterval(updateSettings, interval);\n        }\n    };\n    Object.defineProperty(ExceptionlessClient, \"default\", {\n        get: function () {\n            if (ExceptionlessClient._instance === null) {\n                ExceptionlessClient._instance = new ExceptionlessClient(null);\n            }\n            return ExceptionlessClient._instance;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ExceptionlessClient._instance = null;\n    return ExceptionlessClient;\n}());\nexports.ExceptionlessClient = ExceptionlessClient;\nvar ConfigurationDefaultsPlugin = (function () {\n    function ConfigurationDefaultsPlugin() {\n        this.priority = 10;\n        this.name = 'ConfigurationDefaultsPlugin';\n    }\n    ConfigurationDefaultsPlugin.prototype.run = function (context, next) {\n        var config = context.client.config;\n        var defaultTags = config.defaultTags || [];\n        for (var index = 0; index < defaultTags.length; index++) {\n            var tag = defaultTags[index];\n            if (!!tag && context.event.tags.indexOf(tag) < 0) {\n                context.event.tags.push(tag);\n            }\n        }\n        var defaultData = config.defaultData || {};\n        for (var key in defaultData) {\n            if (!!defaultData[key]) {\n                var result = JSON.parse(Utils.stringify(defaultData[key], config.dataExclusions));\n                if (!Utils.isEmpty(result)) {\n                    context.event.data[key] = result;\n                }\n            }\n        }\n        next && next();\n    };\n    return ConfigurationDefaultsPlugin;\n}());\nexports.ConfigurationDefaultsPlugin = ConfigurationDefaultsPlugin;\nvar ErrorPlugin = (function () {\n    function ErrorPlugin() {\n        this.priority = 30;\n        this.name = 'ErrorPlugin';\n    }\n    ErrorPlugin.prototype.run = function (context, next) {\n        var ERROR_KEY = '@error';\n        var ignoredProperties = [\n            'arguments',\n            'column',\n            'columnNumber',\n            'description',\n            'fileName',\n            'message',\n            'name',\n            'number',\n            'line',\n            'lineNumber',\n            'opera#sourceloc',\n            'sourceId',\n            'sourceURL',\n            'stack',\n            'stackArray',\n            'stacktrace'\n        ];\n        var exception = context.contextData.getException();\n        if (!!exception) {\n            context.event.type = 'error';\n            if (!context.event.data[ERROR_KEY]) {\n                var config = context.client.config;\n                var parser = config.errorParser;\n                if (!parser) {\n                    throw new Error('No error parser was defined.');\n                }\n                var result = parser.parse(context, exception);\n                if (!!result) {\n                    var additionalData = JSON.parse(Utils.stringify(exception, config.dataExclusions.concat(ignoredProperties)));\n                    if (!Utils.isEmpty(additionalData)) {\n                        if (!result.data) {\n                            result.data = {};\n                        }\n                        result.data['@ext'] = additionalData;\n                    }\n                    context.event.data[ERROR_KEY] = result;\n                }\n            }\n        }\n        next && next();\n    };\n    return ErrorPlugin;\n}());\nexports.ErrorPlugin = ErrorPlugin;\nvar ModuleInfoPlugin = (function () {\n    function ModuleInfoPlugin() {\n        this.priority = 50;\n        this.name = 'ModuleInfoPlugin';\n    }\n    ModuleInfoPlugin.prototype.run = function (context, next) {\n        var ERROR_KEY = '@error';\n        var collector = context.client.config.moduleCollector;\n        if (context.event.data[ERROR_KEY] && !context.event.data['@error'].modules && !!collector) {\n            var modules = collector.getModules(context);\n            if (modules && modules.length > 0) {\n                context.event.data[ERROR_KEY].modules = modules;\n            }\n        }\n        next && next();\n    };\n    return ModuleInfoPlugin;\n}());\nexports.ModuleInfoPlugin = ModuleInfoPlugin;\nvar RequestInfoPlugin = (function () {\n    function RequestInfoPlugin() {\n        this.priority = 70;\n        this.name = 'RequestInfoPlugin';\n    }\n    RequestInfoPlugin.prototype.run = function (context, next) {\n        var REQUEST_KEY = '@request';\n        var config = context.client.config;\n        var collector = config.requestInfoCollector;\n        if (!context.event.data[REQUEST_KEY] && !!collector) {\n            var requestInfo = collector.getRequestInfo(context);\n            if (!!requestInfo) {\n                if (Utils.isMatch(requestInfo.user_agent, config.userAgentBotPatterns)) {\n                    context.log.info('Cancelling event as the request user agent matches a known bot pattern');\n                    context.cancelled = true;\n                }\n                else {\n                    context.event.data[REQUEST_KEY] = requestInfo;\n                }\n            }\n        }\n        next && next();\n    };\n    return RequestInfoPlugin;\n}());\nexports.RequestInfoPlugin = RequestInfoPlugin;\nvar EnvironmentInfoPlugin = (function () {\n    function EnvironmentInfoPlugin() {\n        this.priority = 80;\n        this.name = 'EnvironmentInfoPlugin';\n    }\n    EnvironmentInfoPlugin.prototype.run = function (context, next) {\n        var ENVIRONMENT_KEY = '@environment';\n        var collector = context.client.config.environmentInfoCollector;\n        if (!context.event.data[ENVIRONMENT_KEY] && collector) {\n            var environmentInfo = collector.getEnvironmentInfo(context);\n            if (!!environmentInfo) {\n                context.event.data[ENVIRONMENT_KEY] = environmentInfo;\n            }\n        }\n        next && next();\n    };\n    return EnvironmentInfoPlugin;\n}());\nexports.EnvironmentInfoPlugin = EnvironmentInfoPlugin;\nvar SubmissionMethodPlugin = (function () {\n    function SubmissionMethodPlugin() {\n        this.priority = 100;\n        this.name = 'SubmissionMethodPlugin';\n    }\n    SubmissionMethodPlugin.prototype.run = function (context, next) {\n        var submissionMethod = context.contextData.getSubmissionMethod();\n        if (!!submissionMethod) {\n            context.event.data['@submission_method'] = submissionMethod;\n        }\n        next && next();\n    };\n    return SubmissionMethodPlugin;\n}());\nexports.SubmissionMethodPlugin = SubmissionMethodPlugin;\nvar DuplicateCheckerPlugin = (function () {\n    function DuplicateCheckerPlugin(getCurrentTime) {\n        if (getCurrentTime === void 0) { getCurrentTime = function () { return Date.now(); }; }\n        this.priority = 40;\n        this.name = 'DuplicateCheckerPlugin';\n        this._processedHashcodes = [];\n        this._getCurrentTime = getCurrentTime;\n    }\n    DuplicateCheckerPlugin.prototype.run = function (context, next) {\n        function isDuplicate(error, processedHashcodes, now, log) {\n            var _loop_1 = function() {\n                var hashCode = Utils.getHashCode(error.stack_trace && JSON.stringify(error.stack_trace));\n                if (hashCode && processedHashcodes.some(function (h) { return h.hash === hashCode && h.timestamp >= (now - 2000); })) {\n                    log.info(\"Ignoring duplicate error event hash: \" + hashCode);\n                    return { value: true };\n                }\n                processedHashcodes.push({ hash: hashCode, timestamp: now });\n                while (processedHashcodes.length > 20) {\n                    processedHashcodes.shift();\n                }\n                error = error.inner;\n            };\n            while (error) {\n                var state_1 = _loop_1();\n                if (typeof state_1 === \"object\") return state_1.value;\n            }\n            return false;\n        }\n        if (context.event.type === 'error') {\n            if (isDuplicate(context.event.data['@error'], this._processedHashcodes, this._getCurrentTime(), context.log)) {\n                context.cancelled = true;\n                return;\n            }\n        }\n        next && next();\n    };\n    return DuplicateCheckerPlugin;\n}());\nexports.DuplicateCheckerPlugin = DuplicateCheckerPlugin;\nvar EventExclusionPlugin = (function () {\n    function EventExclusionPlugin() {\n        this.priority = 45;\n        this.name = 'EventExclusionPlugin';\n    }\n    EventExclusionPlugin.prototype.run = function (context, next) {\n        function getLogLevel(level) {\n            switch ((level || '').toLowerCase().trim()) {\n                case 'trace':\n                case 'true':\n                case '1':\n                case 'yes':\n                    return 0;\n                case 'debug':\n                    return 1;\n                case 'info':\n                    return 2;\n                case 'warn':\n                    return 3;\n                case 'error':\n                    return 4;\n                case 'fatal':\n                    return 5;\n                case 'off':\n                case 'false':\n                case '0':\n                case 'no':\n                    return 6;\n                default:\n                    return -1;\n            }\n        }\n        function getMinLogLevel(settings, loggerName) {\n            if (loggerName === void 0) { loggerName = '*'; }\n            return getLogLevel(getTypeAndSourceSetting(settings, 'log', loggerName, 'Trace') + '');\n        }\n        function getTypeAndSourceSetting(settings, type, source, defaultValue) {\n            if (settings === void 0) { settings = {}; }\n            if (defaultValue === void 0) { defaultValue = undefined; }\n            if (!type) {\n                return defaultValue;\n            }\n            var isLog = type === 'log';\n            var sourcePrefix = \"@@\" + type + \":\";\n            var value = settings[sourcePrefix + source];\n            if (value) {\n                return !isLog ? Utils.toBoolean(value) : value;\n            }\n            for (var key in settings) {\n                if (Utils.startsWith(key.toLowerCase(), sourcePrefix.toLowerCase()) && Utils.isMatch(source, [key.substring(sourcePrefix.length)])) {\n                    return !isLog ? Utils.toBoolean(settings[key]) : settings[key];\n                }\n            }\n            return defaultValue;\n        }\n        var ev = context.event;\n        var log = context.log;\n        var settings = context.client.config.settings;\n        if (ev.type === 'log') {\n            var minLogLevel = getMinLogLevel(settings, ev.source);\n            var logLevel = getLogLevel(ev.data['@level']);\n            if (logLevel >= 0 && (logLevel > 5 || logLevel < minLogLevel)) {\n                log.info('Cancelling log event due to minimum log level.');\n                context.cancelled = true;\n            }\n        }\n        else if (ev.type === 'error') {\n            var error = ev.data['@error'];\n            while (!context.cancelled && error) {\n                if (getTypeAndSourceSetting(settings, ev.type, error.type, true) === false) {\n                    log.info(\"Cancelling error from excluded exception type: \" + error.type);\n                    context.cancelled = true;\n                }\n                error = error.inner;\n            }\n        }\n        else if (getTypeAndSourceSetting(settings, ev.type, ev.source, true) === false) {\n            log.info(\"Cancelling event from excluded type: \" + ev.type + \" and source: \" + ev.source);\n            context.cancelled = true;\n        }\n        next && next();\n    };\n    return EventExclusionPlugin;\n}());\nexports.EventExclusionPlugin = EventExclusionPlugin;\nvar SettingsResponse = (function () {\n    function SettingsResponse(success, settings, settingsVersion, exception, message) {\n        if (settingsVersion === void 0) { settingsVersion = -1; }\n        if (exception === void 0) { exception = null; }\n        if (message === void 0) { message = null; }\n        this.success = false;\n        this.settingsVersion = -1;\n        this.success = success;\n        this.settings = settings;\n        this.settingsVersion = settingsVersion;\n        this.exception = exception;\n        this.message = message;\n    }\n    return SettingsResponse;\n}());\nexports.SettingsResponse = SettingsResponse;\nvar InMemoryStorage = (function () {\n    function InMemoryStorage(maxItems) {\n        this.items = [];\n        this.lastTimestamp = 0;\n        this.maxItems = maxItems;\n    }\n    InMemoryStorage.prototype.save = function (value) {\n        if (!value) {\n            return null;\n        }\n        var items = this.items;\n        var timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n        var item = { timestamp: timestamp, value: value };\n        if (items.push(item) > this.maxItems) {\n            items.shift();\n        }\n        this.lastTimestamp = timestamp;\n        return item.timestamp;\n    };\n    InMemoryStorage.prototype.get = function (limit) {\n        return this.items.slice(0, limit);\n    };\n    InMemoryStorage.prototype.remove = function (timestamp) {\n        var items = this.items;\n        for (var i = 0; i < items.length; i++) {\n            if (items[i].timestamp === timestamp) {\n                items.splice(i, 1);\n                return;\n            }\n        }\n    };\n    InMemoryStorage.prototype.clear = function () {\n        this.items = [];\n    };\n    return InMemoryStorage;\n}());\nexports.InMemoryStorage = InMemoryStorage;\nvar KeyValueStorageBase = (function () {\n    function KeyValueStorageBase(maxItems) {\n        this.lastTimestamp = 0;\n        this.maxItems = maxItems;\n    }\n    KeyValueStorageBase.prototype.save = function (value, single) {\n        if (!value) {\n            return null;\n        }\n        this.ensureIndex();\n        var items = this.items;\n        var timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n        var key = this.getKey(timestamp);\n        var json = JSON.stringify(value);\n        try {\n            this.write(key, json);\n            this.lastTimestamp = timestamp;\n            if (items.push(timestamp) > this.maxItems) {\n                this.delete(this.getKey(items.shift()));\n            }\n        }\n        catch (e) {\n            return null;\n        }\n        return timestamp;\n    };\n    KeyValueStorageBase.prototype.get = function (limit) {\n        var _this = this;\n        this.ensureIndex();\n        return this.items.slice(0, limit)\n            .map(function (timestamp) {\n            var key = _this.getKey(timestamp);\n            try {\n                var json = _this.read(key);\n                var value = JSON.parse(json, parseDate);\n                return { timestamp: timestamp, value: value };\n            }\n            catch (error) {\n                _this.safeDelete(key);\n                return null;\n            }\n        })\n            .filter(function (item) { return item != null; });\n    };\n    KeyValueStorageBase.prototype.remove = function (timestamp) {\n        this.ensureIndex();\n        var items = this.items;\n        var index = items.indexOf(timestamp);\n        if (index >= 0) {\n            var key = this.getKey(timestamp);\n            this.safeDelete(key);\n            items.splice(index, 1);\n        }\n        ;\n    };\n    KeyValueStorageBase.prototype.clear = function () {\n        var _this = this;\n        this.items.forEach(function (item) { return _this.safeDelete(_this.getKey(item)); });\n        this.items = [];\n    };\n    KeyValueStorageBase.prototype.ensureIndex = function () {\n        if (!this.items) {\n            this.items = this.createIndex();\n            this.lastTimestamp = Math.max.apply(Math, [0].concat(this.items)) + 1;\n        }\n    };\n    KeyValueStorageBase.prototype.safeDelete = function (key) {\n        try {\n            this.delete(key);\n        }\n        catch (error) {\n        }\n    };\n    KeyValueStorageBase.prototype.createIndex = function () {\n        var _this = this;\n        try {\n            var keys = this.readAllKeys();\n            return keys.map(function (key) {\n                try {\n                    var timestamp = _this.getTimestamp(key);\n                    if (!timestamp) {\n                        _this.safeDelete(key);\n                        return null;\n                    }\n                    return timestamp;\n                }\n                catch (error) {\n                    _this.safeDelete(key);\n                    return null;\n                }\n            }).filter(function (timestamp) { return timestamp != null; })\n                .sort(function (a, b) { return a - b; });\n        }\n        catch (error) {\n            return [];\n        }\n    };\n    return KeyValueStorageBase;\n}());\nexports.KeyValueStorageBase = KeyValueStorageBase;\nfunction parseDate(key, value) {\n    var dateRegx = /\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/g;\n    if (typeof value === 'string') {\n        var a = dateRegx.exec(value);\n        if (a) {\n            return new Date(value);\n        }\n    }\n    return value;\n}\n;\nvar BrowserStorage = (function (_super) {\n    __extends(BrowserStorage, _super);\n    function BrowserStorage(namespace, prefix, maxItems) {\n        if (prefix === void 0) { prefix = 'com.exceptionless.'; }\n        if (maxItems === void 0) { maxItems = 20; }\n        _super.call(this, maxItems);\n        this.prefix = prefix + namespace + '-';\n    }\n    BrowserStorage.isAvailable = function () {\n        try {\n            var storage = window.localStorage, x = '__storage_test__';\n            storage.setItem(x, x);\n            storage.removeItem(x);\n            return true;\n        }\n        catch (e) {\n            return false;\n        }\n    };\n    BrowserStorage.prototype.write = function (key, value) {\n        window.localStorage.setItem(key, value);\n    };\n    BrowserStorage.prototype.read = function (key) {\n        return window.localStorage.getItem(key);\n    };\n    BrowserStorage.prototype.readAllKeys = function () {\n        var _this = this;\n        return Object.keys(window.localStorage)\n            .filter(function (key) { return key.indexOf(_this.prefix) === 0; });\n    };\n    BrowserStorage.prototype.delete = function (key) {\n        window.localStorage.removeItem(key);\n    };\n    BrowserStorage.prototype.getKey = function (timestamp) {\n        return this.prefix + timestamp;\n    };\n    BrowserStorage.prototype.getTimestamp = function (key) {\n        return parseInt(key.substr(this.prefix.length), 10);\n    };\n    return BrowserStorage;\n}(KeyValueStorageBase));\nexports.BrowserStorage = BrowserStorage;\nvar DefaultErrorParser = (function () {\n    function DefaultErrorParser() {\n    }\n    DefaultErrorParser.prototype.parse = function (context, exception) {\n        function getParameters(parameters) {\n            var params = (typeof parameters === 'string' ? [parameters] : parameters) || [];\n            var result = [];\n            for (var index = 0; index < params.length; index++) {\n                result.push({ name: params[index] });\n            }\n            return result;\n        }\n        function getStackFrames(stackFrames) {\n            var ANONYMOUS = '<anonymous>';\n            var frames = [];\n            for (var index = 0; index < stackFrames.length; index++) {\n                var frame = stackFrames[index];\n                frames.push({\n                    name: (frame.func || ANONYMOUS).replace('?', ANONYMOUS),\n                    parameters: getParameters(frame.args),\n                    file_name: frame.url,\n                    line_number: frame.line || 0,\n                    column: frame.column || 0\n                });\n            }\n            return frames;\n        }\n        var TRACEKIT_STACK_TRACE_KEY = '@@_TraceKit.StackTrace';\n        var stackTrace = !!context.contextData[TRACEKIT_STACK_TRACE_KEY]\n            ? context.contextData[TRACEKIT_STACK_TRACE_KEY]\n            : TraceKit.computeStackTrace(exception, 25);\n        if (!stackTrace) {\n            throw new Error('Unable to parse the exceptions stack trace.');\n        }\n        return {\n            type: stackTrace.name,\n            message: stackTrace.message || exception.message,\n            stack_trace: getStackFrames(stackTrace.stack || [])\n        };\n    };\n    return DefaultErrorParser;\n}());\nexports.DefaultErrorParser = DefaultErrorParser;\nvar DefaultModuleCollector = (function () {\n    function DefaultModuleCollector() {\n    }\n    DefaultModuleCollector.prototype.getModules = function (context) {\n        if (document && document.getElementsByTagName) {\n            return null;\n        }\n        var modules = [];\n        var scripts = document.getElementsByTagName('script');\n        if (scripts && scripts.length > 0) {\n            for (var index = 0; index < scripts.length; index++) {\n                if (scripts[index].src) {\n                    modules.push({\n                        module_id: index,\n                        name: scripts[index].src,\n                        version: Utils.parseVersion(scripts[index].src)\n                    });\n                }\n                else if (!!scripts[index].innerHTML) {\n                    modules.push({\n                        module_id: index,\n                        name: 'Script Tag',\n                        version: Utils.getHashCode(scripts[index].innerHTML).toString()\n                    });\n                }\n            }\n        }\n        return modules;\n    };\n    return DefaultModuleCollector;\n}());\nexports.DefaultModuleCollector = DefaultModuleCollector;\nvar DefaultRequestInfoCollector = (function () {\n    function DefaultRequestInfoCollector() {\n    }\n    DefaultRequestInfoCollector.prototype.getRequestInfo = function (context) {\n        if (!document || !navigator || !location) {\n            return null;\n        }\n        var exclusions = context.client.config.dataExclusions;\n        var requestInfo = {\n            user_agent: navigator.userAgent,\n            is_secure: location.protocol === 'https:',\n            host: location.hostname,\n            port: location.port && location.port !== '' ? parseInt(location.port, 10) : 80,\n            path: location.pathname,\n            cookies: Utils.getCookies(document.cookie, exclusions),\n            query_string: Utils.parseQueryString(location.search.substring(1), exclusions)\n        };\n        if (document.referrer && document.referrer !== '') {\n            requestInfo.referrer = document.referrer;\n        }\n        return requestInfo;\n    };\n    return DefaultRequestInfoCollector;\n}());\nexports.DefaultRequestInfoCollector = DefaultRequestInfoCollector;\nvar DefaultSubmissionAdapter = (function () {\n    function DefaultSubmissionAdapter() {\n    }\n    DefaultSubmissionAdapter.prototype.sendRequest = function (request, callback, isAppExiting) {\n        var TIMEOUT = 'timeout';\n        var LOADED = 'loaded';\n        var WITH_CREDENTIALS = 'withCredentials';\n        var isCompleted = false;\n        var useSetTimeout = false;\n        function complete(mode, xhr) {\n            function parseResponseHeaders(headerStr) {\n                function trim(value) {\n                    return value.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n                }\n                var headers = {};\n                var headerPairs = (headerStr || '').split('\\u000d\\u000a');\n                for (var index = 0; index < headerPairs.length; index++) {\n                    var headerPair = headerPairs[index];\n                    var separator = headerPair.indexOf('\\u003a\\u0020');\n                    if (separator > 0) {\n                        headers[trim(headerPair.substring(0, separator).toLowerCase())] = headerPair.substring(separator + 2);\n                    }\n                }\n                return headers;\n            }\n            if (isCompleted) {\n                return;\n            }\n            isCompleted = true;\n            var message = xhr.statusText;\n            var responseText = xhr.responseText;\n            var status = xhr.status;\n            if (mode === TIMEOUT || status === 0) {\n                message = 'Unable to connect to server.';\n                status = 0;\n            }\n            else if (mode === LOADED && !status) {\n                status = request.method === 'POST' ? 202 : 200;\n            }\n            else if (status < 200 || status > 299) {\n                var responseBody = xhr.responseBody;\n                if (!!responseBody && !!responseBody.message) {\n                    message = responseBody.message;\n                }\n                else if (!!responseText && responseText.indexOf('message') !== -1) {\n                    try {\n                        message = JSON.parse(responseText).message;\n                    }\n                    catch (e) {\n                        message = responseText;\n                    }\n                }\n            }\n            callback && callback(status || 500, message || '', responseText, parseResponseHeaders(xhr.getAllResponseHeaders && xhr.getAllResponseHeaders()));\n        }\n        function createRequest(userAgent, method, url) {\n            var xhr = new XMLHttpRequest();\n            if (WITH_CREDENTIALS in xhr) {\n                xhr.open(method, url, true);\n                xhr.setRequestHeader('X-Exceptionless-Client', userAgent);\n                if (method === 'POST') {\n                    xhr.setRequestHeader('Content-Type', 'application/json');\n                }\n            }\n            else if (typeof XDomainRequest !== 'undefined') {\n                useSetTimeout = true;\n                xhr = new XDomainRequest();\n                xhr.open(method, location.protocol === 'http:' ? url.replace('https:', 'http:') : url);\n            }\n            else {\n                xhr = null;\n            }\n            if (xhr) {\n                xhr.timeout = 10000;\n            }\n            return xhr;\n        }\n        var url = \"\" + request.url + (request.url.indexOf('?') === -1 ? '?' : '&') + \"access_token=\" + encodeURIComponent(request.apiKey);\n        var xhr = createRequest(request.userAgent, request.method || 'POST', url);\n        if (!xhr) {\n            return (callback && callback(503, 'CORS not supported.'));\n        }\n        if (WITH_CREDENTIALS in xhr) {\n            xhr.onreadystatechange = function () {\n                if (xhr.readyState !== 4) {\n                    return;\n                }\n                complete(LOADED, xhr);\n            };\n        }\n        xhr.onprogress = function () { };\n        xhr.ontimeout = function () { return complete(TIMEOUT, xhr); };\n        xhr.onerror = function () { return complete('error', xhr); };\n        xhr.onload = function () { return complete(LOADED, xhr); };\n        if (useSetTimeout) {\n            setTimeout(function () { return xhr.send(request.data); }, 500);\n        }\n        else {\n            xhr.send(request.data);\n        }\n    };\n    return DefaultSubmissionAdapter;\n}());\nexports.DefaultSubmissionAdapter = DefaultSubmissionAdapter;\nvar BrowserStorageProvider = (function () {\n    function BrowserStorageProvider(prefix, maxQueueItems) {\n        if (maxQueueItems === void 0) { maxQueueItems = 250; }\n        this.queue = new BrowserStorage('q', prefix, maxQueueItems);\n        this.settings = new BrowserStorage('settings', prefix, 1);\n    }\n    return BrowserStorageProvider;\n}());\nexports.BrowserStorageProvider = BrowserStorageProvider;\nfunction getDefaultsSettingsFromScriptTag() {\n    if (!document || !document.getElementsByTagName) {\n        return null;\n    }\n    var scripts = document.getElementsByTagName('script');\n    for (var index = 0; index < scripts.length; index++) {\n        if (scripts[index].src && scripts[index].src.indexOf('/exceptionless') > -1) {\n            return Utils.parseQueryString(scripts[index].src.split('?').pop());\n        }\n    }\n    return null;\n}\nfunction processUnhandledException(stackTrace, options) {\n    var builder = ExceptionlessClient.default.createUnhandledException(new Error(stackTrace.message || (options || {}).status || 'Script error'), 'onerror');\n    builder.pluginContextData['@@_TraceKit.StackTrace'] = stackTrace;\n    builder.submit();\n}\nConfiguration.prototype.useLocalStorage = function () {\n    if (BrowserStorage.isAvailable()) {\n        this.storage = new BrowserStorageProvider();\n        SettingsManager.applySavedServerSettings(this);\n        this.changed();\n    }\n};\nvar defaults = Configuration.defaults;\nvar settings = getDefaultsSettingsFromScriptTag();\nif (settings && (settings.apiKey || settings.serverUrl)) {\n    defaults.apiKey = settings.apiKey;\n    defaults.serverUrl = settings.serverUrl;\n}\ndefaults.errorParser = new DefaultErrorParser();\ndefaults.moduleCollector = new DefaultModuleCollector();\ndefaults.requestInfoCollector = new DefaultRequestInfoCollector();\ndefaults.submissionAdapter = new DefaultSubmissionAdapter();\nTraceKit.report.subscribe(processUnhandledException);\nTraceKit.extendToAsynchronousCallbacks();\nError.stackTraceLimit = Infinity;\n\nreturn exports;\n\n}));\n\n\n","import * as TraceKit from 'TraceKit';\nexport interface IEvent {\n  type?: string;\n  source?: string;\n  date?: Date;\n  tags?: string[];\n  message?: string;\n  geo?: string;\n  value?: number;\n  data?: any;\n  reference_id?: string;\n}\n\nexport class SubmissionResponse {\n  public success: boolean = false;\n  public badRequest: boolean = false;\n  public serviceUnavailable: boolean = false;\n  public paymentRequired: boolean = false;\n  public unableToAuthenticate: boolean = false;\n  public notFound: boolean = false;\n  public requestEntityTooLarge: boolean = false;\n  public statusCode: number;\n  public message: string;\n\n  constructor(statusCode: number, message?: string) {\n    this.statusCode = statusCode;\n    this.message = message;\n\n    this.success = statusCode >= 200 && statusCode <= 299;\n    this.badRequest = statusCode === 400;\n    this.serviceUnavailable = statusCode === 503;\n    this.paymentRequired = statusCode === 402;\n    this.unableToAuthenticate = statusCode === 401 || statusCode === 403;\n    this.notFound = statusCode === 404;\n    this.requestEntityTooLarge = statusCode === 413;\n  }\n}\n\nexport interface ILastReferenceIdManager {\n  getLast(): string;\n  clearLast(): void;\n  setLast(eventId: string): void;\n}\n\nexport interface ILog {\n  info(message: string): void;\n  warn(message: string): void;\n  error(message: string): void;\n}\n\n                                                                                                                 \n\nexport interface IEventQueue {\n  enqueue(event: IEvent): void;\n  process(isAppExiting?: boolean): void;\n  suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void;\n  onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void;\n}\n\n                                                                                                                                  \n\nexport interface IEnvironmentInfoCollector {\n  getEnvironmentInfo(context: EventPluginContext): IEnvironmentInfo;\n}\n\n                                                                                                              \n\nexport interface IErrorParser {\n  parse(context: EventPluginContext, exception: Error): IError;\n}\n\n                                                                                                                \n\nexport interface IModuleCollector {\n  getModules(context: EventPluginContext): IModule[];\n}\n\n                                                                                                                          \n\nexport interface IRequestInfoCollector {\n  getRequestInfo(context: EventPluginContext): IRequestInfo;\n}\n\n                                      \n\nexport interface IStorageProvider {\n  queue: IStorage;\n  settings: IStorage;\n}\n\n                                                                                                                   \n\nexport interface ISubmissionAdapter {\n  sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean): void;\n}\n\n                                                                                                                                                                                                                                                                                           \n\nexport interface ISubmissionClient {\n  postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void;\n  postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void;\n  getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void;\n  sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void;\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            \n\nexport interface IConfigurationSettings {\n  apiKey?: string;\n  serverUrl?: string;\n  heartbeatServerUrl?: string;\n  updateSettingsWhenIdleInterval?: number;\n  environmentInfoCollector?: IEnvironmentInfoCollector;\n  errorParser?: IErrorParser;\n  lastReferenceIdManager?: ILastReferenceIdManager;\n  log?: ILog;\n  moduleCollector?: IModuleCollector;\n  requestInfoCollector?: IRequestInfoCollector;\n  submissionBatchSize?: number;\n  submissionClient?: ISubmissionClient;\n  submissionAdapter?: ISubmissionAdapter;\n  storage?: IStorageProvider;\n  queue?: IEventQueue;\n}\n\n                                                                                                                                                     \n\ninterface ISettingsWithVersion {\n  version: number;\n  settings: { [key: string]: string };\n}\n\nexport class SettingsManager {\n  /**\n   * A list of handlers that will be fired when the settings change.\n   * @type {Array}\n   * @private\n   */\n  private static _handlers: { (config: Configuration): void }[] = [];\n\n  public static onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  public static applySavedServerSettings(config: Configuration): void {\n    if (!config || !config.isValid) {\n      return;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    config.log.info(`Applying saved settings: v${savedSettings.version}`);\n    config.settings = Utils.merge(config.settings, savedSettings.settings);\n    this.changed(config);\n  }\n\n  public static getVersion(config: Configuration): number {\n    if (!config || !config.isValid) {\n      return 0;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    return savedSettings.version || 0;\n  }\n\n  public static checkVersion(version: number, config: Configuration): void {\n    let currentVersion: number = this.getVersion(config);\n    if (version <= currentVersion) {\n      return;\n    }\n\n    config.log.info(`Updating settings from v${currentVersion} to v${version}`);\n    this.updateSettings(config, currentVersion);\n  }\n\n  public static updateSettings(config: Configuration, version?: number): void {\n    if (!config || !config.enabled) {\n      return;\n    }\n\n    let unableToUpdateMessage = 'Unable to update settings';\n    if (!config.isValid) {\n      config.log.error(`${unableToUpdateMessage}: ApiKey is not set.`);\n      return;\n    }\n\n    if (!version || version < 0) {\n      version = this.getVersion(config);\n    }\n\n    config.log.info(`Checking for updated settings from: v${version}.`);\n    config.submissionClient.getSettings(config, version, (response: SettingsResponse) => {\n      if (!config || !response || !response.success || !response.settings) {\n        config.log.warn(`${unableToUpdateMessage}: ${response.message}`);\n        return;\n      }\n\n      config.settings = Utils.merge(config.settings, response.settings);\n\n      // TODO: Store snapshot of settings after reading from config and attributes and use that to revert to defaults.\n      // Remove any existing server settings that are not in the new server settings.\n      let savedServerSettings = SettingsManager.getSavedServerSettings(config);\n      for (let key in savedServerSettings) {\n        if (response.settings[key]) {\n          continue;\n        }\n\n        delete config.settings[key];\n      }\n\n      let newSettings = <ISettingsWithVersion>{\n        version: response.settingsVersion,\n        settings: response.settings\n      };\n\n      config.storage.settings.save(newSettings);\n\n      config.log.info(`Updated settings: v${newSettings.version}`);\n      this.changed(config);\n    });\n  }\n\n  private static changed(config: Configuration) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](config);\n      } catch (ex) {\n        config.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  private static getSavedServerSettings(config: Configuration): ISettingsWithVersion {\n    let item = config.storage.settings.get()[0];\n    if (item && item.value && item.value.version && item.value.settings) {\n      return item.value;\n    }\n\n    return { version: 0, settings: {} };\n  }\n}\n\n                                                                    \n\nexport class DefaultLastReferenceIdManager implements ILastReferenceIdManager {\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @type {string}\n   * @private\n   */\n  private _lastReferenceId: string = null;\n\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @returns {string}\n   */\n  public getLast(): string {\n    return this._lastReferenceId;\n  }\n\n  /**\n   * Clears the last event's reference id.\n   */\n  public clearLast(): void {\n    this._lastReferenceId = null;\n  }\n\n  /**\n   * Sets the last event's reference id.\n   * @param eventId\n   */\n  public setLast(eventId: string): void {\n    this._lastReferenceId = eventId;\n  }\n}\n\n                              \n\nexport class ConsoleLog implements ILog {\n  public info(message: string): void {\n    this.log('info', message);\n  }\n\n  public warn(message: string): void {\n    this.log('warn', message);\n  }\n\n  public error(message: string): void {\n    this.log('error', message);\n  }\n\n  private log(level: string, message: string) {\n    if (console && console[level]) {\n      console[level](`[${level}] Exceptionless: ${message}`);\n    }\n  }\n}\n\n                              \n\nexport class NullLog implements ILog {\n  public info(message: string): void { }\n  public warn(message: string): void { }\n  public error(message: string): void { }\n}\n\nexport interface IUserInfo {\n  identity?: string;\n  name?: string;\n  data?: any;\n}\n\n                                                                                                         \n\nexport interface IEventPlugin {\n  priority?: number;\n  name?: string;\n  run(context: EventPluginContext, next?: () => void): void;\n}\n\n                                                                                                                                                                                             \n\nexport class EventPluginContext {\n  public cancelled: boolean;\n  public client: ExceptionlessClient;\n  public event: IEvent;\n  public contextData: ContextData;\n\n  constructor(client: ExceptionlessClient, event: IEvent, contextData?: ContextData) {\n    this.client = client;\n    this.event = event;\n    this.contextData = contextData ? contextData : new ContextData();\n  }\n\n  public get log(): ILog {\n    return this.client.config.log;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \n\nexport class EventPluginManager {\n  public static run(context: EventPluginContext, callback: (context?: EventPluginContext) => void): void {\n    let wrap = function(plugin: IEventPlugin, next?: () => void): () => void {\n      return () => {\n        try {\n          if (!context.cancelled) {\n            plugin.run(context, next);\n          }\n        } catch (ex) {\n          context.cancelled = true;\n          context.log.error(`Error running plugin '${plugin.name}': ${ex.message}. Discarding Event.`);\n        }\n\n        if (context.cancelled && !!callback) {\n          callback(context);\n        }\n      };\n    };\n\n    let plugins: IEventPlugin[] = context.client.config.plugins; // optimization for minifier.\n    let wrappedPlugins: { (): void }[] = [];\n    if (!!callback) {\n      wrappedPlugins[plugins.length] = wrap({ name: 'cb', priority: 9007199254740992, run: callback }, null);\n    }\n\n    for (let index = plugins.length - 1; index > -1; index--) {\n      wrappedPlugins[index] = wrap(plugins[index], !!callback || (index < plugins.length - 1) ? wrappedPlugins[index + 1] : null);\n    }\n\n    wrappedPlugins[0]();\n  }\n\n  public static addDefaultPlugins(config: Configuration): void {\n    config.addPlugin(new ConfigurationDefaultsPlugin());\n    config.addPlugin(new ErrorPlugin());\n    config.addPlugin(new DuplicateCheckerPlugin());\n    config.addPlugin(new EventExclusionPlugin());\n    config.addPlugin(new ModuleInfoPlugin());\n    config.addPlugin(new RequestInfoPlugin());\n    config.addPlugin(new EnvironmentInfoPlugin());\n    config.addPlugin(new SubmissionMethodPlugin());\n  }\n}\n\n                                                                                                                                                               \n\nexport class HeartbeatPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'HeartbeatPlugin';\n\n  private _interval: number;\n  private _intervalId: any;\n\n  constructor (heartbeatInterval: number = 30000) {\n    this._interval = heartbeatInterval;\n  }\n\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    clearInterval(this._intervalId);\n\n    let user: IUserInfo = context.event.data['@user'];\n    if (user && user.identity) {\n      this._intervalId = setInterval(() => context.client.submitSessionHeartbeat(user.identity), this._interval);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ReferenceIdPlugin implements IEventPlugin {\n  public priority: number = 20;\n  public name: string = 'ReferenceIdPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    if ((!context.event.reference_id || context.event.reference_id.length === 0) && context.event.type === 'error') {\n      context.event.reference_id = Utils.guid().replace('-', '').substring(0, 10);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                     \n\nexport class DefaultEventQueue implements IEventQueue {\n  /**\n   * The configuration object.\n   * @type {Configuration}\n   * @private\n   */\n  private _config: Configuration;\n\n  /**\n   * A list of handlers that will be fired when events are submitted.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (events: IEvent[], response: SubmissionResponse): void }[] = [];\n\n  /**\n   * Suspends processing until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _suspendProcessingUntil: Date;\n\n  /**\n   * Discards queued items until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _discardQueuedItemsUntil: Date;\n\n  /**\n   * Returns true if the queue is processing.\n   * @type {boolean}\n   * @private\n   */\n  private _processingQueue: boolean = false;\n\n  /**\n   * Processes the queue every xx seconds.\n   * @type {Timer}\n   * @private\n   */\n  private _queueTimer: any;\n\n  constructor(config: Configuration) {\n    this._config = config;\n  }\n\n  public enqueue(event: IEvent): void {\n    const eventWillNotBeQueued: string = 'The event will not be queued.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (this.areQueuedItemsDiscarded()) {\n      log.info(`Queue items are currently being discarded. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    this.ensureQueueTimer();\n\n    let timestamp = config.storage.queue.save(event);\n    let logText = `type=${event.type} ${!!event.reference_id ? 'refid=' + event.reference_id : ''}`;\n    if (timestamp) {\n      log.info(`Enqueuing event: ${timestamp} ${logText}`);\n    } else {\n      log.error(`Could not enqueue event ${logText}`);\n    }\n  }\n\n  public process(isAppExiting?: boolean): void {\n    const queueNotProcessed: string = 'The queue will not be processed.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (this._processingQueue) {\n      return;\n    }\n\n    log.info('Processing queue...');\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${queueNotProcessed}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${queueNotProcessed}`);\n      return;\n    }\n\n    this._processingQueue = true;\n    this.ensureQueueTimer();\n\n    try {\n      let events = config.storage.queue.get(config.submissionBatchSize);\n      if (!events || events.length === 0) {\n        this._processingQueue = false;\n        return;\n      }\n\n      log.info(`Sending ${events.length} events to ${config.serverUrl}.`);\n      config.submissionClient.postEvents(events.map(e => e.value), config, (response: SubmissionResponse) => {\n        this.processSubmissionResponse(response, events);\n        this.eventsPosted(events.map(e => e.value), response);\n        log.info('Finished processing queue.');\n        this._processingQueue = false;\n      }, isAppExiting);\n    } catch (ex) {\n      log.error(`Error processing queue: ${ex}`);\n      this.suspendProcessing();\n      this._processingQueue = false;\n    }\n  }\n\n  public suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void {\n    let config: Configuration = this._config; // Optimization for minifier.\n\n    if (!durationInMinutes || durationInMinutes <= 0) {\n      durationInMinutes = 5;\n    }\n\n    config.log.info(`Suspending processing for ${durationInMinutes} minutes.`);\n    this._suspendProcessingUntil = new Date(new Date().getTime() + (durationInMinutes * 60000));\n\n    if (discardFutureQueuedItems) {\n      this._discardQueuedItemsUntil = this._suspendProcessingUntil;\n    }\n\n    if (clearQueue) {\n      // Account is over the limit and we want to ensure that the sample size being sent in will contain newer errors.\n      config.storage.queue.clear();\n    }\n  }\n\n  public onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private eventsPosted(events: IEvent[], response: SubmissionResponse) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](events, response);\n      } catch (ex) {\n        this._config.log.error(`Error calling onEventsPosted handler: ${ex}`);\n      }\n    }\n  }\n\n  private areQueuedItemsDiscarded(): boolean {\n    return this._discardQueuedItemsUntil && this._discardQueuedItemsUntil > new Date();\n  }\n\n  private ensureQueueTimer(): void {\n    if (!this._queueTimer) {\n      this._queueTimer = setInterval(() => this.onProcessQueue(), 10000);\n    }\n  }\n\n  private isQueueProcessingSuspended(): boolean {\n    return this._suspendProcessingUntil && this._suspendProcessingUntil > new Date();\n  }\n\n  private onProcessQueue(): void {\n    if (!this.isQueueProcessingSuspended() && !this._processingQueue) {\n      this.process();\n    }\n  }\n\n  private processSubmissionResponse(response: SubmissionResponse, events: IStorageItem[]): void {\n    const noSubmission: string = 'The event will not be submitted.'; // Optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (response.success) {\n      log.info(`Sent ${events.length} events.`);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.serviceUnavailable) {\n      // You are currently over your rate limit or the servers are under stress.\n      log.error('Server returned service unavailable.');\n      this.suspendProcessing();\n      return;\n    }\n\n    if (response.paymentRequired) {\n      // If the organization over the rate limit then discard the event.\n      log.info('Too many events have been submitted, please upgrade your plan.');\n      this.suspendProcessing(null, true, true);\n      return;\n    }\n\n    if (response.unableToAuthenticate) {\n      // The api key was suspended or could not be authorized.\n      log.info(`Unable to authenticate, please check your configuration. ${noSubmission}`);\n      this.suspendProcessing(15);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.notFound || response.badRequest) {\n      // The service end point could not be found.\n      log.error(`Error while trying to submit data: ${response.message}`);\n      this.suspendProcessing(60 * 4);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.requestEntityTooLarge) {\n      let message = 'Event submission discarded for being too large.';\n      if (config.submissionBatchSize > 1) {\n        log.error(`${message} Retrying with smaller batch size.`);\n        config.submissionBatchSize = Math.max(1, Math.round(config.submissionBatchSize / 1.5));\n      } else {\n        log.error(`${message} ${noSubmission}`);\n        this.removeEvents(events);\n      }\n\n      return;\n    }\n\n    if (!response.success) {\n      log.error(`Error submitting events: ${response.message || 'Please check the network tab for more info.'}`);\n      this.suspendProcessing();\n    }\n  }\n\n  private removeEvents(events: IStorageItem[]) {\n    for (let index = 0; index < (events || []).length; index++) {\n      this._config.storage.queue.remove(events[index].timestamp);\n    }\n  }\n}\n\n                                                                                                                                                  \n\nexport class InMemoryStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(maxQueueItems: number = 250) {\n    this.queue = new InMemoryStorage(maxQueueItems);\n    this.settings = new InMemoryStorage(1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n\ndeclare var XDomainRequest: { new (); create(); };\n\nexport class DefaultSubmissionClient implements ISubmissionClient {\n  public configurationVersionHeader: string = 'x-exceptionless-configversion';\n\n  public postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void {\n    let data = JSON.stringify(events);\n    let request = this.createRequest(config, 'POST',  `${config.serverUrl}/api/v2/events`, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb, isAppExiting);\n  }\n\n  public postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void {\n    let path = `${config.serverUrl}/api/v2/events/by-ref/${encodeURIComponent(referenceId)}/user-description`;\n    let data = JSON.stringify(description);\n    let request = this.createRequest(config, 'POST', path, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void {\n    let request = this.createRequest(config, 'GET', `${config.serverUrl}/api/v2/projects/config?v=${version}`);\n    let cb = (status, message, data?, headers?) => {\n      if (status !== 200) {\n        return callback(new SettingsResponse(false, null, -1, null, message));\n      }\n\n      let settings: IClientConfiguration;\n      try {\n        settings = JSON.parse(data);\n      } catch (e) {\n        config.log.error(`Unable to parse settings: '${data}'`);\n      }\n\n      if (!settings || isNaN(settings.version)) {\n        return callback(new SettingsResponse(false, null, -1, null, 'Invalid configuration settings.'));\n      }\n\n      callback(new SettingsResponse(true, settings.settings || {}, settings.version));\n    };\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void {\n    let request = this.createRequest(config, 'GET', `${config.heartbeatServerUrl}/api/v2/events/session/heartbeat?id=${sessionIdOrUserId}&close=${closeSession}`);\n    config.submissionAdapter.sendRequest(request);\n  }\n\n  private createRequest(config: Configuration, method: string, url: string, data: string = null): SubmissionRequest {\n    return {\n      method,\n      url,\n      data,\n      apiKey: config.apiKey,\n      userAgent: config.userAgent\n    };\n  }\n\n  private createSubmissionCallback(config: Configuration, callback: (response: SubmissionResponse) => void) {\n    return (status, message, data?, headers?) => {\n      let settingsVersion: number = headers && parseInt(headers[this.configurationVersionHeader], 10);\n      SettingsManager.checkVersion(settingsVersion, config);\n\n      callback(new SubmissionResponse(status, message));\n    };\n  }\n}\n\nexport class Utils {\n  public static addRange<T>(target: T[], ...values: T[]) {\n    if (!target) {\n      target = [];\n    }\n\n    if (!values || values.length === 0) {\n      return target;\n    }\n\n    for (let index = 0; index < values.length; index++) {\n      if (values[index] && target.indexOf(values[index]) < 0) {\n        target.push(values[index]);\n      }\n    }\n\n    return target;\n  }\n\n  public static getHashCode(source: string): number {\n    if (!source || source.length === 0) {\n      return 0;\n    }\n\n    let hash: number = 0;\n    for (let index = 0; index < source.length; index++) {\n      let character = source.charCodeAt(index);\n      hash = ((hash << 5) - hash) + character;\n      hash |= 0;\n    }\n\n    return hash;\n  }\n\n  public static getCookies(cookies: string, exclusions?: string[]): Object {\n    let result: Object = {};\n\n    let parts: string[] = (cookies || '').split('; ');\n    for (let index = 0; index < parts.length; index++) {\n      let cookie: string[] = parts[index].split('=');\n      if (!Utils.isMatch(cookie[0], exclusions)) {\n        result[cookie[0]] = cookie[1];\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static guid(): string {\n    function s4() {\n      return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n    }\n\n    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n  }\n\n  public static merge(defaultValues: Object, values: Object) {\n    let result: Object = {};\n\n    for (let key in defaultValues || {}) {\n      if (!!defaultValues[key]) {\n        result[key] = defaultValues[key];\n      }\n    }\n\n    for (let key in values || {}) {\n      if (!!values[key]) {\n        result[key] = values[key];\n      }\n    }\n\n    return result;\n  }\n\n  public static parseVersion(source: string): string {\n    if (!source) {\n      return null;\n    }\n\n    let versionRegex = /(v?((\\d+)\\.(\\d+)(\\.(\\d+))?)(?:-([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?(?:\\+([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?)/;\n    let matches = versionRegex.exec(source);\n    if (matches && matches.length > 0) {\n      return matches[0];\n    }\n\n    return null;\n  }\n\n  public static parseQueryString(query: string, exclusions?: string[]) {\n    if (!query || query.length === 0) {\n      return null;\n    }\n\n    let pairs: string[] = query.split('&');\n    if (pairs.length === 0) {\n      return null;\n    }\n\n    let result: Object = {};\n    for (let index = 0; index < pairs.length; index++) {\n      let pair = pairs[index].split('=');\n      if (!Utils.isMatch(pair[0], exclusions)) {\n        result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static randomNumber(): number {\n    return Math.floor(Math.random() * 9007199254740992);\n  }\n\n  /**\n   * Checks to see if a value matches a pattern.\n   * @param input the value to check against the @pattern.\n   * @param pattern The pattern to check, supports wild cards (*).\n   */\n  public static isMatch(input: string, patterns: string[], ignoreCase: boolean = true): boolean {\n    if (!input || typeof input !== 'string') {\n      return false;\n    }\n\n    let trim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n    input = (ignoreCase ? input.toLowerCase() : input).replace(trim, '');\n\n    return (patterns || []).some(pattern => {\n      if (typeof pattern !== 'string') {\n        return false;\n      }\n\n      pattern = (ignoreCase ? pattern.toLowerCase() : pattern).replace(trim, '');\n      if (pattern.length <= 0) {\n        return false;\n      }\n\n      let startsWithWildcard: boolean = pattern[0] === '*';\n      if (startsWithWildcard) {\n        pattern = pattern.slice(1);\n      }\n\n      let endsWithWildcard: boolean = pattern[pattern.length - 1] === '*';\n      if (endsWithWildcard) {\n        pattern = pattern.substring(0, pattern.length - 1);\n      }\n\n      if (startsWithWildcard && endsWithWildcard) {\n        return pattern.length <= input.length && input.indexOf(pattern, 0) !== -1;\n      }\n\n      if (startsWithWildcard) {\n        return Utils.endsWith(input, pattern);\n      }\n\n      if (endsWithWildcard) {\n        return Utils.startsWith(input, pattern);\n      }\n\n      return input === pattern;\n    });\n  }\n\n  public static isEmpty(input: Object) {\n    return input === null || (typeof (input) === 'object' && Object.keys(input).length === 0);\n  }\n\n  public static startsWith(input: string, prefix: string): boolean {\n    return input.substring(0, prefix.length) === prefix;\n  }\n\n  public static endsWith(input: string, suffix: string): boolean {\n    return input.indexOf(suffix, input.length - suffix.length) !== -1;\n  }\n\n  /**\n   * Stringifys an object with optional exclusions and max depth.\n   * @param data The data object to add.\n   * @param exclusions Any property names that should be excluded.\n   * @param maxDepth The max depth of the object to include.\n   */\n  public static stringify(data: any, exclusions?: string[], maxDepth?: number): string {\n    function stringifyImpl(obj: any, excludedKeys: string[]): string {\n      let cache: string[] = [];\n      return JSON.stringify(obj, function(key: string, value: any) {\n        if (Utils.isMatch(key, excludedKeys)) {\n          return;\n        }\n\n        if (typeof value === 'object' && !!value) {\n          if (cache.indexOf(value) !== -1) {\n            // Circular reference found, discard key\n            return;\n          }\n\n          cache.push(value);\n        }\n\n        return value;\n      });\n    }\n\n    if (({}).toString.call(data) === '[object Object]') {\n      let flattened = {};\n      /* tslint:disable:forin */\n      for (let prop in data) {\n        let value = data[prop];\n        if (value === data) {\n          continue;\n        }\n        flattened[prop] = data[prop];\n      }\n      /* tslint:enable:forin */\n\n      return stringifyImpl(flattened, exclusions);\n    }\n\n    if (({}).toString.call(data) === '[object Array]') {\n      let result = [];\n      for (let index = 0; index < data.length; index++) {\n        result[index] = JSON.parse(stringifyImpl(data[index], exclusions));\n      }\n\n      return JSON.stringify(result);\n    }\n\n    return stringifyImpl(data, exclusions);\n  }\n\n  public static toBoolean(input, defaultValue: boolean = false): boolean {\n    if (typeof input === 'boolean') {\n      return input;\n    }\n\n    if (input === null || typeof input !== 'number' && typeof input !== 'string') {\n      return defaultValue;\n    }\n\n    switch ((input + '').toLowerCase().trim()) {\n      case 'true': case 'yes': case '1': return true;\n      case 'false': case 'no': case '0': case null: return false;\n    }\n\n    return defaultValue;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 \n\nexport class Configuration implements IConfigurationSettings {\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @type {IConfigurationSettings}\n   * @private\n   */\n  private static _defaultSettings: IConfigurationSettings = null;\n\n  /**\n   * A default list of tags that will automatically be added to every\n   * report submitted to the server.\n   *\n   * @type {Array}\n   */\n  public defaultTags: string[] = [];\n\n  /**\n   * A default list of of extended data objects that will automatically\n   * be added to every report submitted to the server.\n   *\n   * @type {{}}\n   */\n  public defaultData: Object = {};\n\n  /**\n   * Whether the client is currently enabled or not. If it is disabled,\n   * submitted errors will be discarded and no data will be sent to the server.\n   *\n   * @returns {boolean}\n   */\n  public enabled: boolean = true;\n\n  public environmentInfoCollector: IEnvironmentInfoCollector;\n  public errorParser: IErrorParser;\n  public lastReferenceIdManager: ILastReferenceIdManager = new DefaultLastReferenceIdManager();\n  public log: ILog;\n  public moduleCollector: IModuleCollector;\n  public requestInfoCollector: IRequestInfoCollector;\n\n  /**\n   * Maximum number of events that should be sent to the server together in a batch. (Defaults to 50)\n   */\n  public submissionBatchSize: number;\n  public submissionAdapter: ISubmissionAdapter;\n  public submissionClient: ISubmissionClient;\n\n  /**\n   * Contains a dictionary of custom settings that can be used to control\n   * the client and will be automatically updated from the server.\n   */\n  public settings: Object = {};\n\n  public storage: IStorageProvider;\n\n  public queue: IEventQueue;\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @type {Array}\n   * @private\n   */\n  private _plugins: IEventPlugin[] = [];\n\n  /**\n   * A list of handlers that will be fired when configuration changes.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (config: Configuration): void }[] = [];\n\n  constructor(configSettings?: IConfigurationSettings) {\n    function inject(fn: any) {\n      return typeof fn === 'function' ? fn(this) : fn;\n    }\n\n    configSettings = Utils.merge(Configuration.defaults, configSettings);\n\n    this.log = inject(configSettings.log) || new NullLog();\n    this.apiKey = configSettings.apiKey;\n    this.serverUrl = configSettings.serverUrl;\n    this.heartbeatServerUrl = configSettings.heartbeatServerUrl;\n    this.updateSettingsWhenIdleInterval = configSettings.updateSettingsWhenIdleInterval;\n\n    this.environmentInfoCollector = inject(configSettings.environmentInfoCollector);\n    this.errorParser = inject(configSettings.errorParser);\n    this.lastReferenceIdManager = inject(configSettings.lastReferenceIdManager) || new DefaultLastReferenceIdManager();\n    this.moduleCollector = inject(configSettings.moduleCollector);\n    this.requestInfoCollector = inject(configSettings.requestInfoCollector);\n    this.submissionBatchSize = inject(configSettings.submissionBatchSize) || 50;\n    this.submissionAdapter = inject(configSettings.submissionAdapter);\n    this.submissionClient = inject(configSettings.submissionClient) || new DefaultSubmissionClient();\n    this.storage = inject(configSettings.storage) || new InMemoryStorageProvider();\n    this.queue = inject(configSettings.queue) || new DefaultEventQueue(this);\n\n    SettingsManager.applySavedServerSettings(this);\n    EventPluginManager.addDefaultPlugins(this);\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @type {string}\n   * @private\n   */\n  private _apiKey: string;\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @returns {string}\n   */\n  public get apiKey(): string {\n    return this._apiKey;\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @param value\n   */\n  public set apiKey(value: string) {\n    this._apiKey = value || null;\n    this.log.info(`apiKey: ${this._apiKey}`);\n    this.changed();\n  }\n\n  /**\n   * Returns true if the apiKey is valid.\n   * @returns {boolean}\n   */\n  public get isValid(): boolean {\n    return !!this.apiKey && this.apiKey.length >= 10;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _serverUrl: string = 'https://collector.exceptionless.io';\n\n  /**\n   * The server url that all events will be sent to.\n   * @returns {string}\n   */\n  public get serverUrl(): string {\n    return this._serverUrl;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @param value\n   */\n  public set serverUrl(value: string) {\n    if (!!value) {\n      this._serverUrl = value;\n      this._heartbeatServerUrl = value;\n      this.log.info(`serverUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _heartbeatServerUrl: string = 'https://heartbeat.exceptionless.io';\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @returns {string}\n   */\n  public get heartbeatServerUrl(): string {\n    return this._heartbeatServerUrl;\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @param value\n   */\n  public set heartbeatServerUrl(value: string) {\n    if (!!value) {\n      this._heartbeatServerUrl = value;\n      this.log.info(`heartbeatServerUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @type {number}\n   * @private\n   */\n  private _updateSettingsWhenIdleInterval: number = 120000;\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @returns {number}\n   */\n  public get updateSettingsWhenIdleInterval(): number {\n    return this._updateSettingsWhenIdleInterval;\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @param value\n   */\n  public set updateSettingsWhenIdleInterval(value: number) {\n    if (typeof value !== 'number') {\n      return;\n    }\n\n    if (value <= 0) {\n      value = -1;\n    } else if (value > 0 && value < 15000) {\n      value = 15000;\n    }\n\n    this._updateSettingsWhenIdleInterval = value;\n    this.log.info(`updateSettingsWhenIdleInterval: ${value}`);\n    this.changed();\n  }\n\n  /**\n   * A list of exclusion patterns.\n   * @type {Array}\n   * @private\n   */\n  private _dataExclusions: string[] = [];\n\n  /**\n   * A list of user agent patterns.\n   * @type {Array}\n   * @private\n   */\n  private _userAgentBotPatterns: string[] = [];\n\n  /**\n   *  A list of exclusion patterns that will automatically remove any data that\n   *  matches them from any data submitted to the server.\n   *\n   *  For example, entering CreditCard will remove any extended data properties,\n   *  form fields, cookies and query parameters from the report.\n   *\n   * @returns {string[]}\n   */\n  public get dataExclusions(): string[] {\n    let exclusions: string = this.settings['@@DataExclusions'];\n    return this._dataExclusions.concat(exclusions && exclusions.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of exclusion patterns that will automatically remove any\n   * data that matches them from any data submitted to the server.\n   *\n   * For example, entering CreditCard will remove any extended data properties, form\n   * fields, cookies and query parameters from the report.\n   *\n   * @param exclusions\n   */\n  public addDataExclusions(...exclusions: string[]) {\n    this._dataExclusions = Utils.addRange<string>(this._dataExclusions, ...exclusions);\n  }\n\n  /**\n   * A list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @returns {string[]}\n   */\n  public get userAgentBotPatterns(): string[] {\n    let patterns: string = this.settings['@@UserAgentBotPatterns'];\n    return this._userAgentBotPatterns.concat(patterns && patterns.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @param userAgentBotPatterns\n   */\n  public addUserAgentBotPatterns(...userAgentBotPatterns: string[]) {\n    this._userAgentBotPatterns = Utils.addRange<string>(this._userAgentBotPatterns, ...userAgentBotPatterns);\n  }\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @returns {IEventPlugin[]}\n   */\n  public get plugins(): IEventPlugin[] {\n    return this._plugins.sort((p1: IEventPlugin, p2: IEventPlugin) => {\n      return (p1.priority < p2.priority) ? -1 : (p1.priority > p2.priority) ? 1 : 0;\n    });\n  }\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param plugin\n   */\n  public addPlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param name The name used to identify the plugin.\n   * @param priority Used to determine plugins priority.\n   * @param pluginAction A function that is run.\n   */\n  public addPlugin(name: string, priority: number, pluginAction: (context: EventPluginContext, next?: () => void) => void): void;\n  public addPlugin(pluginOrName: IEventPlugin | string, priority?: number, pluginAction?: (context: EventPluginContext, next?: () => void) => void): void {\n    let plugin: IEventPlugin = !!pluginAction ? { name: <string>pluginOrName, priority: priority, run: pluginAction } : <IEventPlugin>pluginOrName;\n    if (!plugin || !plugin.run) {\n      this.log.error('Add plugin failed: Run method not defined');\n      return;\n    }\n\n    if (!plugin.name) {\n      plugin.name = Utils.guid();\n    }\n\n    if (!plugin.priority) {\n      plugin.priority = 0;\n    }\n\n    let pluginExists: boolean = false;\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === plugin.name) {\n        pluginExists = true;\n        break;\n      }\n    }\n\n    if (!pluginExists) {\n      plugins.push(plugin);\n    }\n  }\n\n  /**\n   * Remove the plugin from this configuration.\n   * @param plugin\n   */\n  public removePlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Remove an plugin by key from this configuration.\n   * @param name\n   */\n  public removePlugin(name: string): void;\n  public removePlugin(pluginOrName: IEventPlugin | string): void {\n    let name: string = typeof pluginOrName === 'string' ? pluginOrName : pluginOrName.name;\n    if (!name) {\n      this.log.error('Remove plugin failed: Plugin name not defined');\n      return;\n    }\n\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === name) {\n        plugins.splice(index, 1);\n        break;\n      }\n    }\n  }\n\n  /**\n   * Automatically set the application version for events.\n   * @param version\n   */\n  public setVersion(version: string): void {\n    if (!!version) {\n      this.defaultData['@version'] = version;\n    }\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): void;\n  public setUserIdentity(identity: string): void;\n  public setUserIdentity(identity: string, name: string): void;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): void {\n    const USER_KEY: string = '@user'; // optimization for minifier.\n    let userInfo: IUserInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n\n    let shouldRemove: boolean = !userInfo || (!userInfo.identity && !userInfo.name);\n    if (shouldRemove) {\n      delete this.defaultData[USER_KEY];\n    } else {\n      this.defaultData[USER_KEY] = userInfo;\n    }\n\n    this.log.info(`user identity: ${shouldRemove ? 'null' : userInfo.identity}`);\n  }\n\n  /**\n   * Used to identify the client that sent the events to the server.\n   * @returns {string}\n   */\n  public get userAgent(): string {\n    return 'exceptionless-js/1.0.0.0';\n  }\n\n  /**\n   * Automatically send a heartbeat to keep the session alive.\n   */\n  public useSessions(sendHeartbeats: boolean = true, heartbeatInterval: number = 30000): void {\n    if (sendHeartbeats) {\n      this.addPlugin(new HeartbeatPlugin(heartbeatInterval));\n    }\n  }\n\n  /**\n   * Automatically set a reference id for error events.\n   */\n  public useReferenceIds(): void {\n    this.addPlugin(new ReferenceIdPlugin());\n  }\n\n  public useLocalStorage(): void {\n    // This method will be injected via the prototype.\n  }\n\n  // TODO: Support a min log level.\n  public useDebugLogger(): void {\n    this.log = new ConsoleLog();\n  }\n\n  public onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private changed() {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](this);\n      } catch (ex) {\n        this.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @returns {IConfigurationSettings}\n   */\n  public static get defaults() {\n    if (Configuration._defaultSettings === null) {\n      Configuration._defaultSettings = {};\n    }\n\n    return Configuration._defaultSettings;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                   \n\nexport class EventBuilder {\n  public target: IEvent;\n  public client: ExceptionlessClient;\n  public pluginContextData: ContextData;\n\n  private _validIdentifierErrorMessage: string = 'must contain between 8 and 100 alphanumeric or \\'-\\' characters.'; // optimization for minifier.\n\n  constructor(event: IEvent, client: ExceptionlessClient, pluginContextData?: ContextData) {\n    this.target = event;\n    this.client = client;\n    this.pluginContextData = pluginContextData || new ContextData();\n  }\n\n  public setType(type: string): EventBuilder {\n    if (!!type) {\n      this.target.type = type;\n    }\n\n    return this;\n  }\n\n  public setSource(source: string): EventBuilder {\n    if (!!source) {\n      this.target.source = source;\n    }\n\n    return this;\n  }\n\n  public setReferenceId(referenceId: string): EventBuilder {\n    if (!this.isValidIdentifier(referenceId)) {\n      throw new Error(`ReferenceId ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.target.reference_id = referenceId;\n    return this;\n  }\n\n  /**\n   * Allows you to reference a parent event by its ReferenceId property. This allows you to have parent and child relationships.\n   * @param name Reference name\n   * @param id The reference id that points to a specific event\n   * @returns {EventBuilder}\n     */\n  public setEventReference(name: string, id: string): EventBuilder {\n    if (!name) {\n      throw new Error('Invalid name');\n    }\n\n    if (!id || !this.isValidIdentifier(id)) {\n      throw new Error(`Id ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.setProperty('@ref:' + name, id);\n    return this;\n  }\n\n  public setMessage(message: string): EventBuilder {\n    if (!!message) {\n      this.target.message = message;\n    }\n\n    return this;\n  }\n\n  public setGeo(latitude: number, longitude: number): EventBuilder {\n    if (latitude < -90.0 || latitude > 90.0) {\n      throw new Error('Must be a valid latitude value between -90.0 and 90.0.');\n    }\n\n    if (longitude < -180.0 || longitude > 180.0) {\n      throw new Error('Must be a valid longitude value between -180.0 and 180.0.');\n    }\n\n    this.target.geo = `${latitude},${longitude}`;\n    return this;\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): EventBuilder;\n  public setUserIdentity(identity: string): EventBuilder;\n  public setUserIdentity(identity: string, name: string): EventBuilder;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): EventBuilder {\n    let userInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n    if (!userInfo || (!userInfo.identity && !userInfo.name)) {\n      return this;\n    }\n\n    this.setProperty('@user', userInfo);\n    return this;\n  }\n\n  /**\n   * Sets the user's description of the event.\n   *\n   * @param emailAddress The email address\n   * @param description The user's description of the event.\n   * @returns {EventBuilder}\n     */\n  public setUserDescription(emailAddress: string, description: string): EventBuilder {\n    if (emailAddress && description) {\n      this.setProperty('@user_description', { email_address: emailAddress, description: description });\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting manual\n   * stacking information.\n   * @param signatureData A dictionary of strings to use for stacking.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingInfo(signatureData: any, title?: string) {\n    if (signatureData) {\n      let stack = <IManualStackingInfo>{\n        signature_data: signatureData\n      };\n      if (title) {\n        stack.title = title;\n      }\n      this.setProperty('@stack', stack);\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting the stacking key.\n   * @param manualStackingKey The manual stacking key.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingKey(manualStackingKey: string, title?: string): EventBuilder {\n    if (manualStackingKey) {\n      let data = {\n        'ManualStackingKey': manualStackingKey\n      };\n      this.setManualStackingInfo(data, title);\n    }\n\n    return this;\n  }\n\n  public setValue(value: number): EventBuilder {\n    if (!!value) {\n      this.target.value = value;\n    }\n\n    return this;\n  }\n\n  public addTags(...tags: string[]): EventBuilder {\n    this.target.tags = Utils.addRange<string>(this.target.tags, ...tags);\n    return this;\n  }\n\n  /**\n   * Adds the object to extended data. Uses @excludedPropertyNames\n   * to exclude data from being included in the event.\n   * @param name The data object to add.\n   * @param value The name of the object to add.\n   * @param maxDepth The max depth of the object to include.\n   * @param excludedPropertyNames Any property names that should be excluded.\n   */\n  public setProperty(name: string, value: any, maxDepth?: number, excludedPropertyNames?: string[]): EventBuilder {\n    if (!name || (value === undefined || value == null)) {\n      return this;\n    }\n\n    if (!this.target.data) {\n      this.target.data = {};\n    }\n\n    let result = JSON.parse(Utils.stringify(value, this.client.config.dataExclusions.concat(excludedPropertyNames || []), maxDepth));\n    if (!Utils.isEmpty(result)) {\n      this.target.data[name] = result;\n    }\n\n    return this;\n  }\n\n  public markAsCritical(critical: boolean): EventBuilder {\n    if (critical) {\n      this.addTags('Critical');\n    }\n\n    return this;\n  }\n\n  public addRequestInfo(request: Object): EventBuilder {\n    if (!!request) {\n      this.pluginContextData['@request'] = request;\n    }\n\n    return this;\n  }\n\n  public submit(callback?: (context: EventPluginContext) => void): void {\n    this.client.submitEvent(this.target, this.pluginContextData, callback);\n  }\n\n  private isValidIdentifier(value: string): boolean {\n    if (!value) {\n      return true;\n    }\n\n    if (value.length < 8 || value.length > 100) {\n      return false;\n    }\n\n    for (let index = 0; index < value.length; index++) {\n      let code = value.charCodeAt(index);\n      let isDigit = (code >= 48) && (code <= 57);\n      let isLetter = ((code >= 65) && (code <= 90)) || ((code >= 97) && (code <= 122));\n      let isMinus = code === 45;\n\n      if (!(isDigit || isLetter) && !isMinus) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n}\n\nexport interface IUserDescription {\n  email_address?: string;\n  description?: string;\n  data?: any;\n}\n\nexport class ContextData {\n  public setException(exception: Error): void {\n    if (exception) {\n      this['@@_Exception'] = exception;\n    }\n  }\n\n  public get hasException(): boolean {\n    return !!this['@@_Exception'];\n  }\n\n  public getException(): Error {\n    return this['@@_Exception'] || null;\n  }\n\n  public markAsUnhandledError(): void {\n    this['@@_IsUnhandledError'] = true;\n  }\n\n  public get isUnhandledError(): boolean {\n    return !!this['@@_IsUnhandledError'];\n  }\n\n  public setSubmissionMethod(method: string): void {\n    if (method) {\n      this['@@_SubmissionMethod'] = method;\n    }\n  }\n\n  public getSubmissionMethod(): string {\n    return this['@@_SubmissionMethod'] || null;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          \n\nexport class ExceptionlessClient {\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   * @private\n   */\n  private static _instance: ExceptionlessClient = null;\n\n  public config: Configuration;\n\n  private _intervalId: any;\n  private _timeoutId: any;\n\n  constructor();\n  constructor(settings: IConfigurationSettings);\n  constructor(apiKey: string, serverUrl?: string);\n  constructor(settingsOrApiKey?: IConfigurationSettings | string, serverUrl?: string) {\n    if (typeof settingsOrApiKey === 'object') {\n      this.config = new Configuration(settingsOrApiKey);\n    } else {\n      this.config = new Configuration({ apiKey: <string>settingsOrApiKey, serverUrl: serverUrl });\n    }\n\n    this.updateSettingsTimer(5000);\n    this.config.onChanged((config) => this.updateSettingsTimer(this._timeoutId > 0 ? 5000 : 0));\n    this.config.queue.onEventsPosted((events, response) =>  this.updateSettingsTimer());\n  }\n\n  public createException(exception: Error): EventBuilder {\n    let pluginContextData = new ContextData();\n    pluginContextData.setException(exception);\n    return this.createEvent(pluginContextData).setType('error');\n  }\n\n  public submitException(exception: Error, callback?: (context: EventPluginContext) => void): void {\n    this.createException(exception).submit(callback);\n  }\n\n  public createUnhandledException(exception: Error, submissionMethod?: string): EventBuilder {\n    let builder = this.createException(exception);\n    builder.pluginContextData.markAsUnhandledError();\n    builder.pluginContextData.setSubmissionMethod(submissionMethod);\n\n    return builder;\n  }\n\n  public submitUnhandledException(exception: Error, submissionMethod?: string, callback?: (context: EventPluginContext) => void) {\n    this.createUnhandledException(exception, submissionMethod).submit(callback);\n  }\n\n  public createFeatureUsage(feature: string): EventBuilder {\n    return this.createEvent().setType('usage').setSource(feature);\n  }\n\n  public submitFeatureUsage(feature: string, callback?: (context: EventPluginContext) => void): void {\n    this.createFeatureUsage(feature).submit(callback);\n  }\n\n  public createLog(message: string): EventBuilder;\n  public createLog(source: string, message: string): EventBuilder;\n  public createLog(source: string, message: string, level: string): EventBuilder;\n  public createLog(sourceOrMessage: string, message?: string, level?: string): EventBuilder {\n    let builder = this.createEvent().setType('log');\n\n    if (message && level) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message).setProperty('@level', level);\n    } else if (message) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message);\n    } else {\n      // TODO: Look into using https: //www.stevefenton.co.uk/Content/Blog/Date/201304/Blog/Obtaining-A-Class-Name-At-Runtime-In-TypeScript/\n      let caller: any = arguments.callee.caller;\n      builder = builder.setSource(caller && caller.name).setMessage(sourceOrMessage);\n    }\n\n    return builder;\n  }\n\n  public submitLog(message: string): void;\n  public submitLog(source: string, message: string): void;\n  public submitLog(source: string, message: string, level: string, callback?: (context: EventPluginContext) => void): void;\n  public submitLog(sourceOrMessage: string, message?: string, level?: string, callback?: (context: EventPluginContext) => void): void {\n    this.createLog(sourceOrMessage, message, level).submit(callback);\n  }\n\n  public createNotFound(resource: string): EventBuilder {\n    return this.createEvent().setType('404').setSource(resource);\n  }\n\n  public submitNotFound(resource: string, callback?: (context: EventPluginContext) => void): void {\n    this.createNotFound(resource).submit(callback);\n  }\n\n  public createSessionStart(): EventBuilder {\n    return this.createEvent().setType('session');\n  }\n\n  public submitSessionStart(callback?: (context: EventPluginContext) => void): void {\n    this.createSessionStart().submit(callback);\n  }\n\n  public submitSessionEnd(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session end: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, true, this.config);\n    }\n  }\n\n  public submitSessionHeartbeat(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session heartbeat: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, false, this.config);\n    }\n  }\n\n  public createEvent(pluginContextData?: ContextData): EventBuilder {\n    return new EventBuilder({ date: new Date() }, this, pluginContextData);\n  }\n\n  /**\n   * Submits the event to be sent to the server.\n   * @param event The event data.\n   * @param pluginContextData Any contextual data objects to be used by Exceptionless plugins to gather default information for inclusion in the report information.\n   * @param callback\n   */\n  public submitEvent(event: IEvent, pluginContextData?: ContextData, callback?: (context: EventPluginContext) => void): void {\n    function cancelled(context: EventPluginContext) {\n      if (!!context) {\n        context.cancelled = true;\n      }\n\n      return !!callback && callback(context);\n    }\n\n    let context = new EventPluginContext(this, event, pluginContextData);\n    if (!event) {\n      return cancelled(context);\n    }\n\n    if (!this.config.enabled) {\n      this.config.log.info('Event submission is currently disabled.');\n      return cancelled(context);\n    }\n\n    if (!event.data) {\n      event.data = {};\n    }\n\n    if (!event.tags || !event.tags.length) {\n      event.tags = [];\n    }\n\n    EventPluginManager.run(context, function (ctx: EventPluginContext) {\n      let config = ctx.client.config;\n      let ev = ctx.event;\n\n      if (!ctx.cancelled) {\n        // ensure all required data\n        if (!ev.type || ev.type.length === 0) {\n          ev.type = 'log';\n        }\n\n        if (!ev.date) {\n          ev.date = new Date();\n        }\n\n        config.queue.enqueue(ev);\n\n        if (ev.reference_id && ev.reference_id.length > 0) {\n          ctx.log.info(`Setting last reference id '${ev.reference_id}'`);\n          config.lastReferenceIdManager.setLast(ev.reference_id);\n        }\n      }\n\n      !!callback && callback(ctx);\n    });\n  }\n\n  /**\n   * Updates the user's email address and description of an event for the specified reference id.\n   * @param referenceId The reference id of the event to update.\n   * @param email The user's email address to set on the event.\n   * @param description The user's description of the event.\n   * @param callback The submission response.\n   */\n  public updateUserEmailAndDescription(referenceId: string, email: string, description: string, callback?: (response: SubmissionResponse) => void) {\n    if (!referenceId || !email || !description || !this.config.enabled) {\n      return !!callback && callback(new SubmissionResponse(500, 'cancelled'));\n    }\n\n    let userDescription: IUserDescription = { email_address: email, description: description };\n    this.config.submissionClient.postUserDescription(referenceId, userDescription, this.config, (response: SubmissionResponse) => {\n      if (!response.success) {\n        this.config.log.error(`Failed to submit user email and description for event '${referenceId}': ${response.statusCode} ${response.message}`);\n      }\n\n      !!callback && callback(response);\n    });\n  }\n\n  /**\n   * Gets the last event client id that was submitted to the server.\n   * @returns {string} The event client id.\n   */\n  public getLastReferenceId(): string {\n    return this.config.lastReferenceIdManager.getLast();\n  }\n\n  private updateSettingsTimer(initialDelay?: number) {\n    this.config.log.info(`Updating settings timer with delay: ${initialDelay}`);\n\n    this._timeoutId = clearTimeout(this._timeoutId);\n    this._timeoutId = clearInterval(this._intervalId);\n\n    let interval = this.config.updateSettingsWhenIdleInterval;\n    if (interval > 0) {\n      let updateSettings = () => SettingsManager.updateSettings(this.config);\n      if (initialDelay > 0) {\n        this._timeoutId = setTimeout(updateSettings, initialDelay);\n      }\n\n      this._intervalId = setInterval(updateSettings, interval);\n    }\n  }\n\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   */\n  public static get default() {\n    if (ExceptionlessClient._instance === null) {\n      ExceptionlessClient._instance = new ExceptionlessClient(null);\n    }\n\n    return ExceptionlessClient._instance;\n  }\n}\n\nexport interface IManualStackingInfo {\n  title?: string;\n  signature_data?: any;\n}\n\nexport interface IModule {\n  data?: any;\n\n  module_id?: number;\n  name?: string;\n  version?: string;\n  is_entry?: boolean;\n  created_date?: Date;\n  modified_date?: Date;\n}\n\nexport interface IRequestInfo {\n  user_agent?: string;\n  http_method?: string;\n  is_secure?: boolean;\n  host?: string;\n  port?: number;\n  path?: string;\n  referrer?: string;\n  client_ip_address?: string;\n  cookies?: any;\n  post_data?: any;\n  query_string?: any;\n  data?: any;\n}\n\nexport interface IEnvironmentInfo {\n  processor_count?: number;\n  total_physical_memory?: number;\n  available_physical_memory?: number;\n  command_line?: string;\n  process_name?: string;\n  process_id?: string;\n  process_memory_size?: number;\n  thread_id?: string;\n  architecture?: string;\n  o_s_name?: string;\n  o_s_version?: string;\n  ip_address?: string;\n  machine_name?: string;\n  install_id?: string;\n  runtime_version?: string;\n  data?: any;\n}\n\nexport interface IParameter {\n  data?: any;\n  generic_arguments?: string[];\n\n  name?: string;\n  type?: string;\n  type_namespace?: string;\n}\n\n                                          \n\nexport interface IMethod {\n  data?: any;\n  generic_arguments?: string[];\n  parameters?: IParameter[];\n\n  is_signature_target?: boolean;\n  declaring_namespace?: string;\n  declaring_type?: string;\n  name?: string;\n  module_id?: number;\n}\n\n                                    \n\nexport interface IStackFrame extends IMethod {\n  file_name?: string;\n  line_number?: number;\n  column?: number;\n}\n\n                                                                                 \n\nexport interface IInnerError {\n  message?: string;\n  type?: string;\n  code?: string;\n  data?: any;\n  inner?: IInnerError;\n  stack_trace?: IStackFrame[];\n  target_method?: IMethod;\n}\n\n                                                                                                                                                \n\nexport class ConfigurationDefaultsPlugin implements IEventPlugin {\n  public priority: number = 10;\n  public name: string = 'ConfigurationDefaultsPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let config = context.client.config;\n    let defaultTags: string[] = config.defaultTags || [];\n    for (let index = 0; index < defaultTags.length; index++) {\n      let tag = defaultTags[index];\n      if (!!tag && context.event.tags.indexOf(tag) < 0) {\n        context.event.tags.push(tag);\n      }\n    }\n\n    let defaultData: Object = config.defaultData || {};\n    for (let key in defaultData) {\n      if (!!defaultData[key]) {\n        let result = JSON.parse(Utils.stringify(defaultData[key], config.dataExclusions));\n        if (!Utils.isEmpty(result)) {\n          context.event.data[key] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ErrorPlugin implements IEventPlugin {\n  public priority: number = 30;\n  public name: string = 'ErrorPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n    let ignoredProperties: string[] = [\n      'arguments',\n      'column',\n      'columnNumber',\n      'description',\n      'fileName',\n      'message',\n      'name',\n      'number',\n      'line',\n      'lineNumber',\n      'opera#sourceloc',\n      'sourceId',\n      'sourceURL',\n      'stack',\n      'stackArray',\n      'stacktrace'\n    ];\n\n    let exception = context.contextData.getException();\n    if (!!exception) {\n      context.event.type = 'error';\n\n      if (!context.event.data[ERROR_KEY]) {\n        let config = context.client.config;\n        let parser = config.errorParser;\n        if (!parser) {\n          throw new Error('No error parser was defined.');\n        }\n\n        let result = parser.parse(context, exception);\n        if (!!result) {\n          let additionalData = JSON.parse(Utils.stringify(exception, config.dataExclusions.concat(ignoredProperties)));\n          if (!Utils.isEmpty(additionalData)) {\n            if (!result.data) {\n              result.data = {};\n            }\n            result.data['@ext'] = additionalData;\n          }\n\n          context.event.data[ERROR_KEY] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                           \n\nexport class ModuleInfoPlugin implements IEventPlugin {\n  public priority: number = 50;\n  public name: string = 'ModuleInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n\n    let collector = context.client.config.moduleCollector;\n    if (context.event.data[ERROR_KEY] && !context.event.data['@error'].modules && !!collector) {\n      let modules: IModule[] = collector.getModules(context);\n      if (modules && modules.length > 0) {\n        context.event.data[ERROR_KEY].modules = modules;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                          \n\nexport class RequestInfoPlugin implements IEventPlugin {\n  public priority: number = 70;\n  public name: string = 'RequestInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const REQUEST_KEY: string = '@request'; // optimization for minifier.\n\n    let config = context.client.config;\n    let collector = config.requestInfoCollector;\n    if (!context.event.data[REQUEST_KEY] && !!collector) {\n      let requestInfo: IRequestInfo = collector.getRequestInfo(context);\n      if (!!requestInfo) {\n        if (Utils.isMatch(requestInfo.user_agent, config.userAgentBotPatterns)) {\n          context.log.info('Cancelling event as the request user agent matches a known bot pattern');\n          context.cancelled = true;\n        } else {\n          context.event.data[REQUEST_KEY] = requestInfo;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                             \n\nexport class EnvironmentInfoPlugin implements IEventPlugin {\n  public priority: number = 80;\n  public name: string = 'EnvironmentInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ENVIRONMENT_KEY: string = '@environment'; // optimization for minifier.\n\n    let collector = context.client.config.environmentInfoCollector;\n    if (!context.event.data[ENVIRONMENT_KEY] && collector) {\n      let environmentInfo: IEnvironmentInfo = collector.getEnvironmentInfo(context);\n      if (!!environmentInfo) {\n        context.event.data[ENVIRONMENT_KEY] = environmentInfo;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                           \n\nexport class SubmissionMethodPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'SubmissionMethodPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let submissionMethod: string = context.contextData.getSubmissionMethod();\n    if (!!submissionMethod) {\n      context.event.data['@submission_method'] = submissionMethod;\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                   \n\nexport class DuplicateCheckerPlugin implements IEventPlugin {\n  public priority: number = 40;\n  public name: string = 'DuplicateCheckerPlugin';\n\n  private _processedHashcodes: TimestampedHash[] = [];\n  private _getCurrentTime: () => number;\n\n  constructor(getCurrentTime: () => number = () => Date.now()) {\n    this._getCurrentTime = getCurrentTime;\n  }\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function isDuplicate(error: IInnerError, processedHashcodes, now, log: ILog): boolean {\n      while (error) {\n        let hashCode = Utils.getHashCode(error.stack_trace && JSON.stringify(error.stack_trace));\n\n        // Only process the unique errors times within a 2 second window.\n        if (hashCode && processedHashcodes.some(h => h.hash === hashCode && h.timestamp >= (now - 2000))) {\n          log.info(`Ignoring duplicate error event hash: ${hashCode}`);\n          return true;\n        }\n\n        // Add this exception to our list of recent processed errors.\n        processedHashcodes.push({ hash: hashCode, timestamp: now });\n\n        // Only keep the last 20 recent errors.\n        while (processedHashcodes.length > 20) {\n          processedHashcodes.shift();\n        }\n\n        error = error.inner;\n      }\n\n      return false;\n    }\n\n    if (context.event.type === 'error') {\n      if (isDuplicate(context.event.data['@error'], this._processedHashcodes, this._getCurrentTime(), context.log)) {\n        context.cancelled = true;\n        return;\n      }\n    }\n\n    next && next();\n  }\n}\n\ninterface TimestampedHash {\n  hash: number;\n  timestamp: number;\n}\n\n                                                                                                                                                                                                        \n\nexport class EventExclusionPlugin implements IEventPlugin {\n  public priority: number = 45;\n  public name: string = 'EventExclusionPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function getLogLevel(level: string): number {\n      switch ((level || '').toLowerCase().trim()) {\n        case 'trace':\n        case 'true':\n        case '1':\n        case 'yes':\n          return 0;\n        case 'debug':\n          return 1;\n        case 'info':\n          return 2;\n        case 'warn':\n          return 3;\n        case 'error':\n          return 4;\n        case 'fatal':\n          return 5;\n        case 'off':\n        case 'false':\n        case '0':\n        case 'no':\n          return 6;\n        default:\n          return -1;\n      }\n    }\n\n    function getMinLogLevel(settings: Object, loggerName: string = '*'): number {\n      return getLogLevel(getTypeAndSourceSetting(settings, 'log', loggerName, 'Trace') + '');\n    }\n\n    function getTypeAndSourceSetting(settings: Object = {}, type: string, source: string, defaultValue: string|boolean = undefined): string|boolean {\n      if (!type) {\n        return defaultValue;\n      }\n\n      let isLog = type === 'log';\n      let sourcePrefix =  `@@${type}:`;\n\n      let value = settings[sourcePrefix + source];\n      if (value) {\n        return !isLog ? Utils.toBoolean(value) : value;\n      }\n\n      // check for wildcard match\n      for (let key in settings) {\n        if (Utils.startsWith(key.toLowerCase(), sourcePrefix.toLowerCase()) && Utils.isMatch(source, [key.substring(sourcePrefix.length)])) {\n          return !isLog ? Utils.toBoolean(settings[key]) : settings[key];\n        }\n      }\n\n      return defaultValue;\n    }\n\n    let ev = context.event;\n    let log = context.log;\n    let settings = context.client.config.settings;\n\n    if (ev.type === 'log') {\n      let minLogLevel = getMinLogLevel(settings, ev.source);\n      let logLevel = getLogLevel(ev.data['@level']);\n\n      if (logLevel >= 0 && (logLevel > 5 || logLevel < minLogLevel)) {\n        log.info('Cancelling log event due to minimum log level.');\n        context.cancelled = true;\n      }\n    } else if (ev.type === 'error') {\n      let error: IInnerError = ev.data['@error'];\n      while (!context.cancelled && error) {\n        if (getTypeAndSourceSetting(settings, ev.type, error.type, true) === false) {\n          log.info(`Cancelling error from excluded exception type: ${error.type}`);\n          context.cancelled = true;\n        }\n\n        error = error.inner;\n      }\n    } else if (getTypeAndSourceSetting(settings, ev.type, ev.source, true) === false) {\n      log.info(`Cancelling event from excluded type: ${ev.type} and source: ${ev.source}`);\n      context.cancelled = true;\n    }\n\n    next && next();\n  }\n}\n\nexport class SettingsResponse {\n  public success: boolean = false;\n  public settings: any;\n  public settingsVersion: number = -1;\n  public message: string;\n  public exception: any;\n\n  constructor(success: boolean, settings: any, settingsVersion: number = -1, exception: any = null, message: string = null) {\n    this.success = success;\n    this.settings = settings;\n    this.settingsVersion = settingsVersion;\n    this.exception = exception;\n    this.message = message;\n  }\n}\n\n                                                                                 \n\nexport interface IError extends IInnerError {\n  modules?: IModule[];\n}\n\nexport interface IStorageItem {\n  timestamp: number;\n  value: any;\n}\n\n                                              \n\nexport interface IStorage {\n  save(value: any): number;\n  get(limit?: number): IStorageItem[];\n  remove(timestamp: number): void;\n  clear(): void;\n}\n\nexport interface SubmissionCallback {\n  (status: number, message: string, data?: string, headers?: Object): void;\n}\n\nexport interface SubmissionRequest {\n  apiKey: string;\n  userAgent: string;\n  method: string;\n  url: string;\n  data: string;\n}\n\n                                                                                     \n\nexport class InMemoryStorage implements IStorage {\n  private maxItems: number;\n  private items: IStorageItem[] = [];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems: number) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any): number {\n    if (!value) {\n      return null;\n    }\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let item = { timestamp, value };\n\n    if (items.push(item) > this.maxItems) {\n      items.shift();\n    }\n\n    this.lastTimestamp = timestamp;\n    return item.timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    return this.items.slice(0, limit);\n  }\n\n  public remove(timestamp: number): void {\n    let items = this.items;\n    for (let i = 0; i < items.length; i++) {\n      if (items[i].timestamp === timestamp) {\n        items.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n  public clear(): void {\n    this.items = [];\n  }\n}\n\nexport interface IClientConfiguration {\n  settings: Object;\n  version: number;\n}\n\n                                                                                     \n\nexport abstract class KeyValueStorageBase implements IStorage {\n  private maxItems: number;\n  private items: number[];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any, single?: boolean): number {\n    if (!value) {\n      return null;\n    }\n\n    this.ensureIndex();\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let key = this.getKey(timestamp);\n    let json = JSON.stringify(value);\n\n    try {\n      this.write(key, json);\n      this.lastTimestamp = timestamp;\n      if (items.push(timestamp) > this.maxItems) {\n        this.delete(this.getKey(items.shift()));\n      }\n    } catch (e) {\n      return null;\n    }\n\n    return timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    this.ensureIndex();\n\n    return this.items.slice(0, limit)\n      .map(timestamp => {\n        // Read and parse item for this timestamp\n        let key = this.getKey(timestamp);\n        try {\n          let json = this.read(key);\n          let value = JSON.parse(json, parseDate);\n          return { timestamp, value };\n        } catch (error) {\n          // Something went wrong - try to delete the cause.\n          this.safeDelete(key);\n          return null;\n        }\n      })\n      .filter(item => item != null);\n  }\n\n  public remove(timestamp: number): void {\n    this.ensureIndex();\n\n    let items = this.items;\n    let index = items.indexOf(timestamp);\n    if (index >= 0) {\n      let key = this.getKey(timestamp);\n      this.safeDelete(key);\n      items.splice(index, 1);\n    };\n  }\n\n  public clear(): void {\n    this.items.forEach(item => this.safeDelete(this.getKey(item)));\n    this.items = [];\n  }\n\n  protected abstract write(key: string, value: string): void;\n  protected abstract read(key: string): string;\n  protected abstract readAllKeys(): string[];\n  protected abstract delete(key: string);\n  protected abstract getKey(timestamp: number): string;\n  protected abstract getTimestamp(key: string): number;\n\n  private ensureIndex() {\n    if (!this.items) {\n      this.items = this.createIndex();\n      this.lastTimestamp = Math.max(0, ...this.items) + 1;\n    }\n  }\n\n  private safeDelete(key: string): void {\n    try {\n      this.delete(key);\n    } catch (error) {\n    }\n  }\n\n  private createIndex() {\n    try {\n      let keys = this.readAllKeys();\n      return keys.map(key => {\n        try {\n          let timestamp = this.getTimestamp(key);\n          if (!timestamp) {\n            this.safeDelete(key);\n            return null;\n          }\n          return timestamp;\n        } catch (error) {\n          this.safeDelete(key);\n          return null;\n        }\n      }).filter(timestamp => timestamp != null)\n        .sort((a, b) => a - b);\n    } catch (error) {\n      return [];\n    }\n  }\n}\n\nfunction parseDate(key, value) {\n  let dateRegx = /\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/g;\n  if (typeof value === 'string') {\n    let a = dateRegx.exec(value);\n    if (a) {\n      return new Date(value);\n    }\n  }\n  return value;\n};\n\n                                                            \n\nexport class BrowserStorage extends KeyValueStorageBase {\n  private prefix: string;\n\n  public static isAvailable(): boolean {\n    try {\n      let storage = window.localStorage,\n        x = '__storage_test__';\n      storage.setItem(x, x);\n      storage.removeItem(x);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  constructor(namespace: string, prefix: string = 'com.exceptionless.', maxItems: number = 20) {\n    super(maxItems);\n\n    this.prefix = prefix + namespace + '-';\n  }\n\n  public write(key: string, value: string) {\n    window.localStorage.setItem(key, value);\n  }\n\n  public read(key: string) {\n    return window.localStorage.getItem(key);\n  }\n\n  public readAllKeys() {\n    return Object.keys(window.localStorage)\n      .filter(key => key.indexOf(this.prefix) === 0);\n  }\n\n  public delete(key: string) {\n    window.localStorage.removeItem(key);\n  }\n\n  public getKey(timestamp) {\n    return this.prefix + timestamp;\n  }\n\n  public getTimestamp(key) {\n    return parseInt(key.substr(this.prefix.length), 10);\n  }\n}\n\n                                                                                                                                                                                                                                                                                                           \n\nexport class DefaultErrorParser implements IErrorParser {\n  public parse(context: EventPluginContext, exception: Error): IError {\n    function getParameters(parameters: string | string[]): IParameter[] {\n      let params: string[] = (typeof parameters === 'string' ? [parameters] : parameters) || [];\n\n      let result: IParameter[] = [];\n      for (let index = 0; index < params.length; index++) {\n        result.push({ name: params[index] });\n      }\n\n      return result;\n    }\n\n    function getStackFrames(stackFrames: TraceKit.StackFrame[]): IStackFrame[] {\n      const ANONYMOUS: string = '<anonymous>';\n      let frames: IStackFrame[] = [];\n\n      for (let index = 0; index < stackFrames.length; index++) {\n        let frame = stackFrames[index];\n        frames.push({\n          name: (frame.func || ANONYMOUS).replace('?', ANONYMOUS),\n          parameters: getParameters(frame.args),\n          file_name: frame.url,\n          line_number: frame.line || 0,\n          column: frame.column || 0\n        });\n      }\n\n      return frames;\n    }\n\n    const TRACEKIT_STACK_TRACE_KEY: string = '@@_TraceKit.StackTrace'; // optimization for minifier.\n\n    let stackTrace: TraceKit.StackTrace = !!context.contextData[TRACEKIT_STACK_TRACE_KEY]\n      ? context.contextData[TRACEKIT_STACK_TRACE_KEY]\n      : TraceKit.computeStackTrace(exception, 25);\n\n    if (!stackTrace) {\n      throw new Error('Unable to parse the exceptions stack trace.');\n    }\n\n    return {\n      type: stackTrace.name,\n      message: stackTrace.message || exception.message,\n      stack_trace: getStackFrames(stackTrace.stack || [])\n    };\n  }\n}\n\n                                                                                                                                                                                                         \n\nexport class DefaultModuleCollector implements IModuleCollector {\n  public getModules(context: EventPluginContext): IModule[] {\n    if (document && document.getElementsByTagName) {\n      return null;\n    }\n\n    let modules: IModule[] = [];\n    let scripts: NodeListOf<HTMLScriptElement> = document.getElementsByTagName('script');\n    if (scripts && scripts.length > 0) {\n      for (let index = 0; index < scripts.length; index++) {\n        if (scripts[index].src) {\n          modules.push({\n            module_id: index,\n            name: scripts[index].src,\n            version: Utils.parseVersion(scripts[index].src)\n          });\n        } else if (!!scripts[index].innerHTML) {\n          modules.push({\n            module_id: index,\n            name: 'Script Tag',\n            version: Utils.getHashCode(scripts[index].innerHTML).toString()\n          });\n        }\n      }\n    }\n\n    return modules;\n  }\n}\n\n                                                                                                                                                                                                                             \n\nexport class DefaultRequestInfoCollector implements IRequestInfoCollector {\n  public getRequestInfo(context: EventPluginContext): IRequestInfo {\n    if (!document || !navigator || !location) {\n      return null;\n    }\n\n    let exclusions = context.client.config.dataExclusions;\n    let requestInfo: IRequestInfo = {\n      user_agent: navigator.userAgent,\n      is_secure: location.protocol === 'https:',\n      host: location.hostname,\n      port: location.port && location.port !== '' ? parseInt(location.port, 10) : 80,\n      path: location.pathname,\n      // client_ip_address: 'TODO',\n      cookies: Utils.getCookies(document.cookie, exclusions),\n      query_string: Utils.parseQueryString(location.search.substring(1), exclusions)\n    };\n\n    if (document.referrer && document.referrer !== '') {\n      requestInfo.referrer = document.referrer;\n    }\n\n    return requestInfo;\n  }\n}\n\n                                                                                                                                                                              \n\ndeclare var XDomainRequest: { new (); create(); };\n\nexport class DefaultSubmissionAdapter implements ISubmissionAdapter {\n  public sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean) {\n    // TODO: Handle sending events when app is exiting with send beacon.\n    const TIMEOUT: string = 'timeout';  // optimization for minifier.\n    const LOADED: string = 'loaded';  // optimization for minifier.\n    const WITH_CREDENTIALS: string = 'withCredentials';  // optimization for minifier.\n\n    let isCompleted: boolean = false;\n    let useSetTimeout: boolean = false;\n    function complete(mode: string, xhr: XMLHttpRequest) {\n      function parseResponseHeaders(headerStr) {\n        function trim(value) {\n          return value.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n        }\n\n        let headers = {};\n        let headerPairs = (headerStr || '').split('\\u000d\\u000a');\n        for (let index: number = 0; index < headerPairs.length; index++) {\n          let headerPair = headerPairs[index];\n          // Can't use split() here because it does the wrong thing\n          // if the header value has the string \": \" in it.\n          let separator = headerPair.indexOf('\\u003a\\u0020');\n          if (separator > 0) {\n            headers[trim(headerPair.substring(0, separator).toLowerCase())] = headerPair.substring(separator + 2);\n          }\n        }\n\n        return headers;\n      }\n\n      if (isCompleted) {\n        return;\n      }\n\n      isCompleted = true;\n\n      let message: string = xhr.statusText;\n      let responseText: string = xhr.responseText;\n      let status: number = xhr.status;\n\n      if (mode === TIMEOUT || status === 0) {\n        message = 'Unable to connect to server.';\n        status = 0;\n      } else if (mode === LOADED && !status) {\n        status = request.method === 'POST' ? 202 : 200;\n      } else if (status < 200 || status > 299) {\n        let responseBody: any = xhr.responseBody;\n        if (!!responseBody && !!responseBody.message) {\n          message = responseBody.message;\n        } else if (!!responseText && responseText.indexOf('message') !== -1) {\n          try {\n            message = JSON.parse(responseText).message;\n          } catch (e) {\n            message = responseText;\n          }\n        }\n      }\n\n      callback && callback(status || 500, message || '', responseText, parseResponseHeaders(xhr.getAllResponseHeaders && xhr.getAllResponseHeaders()));\n    }\n\n    function createRequest(userAgent: string, method: string, url: string): XMLHttpRequest {\n      let xhr: any = new XMLHttpRequest();\n      if (WITH_CREDENTIALS in xhr) {\n        xhr.open(method, url, true);\n\n        xhr.setRequestHeader('X-Exceptionless-Client', userAgent);\n        if (method === 'POST') {\n          xhr.setRequestHeader('Content-Type', 'application/json');\n        }\n      } else if (typeof XDomainRequest !== 'undefined') {\n        useSetTimeout = true;\n        xhr = new XDomainRequest();\n        xhr.open(method, location.protocol === 'http:' ? url.replace('https:', 'http:') : url);\n      } else {\n        xhr = null;\n      }\n\n      if (xhr) {\n        xhr.timeout = 10000;\n      }\n\n      return xhr;\n    }\n\n    let url = `${request.url}${(request.url.indexOf('?') === -1 ? '?' : '&')}access_token=${encodeURIComponent(request.apiKey)}`;\n    let xhr = createRequest(request.userAgent, request.method || 'POST', url);\n    if (!xhr) {\n      return (callback && callback(503, 'CORS not supported.'));\n    }\n\n    if (WITH_CREDENTIALS in xhr) {\n      xhr.onreadystatechange = () => {\n        // xhr not ready.\n        if (xhr.readyState !== 4) {\n          return;\n        }\n\n        complete(LOADED, xhr);\n      };\n    }\n\n    xhr.onprogress = () => { };\n    xhr.ontimeout = () => complete(TIMEOUT, xhr);\n    xhr.onerror = () => complete('error', xhr);\n    xhr.onload = () => complete(LOADED, xhr);\n\n    if (useSetTimeout) {\n      setTimeout(() => xhr.send(request.data), 500);\n    } else {\n      xhr.send(request.data);\n    }\n  }\n}\n\n                                                                                                                                                \n\nexport class BrowserStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(prefix?: string, maxQueueItems: number = 250) {\n    this.queue = new BrowserStorage('q', prefix, maxQueueItems);\n    this.settings = new BrowserStorage('settings', prefix, 1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    \n\nfunction getDefaultsSettingsFromScriptTag(): IConfigurationSettings {\n  if (!document || !document.getElementsByTagName) {\n    return null;\n  }\n\n  let scripts = document.getElementsByTagName('script');\n  for (let index = 0; index < scripts.length; index++) {\n    if (scripts[index].src && scripts[index].src.indexOf('/exceptionless') > -1) {\n      return Utils.parseQueryString(scripts[index].src.split('?').pop());\n    }\n  }\n  return null;\n}\n\nfunction processUnhandledException(stackTrace: TraceKit.StackTrace, options?: any): void {\n  let builder = ExceptionlessClient.default.createUnhandledException(new Error(stackTrace.message || (options || {}).status || 'Script error'), 'onerror');\n  builder.pluginContextData['@@_TraceKit.StackTrace'] = stackTrace;\n  builder.submit();\n}\n\n/*\nTODO: We currently are unable to parse string exceptions.\nfunction processJQueryAjaxError(event, xhr, settings, error:string): void {\n  let client = ExceptionlessClient.default;\n  if (xhr.status === 404) {\n    client.submitNotFound(settings.url);\n  } else if (xhr.status !== 401) {\n    client.createUnhandledException(error, 'JQuery.ajaxError')\n      .setSource(settings.url)\n      .setProperty('status', xhr.status)\n      .setProperty('request', settings.data)\n      .setProperty('response', xhr.responseText && xhr.responseText.slice && xhr.responseText.slice(0, 1024))\n      .submit();\n  }\n}\n*/\n\nConfiguration.prototype.useLocalStorage = function() {\n  if (BrowserStorage.isAvailable()) {\n    this.storage = new BrowserStorageProvider();\n    SettingsManager.applySavedServerSettings(this);\n    this.changed();\n  }\n};\n\nlet defaults = Configuration.defaults;\nlet settings = getDefaultsSettingsFromScriptTag();\nif (settings && (settings.apiKey || settings.serverUrl)) {\n  defaults.apiKey = settings.apiKey;\n  defaults.serverUrl = settings.serverUrl;\n}\n\ndefaults.errorParser = new DefaultErrorParser();\ndefaults.moduleCollector = new DefaultModuleCollector();\ndefaults.requestInfoCollector = new DefaultRequestInfoCollector();\ndefaults.submissionAdapter = new DefaultSubmissionAdapter();\n\nTraceKit.report.subscribe(processUnhandledException);\nTraceKit.extendToAsynchronousCallbacks();\n\n// window && window.addEventListener && window.addEventListener('beforeunload', function () {\n//   ExceptionlessClient.default.config.queue.process(true);\n// });\n\n// if (typeof $ !== 'undefined' && $(document)) {\n//   $(document).ajaxError(processJQueryAjaxError);\n// }\n\n(<any>Error).stackTraceLimit = Infinity;\n\ndeclare var $;\n\n"],"sourceRoot":"/source/"}
\ No newline at end of file
+{"version":3,"sources":["tracekit.js","exceptionless.min.js","/source/exceptionless.ts"],"names":["window","undefined","_has","object","key","Object","prototype","hasOwnProperty","call","_isUndefined","what","TraceKit","_oldTraceKit","_slice","slice","UNKNOWN_FUNCTION","noConflict","wrap","func","wrapped","apply","this","arguments","e","report","subscribe","handler","installGlobalHandler","handlers","push","unsubscribe","i","length","splice","notifyHandlers","stack","isWindowError","exception","collectWindowErrors","concat","inner","traceKitWindowOnError","message","url","lineNo","columnNo","errorObj","lastExceptionStack","computeStackTrace","augmentStackTraceWithInitialElement","processLastException","location","line","column","guessFunctionName","context","gatherContext","mode","_oldOnerrorHandler","_onErrorHandlerInstalled","onerror","_lastExceptionStack","_lastArgs","lastArgs","lastException","ex","setTimeout","incomplete","loadSource","remoteFetching","getXHR","XMLHttpRequest","ActiveXObject","request","open","send","responseText","getSource","sourceCache","source","domain","document","match","exec","split","m","reFunctionArgNames","reGuessFunction","maxLines","linesBefore","Math","floor","linesOfContext","linesAfter","start","max","end","min","escapeRegExp","text","replace","escapeCodeAsRegExpForMatchingInsideHTML","body","findSourceInUrls","re","urls","j","join","substring","index","lastIndexOf","findSourceInLine","fragment","RegExp","findSourceByFunctionBody","parts","result","href","scripts","getElementsByTagName","code","codeRE","eventRE","script","src","name","args","event","computeStackTraceFromStackProp","element","chrome","gecko","winjs","lines","reference","isNative","indexOf","columnNumber","computeStackTraceFromStacktraceProp","stacktrace","opera10Regex","opera11Regex","exc","computeStackTraceFromOperaMultiLineMessage","lineRE1","lineRE2","lineRE3","inlineScriptBlocks","s","item","relativeLine","pos","innerText","midline","stackInfo","initial","unshift","partial","computeStackTraceByWalkingCallerChain","depth","functionName","funcs","recursion","curr","caller","toString","input","description","sourceURL","fileName","lineNumber","debug","computeStackTraceOfCaller","Error","ofCaller","extendToAsynchronousCallbacks","_helper","fnName","originalFn","originalCallback","module","exports","define","amd","global","root","factory","require","exceptionless","parseDate","value","dateRegx","a","Date","getDefaultsSettingsFromScriptTag","Utils","parseQueryString","pop","processUnhandledException","stackTrace","options","builder","ExceptionlessClient","createUnhandledException","status","pluginContextData","submit","__extends","d","b","__","constructor","p","create","SubmissionResponse","statusCode","success","badRequest","serviceUnavailable","paymentRequired","unableToAuthenticate","notFound","requestEntityTooLarge","SettingsManager","onChanged","_handlers","applySavedServerSettings","config","isValid","savedSettings","getSavedServerSettings","log","info","version","settings","merge","changed","getVersion","checkVersion","currentVersion","updateSettings","_this","enabled","unableToUpdateMessage","error","submissionClient","getSettings","response","warn","savedServerSettings","newSettings","settingsVersion","storage","save","get","DefaultLastReferenceIdManager","_lastReferenceId","getLast","clearLast","setLast","eventId","ConsoleLog","level","console","NullLog","EventPluginContext","client","contextData","ContextData","defineProperty","enumerable","configurable","EventPluginManager","run","callback","plugin","next","cancelled","plugins","wrappedPlugins","priority","addDefaultPlugins","addPlugin","ConfigurationDefaultsPlugin","ErrorPlugin","DuplicateCheckerPlugin","EventExclusionPlugin","ModuleInfoPlugin","RequestInfoPlugin","EnvironmentInfoPlugin","SubmissionMethodPlugin","HeartbeatPlugin","heartbeatInterval","_interval","clearInterval","_intervalId","user","data","identity","setInterval","submitSessionHeartbeat","ReferenceIdPlugin","reference_id","type","guid","DefaultEventQueue","_processingQueue","_config","enqueue","eventWillNotBeQueued","areQueuedItemsDiscarded","ensureQueueTimer","timestamp","queue","logText","process","isAppExiting","queueNotProcessed","events_1","submissionBatchSize","serverUrl","postEvents","map","processSubmissionResponse","eventsPosted","suspendProcessing","durationInMinutes","discardFutureQueuedItems","clearQueue","_suspendProcessingUntil","getTime","_discardQueuedItemsUntil","clear","onEventsPosted","events","_queueTimer","onProcessQueue","isQueueProcessingSuspended","noSubmission","removeEvents","round","remove","InMemoryStorageProvider","maxQueueItems","InMemoryStorage","DefaultSubmissionClient","configurationVersionHeader","JSON","stringify","createRequest","cb","createSubmissionCallback","submissionAdapter","sendRequest","postUserDescription","referenceId","path","encodeURIComponent","headers","SettingsResponse","parse","isNaN","sendHeartbeat","sessionIdOrUserId","closeSession","heartbeatServerUrl","method","apiKey","userAgent","parseInt","addRange","target","values","_i","getHashCode","hash","character","charCodeAt","getCookies","cookies","exclusions","cookie","isMatch","isEmpty","s4","random","defaultValues","parseVersion","versionRegex","matches","query","pairs","pair","decodeURIComponent","randomNumber","patterns","ignoreCase","trim","toLowerCase","some","pattern","startsWithWildcard","endsWithWildcard","endsWith","startsWith","keys","prefix","suffix","maxDepth","stringifyImpl","obj","excludedKeys","cache","flattened","prop","toBoolean","defaultValue","Configuration","configSettings","inject","fn","defaultTags","defaultData","lastReferenceIdManager","_serverUrl","_heartbeatServerUrl","_updateSettingsWhenIdleInterval","_dataExclusions","_userAgentBotPatterns","_plugins","defaults","updateSettingsWhenIdleInterval","environmentInfoCollector","errorParser","moduleCollector","requestInfoCollector","_apiKey","set","addDataExclusions","addUserAgentBotPatterns","userAgentBotPatterns","sort","p1","p2","pluginOrName","pluginAction","pluginExists","removePlugin","setVersion","setUserIdentity","userInfoOrIdentity","USER_KEY","userInfo","shouldRemove","useSessions","sendHeartbeats","useReferenceIds","useLocalStorage","useDebugLogger","_defaultSettings","EventBuilder","_validIdentifierErrorMessage","setType","setSource","setReferenceId","isValidIdentifier","setEventReference","id","setProperty","setMessage","setGeo","latitude","longitude","geo","setUserDescription","emailAddress","email_address","setManualStackingInfo","signatureData","title","signature_data","setManualStackingKey","manualStackingKey","ManualStackingKey","setValue","addTags","tags","excludedPropertyNames","dataExclusions","markAsCritical","critical","addRequestInfo","submitEvent","isDigit","isLetter","isMinus","setException","getException","markAsUnhandledError","setSubmissionMethod","getSubmissionMethod","settingsOrApiKey","updateSettingsTimer","_timeoutId","createException","createEvent","submitException","submissionMethod","submitUnhandledException","createFeatureUsage","feature","submitFeatureUsage","createLog","sourceOrMessage","callee","submitLog","createNotFound","resource","submitNotFound","createSessionStart","submitSessionStart","submitSessionEnd","date","ctx","ev","updateUserEmailAndDescription","email","userDescription","getLastReferenceId","initialDelay","clearTimeout","interval","_instance","tag","ERROR_KEY","ignoredProperties","parser","additionalData","collector","modules","getModules","REQUEST_KEY","requestInfo","getRequestInfo","user_agent","ENVIRONMENT_KEY","environmentInfo","getEnvironmentInfo","getCurrentTime","now","_processedHashcodes","_getCurrentTime","isDuplicate","processedHashcodes","_loop_1","hashCode","stack_trace","h","shift","state_1","getLogLevel","getMinLogLevel","loggerName","getTypeAndSourceSetting","isLog","sourcePrefix","minLogLevel","logLevel","maxItems","items","lastTimestamp","limit","KeyValueStorageBase","single","ensureIndex","getKey","json","write","read","safeDelete","filter","forEach","createIndex","readAllKeys","getTimestamp","BrowserStorage","_super","namespace","isAvailable","localStorage","x","setItem","removeItem","getItem","substr","DefaultErrorParser","getParameters","parameters","params","getStackFrames","stackFrames","ANONYMOUS","frames","frame","file_name","line_number","TRACEKIT_STACK_TRACE_KEY","DefaultModuleCollector","module_id","innerHTML","DefaultRequestInfoCollector","navigator","is_secure","protocol","host","hostname","port","pathname","query_string","search","referrer","DefaultSubmissionAdapter","complete","xhr","parseResponseHeaders","headerStr","headerPairs","headerPair","separator","isCompleted","statusText","TIMEOUT","LOADED","responseBody","getAllResponseHeaders","WITH_CREDENTIALS","setRequestHeader","XDomainRequest","useSetTimeout","timeout","onreadystatechange","readyState","onprogress","ontimeout","onload","BrowserStorageProvider","stackTraceLimit","Infinity"],"mappings":"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","file":"exceptionless.min.js","sourcesContent":["/**\n * https://github.com/csnover/TraceKit\n * @license MIT\n * @namespace TraceKit\n */\n(function(window, undefined) {\nif (!window) {\n    return;\n}\n\nvar TraceKit = {};\nvar _oldTraceKit = window.TraceKit;\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n/**\n * A better form of hasOwnProperty<br/>\n * Example: `_has(MainHostObject, property) === true/false`\n *\n * @param {Object} object to check property\n * @param {string} key to check\n * @return {Boolean} true if the object has the key and it is not inherited\n */\nfunction _has(object, key) {\n    return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/**\n * Returns true if the parameter is undefined<br/>\n * Example: `_isUndefined(val) === true/false`\n *\n * @param {*} what Value to check\n * @return {Boolean} true if undefined and false otherwise\n */\nfunction _isUndefined(what) {\n    return typeof what === 'undefined';\n}\n\n/**\n * Export TraceKit out to another variable<br/>\n * Example: `var TK = TraceKit.noConflict()`\n * @return {Object} The TraceKit object\n * @memberof TraceKit\n */\nTraceKit.noConflict = function noConflict() {\n    window.TraceKit = _oldTraceKit;\n    return TraceKit;\n};\n\n/**\n * Wrap any function in a TraceKit reporter<br/>\n * Example: `func = TraceKit.wrap(func);`\n *\n * @param {Function} func Function to be wrapped\n * @return {Function} The wrapped func\n * @memberof TraceKit\n */\nTraceKit.wrap = function traceKitWrapper(func) {\n    function wrapped() {\n        try {\n            return func.apply(this, arguments);\n        } catch (e) {\n            TraceKit.report(e);\n            throw e;\n        }\n    }\n    return wrapped;\n};\n\n/**\n * Cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * ```js\n *   TraceKit.report.subscribe(function(stackInfo) { ... })\n *   TraceKit.report.unsubscribe(function(stackInfo) { ... })\n *   TraceKit.report(exception)\n *   try { ...code... } catch(ex) { TraceKit.report(ex); }\n * ```\n *\n * Supports:\n *   - Firefox: full stack trace with line numbers, plus column number\n *     on top frame; column number is not guaranteed\n *   - Opera: full stack trace with line and column numbers\n *   - Chrome: full stack trace with line and column numbers\n *   - Safari: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *   - IE: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n *   - IE5.5+ (only 8.0 tested)\n *   - Firefox 0.9+ (only 3.5+ tested)\n *   - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n *     Exceptions Have Stacktrace to be enabled in opera:config)\n *   - Safari 3+ (only 4+ tested)\n *   - Chrome 1+ (only 5+ tested)\n *   - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a TraceKit.StackTrace object as described in the\n * TraceKit.computeStackTrace docs.\n *\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.report = (function reportModuleWrapper() {\n    var handlers = [],\n        lastArgs = null,\n        lastException = null,\n        lastExceptionStack = null;\n\n    /**\n     * Add a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function subscribe(handler) {\n        installGlobalHandler();\n        handlers.push(handler);\n    }\n\n    /**\n     * Remove a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function unsubscribe(handler) {\n        for (var i = handlers.length - 1; i >= 0; --i) {\n            if (handlers[i] === handler) {\n                handlers.splice(i, 1);\n            }\n        }\n    }\n\n    /**\n     * Dispatch stack information to all handlers.\n     * @param {TraceKit.StackTrace} stack\n     * @param {boolean} isWindowError Is this a top-level window error?\n     * @memberof TraceKit.report\n     * @throws An exception if an error occurs while calling an handler.\n     */\n    function notifyHandlers(stack, isWindowError) {\n        var exception = null;\n        if (isWindowError && !TraceKit.collectWindowErrors) {\n          return;\n        }\n        for (var i in handlers) {\n            if (_has(handlers, i)) {\n                try {\n                    handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n                } catch (inner) {\n                    exception = inner;\n                }\n            }\n        }\n\n        if (exception) {\n            throw exception;\n        }\n    }\n\n    var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n    /**\n     * Ensures all global unhandled exceptions are recorded.\n     * Supported by Gecko and IE.\n     * @param {string} message Error message.\n     * @param {string} url URL of script that generated the exception.\n     * @param {(number|string)} lineNo The line number at which the error occurred.\n     * @param {(number|string)=} columnNo The column number at which the error occurred.\n     * @param {Error=} errorObj The actual Error object.\n     * @memberof TraceKit.report\n     */\n    function traceKitWindowOnError(message, url, lineNo, columnNo, errorObj) {\n        var stack = null;\n\n        if (lastExceptionStack) {\n            TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message);\n    \t    processLastException();\n\t    } else if (errorObj) {\n            stack = TraceKit.computeStackTrace(errorObj);\n            notifyHandlers(stack, true);\n        } else {\n            var location = {\n              'url': url,\n              'line': lineNo,\n              'column': columnNo\n            };\n            location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line);\n            location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line);\n            stack = {\n              'mode': 'onerror',\n              'message': message,\n              'stack': [location]\n            };\n\n            notifyHandlers(stack, true);\n        }\n\n        if (_oldOnerrorHandler) {\n            return _oldOnerrorHandler.apply(this, arguments);\n        }\n\n        return false;\n    }\n\n    /**\n     * Install a global onerror handler\n     * @memberof TraceKit.report\n     */\n    function installGlobalHandler () {\n        if (_onErrorHandlerInstalled === true) {\n            return;\n        }\n        _oldOnerrorHandler = window.onerror;\n        window.onerror = traceKitWindowOnError;\n        _onErrorHandlerInstalled = true;\n    }\n\n    /**\n     * Process the most recent exception\n     * @memberof TraceKit.report\n     */\n    function processLastException() {\n        var _lastExceptionStack = lastExceptionStack,\n            _lastArgs = lastArgs;\n        lastArgs = null;\n        lastExceptionStack = null;\n        lastException = null;\n        notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n    }\n\n    /**\n     * Reports an unhandled Error to TraceKit.\n     * @param {Error} ex\n     * @memberof TraceKit.report\n     * @throws An exception if an incomplete stack trace is detected (old IE browsers).\n     */\n    function report(ex) {\n        if (lastExceptionStack) {\n            if (lastException === ex) {\n                return; // already caught by an inner catch block, ignore\n            } else {\n              processLastException();\n            }\n        }\n\n        var stack = TraceKit.computeStackTrace(ex);\n        lastExceptionStack = stack;\n        lastException = ex;\n        lastArgs = _slice.call(arguments, 1);\n\n        // If the stack trace is incomplete, wait for 2 seconds for\n        // slow slow IE to see if onerror occurs or not before reporting\n        // this exception; otherwise, we will end up with an incomplete\n        // stack trace\n        window.setTimeout(function () {\n            if (lastException === ex) {\n                processLastException();\n            }\n        }, (stack.incomplete ? 2000 : 0));\n\n        throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n    }\n\n    report.subscribe = subscribe;\n    report.unsubscribe = unsubscribe;\n    return report;\n}());\n\n/**\n * An object representing a single stack frame.\n * @typedef {Object} StackFrame\n * @property {string} url The JavaScript or HTML file URL.\n * @property {string} func The function name, or empty for anonymous functions (if guessing did not work).\n * @property {string[]?} args The arguments passed to the function, if known.\n * @property {number=} line The line number, if known.\n * @property {number=} column The column number, if known.\n * @property {string[]} context An array of source code lines; the middle element corresponds to the correct line#.\n * @memberof TraceKit\n */\n\n/**\n * An object representing a JavaScript stack trace.\n * @typedef {Object} StackTrace\n * @property {string} name The name of the thrown exception.\n * @property {string} message The exception error message.\n * @property {TraceKit.StackFrame[]} stack An array of stack frames.\n * @property {string} mode 'stack', 'stacktrace', 'multiline', 'callers', 'onerror', or 'failed' -- method used to collect the stack trace.\n * @memberof TraceKit\n */\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n *   ```js\n *   s = TraceKit.computeStackTrace.ofCaller([depth])\n *   s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n *   ```\n *\n * Supports:\n *   - Firefox:  full stack trace with line numbers and unreliable column\n *               number on top frame\n *   - Opera 10: full stack trace with line and column numbers\n *   - Opera 9-: full stack trace with line numbers\n *   - Chrome:   full stack trace with line and column numbers\n *   - Safari:   line and column number for the topmost stacktrace element\n *               only\n *   - IE:       no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n *  * in Safari, some methods may be missing from the stack trace;\n *  * in IE, the topmost function in the stack trace will always be the\n *    caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n * Tracing example:\n *  ```js\n *     function trace(message) {\n *         var stackInfo = TraceKit.computeStackTrace.ofCaller();\n *         var data = message + \"\\n\";\n *         for(var i in stackInfo.stack) {\n *             var item = stackInfo.stack[i];\n *             data += (item.func || '[anonymous]') + \"() in \" + item.url + \":\" + (item.line || '0') + \"\\n\";\n *         }\n *         if (window.console)\n *             console.info(data);\n *         else\n *             alert(data);\n *     }\n * ```\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n    var debug = false,\n        sourceCache = {};\n\n    /**\n     * Attempts to retrieve source code via XMLHttpRequest, which is used\n     * to look up anonymous function names.\n     * @param {string} url URL of source code.\n     * @return {string} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function loadSource(url) {\n        if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on.\n            return '';\n        }\n        try {\n            var getXHR = function() {\n                try {\n                    return new window.XMLHttpRequest();\n                } catch (e) {\n                    // explicitly bubble up the exception if not found\n                    return new window.ActiveXObject('Microsoft.XMLHTTP');\n                }\n            };\n\n            var request = getXHR();\n            request.open('GET', url, false);\n            request.send('');\n            return request.responseText;\n        } catch (e) {\n            return '';\n        }\n    }\n\n    /**\n     * Retrieves source code from the source code cache.\n     * @param {string} url URL of source code.\n     * @return {Array.<string>} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function getSource(url) {\n        if (typeof url !== 'string') {\n            return [];\n        }\n\n        if (!_has(sourceCache, url)) {\n            // URL needs to be able to fetched within the acceptable domain.  Otherwise,\n            // cross-domain errors will be triggered.\n            /*\n                Regex matches:\n                0 - Full Url\n                1 - Protocol\n                2 - Domain\n                3 - Port (Useful for internal applications)\n                4 - Path\n            */\n            var source = '';\n            var domain = '';\n            try { domain = window.document.domain; } catch (e) { }\n            var match = /(.*)\\:\\/\\/([^:\\/]+)([:\\d]*)\\/{0,1}([\\s\\S]*)/.exec(url);\n            if (match && match[2] === domain) {\n                source = loadSource(url);\n            }\n            sourceCache[url] = source ? source.split('\\n') : [];\n        }\n\n        return sourceCache[url];\n    }\n\n    /**\n     * Tries to use an externally loaded copy of source code to determine\n     * the name of a function by looking at the name of the variable it was\n     * assigned to, if any.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} lineNo Line number in source code.\n     * @return {string} The function name, if discoverable.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function guessFunctionName(url, lineNo) {\n        var reFunctionArgNames = /function ([^(]*)\\(([^)]*)\\)/,\n            reGuessFunction = /['\"]?([0-9A-Za-z$_]+)['\"]?\\s*[:=]\\s*(function|eval|new Function)/,\n            line = '',\n            maxLines = 10,\n            source = getSource(url),\n            m;\n\n        if (!source.length) {\n            return UNKNOWN_FUNCTION;\n        }\n\n        // Walk backwards from the first line in the function until we find the line which\n        // matches the pattern above, which is the function definition\n        for (var i = 0; i < maxLines; ++i) {\n            line = source[lineNo - i] + line;\n\n            if (!_isUndefined(line)) {\n                if ((m = reGuessFunction.exec(line))) {\n                    return m[1];\n                } else if ((m = reFunctionArgNames.exec(line))) {\n                    return m[1];\n                }\n            }\n        }\n\n        return UNKNOWN_FUNCTION;\n    }\n\n    /**\n     * Retrieves the surrounding lines from where an exception occurred.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} line Line number in source code to centre\n     * around for context.\n     * @return {?Array.<string>} Lines of source code.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function gatherContext(url, line) {\n        var source = getSource(url);\n\n        if (!source.length) {\n            return null;\n        }\n\n        var context = [],\n            // linesBefore & linesAfter are inclusive with the offending line.\n            // if linesOfContext is even, there will be one extra line\n            //   *before* the offending line.\n            linesBefore = Math.floor(TraceKit.linesOfContext / 2),\n            // Add one extra line if linesOfContext is odd\n            linesAfter = linesBefore + (TraceKit.linesOfContext % 2),\n            start = Math.max(0, line - linesBefore - 1),\n            end = Math.min(source.length, line + linesAfter - 1);\n\n        line -= 1; // convert to 0-based index\n\n        for (var i = start; i < end; ++i) {\n            if (!_isUndefined(source[i])) {\n                context.push(source[i]);\n            }\n        }\n\n        return context.length > 0 ? context : null;\n    }\n\n    /**\n     * Escapes special characters, except for whitespace, in a string to be\n     * used inside a regular expression as a string literal.\n     * @param {string} text The string.\n     * @return {string} The escaped string literal.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeRegExp(text) {\n        return text.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#]/g, '\\\\$&');\n    }\n\n    /**\n     * Escapes special characters in a string to be used inside a regular\n     * expression as a string literal. Also ensures that HTML entities will\n     * be matched the same as their literal friends.\n     * @param {string} body The string.\n     * @return {string} The escaped string.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeCodeAsRegExpForMatchingInsideHTML(body) {\n        return escapeRegExp(body).replace('<', '(?:<|&lt;)').replace('>', '(?:>|&gt;)').replace('&', '(?:&|&amp;)').replace('\"', '(?:\"|&quot;)').replace(/\\s+/g, '\\\\s+');\n    }\n\n    /**\n     * Determines where a code fragment occurs in the source code.\n     * @param {RegExp} re The function definition.\n     * @param {Array.<string>} urls A list of URLs to search.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInUrls(re, urls) {\n        var source, m;\n        for (var i = 0, j = urls.length; i < j; ++i) {\n            // console.log('searching', urls[i]);\n            if ((source = getSource(urls[i])).length) {\n                source = source.join('\\n');\n                if ((m = re.exec(source))) {\n                    // console.log('Found function in ' + urls[i]);\n\n                    return {\n                        'url': urls[i],\n                        'line': source.substring(0, m.index).split('\\n').length,\n                        'column': m.index - source.lastIndexOf('\\n', m.index) - 1\n                    };\n                }\n            }\n        }\n\n        // console.log('no match');\n\n        return null;\n    }\n\n    /**\n     * Determines at which column a code fragment occurs on a line of the\n     * source code.\n     * @param {string} fragment The code fragment.\n     * @param {string} url The URL to search.\n     * @param {(string|number)} line The line number to examine.\n     * @return {?number} The column number.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInLine(fragment, url, line) {\n        var source = getSource(url),\n            re = new RegExp('\\\\b' + escapeRegExp(fragment) + '\\\\b'),\n            m;\n\n        line -= 1;\n\n        if (source && source.length > line && (m = re.exec(source[line]))) {\n            return m.index;\n        }\n\n        return null;\n    }\n\n    /**\n     * Determines where a function was defined within the source code.\n     * @param {(Function|string)} func A function reference or serialized\n     * function definition.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceByFunctionBody(func) {\n        if (_isUndefined(window && window.document)) {\n            return;\n        }\n\n        var urls = [window.location.href],\n            scripts = window.document.getElementsByTagName('script'),\n            body,\n            code = '' + func,\n            codeRE = /^function(?:\\s+([\\w$]+))?\\s*\\(([\\w\\s,]*)\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            eventRE = /^function on([\\w$]+)\\s*\\(event\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            re,\n            parts,\n            result;\n\n        for (var i = 0; i < scripts.length; ++i) {\n            var script = scripts[i];\n            if (script.src) {\n                urls.push(script.src);\n            }\n        }\n\n        if (!(parts = codeRE.exec(code))) {\n            re = new RegExp(escapeRegExp(code).replace(/\\s+/g, '\\\\s+'));\n        }\n\n        // not sure if this is really necessary, but I don’t have a test\n        // corpus large enough to confirm that and it was in the original.\n        else {\n            var name = parts[1] ? '\\\\s+' + parts[1] : '',\n                args = parts[2].split(',').join('\\\\s*,\\\\s*');\n\n            body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\\s+/g, '\\\\s+');\n            re = new RegExp('function' + name + '\\\\s*\\\\(\\\\s*' + args + '\\\\s*\\\\)\\\\s*{\\\\s*' + body + '\\\\s*}');\n        }\n\n        // look for a normal function definition\n        if ((result = findSourceInUrls(re, urls))) {\n            return result;\n        }\n\n        // look for an old-school event handler function\n        if ((parts = eventRE.exec(code))) {\n            var event = parts[1];\n            body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]);\n\n            // look for a function defined in HTML as an onXXX handler\n            re = new RegExp('on' + event + '=[\\\\\\'\"]\\\\s*' + body + '\\\\s*[\\\\\\'\"]', 'i');\n\n            if ((result = findSourceInUrls(re, urls[0]))) {\n                return result;\n            }\n\n            // look for ???\n            re = new RegExp(body);\n\n            if ((result = findSourceInUrls(re, urls))) {\n                return result;\n            }\n        }\n\n        return null;\n    }\n\n    // Contents of Exception in various browsers.\n    //\n    // SAFARI:\n    // ex.message = Can't find variable: qq\n    // ex.line = 59\n    // ex.sourceId = 580238192\n    // ex.sourceURL = http://...\n    // ex.expressionBeginOffset = 96\n    // ex.expressionCaretOffset = 98\n    // ex.expressionEndOffset = 98\n    // ex.name = ReferenceError\n    //\n    // FIREFOX:\n    // ex.message = qq is not defined\n    // ex.fileName = http://...\n    // ex.lineNumber = 59\n    // ex.columnNumber = 69\n    // ex.stack = ...stack trace... (see the example below)\n    // ex.name = ReferenceError\n    //\n    // CHROME:\n    // ex.message = qq is not defined\n    // ex.name = ReferenceError\n    // ex.type = not_defined\n    // ex.arguments = ['aa']\n    // ex.stack = ...stack trace...\n    //\n    // INTERNET EXPLORER:\n    // ex.message = ...\n    // ex.name = ReferenceError\n    //\n    // OPERA:\n    // ex.message = ...message... (see the example below)\n    // ex.name = ReferenceError\n    // ex.opera#sourceloc = 11  (pretty much useless, duplicates the info in ex.message)\n    // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n    /**\n     * Computes stack trace information from the stack property.\n     * Chrome and Gecko use this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStackProp(ex) {\n        if (!ex.stack) {\n            return null;\n        }\n\n        var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n            gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|\\[native).*?)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n            winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:ms-appx|https?|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n            lines = ex.stack.split('\\n'),\n            stack = [],\n            parts,\n            element,\n            reference = /^(.*) is undefined$/.exec(ex.message);\n\n        for (var i = 0, j = lines.length; i < j; ++i) {\n            if ((parts = chrome.exec(lines[i]))) {\n                var isNative = parts[2] && parts[2].indexOf('native') !== -1;\n                element = {\n                    'url': !isNative ? parts[2] : null,\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': isNative ? [parts[2]] : [],\n                    'line': parts[3] ? +parts[3] : null,\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ( parts = winjs.exec(lines[i]) ) {\n                element = {\n                    'url': parts[2],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': [],\n                    'line': +parts[3],\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ((parts = gecko.exec(lines[i]))) {\n                element = {\n                    'url': parts[3],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': parts[2] ? parts[2].split(',') : [],\n                    'line': parts[4] ? +parts[4] : null,\n                    'column': parts[5] ? +parts[5] : null\n                };\n            } else {\n                continue;\n            }\n\n            if (!element.func && element.line) {\n                element.func = guessFunctionName(element.url, element.line);\n            }\n\n            if (element.line) {\n                element.context = gatherContext(element.url, element.line);\n            }\n\n            stack.push(element);\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        if (stack[0] && stack[0].line && !stack[0].column && reference) {\n            stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line);\n        } else if (!stack[0].column && !_isUndefined(ex.columnNumber)) {\n            // FireFox uses this awesome columnNumber property for its top frame\n            // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n            // so adding 1\n            stack[0].column = ex.columnNumber + 1;\n        }\n\n        return {\n            'mode': 'stack',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * Computes stack trace information from the stacktrace property.\n     * Opera 10+ uses this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStacktraceProp(ex) {\n        // Access and store the stacktrace property before doing ANYTHING\n        // else to it because Opera is not very good at providing it\n        // reliably in other circumstances.\n        var stacktrace = ex.stacktrace;\n        if (!stacktrace) {\n            return;\n        }\n\n        var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i,\n            opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i,\n            lines = stacktrace.split('\\n'),\n            stack = [],\n            parts;\n\n        for (var line = 0; line < lines.length; line += 2) {\n            var element = null;\n            if ((parts = opera10Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[2],\n                    'line': +parts[1],\n                    'column': null,\n                    'func': parts[3],\n                    'args':[]\n                };\n            } else if ((parts = opera11Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[6],\n                    'line': +parts[1],\n                    'column': +parts[2],\n                    'func': parts[3] || parts[4],\n                    'args': parts[5] ? parts[5].split(',') : []\n                };\n            }\n\n            if (element) {\n                if (!element.func && element.line) {\n                    element.func = guessFunctionName(element.url, element.line);\n                }\n                if (element.line) {\n                    try {\n                        element.context = gatherContext(element.url, element.line);\n                    } catch (exc) {}\n                }\n\n                if (!element.context) {\n                    element.context = [lines[line + 1]];\n                }\n\n                stack.push(element);\n            }\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        return {\n            'mode': 'stacktrace',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * NOT TESTED.\n     * Computes stack trace information from an error message that includes\n     * the stack trace.\n     * Opera 9 and earlier use this method if the option to show stack\n     * traces is turned on in opera:config.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromOperaMultiLineMessage(ex) {\n        // TODO: Clean this function up\n        // Opera includes a stack trace into the exception message. An example is:\n        //\n        // Statement on line 3: Undefined variable: undefinedFunc\n        // Backtrace:\n        //   Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz\n        //         undefinedFunc(a);\n        //   Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy\n        //           zzz(x, y, z);\n        //   Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx\n        //           yyy(a, a, a);\n        //   Line 1 of function script\n        //     try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); }\n        //   ...\n\n        var lines = ex.message.split('\\n');\n        if (lines.length < 4) {\n            return null;\n        }\n\n        var lineRE1 = /^\\s*Line (\\d+) of linked script ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE2 = /^\\s*Line (\\d+) of inline#(\\d+) script in ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE3 = /^\\s*Line (\\d+) of function script\\s*$/i,\n            stack = [],\n            scripts = (window && window.document && window.document.getElementsByTagName('script')),\n            inlineScriptBlocks = [],\n            parts;\n\n        for (var s in scripts) {\n            if (_has(scripts, s) && !scripts[s].src) {\n                inlineScriptBlocks.push(scripts[s]);\n            }\n        }\n\n        for (var line = 2; line < lines.length; line += 2) {\n            var item = null;\n            if ((parts = lineRE1.exec(lines[line]))) {\n                item = {\n                    'url': parts[2],\n                    'func': parts[3],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null\n                };\n            } else if ((parts = lineRE2.exec(lines[line]))) {\n                item = {\n                    'url': parts[3],\n                    'func': parts[4],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null // TODO: Check to see if inline#1 (+parts[2]) points to the script number or column number.\n                };\n                var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block\n                var script = inlineScriptBlocks[parts[2] - 1];\n                if (script) {\n                    var source = getSource(item.url);\n                    if (source) {\n                        source = source.join('\\n');\n                        var pos = source.indexOf(script.innerText);\n                        if (pos >= 0) {\n                            item.line = relativeLine + source.substring(0, pos).split('\\n').length;\n                        }\n                    }\n                }\n            } else if ((parts = lineRE3.exec(lines[line]))) {\n                var url = window.location.href.replace(/#.*$/, '');\n                var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[line + 1]));\n                var src = findSourceInUrls(re, [url]);\n                item = {\n                    'url': url,\n                    'func': '',\n                    'args': [],\n                    'line': src ? src.line : parts[1],\n                    'column': null\n                };\n            }\n\n            if (item) {\n                if (!item.func) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n                var context = gatherContext(item.url, item.line);\n                var midline = (context ? context[Math.floor(context.length / 2)] : null);\n                if (context && midline.replace(/^\\s*/, '') === lines[line + 1].replace(/^\\s*/, '')) {\n                    item.context = context;\n                } else {\n                    // if (context) alert(\"Context mismatch. Correct midline:\\n\" + lines[i+1] + \"\\n\\nMidline:\\n\" + midline + \"\\n\\nContext:\\n\" + context.join(\"\\n\") + \"\\n\\nURL:\\n\" + item.url);\n                    item.context = [lines[line + 1]];\n                }\n                stack.push(item);\n            }\n        }\n        if (!stack.length) {\n            return null; // could not parse multiline exception message as Opera stack trace\n        }\n\n        return {\n            'mode': 'multiline',\n            'name': ex.name,\n            'message': lines[0],\n            'stack': stack\n        };\n    }\n\n    /**\n     * Adds information about the first frame to incomplete stack traces.\n     * Safari and IE require this to get complete data on the first frame.\n     * @param {TraceKit.StackTrace} stackInfo Stack trace information from\n     * one of the compute* methods.\n     * @param {string} url The URL of the script that caused an error.\n     * @param {(number|string)} lineNo The line number of the script that\n     * caused an error.\n     * @param {string=} message The error generated by the browser, which\n     * hopefully contains the name of the object that caused the error.\n     * @return {boolean} Whether or not the stack information was\n     * augmented.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n        var initial = {\n            'url': url,\n            'line': lineNo\n        };\n\n        if (initial.url && initial.line) {\n            stackInfo.incomplete = false;\n\n            if (!initial.func) {\n                initial.func = guessFunctionName(initial.url, initial.line);\n            }\n\n            if (!initial.context) {\n                initial.context = gatherContext(initial.url, initial.line);\n            }\n\n            var reference = / '([^']+)' /.exec(message);\n            if (reference) {\n                initial.column = findSourceInLine(reference[1], initial.url, initial.line);\n            }\n\n            if (stackInfo.stack.length > 0) {\n                if (stackInfo.stack[0].url === initial.url) {\n                    if (stackInfo.stack[0].line === initial.line) {\n                        return false; // already in stack trace\n                    } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) {\n                        stackInfo.stack[0].line = initial.line;\n                        stackInfo.stack[0].context = initial.context;\n                        return false;\n                    }\n                }\n            }\n\n            stackInfo.stack.unshift(initial);\n            stackInfo.partial = true;\n            return true;\n        } else {\n            stackInfo.incomplete = true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Computes stack trace information by walking the arguments.caller\n     * chain at the time the exception occurred. This will cause earlier\n     * frames to be missed but is the only way to get any stack trace in\n     * Safari and IE. The top frame is restored by\n     * {@link augmentStackTraceWithInitialElement}.\n     * @param {Error} ex\n     * @return {TraceKit.StackTrace=} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceByWalkingCallerChain(ex, depth) {\n        var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n            stack = [],\n            funcs = {},\n            recursion = false,\n            parts,\n            item,\n            source;\n\n        for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {\n            if (curr === computeStackTrace || curr === TraceKit.report) {\n                // console.log('skipping internal function');\n                continue;\n            }\n\n            item = {\n                'url': null,\n                'func': UNKNOWN_FUNCTION,\n                'args': [],\n                'line': null,\n                'column': null\n            };\n\n            if (curr.name) {\n                item.func = curr.name;\n            } else if ((parts = functionName.exec(curr.toString()))) {\n                item.func = parts[1];\n            }\n\n            if (typeof item.func === 'undefined') {\n              try {\n                item.func = parts.input.substring(0, parts.input.indexOf('{'));\n              } catch (e) { }\n            }\n\n            if ((source = findSourceByFunctionBody(curr))) {\n                item.url = source.url;\n                item.line = source.line;\n\n                if (item.func === UNKNOWN_FUNCTION) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n\n                var reference = / '([^']+)' /.exec(ex.message || ex.description);\n                if (reference) {\n                    item.column = findSourceInLine(reference[1], source.url, source.line);\n                }\n            }\n\n            if (funcs['' + curr]) {\n                recursion = true;\n            }else{\n                funcs['' + curr] = true;\n            }\n\n            stack.push(item);\n        }\n\n        if (depth) {\n            // console.log('depth is ' + depth);\n            // console.log('stack is ' + stack.length);\n            stack.splice(0, depth);\n        }\n\n        var result = {\n            'mode': 'callers',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n        augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description);\n        return result;\n    }\n\n    /**\n     * Computes a stack trace for an exception.\n     * @param {Error} ex\n     * @param {(string|number)=} depth\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTrace(ex, depth) {\n        var stack = null;\n        depth = (depth == null ? 0 : +depth);\n\n        try {\n            // This must be tried first because Opera 10 *destroys*\n            // its stacktrace property if you try to access the stack\n            // property first!!\n            stack = computeStackTraceFromStacktraceProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromStackProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromOperaMultiLineMessage(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        return {\n            'mode': 'failed'\n        };\n    }\n\n    /**\n     * Logs a stacktrace starting from the previous call and working down.\n     * @param {(number|string)=} depth How many frames deep to trace.\n     * @return {TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceOfCaller(depth) {\n        depth = (depth == null ? 0 : +depth) + 1; // \"+ 1\" because \"ofCaller\" should drop one frame\n        try {\n            throw new Error();\n        } catch (ex) {\n            return computeStackTrace(ex, depth + 1);\n        }\n    }\n\n    computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n    computeStackTrace.guessFunctionName = guessFunctionName;\n    computeStackTrace.gatherContext = gatherContext;\n    computeStackTrace.ofCaller = computeStackTraceOfCaller;\n    computeStackTrace.getSource = getSource;\n\n    return computeStackTrace;\n}());\n\n/**\n * Extends support for global error handling for asynchronous browser\n * functions. Adopted from Closure Library's errorhandler.js\n * @memberof TraceKit\n */\nTraceKit.extendToAsynchronousCallbacks = function () {\n    var _helper = function _helper(fnName) {\n        var originalFn = window[fnName];\n        window[fnName] = function traceKitAsyncExtension() {\n            // Make a copy of the arguments\n            var args = _slice.call(arguments);\n            var originalCallback = args[0];\n            if (typeof (originalCallback) === 'function') {\n                args[0] = TraceKit.wrap(originalCallback);\n            }\n            // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n            // also only supports 2 argument and doesn't care what \"this\" is, so we\n            // can just call the original function directly.\n            if (originalFn.apply) {\n                return originalFn.apply(this, args);\n            } else {\n                return originalFn(args[0], args[1]);\n            }\n        };\n    };\n\n    _helper('setTimeout');\n    _helper('setInterval');\n};\n\n//Default options:\nif (!TraceKit.remoteFetching) {\n    TraceKit.remoteFetching = true;\n}\nif (!TraceKit.collectWindowErrors) {\n    TraceKit.collectWindowErrors = true;\n}\nif (!TraceKit.linesOfContext || TraceKit.linesOfContext < 1) {\n    // 5 lines before, the offending line, 5 lines after\n    TraceKit.linesOfContext = 11;\n}\n\n// UMD export\nif (typeof module !== 'undefined' && module.exports && this.module !== module) {\n    module.exports = TraceKit;\n} else if (typeof define === 'function' && define.amd) {\n    define('TraceKit', [], TraceKit);\n} else {\n    window.TraceKit = TraceKit;\n}\n\n}(typeof window !== 'undefined' ? window : global));\n","/**\n * https://github.com/csnover/TraceKit\n * @license MIT\n * @namespace TraceKit\n */\n(function(window, undefined) {\nif (!window) {\n    return;\n}\n\nvar TraceKit = {};\nvar _oldTraceKit = window.TraceKit;\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n/**\n * A better form of hasOwnProperty<br/>\n * Example: `_has(MainHostObject, property) === true/false`\n *\n * @param {Object} object to check property\n * @param {string} key to check\n * @return {Boolean} true if the object has the key and it is not inherited\n */\nfunction _has(object, key) {\n    return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/**\n * Returns true if the parameter is undefined<br/>\n * Example: `_isUndefined(val) === true/false`\n *\n * @param {*} what Value to check\n * @return {Boolean} true if undefined and false otherwise\n */\nfunction _isUndefined(what) {\n    return typeof what === 'undefined';\n}\n\n/**\n * Export TraceKit out to another variable<br/>\n * Example: `var TK = TraceKit.noConflict()`\n * @return {Object} The TraceKit object\n * @memberof TraceKit\n */\nTraceKit.noConflict = function noConflict() {\n    window.TraceKit = _oldTraceKit;\n    return TraceKit;\n};\n\n/**\n * Wrap any function in a TraceKit reporter<br/>\n * Example: `func = TraceKit.wrap(func);`\n *\n * @param {Function} func Function to be wrapped\n * @return {Function} The wrapped func\n * @memberof TraceKit\n */\nTraceKit.wrap = function traceKitWrapper(func) {\n    function wrapped() {\n        try {\n            return func.apply(this, arguments);\n        } catch (e) {\n            TraceKit.report(e);\n            throw e;\n        }\n    }\n    return wrapped;\n};\n\n/**\n * Cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * ```js\n *   TraceKit.report.subscribe(function(stackInfo) { ... })\n *   TraceKit.report.unsubscribe(function(stackInfo) { ... })\n *   TraceKit.report(exception)\n *   try { ...code... } catch(ex) { TraceKit.report(ex); }\n * ```\n *\n * Supports:\n *   - Firefox: full stack trace with line numbers, plus column number\n *     on top frame; column number is not guaranteed\n *   - Opera: full stack trace with line and column numbers\n *   - Chrome: full stack trace with line and column numbers\n *   - Safari: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *   - IE: line and column number for the top frame only; some frames\n *     may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n *   - IE5.5+ (only 8.0 tested)\n *   - Firefox 0.9+ (only 3.5+ tested)\n *   - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n *     Exceptions Have Stacktrace to be enabled in opera:config)\n *   - Safari 3+ (only 4+ tested)\n *   - Chrome 1+ (only 5+ tested)\n *   - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a TraceKit.StackTrace object as described in the\n * TraceKit.computeStackTrace docs.\n *\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.report = (function reportModuleWrapper() {\n    var handlers = [],\n        lastArgs = null,\n        lastException = null,\n        lastExceptionStack = null;\n\n    /**\n     * Add a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function subscribe(handler) {\n        installGlobalHandler();\n        handlers.push(handler);\n    }\n\n    /**\n     * Remove a crash handler.\n     * @param {Function} handler\n     * @memberof TraceKit.report\n     */\n    function unsubscribe(handler) {\n        for (var i = handlers.length - 1; i >= 0; --i) {\n            if (handlers[i] === handler) {\n                handlers.splice(i, 1);\n            }\n        }\n    }\n\n    /**\n     * Dispatch stack information to all handlers.\n     * @param {TraceKit.StackTrace} stack\n     * @param {boolean} isWindowError Is this a top-level window error?\n     * @memberof TraceKit.report\n     * @throws An exception if an error occurs while calling an handler.\n     */\n    function notifyHandlers(stack, isWindowError) {\n        var exception = null;\n        if (isWindowError && !TraceKit.collectWindowErrors) {\n          return;\n        }\n        for (var i in handlers) {\n            if (_has(handlers, i)) {\n                try {\n                    handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n                } catch (inner) {\n                    exception = inner;\n                }\n            }\n        }\n\n        if (exception) {\n            throw exception;\n        }\n    }\n\n    var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n    /**\n     * Ensures all global unhandled exceptions are recorded.\n     * Supported by Gecko and IE.\n     * @param {string} message Error message.\n     * @param {string} url URL of script that generated the exception.\n     * @param {(number|string)} lineNo The line number at which the error occurred.\n     * @param {(number|string)=} columnNo The column number at which the error occurred.\n     * @param {Error=} errorObj The actual Error object.\n     * @memberof TraceKit.report\n     */\n    function traceKitWindowOnError(message, url, lineNo, columnNo, errorObj) {\n        var stack = null;\n\n        if (lastExceptionStack) {\n            TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message);\n    \t    processLastException();\n\t    } else if (errorObj) {\n            stack = TraceKit.computeStackTrace(errorObj);\n            notifyHandlers(stack, true);\n        } else {\n            var location = {\n              'url': url,\n              'line': lineNo,\n              'column': columnNo\n            };\n            location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line);\n            location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line);\n            stack = {\n              'mode': 'onerror',\n              'message': message,\n              'stack': [location]\n            };\n\n            notifyHandlers(stack, true);\n        }\n\n        if (_oldOnerrorHandler) {\n            return _oldOnerrorHandler.apply(this, arguments);\n        }\n\n        return false;\n    }\n\n    /**\n     * Install a global onerror handler\n     * @memberof TraceKit.report\n     */\n    function installGlobalHandler () {\n        if (_onErrorHandlerInstalled === true) {\n            return;\n        }\n        _oldOnerrorHandler = window.onerror;\n        window.onerror = traceKitWindowOnError;\n        _onErrorHandlerInstalled = true;\n    }\n\n    /**\n     * Process the most recent exception\n     * @memberof TraceKit.report\n     */\n    function processLastException() {\n        var _lastExceptionStack = lastExceptionStack,\n            _lastArgs = lastArgs;\n        lastArgs = null;\n        lastExceptionStack = null;\n        lastException = null;\n        notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n    }\n\n    /**\n     * Reports an unhandled Error to TraceKit.\n     * @param {Error} ex\n     * @memberof TraceKit.report\n     * @throws An exception if an incomplete stack trace is detected (old IE browsers).\n     */\n    function report(ex) {\n        if (lastExceptionStack) {\n            if (lastException === ex) {\n                return; // already caught by an inner catch block, ignore\n            } else {\n              processLastException();\n            }\n        }\n\n        var stack = TraceKit.computeStackTrace(ex);\n        lastExceptionStack = stack;\n        lastException = ex;\n        lastArgs = _slice.call(arguments, 1);\n\n        // If the stack trace is incomplete, wait for 2 seconds for\n        // slow slow IE to see if onerror occurs or not before reporting\n        // this exception; otherwise, we will end up with an incomplete\n        // stack trace\n        window.setTimeout(function () {\n            if (lastException === ex) {\n                processLastException();\n            }\n        }, (stack.incomplete ? 2000 : 0));\n\n        throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n    }\n\n    report.subscribe = subscribe;\n    report.unsubscribe = unsubscribe;\n    return report;\n}());\n\n/**\n * An object representing a single stack frame.\n * @typedef {Object} StackFrame\n * @property {string} url The JavaScript or HTML file URL.\n * @property {string} func The function name, or empty for anonymous functions (if guessing did not work).\n * @property {string[]?} args The arguments passed to the function, if known.\n * @property {number=} line The line number, if known.\n * @property {number=} column The column number, if known.\n * @property {string[]} context An array of source code lines; the middle element corresponds to the correct line#.\n * @memberof TraceKit\n */\n\n/**\n * An object representing a JavaScript stack trace.\n * @typedef {Object} StackTrace\n * @property {string} name The name of the thrown exception.\n * @property {string} message The exception error message.\n * @property {TraceKit.StackFrame[]} stack An array of stack frames.\n * @property {string} mode 'stack', 'stacktrace', 'multiline', 'callers', 'onerror', or 'failed' -- method used to collect the stack trace.\n * @memberof TraceKit\n */\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n *   ```js\n *   s = TraceKit.computeStackTrace.ofCaller([depth])\n *   s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n *   ```\n *\n * Supports:\n *   - Firefox:  full stack trace with line numbers and unreliable column\n *               number on top frame\n *   - Opera 10: full stack trace with line and column numbers\n *   - Opera 9-: full stack trace with line numbers\n *   - Chrome:   full stack trace with line and column numbers\n *   - Safari:   line and column number for the topmost stacktrace element\n *               only\n *   - IE:       no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n *  * in Safari, some methods may be missing from the stack trace;\n *  * in IE, the topmost function in the stack trace will always be the\n *    caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n * Tracing example:\n *  ```js\n *     function trace(message) {\n *         var stackInfo = TraceKit.computeStackTrace.ofCaller();\n *         var data = message + \"\\n\";\n *         for(var i in stackInfo.stack) {\n *             var item = stackInfo.stack[i];\n *             data += (item.func || '[anonymous]') + \"() in \" + item.url + \":\" + (item.line || '0') + \"\\n\";\n *         }\n *         if (window.console)\n *             console.info(data);\n *         else\n *             alert(data);\n *     }\n * ```\n * @memberof TraceKit\n * @namespace\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n    var debug = false,\n        sourceCache = {};\n\n    /**\n     * Attempts to retrieve source code via XMLHttpRequest, which is used\n     * to look up anonymous function names.\n     * @param {string} url URL of source code.\n     * @return {string} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function loadSource(url) {\n        if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on.\n            return '';\n        }\n        try {\n            var getXHR = function() {\n                try {\n                    return new window.XMLHttpRequest();\n                } catch (e) {\n                    // explicitly bubble up the exception if not found\n                    return new window.ActiveXObject('Microsoft.XMLHTTP');\n                }\n            };\n\n            var request = getXHR();\n            request.open('GET', url, false);\n            request.send('');\n            return request.responseText;\n        } catch (e) {\n            return '';\n        }\n    }\n\n    /**\n     * Retrieves source code from the source code cache.\n     * @param {string} url URL of source code.\n     * @return {Array.<string>} Source contents.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function getSource(url) {\n        if (typeof url !== 'string') {\n            return [];\n        }\n\n        if (!_has(sourceCache, url)) {\n            // URL needs to be able to fetched within the acceptable domain.  Otherwise,\n            // cross-domain errors will be triggered.\n            /*\n                Regex matches:\n                0 - Full Url\n                1 - Protocol\n                2 - Domain\n                3 - Port (Useful for internal applications)\n                4 - Path\n            */\n            var source = '';\n            var domain = '';\n            try { domain = window.document.domain; } catch (e) { }\n            var match = /(.*)\\:\\/\\/([^:\\/]+)([:\\d]*)\\/{0,1}([\\s\\S]*)/.exec(url);\n            if (match && match[2] === domain) {\n                source = loadSource(url);\n            }\n            sourceCache[url] = source ? source.split('\\n') : [];\n        }\n\n        return sourceCache[url];\n    }\n\n    /**\n     * Tries to use an externally loaded copy of source code to determine\n     * the name of a function by looking at the name of the variable it was\n     * assigned to, if any.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} lineNo Line number in source code.\n     * @return {string} The function name, if discoverable.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function guessFunctionName(url, lineNo) {\n        var reFunctionArgNames = /function ([^(]*)\\(([^)]*)\\)/,\n            reGuessFunction = /['\"]?([0-9A-Za-z$_]+)['\"]?\\s*[:=]\\s*(function|eval|new Function)/,\n            line = '',\n            maxLines = 10,\n            source = getSource(url),\n            m;\n\n        if (!source.length) {\n            return UNKNOWN_FUNCTION;\n        }\n\n        // Walk backwards from the first line in the function until we find the line which\n        // matches the pattern above, which is the function definition\n        for (var i = 0; i < maxLines; ++i) {\n            line = source[lineNo - i] + line;\n\n            if (!_isUndefined(line)) {\n                if ((m = reGuessFunction.exec(line))) {\n                    return m[1];\n                } else if ((m = reFunctionArgNames.exec(line))) {\n                    return m[1];\n                }\n            }\n        }\n\n        return UNKNOWN_FUNCTION;\n    }\n\n    /**\n     * Retrieves the surrounding lines from where an exception occurred.\n     * @param {string} url URL of source code.\n     * @param {(string|number)} line Line number in source code to centre\n     * around for context.\n     * @return {?Array.<string>} Lines of source code.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function gatherContext(url, line) {\n        var source = getSource(url);\n\n        if (!source.length) {\n            return null;\n        }\n\n        var context = [],\n            // linesBefore & linesAfter are inclusive with the offending line.\n            // if linesOfContext is even, there will be one extra line\n            //   *before* the offending line.\n            linesBefore = Math.floor(TraceKit.linesOfContext / 2),\n            // Add one extra line if linesOfContext is odd\n            linesAfter = linesBefore + (TraceKit.linesOfContext % 2),\n            start = Math.max(0, line - linesBefore - 1),\n            end = Math.min(source.length, line + linesAfter - 1);\n\n        line -= 1; // convert to 0-based index\n\n        for (var i = start; i < end; ++i) {\n            if (!_isUndefined(source[i])) {\n                context.push(source[i]);\n            }\n        }\n\n        return context.length > 0 ? context : null;\n    }\n\n    /**\n     * Escapes special characters, except for whitespace, in a string to be\n     * used inside a regular expression as a string literal.\n     * @param {string} text The string.\n     * @return {string} The escaped string literal.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeRegExp(text) {\n        return text.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#]/g, '\\\\$&');\n    }\n\n    /**\n     * Escapes special characters in a string to be used inside a regular\n     * expression as a string literal. Also ensures that HTML entities will\n     * be matched the same as their literal friends.\n     * @param {string} body The string.\n     * @return {string} The escaped string.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function escapeCodeAsRegExpForMatchingInsideHTML(body) {\n        return escapeRegExp(body).replace('<', '(?:<|&lt;)').replace('>', '(?:>|&gt;)').replace('&', '(?:&|&amp;)').replace('\"', '(?:\"|&quot;)').replace(/\\s+/g, '\\\\s+');\n    }\n\n    /**\n     * Determines where a code fragment occurs in the source code.\n     * @param {RegExp} re The function definition.\n     * @param {Array.<string>} urls A list of URLs to search.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInUrls(re, urls) {\n        var source, m;\n        for (var i = 0, j = urls.length; i < j; ++i) {\n            // console.log('searching', urls[i]);\n            if ((source = getSource(urls[i])).length) {\n                source = source.join('\\n');\n                if ((m = re.exec(source))) {\n                    // console.log('Found function in ' + urls[i]);\n\n                    return {\n                        'url': urls[i],\n                        'line': source.substring(0, m.index).split('\\n').length,\n                        'column': m.index - source.lastIndexOf('\\n', m.index) - 1\n                    };\n                }\n            }\n        }\n\n        // console.log('no match');\n\n        return null;\n    }\n\n    /**\n     * Determines at which column a code fragment occurs on a line of the\n     * source code.\n     * @param {string} fragment The code fragment.\n     * @param {string} url The URL to search.\n     * @param {(string|number)} line The line number to examine.\n     * @return {?number} The column number.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceInLine(fragment, url, line) {\n        var source = getSource(url),\n            re = new RegExp('\\\\b' + escapeRegExp(fragment) + '\\\\b'),\n            m;\n\n        line -= 1;\n\n        if (source && source.length > line && (m = re.exec(source[line]))) {\n            return m.index;\n        }\n\n        return null;\n    }\n\n    /**\n     * Determines where a function was defined within the source code.\n     * @param {(Function|string)} func A function reference or serialized\n     * function definition.\n     * @return {?Object.<string, (string|number)>} An object containing\n     * the url, line, and column number of the defined function.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function findSourceByFunctionBody(func) {\n        if (_isUndefined(window && window.document)) {\n            return;\n        }\n\n        var urls = [window.location.href],\n            scripts = window.document.getElementsByTagName('script'),\n            body,\n            code = '' + func,\n            codeRE = /^function(?:\\s+([\\w$]+))?\\s*\\(([\\w\\s,]*)\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            eventRE = /^function on([\\w$]+)\\s*\\(event\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n            re,\n            parts,\n            result;\n\n        for (var i = 0; i < scripts.length; ++i) {\n            var script = scripts[i];\n            if (script.src) {\n                urls.push(script.src);\n            }\n        }\n\n        if (!(parts = codeRE.exec(code))) {\n            re = new RegExp(escapeRegExp(code).replace(/\\s+/g, '\\\\s+'));\n        }\n\n        // not sure if this is really necessary, but I don’t have a test\n        // corpus large enough to confirm that and it was in the original.\n        else {\n            var name = parts[1] ? '\\\\s+' + parts[1] : '',\n                args = parts[2].split(',').join('\\\\s*,\\\\s*');\n\n            body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\\s+/g, '\\\\s+');\n            re = new RegExp('function' + name + '\\\\s*\\\\(\\\\s*' + args + '\\\\s*\\\\)\\\\s*{\\\\s*' + body + '\\\\s*}');\n        }\n\n        // look for a normal function definition\n        if ((result = findSourceInUrls(re, urls))) {\n            return result;\n        }\n\n        // look for an old-school event handler function\n        if ((parts = eventRE.exec(code))) {\n            var event = parts[1];\n            body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]);\n\n            // look for a function defined in HTML as an onXXX handler\n            re = new RegExp('on' + event + '=[\\\\\\'\"]\\\\s*' + body + '\\\\s*[\\\\\\'\"]', 'i');\n\n            if ((result = findSourceInUrls(re, urls[0]))) {\n                return result;\n            }\n\n            // look for ???\n            re = new RegExp(body);\n\n            if ((result = findSourceInUrls(re, urls))) {\n                return result;\n            }\n        }\n\n        return null;\n    }\n\n    // Contents of Exception in various browsers.\n    //\n    // SAFARI:\n    // ex.message = Can't find variable: qq\n    // ex.line = 59\n    // ex.sourceId = 580238192\n    // ex.sourceURL = http://...\n    // ex.expressionBeginOffset = 96\n    // ex.expressionCaretOffset = 98\n    // ex.expressionEndOffset = 98\n    // ex.name = ReferenceError\n    //\n    // FIREFOX:\n    // ex.message = qq is not defined\n    // ex.fileName = http://...\n    // ex.lineNumber = 59\n    // ex.columnNumber = 69\n    // ex.stack = ...stack trace... (see the example below)\n    // ex.name = ReferenceError\n    //\n    // CHROME:\n    // ex.message = qq is not defined\n    // ex.name = ReferenceError\n    // ex.type = not_defined\n    // ex.arguments = ['aa']\n    // ex.stack = ...stack trace...\n    //\n    // INTERNET EXPLORER:\n    // ex.message = ...\n    // ex.name = ReferenceError\n    //\n    // OPERA:\n    // ex.message = ...message... (see the example below)\n    // ex.name = ReferenceError\n    // ex.opera#sourceloc = 11  (pretty much useless, duplicates the info in ex.message)\n    // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n    /**\n     * Computes stack trace information from the stack property.\n     * Chrome and Gecko use this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStackProp(ex) {\n        if (!ex.stack) {\n            return null;\n        }\n\n        var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n            gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|\\[native).*?)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n            winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:ms-appx|https?|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n            lines = ex.stack.split('\\n'),\n            stack = [],\n            parts,\n            element,\n            reference = /^(.*) is undefined$/.exec(ex.message);\n\n        for (var i = 0, j = lines.length; i < j; ++i) {\n            if ((parts = chrome.exec(lines[i]))) {\n                var isNative = parts[2] && parts[2].indexOf('native') !== -1;\n                element = {\n                    'url': !isNative ? parts[2] : null,\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': isNative ? [parts[2]] : [],\n                    'line': parts[3] ? +parts[3] : null,\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ( parts = winjs.exec(lines[i]) ) {\n                element = {\n                    'url': parts[2],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': [],\n                    'line': +parts[3],\n                    'column': parts[4] ? +parts[4] : null\n                };\n            } else if ((parts = gecko.exec(lines[i]))) {\n                element = {\n                    'url': parts[3],\n                    'func': parts[1] || UNKNOWN_FUNCTION,\n                    'args': parts[2] ? parts[2].split(',') : [],\n                    'line': parts[4] ? +parts[4] : null,\n                    'column': parts[5] ? +parts[5] : null\n                };\n            } else {\n                continue;\n            }\n\n            if (!element.func && element.line) {\n                element.func = guessFunctionName(element.url, element.line);\n            }\n\n            if (element.line) {\n                element.context = gatherContext(element.url, element.line);\n            }\n\n            stack.push(element);\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        if (stack[0] && stack[0].line && !stack[0].column && reference) {\n            stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line);\n        } else if (!stack[0].column && !_isUndefined(ex.columnNumber)) {\n            // FireFox uses this awesome columnNumber property for its top frame\n            // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n            // so adding 1\n            stack[0].column = ex.columnNumber + 1;\n        }\n\n        return {\n            'mode': 'stack',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * Computes stack trace information from the stacktrace property.\n     * Opera 10+ uses this property.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromStacktraceProp(ex) {\n        // Access and store the stacktrace property before doing ANYTHING\n        // else to it because Opera is not very good at providing it\n        // reliably in other circumstances.\n        var stacktrace = ex.stacktrace;\n        if (!stacktrace) {\n            return;\n        }\n\n        var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i,\n            opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i,\n            lines = stacktrace.split('\\n'),\n            stack = [],\n            parts;\n\n        for (var line = 0; line < lines.length; line += 2) {\n            var element = null;\n            if ((parts = opera10Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[2],\n                    'line': +parts[1],\n                    'column': null,\n                    'func': parts[3],\n                    'args':[]\n                };\n            } else if ((parts = opera11Regex.exec(lines[line]))) {\n                element = {\n                    'url': parts[6],\n                    'line': +parts[1],\n                    'column': +parts[2],\n                    'func': parts[3] || parts[4],\n                    'args': parts[5] ? parts[5].split(',') : []\n                };\n            }\n\n            if (element) {\n                if (!element.func && element.line) {\n                    element.func = guessFunctionName(element.url, element.line);\n                }\n                if (element.line) {\n                    try {\n                        element.context = gatherContext(element.url, element.line);\n                    } catch (exc) {}\n                }\n\n                if (!element.context) {\n                    element.context = [lines[line + 1]];\n                }\n\n                stack.push(element);\n            }\n        }\n\n        if (!stack.length) {\n            return null;\n        }\n\n        return {\n            'mode': 'stacktrace',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n    }\n\n    /**\n     * NOT TESTED.\n     * Computes stack trace information from an error message that includes\n     * the stack trace.\n     * Opera 9 and earlier use this method if the option to show stack\n     * traces is turned on in opera:config.\n     * @param {Error} ex\n     * @return {?TraceKit.StackTrace} Stack information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceFromOperaMultiLineMessage(ex) {\n        // TODO: Clean this function up\n        // Opera includes a stack trace into the exception message. An example is:\n        //\n        // Statement on line 3: Undefined variable: undefinedFunc\n        // Backtrace:\n        //   Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz\n        //         undefinedFunc(a);\n        //   Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy\n        //           zzz(x, y, z);\n        //   Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx\n        //           yyy(a, a, a);\n        //   Line 1 of function script\n        //     try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); }\n        //   ...\n\n        var lines = ex.message.split('\\n');\n        if (lines.length < 4) {\n            return null;\n        }\n\n        var lineRE1 = /^\\s*Line (\\d+) of linked script ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE2 = /^\\s*Line (\\d+) of inline#(\\d+) script in ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n            lineRE3 = /^\\s*Line (\\d+) of function script\\s*$/i,\n            stack = [],\n            scripts = (window && window.document && window.document.getElementsByTagName('script')),\n            inlineScriptBlocks = [],\n            parts;\n\n        for (var s in scripts) {\n            if (_has(scripts, s) && !scripts[s].src) {\n                inlineScriptBlocks.push(scripts[s]);\n            }\n        }\n\n        for (var line = 2; line < lines.length; line += 2) {\n            var item = null;\n            if ((parts = lineRE1.exec(lines[line]))) {\n                item = {\n                    'url': parts[2],\n                    'func': parts[3],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null\n                };\n            } else if ((parts = lineRE2.exec(lines[line]))) {\n                item = {\n                    'url': parts[3],\n                    'func': parts[4],\n                    'args': [],\n                    'line': +parts[1],\n                    'column': null // TODO: Check to see if inline#1 (+parts[2]) points to the script number or column number.\n                };\n                var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block\n                var script = inlineScriptBlocks[parts[2] - 1];\n                if (script) {\n                    var source = getSource(item.url);\n                    if (source) {\n                        source = source.join('\\n');\n                        var pos = source.indexOf(script.innerText);\n                        if (pos >= 0) {\n                            item.line = relativeLine + source.substring(0, pos).split('\\n').length;\n                        }\n                    }\n                }\n            } else if ((parts = lineRE3.exec(lines[line]))) {\n                var url = window.location.href.replace(/#.*$/, '');\n                var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[line + 1]));\n                var src = findSourceInUrls(re, [url]);\n                item = {\n                    'url': url,\n                    'func': '',\n                    'args': [],\n                    'line': src ? src.line : parts[1],\n                    'column': null\n                };\n            }\n\n            if (item) {\n                if (!item.func) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n                var context = gatherContext(item.url, item.line);\n                var midline = (context ? context[Math.floor(context.length / 2)] : null);\n                if (context && midline.replace(/^\\s*/, '') === lines[line + 1].replace(/^\\s*/, '')) {\n                    item.context = context;\n                } else {\n                    // if (context) alert(\"Context mismatch. Correct midline:\\n\" + lines[i+1] + \"\\n\\nMidline:\\n\" + midline + \"\\n\\nContext:\\n\" + context.join(\"\\n\") + \"\\n\\nURL:\\n\" + item.url);\n                    item.context = [lines[line + 1]];\n                }\n                stack.push(item);\n            }\n        }\n        if (!stack.length) {\n            return null; // could not parse multiline exception message as Opera stack trace\n        }\n\n        return {\n            'mode': 'multiline',\n            'name': ex.name,\n            'message': lines[0],\n            'stack': stack\n        };\n    }\n\n    /**\n     * Adds information about the first frame to incomplete stack traces.\n     * Safari and IE require this to get complete data on the first frame.\n     * @param {TraceKit.StackTrace} stackInfo Stack trace information from\n     * one of the compute* methods.\n     * @param {string} url The URL of the script that caused an error.\n     * @param {(number|string)} lineNo The line number of the script that\n     * caused an error.\n     * @param {string=} message The error generated by the browser, which\n     * hopefully contains the name of the object that caused the error.\n     * @return {boolean} Whether or not the stack information was\n     * augmented.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n        var initial = {\n            'url': url,\n            'line': lineNo\n        };\n\n        if (initial.url && initial.line) {\n            stackInfo.incomplete = false;\n\n            if (!initial.func) {\n                initial.func = guessFunctionName(initial.url, initial.line);\n            }\n\n            if (!initial.context) {\n                initial.context = gatherContext(initial.url, initial.line);\n            }\n\n            var reference = / '([^']+)' /.exec(message);\n            if (reference) {\n                initial.column = findSourceInLine(reference[1], initial.url, initial.line);\n            }\n\n            if (stackInfo.stack.length > 0) {\n                if (stackInfo.stack[0].url === initial.url) {\n                    if (stackInfo.stack[0].line === initial.line) {\n                        return false; // already in stack trace\n                    } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) {\n                        stackInfo.stack[0].line = initial.line;\n                        stackInfo.stack[0].context = initial.context;\n                        return false;\n                    }\n                }\n            }\n\n            stackInfo.stack.unshift(initial);\n            stackInfo.partial = true;\n            return true;\n        } else {\n            stackInfo.incomplete = true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Computes stack trace information by walking the arguments.caller\n     * chain at the time the exception occurred. This will cause earlier\n     * frames to be missed but is the only way to get any stack trace in\n     * Safari and IE. The top frame is restored by\n     * {@link augmentStackTraceWithInitialElement}.\n     * @param {Error} ex\n     * @return {TraceKit.StackTrace=} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceByWalkingCallerChain(ex, depth) {\n        var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n            stack = [],\n            funcs = {},\n            recursion = false,\n            parts,\n            item,\n            source;\n\n        for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {\n            if (curr === computeStackTrace || curr === TraceKit.report) {\n                // console.log('skipping internal function');\n                continue;\n            }\n\n            item = {\n                'url': null,\n                'func': UNKNOWN_FUNCTION,\n                'args': [],\n                'line': null,\n                'column': null\n            };\n\n            if (curr.name) {\n                item.func = curr.name;\n            } else if ((parts = functionName.exec(curr.toString()))) {\n                item.func = parts[1];\n            }\n\n            if (typeof item.func === 'undefined') {\n              try {\n                item.func = parts.input.substring(0, parts.input.indexOf('{'));\n              } catch (e) { }\n            }\n\n            if ((source = findSourceByFunctionBody(curr))) {\n                item.url = source.url;\n                item.line = source.line;\n\n                if (item.func === UNKNOWN_FUNCTION) {\n                    item.func = guessFunctionName(item.url, item.line);\n                }\n\n                var reference = / '([^']+)' /.exec(ex.message || ex.description);\n                if (reference) {\n                    item.column = findSourceInLine(reference[1], source.url, source.line);\n                }\n            }\n\n            if (funcs['' + curr]) {\n                recursion = true;\n            }else{\n                funcs['' + curr] = true;\n            }\n\n            stack.push(item);\n        }\n\n        if (depth) {\n            // console.log('depth is ' + depth);\n            // console.log('stack is ' + stack.length);\n            stack.splice(0, depth);\n        }\n\n        var result = {\n            'mode': 'callers',\n            'name': ex.name,\n            'message': ex.message,\n            'stack': stack\n        };\n        augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description);\n        return result;\n    }\n\n    /**\n     * Computes a stack trace for an exception.\n     * @param {Error} ex\n     * @param {(string|number)=} depth\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTrace(ex, depth) {\n        var stack = null;\n        depth = (depth == null ? 0 : +depth);\n\n        try {\n            // This must be tried first because Opera 10 *destroys*\n            // its stacktrace property if you try to access the stack\n            // property first!!\n            stack = computeStackTraceFromStacktraceProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromStackProp(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceFromOperaMultiLineMessage(ex);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        try {\n            stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n            if (stack) {\n                return stack;\n            }\n        } catch (e) {\n            if (debug) {\n                throw e;\n            }\n        }\n\n        return {\n            'mode': 'failed'\n        };\n    }\n\n    /**\n     * Logs a stacktrace starting from the previous call and working down.\n     * @param {(number|string)=} depth How many frames deep to trace.\n     * @return {TraceKit.StackTrace} Stack trace information.\n     * @memberof TraceKit.computeStackTrace\n     */\n    function computeStackTraceOfCaller(depth) {\n        depth = (depth == null ? 0 : +depth) + 1; // \"+ 1\" because \"ofCaller\" should drop one frame\n        try {\n            throw new Error();\n        } catch (ex) {\n            return computeStackTrace(ex, depth + 1);\n        }\n    }\n\n    computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n    computeStackTrace.guessFunctionName = guessFunctionName;\n    computeStackTrace.gatherContext = gatherContext;\n    computeStackTrace.ofCaller = computeStackTraceOfCaller;\n    computeStackTrace.getSource = getSource;\n\n    return computeStackTrace;\n}());\n\n/**\n * Extends support for global error handling for asynchronous browser\n * functions. Adopted from Closure Library's errorhandler.js\n * @memberof TraceKit\n */\nTraceKit.extendToAsynchronousCallbacks = function () {\n    var _helper = function _helper(fnName) {\n        var originalFn = window[fnName];\n        window[fnName] = function traceKitAsyncExtension() {\n            // Make a copy of the arguments\n            var args = _slice.call(arguments);\n            var originalCallback = args[0];\n            if (typeof (originalCallback) === 'function') {\n                args[0] = TraceKit.wrap(originalCallback);\n            }\n            // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n            // also only supports 2 argument and doesn't care what \"this\" is, so we\n            // can just call the original function directly.\n            if (originalFn.apply) {\n                return originalFn.apply(this, args);\n            } else {\n                return originalFn(args[0], args[1]);\n            }\n        };\n    };\n\n    _helper('setTimeout');\n    _helper('setInterval');\n};\n\n//Default options:\nif (!TraceKit.remoteFetching) {\n    TraceKit.remoteFetching = true;\n}\nif (!TraceKit.collectWindowErrors) {\n    TraceKit.collectWindowErrors = true;\n}\nif (!TraceKit.linesOfContext || TraceKit.linesOfContext < 1) {\n    // 5 lines before, the offending line, 5 lines after\n    TraceKit.linesOfContext = 11;\n}\n\n// UMD export\nif (typeof module !== 'undefined' && module.exports && this.module !== module) {\n    module.exports = TraceKit;\n} else if (typeof define === 'function' && define.amd) {\n    define('TraceKit', [], TraceKit);\n} else {\n    window.TraceKit = TraceKit;\n}\n\n}(typeof window !== 'undefined' ? window : global));\n\n\n(function(root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    define('exceptionless', [\"require\",\"exports\",\"module\",\"TraceKit\"], factory);\n  } else if (typeof exports === 'object') {\n    module.exports = factory(require, exports, module, require('TraceKit'));\n  } else {\n    root.exceptionless = factory(require, exports, module, root.TraceKit);\n  }\n}(this, function(require, exports, module, TraceKit) {\nif (!require) {\n\trequire = function(name) {\n\t\treturn (typeof window !== \"undefined\" ? window : global)[name];\n\t}\n}\nif (!exports) {\n\tvar exports = {};\n}\n\n\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar TraceKit = require('TraceKit');\nvar SubmissionResponse = (function () {\n    function SubmissionResponse(statusCode, message) {\n        this.success = false;\n        this.badRequest = false;\n        this.serviceUnavailable = false;\n        this.paymentRequired = false;\n        this.unableToAuthenticate = false;\n        this.notFound = false;\n        this.requestEntityTooLarge = false;\n        this.statusCode = statusCode;\n        this.message = message;\n        this.success = statusCode >= 200 && statusCode <= 299;\n        this.badRequest = statusCode === 400;\n        this.serviceUnavailable = statusCode === 503;\n        this.paymentRequired = statusCode === 402;\n        this.unableToAuthenticate = statusCode === 401 || statusCode === 403;\n        this.notFound = statusCode === 404;\n        this.requestEntityTooLarge = statusCode === 413;\n    }\n    return SubmissionResponse;\n}());\nexports.SubmissionResponse = SubmissionResponse;\nvar SettingsManager = (function () {\n    function SettingsManager() {\n    }\n    SettingsManager.onChanged = function (handler) {\n        !!handler && this._handlers.push(handler);\n    };\n    SettingsManager.applySavedServerSettings = function (config) {\n        if (!config || !config.isValid) {\n            return;\n        }\n        var savedSettings = this.getSavedServerSettings(config);\n        config.log.info(\"Applying saved settings: v\" + savedSettings.version);\n        config.settings = Utils.merge(config.settings, savedSettings.settings);\n        this.changed(config);\n    };\n    SettingsManager.getVersion = function (config) {\n        if (!config || !config.isValid) {\n            return 0;\n        }\n        var savedSettings = this.getSavedServerSettings(config);\n        return savedSettings.version || 0;\n    };\n    SettingsManager.checkVersion = function (version, config) {\n        var currentVersion = this.getVersion(config);\n        if (version <= currentVersion) {\n            return;\n        }\n        config.log.info(\"Updating settings from v\" + currentVersion + \" to v\" + version);\n        this.updateSettings(config, currentVersion);\n    };\n    SettingsManager.updateSettings = function (config, version) {\n        var _this = this;\n        if (!config || !config.enabled) {\n            return;\n        }\n        var unableToUpdateMessage = 'Unable to update settings';\n        if (!config.isValid) {\n            config.log.error(unableToUpdateMessage + \": ApiKey is not set.\");\n            return;\n        }\n        if (!version || version < 0) {\n            version = this.getVersion(config);\n        }\n        config.log.info(\"Checking for updated settings from: v\" + version + \".\");\n        config.submissionClient.getSettings(config, version, function (response) {\n            if (!config || !response || !response.success || !response.settings) {\n                config.log.warn(unableToUpdateMessage + \": \" + response.message);\n                return;\n            }\n            config.settings = Utils.merge(config.settings, response.settings);\n            var savedServerSettings = SettingsManager.getSavedServerSettings(config);\n            for (var key in savedServerSettings) {\n                if (response.settings[key]) {\n                    continue;\n                }\n                delete config.settings[key];\n            }\n            var newSettings = {\n                version: response.settingsVersion,\n                settings: response.settings\n            };\n            config.storage.settings.save(newSettings);\n            config.log.info(\"Updated settings: v\" + newSettings.version);\n            _this.changed(config);\n        });\n    };\n    SettingsManager.changed = function (config) {\n        var handlers = this._handlers;\n        for (var index = 0; index < handlers.length; index++) {\n            try {\n                handlers[index](config);\n            }\n            catch (ex) {\n                config.log.error(\"Error calling onChanged handler: \" + ex);\n            }\n        }\n    };\n    SettingsManager.getSavedServerSettings = function (config) {\n        var item = config.storage.settings.get()[0];\n        if (item && item.value && item.value.version && item.value.settings) {\n            return item.value;\n        }\n        return { version: 0, settings: {} };\n    };\n    SettingsManager._handlers = [];\n    return SettingsManager;\n}());\nexports.SettingsManager = SettingsManager;\nvar DefaultLastReferenceIdManager = (function () {\n    function DefaultLastReferenceIdManager() {\n        this._lastReferenceId = null;\n    }\n    DefaultLastReferenceIdManager.prototype.getLast = function () {\n        return this._lastReferenceId;\n    };\n    DefaultLastReferenceIdManager.prototype.clearLast = function () {\n        this._lastReferenceId = null;\n    };\n    DefaultLastReferenceIdManager.prototype.setLast = function (eventId) {\n        this._lastReferenceId = eventId;\n    };\n    return DefaultLastReferenceIdManager;\n}());\nexports.DefaultLastReferenceIdManager = DefaultLastReferenceIdManager;\nvar ConsoleLog = (function () {\n    function ConsoleLog() {\n    }\n    ConsoleLog.prototype.info = function (message) {\n        this.log('info', message);\n    };\n    ConsoleLog.prototype.warn = function (message) {\n        this.log('warn', message);\n    };\n    ConsoleLog.prototype.error = function (message) {\n        this.log('error', message);\n    };\n    ConsoleLog.prototype.log = function (level, message) {\n        if (console && console[level]) {\n            console[level](\"[\" + level + \"] Exceptionless: \" + message);\n        }\n    };\n    return ConsoleLog;\n}());\nexports.ConsoleLog = ConsoleLog;\nvar NullLog = (function () {\n    function NullLog() {\n    }\n    NullLog.prototype.info = function (message) { };\n    NullLog.prototype.warn = function (message) { };\n    NullLog.prototype.error = function (message) { };\n    return NullLog;\n}());\nexports.NullLog = NullLog;\nvar EventPluginContext = (function () {\n    function EventPluginContext(client, event, contextData) {\n        this.client = client;\n        this.event = event;\n        this.contextData = contextData ? contextData : new ContextData();\n    }\n    Object.defineProperty(EventPluginContext.prototype, \"log\", {\n        get: function () {\n            return this.client.config.log;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    return EventPluginContext;\n}());\nexports.EventPluginContext = EventPluginContext;\nvar EventPluginManager = (function () {\n    function EventPluginManager() {\n    }\n    EventPluginManager.run = function (context, callback) {\n        var wrap = function (plugin, next) {\n            return function () {\n                try {\n                    if (!context.cancelled) {\n                        plugin.run(context, next);\n                    }\n                }\n                catch (ex) {\n                    context.cancelled = true;\n                    context.log.error(\"Error running plugin '\" + plugin.name + \"': \" + ex.message + \". Discarding Event.\");\n                }\n                if (context.cancelled && !!callback) {\n                    callback(context);\n                }\n            };\n        };\n        var plugins = context.client.config.plugins;\n        var wrappedPlugins = [];\n        if (!!callback) {\n            wrappedPlugins[plugins.length] = wrap({ name: 'cb', priority: 9007199254740992, run: callback }, null);\n        }\n        for (var index = plugins.length - 1; index > -1; index--) {\n            wrappedPlugins[index] = wrap(plugins[index], !!callback || (index < plugins.length - 1) ? wrappedPlugins[index + 1] : null);\n        }\n        wrappedPlugins[0]();\n    };\n    EventPluginManager.addDefaultPlugins = function (config) {\n        config.addPlugin(new ConfigurationDefaultsPlugin());\n        config.addPlugin(new ErrorPlugin());\n        config.addPlugin(new DuplicateCheckerPlugin());\n        config.addPlugin(new EventExclusionPlugin());\n        config.addPlugin(new ModuleInfoPlugin());\n        config.addPlugin(new RequestInfoPlugin());\n        config.addPlugin(new EnvironmentInfoPlugin());\n        config.addPlugin(new SubmissionMethodPlugin());\n    };\n    return EventPluginManager;\n}());\nexports.EventPluginManager = EventPluginManager;\nvar HeartbeatPlugin = (function () {\n    function HeartbeatPlugin(heartbeatInterval) {\n        if (heartbeatInterval === void 0) { heartbeatInterval = 30000; }\n        this.priority = 100;\n        this.name = 'HeartbeatPlugin';\n        this._interval = heartbeatInterval;\n    }\n    HeartbeatPlugin.prototype.run = function (context, next) {\n        clearInterval(this._intervalId);\n        var user = context.event.data['@user'];\n        if (user && user.identity) {\n            this._intervalId = setInterval(function () { return context.client.submitSessionHeartbeat(user.identity); }, this._interval);\n        }\n        next && next();\n    };\n    return HeartbeatPlugin;\n}());\nexports.HeartbeatPlugin = HeartbeatPlugin;\nvar ReferenceIdPlugin = (function () {\n    function ReferenceIdPlugin() {\n        this.priority = 20;\n        this.name = 'ReferenceIdPlugin';\n    }\n    ReferenceIdPlugin.prototype.run = function (context, next) {\n        if ((!context.event.reference_id || context.event.reference_id.length === 0) && context.event.type === 'error') {\n            context.event.reference_id = Utils.guid().replace('-', '').substring(0, 10);\n        }\n        next && next();\n    };\n    return ReferenceIdPlugin;\n}());\nexports.ReferenceIdPlugin = ReferenceIdPlugin;\nvar DefaultEventQueue = (function () {\n    function DefaultEventQueue(config) {\n        this._handlers = [];\n        this._processingQueue = false;\n        this._config = config;\n    }\n    DefaultEventQueue.prototype.enqueue = function (event) {\n        var eventWillNotBeQueued = 'The event will not be queued.';\n        var config = this._config;\n        var log = config.log;\n        if (!config.enabled) {\n            log.info(\"Configuration is disabled. \" + eventWillNotBeQueued);\n            return;\n        }\n        if (!config.isValid) {\n            log.info(\"Invalid Api Key. \" + eventWillNotBeQueued);\n            return;\n        }\n        if (this.areQueuedItemsDiscarded()) {\n            log.info(\"Queue items are currently being discarded. \" + eventWillNotBeQueued);\n            return;\n        }\n        this.ensureQueueTimer();\n        var timestamp = config.storage.queue.save(event);\n        var logText = \"type=\" + event.type + \" \" + (!!event.reference_id ? 'refid=' + event.reference_id : '');\n        if (timestamp) {\n            log.info(\"Enqueuing event: \" + timestamp + \" \" + logText);\n        }\n        else {\n            log.error(\"Could not enqueue event \" + logText);\n        }\n    };\n    DefaultEventQueue.prototype.process = function (isAppExiting) {\n        var _this = this;\n        var queueNotProcessed = 'The queue will not be processed.';\n        var config = this._config;\n        var log = config.log;\n        if (this._processingQueue) {\n            return;\n        }\n        log.info('Processing queue...');\n        if (!config.enabled) {\n            log.info(\"Configuration is disabled. \" + queueNotProcessed);\n            return;\n        }\n        if (!config.isValid) {\n            log.info(\"Invalid Api Key. \" + queueNotProcessed);\n            return;\n        }\n        this._processingQueue = true;\n        this.ensureQueueTimer();\n        try {\n            var events_1 = config.storage.queue.get(config.submissionBatchSize);\n            if (!events_1 || events_1.length === 0) {\n                this._processingQueue = false;\n                return;\n            }\n            log.info(\"Sending \" + events_1.length + \" events to \" + config.serverUrl + \".\");\n            config.submissionClient.postEvents(events_1.map(function (e) { return e.value; }), config, function (response) {\n                _this.processSubmissionResponse(response, events_1);\n                _this.eventsPosted(events_1.map(function (e) { return e.value; }), response);\n                log.info('Finished processing queue.');\n                _this._processingQueue = false;\n            }, isAppExiting);\n        }\n        catch (ex) {\n            log.error(\"Error processing queue: \" + ex);\n            this.suspendProcessing();\n            this._processingQueue = false;\n        }\n    };\n    DefaultEventQueue.prototype.suspendProcessing = function (durationInMinutes, discardFutureQueuedItems, clearQueue) {\n        var config = this._config;\n        if (!durationInMinutes || durationInMinutes <= 0) {\n            durationInMinutes = 5;\n        }\n        config.log.info(\"Suspending processing for \" + durationInMinutes + \" minutes.\");\n        this._suspendProcessingUntil = new Date(new Date().getTime() + (durationInMinutes * 60000));\n        if (discardFutureQueuedItems) {\n            this._discardQueuedItemsUntil = this._suspendProcessingUntil;\n        }\n        if (clearQueue) {\n            config.storage.queue.clear();\n        }\n    };\n    DefaultEventQueue.prototype.onEventsPosted = function (handler) {\n        !!handler && this._handlers.push(handler);\n    };\n    DefaultEventQueue.prototype.eventsPosted = function (events, response) {\n        var handlers = this._handlers;\n        for (var index = 0; index < handlers.length; index++) {\n            try {\n                handlers[index](events, response);\n            }\n            catch (ex) {\n                this._config.log.error(\"Error calling onEventsPosted handler: \" + ex);\n            }\n        }\n    };\n    DefaultEventQueue.prototype.areQueuedItemsDiscarded = function () {\n        return this._discardQueuedItemsUntil && this._discardQueuedItemsUntil > new Date();\n    };\n    DefaultEventQueue.prototype.ensureQueueTimer = function () {\n        var _this = this;\n        if (!this._queueTimer) {\n            this._queueTimer = setInterval(function () { return _this.onProcessQueue(); }, 10000);\n        }\n    };\n    DefaultEventQueue.prototype.isQueueProcessingSuspended = function () {\n        return this._suspendProcessingUntil && this._suspendProcessingUntil > new Date();\n    };\n    DefaultEventQueue.prototype.onProcessQueue = function () {\n        if (!this.isQueueProcessingSuspended() && !this._processingQueue) {\n            this.process();\n        }\n    };\n    DefaultEventQueue.prototype.processSubmissionResponse = function (response, events) {\n        var noSubmission = 'The event will not be submitted.';\n        var config = this._config;\n        var log = config.log;\n        if (response.success) {\n            log.info(\"Sent \" + events.length + \" events.\");\n            this.removeEvents(events);\n            return;\n        }\n        if (response.serviceUnavailable) {\n            log.error('Server returned service unavailable.');\n            this.suspendProcessing();\n            return;\n        }\n        if (response.paymentRequired) {\n            log.info('Too many events have been submitted, please upgrade your plan.');\n            this.suspendProcessing(null, true, true);\n            return;\n        }\n        if (response.unableToAuthenticate) {\n            log.info(\"Unable to authenticate, please check your configuration. \" + noSubmission);\n            this.suspendProcessing(15);\n            this.removeEvents(events);\n            return;\n        }\n        if (response.notFound || response.badRequest) {\n            log.error(\"Error while trying to submit data: \" + response.message);\n            this.suspendProcessing(60 * 4);\n            this.removeEvents(events);\n            return;\n        }\n        if (response.requestEntityTooLarge) {\n            var message = 'Event submission discarded for being too large.';\n            if (config.submissionBatchSize > 1) {\n                log.error(message + \" Retrying with smaller batch size.\");\n                config.submissionBatchSize = Math.max(1, Math.round(config.submissionBatchSize / 1.5));\n            }\n            else {\n                log.error(message + \" \" + noSubmission);\n                this.removeEvents(events);\n            }\n            return;\n        }\n        if (!response.success) {\n            log.error(\"Error submitting events: \" + (response.message || 'Please check the network tab for more info.'));\n            this.suspendProcessing();\n        }\n    };\n    DefaultEventQueue.prototype.removeEvents = function (events) {\n        for (var index = 0; index < (events || []).length; index++) {\n            this._config.storage.queue.remove(events[index].timestamp);\n        }\n    };\n    return DefaultEventQueue;\n}());\nexports.DefaultEventQueue = DefaultEventQueue;\nvar InMemoryStorageProvider = (function () {\n    function InMemoryStorageProvider(maxQueueItems) {\n        if (maxQueueItems === void 0) { maxQueueItems = 250; }\n        this.queue = new InMemoryStorage(maxQueueItems);\n        this.settings = new InMemoryStorage(1);\n    }\n    return InMemoryStorageProvider;\n}());\nexports.InMemoryStorageProvider = InMemoryStorageProvider;\nvar DefaultSubmissionClient = (function () {\n    function DefaultSubmissionClient() {\n        this.configurationVersionHeader = 'x-exceptionless-configversion';\n    }\n    DefaultSubmissionClient.prototype.postEvents = function (events, config, callback, isAppExiting) {\n        var data = JSON.stringify(events);\n        var request = this.createRequest(config, 'POST', config.serverUrl + \"/api/v2/events\", data);\n        var cb = this.createSubmissionCallback(config, callback);\n        return config.submissionAdapter.sendRequest(request, cb, isAppExiting);\n    };\n    DefaultSubmissionClient.prototype.postUserDescription = function (referenceId, description, config, callback) {\n        var path = config.serverUrl + \"/api/v2/events/by-ref/\" + encodeURIComponent(referenceId) + \"/user-description\";\n        var data = JSON.stringify(description);\n        var request = this.createRequest(config, 'POST', path, data);\n        var cb = this.createSubmissionCallback(config, callback);\n        return config.submissionAdapter.sendRequest(request, cb);\n    };\n    DefaultSubmissionClient.prototype.getSettings = function (config, version, callback) {\n        var request = this.createRequest(config, 'GET', config.serverUrl + \"/api/v2/projects/config?v=\" + version);\n        var cb = function (status, message, data, headers) {\n            if (status !== 200) {\n                return callback(new SettingsResponse(false, null, -1, null, message));\n            }\n            var settings;\n            try {\n                settings = JSON.parse(data);\n            }\n            catch (e) {\n                config.log.error(\"Unable to parse settings: '\" + data + \"'\");\n            }\n            if (!settings || isNaN(settings.version)) {\n                return callback(new SettingsResponse(false, null, -1, null, 'Invalid configuration settings.'));\n            }\n            callback(new SettingsResponse(true, settings.settings || {}, settings.version));\n        };\n        return config.submissionAdapter.sendRequest(request, cb);\n    };\n    DefaultSubmissionClient.prototype.sendHeartbeat = function (sessionIdOrUserId, closeSession, config) {\n        var request = this.createRequest(config, 'GET', config.heartbeatServerUrl + \"/api/v2/events/session/heartbeat?id=\" + sessionIdOrUserId + \"&close=\" + closeSession);\n        config.submissionAdapter.sendRequest(request);\n    };\n    DefaultSubmissionClient.prototype.createRequest = function (config, method, url, data) {\n        if (data === void 0) { data = null; }\n        return {\n            method: method,\n            url: url,\n            data: data,\n            apiKey: config.apiKey,\n            userAgent: config.userAgent\n        };\n    };\n    DefaultSubmissionClient.prototype.createSubmissionCallback = function (config, callback) {\n        var _this = this;\n        return function (status, message, data, headers) {\n            var settingsVersion = headers && parseInt(headers[_this.configurationVersionHeader], 10);\n            SettingsManager.checkVersion(settingsVersion, config);\n            callback(new SubmissionResponse(status, message));\n        };\n    };\n    return DefaultSubmissionClient;\n}());\nexports.DefaultSubmissionClient = DefaultSubmissionClient;\nvar Utils = (function () {\n    function Utils() {\n    }\n    Utils.addRange = function (target) {\n        var values = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            values[_i - 1] = arguments[_i];\n        }\n        if (!target) {\n            target = [];\n        }\n        if (!values || values.length === 0) {\n            return target;\n        }\n        for (var index = 0; index < values.length; index++) {\n            if (values[index] && target.indexOf(values[index]) < 0) {\n                target.push(values[index]);\n            }\n        }\n        return target;\n    };\n    Utils.getHashCode = function (source) {\n        if (!source || source.length === 0) {\n            return 0;\n        }\n        var hash = 0;\n        for (var index = 0; index < source.length; index++) {\n            var character = source.charCodeAt(index);\n            hash = ((hash << 5) - hash) + character;\n            hash |= 0;\n        }\n        return hash;\n    };\n    Utils.getCookies = function (cookies, exclusions) {\n        var result = {};\n        var parts = (cookies || '').split('; ');\n        for (var index = 0; index < parts.length; index++) {\n            var cookie = parts[index].split('=');\n            if (!Utils.isMatch(cookie[0], exclusions)) {\n                result[cookie[0]] = cookie[1];\n            }\n        }\n        return !Utils.isEmpty(result) ? result : null;\n    };\n    Utils.guid = function () {\n        function s4() {\n            return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n        }\n        return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n    };\n    Utils.merge = function (defaultValues, values) {\n        var result = {};\n        for (var key in defaultValues || {}) {\n            if (!!defaultValues[key]) {\n                result[key] = defaultValues[key];\n            }\n        }\n        for (var key in values || {}) {\n            if (!!values[key]) {\n                result[key] = values[key];\n            }\n        }\n        return result;\n    };\n    Utils.parseVersion = function (source) {\n        if (!source) {\n            return null;\n        }\n        var versionRegex = /(v?((\\d+)\\.(\\d+)(\\.(\\d+))?)(?:-([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?(?:\\+([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?)/;\n        var matches = versionRegex.exec(source);\n        if (matches && matches.length > 0) {\n            return matches[0];\n        }\n        return null;\n    };\n    Utils.parseQueryString = function (query, exclusions) {\n        if (!query || query.length === 0) {\n            return null;\n        }\n        var pairs = query.split('&');\n        if (pairs.length === 0) {\n            return null;\n        }\n        var result = {};\n        for (var index = 0; index < pairs.length; index++) {\n            var pair = pairs[index].split('=');\n            if (!Utils.isMatch(pair[0], exclusions)) {\n                result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n            }\n        }\n        return !Utils.isEmpty(result) ? result : null;\n    };\n    Utils.randomNumber = function () {\n        return Math.floor(Math.random() * 9007199254740992);\n    };\n    Utils.isMatch = function (input, patterns, ignoreCase) {\n        if (ignoreCase === void 0) { ignoreCase = true; }\n        if (!input || typeof input !== 'string') {\n            return false;\n        }\n        var trim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n        input = (ignoreCase ? input.toLowerCase() : input).replace(trim, '');\n        return (patterns || []).some(function (pattern) {\n            if (typeof pattern !== 'string') {\n                return false;\n            }\n            pattern = (ignoreCase ? pattern.toLowerCase() : pattern).replace(trim, '');\n            if (pattern.length <= 0) {\n                return false;\n            }\n            var startsWithWildcard = pattern[0] === '*';\n            if (startsWithWildcard) {\n                pattern = pattern.slice(1);\n            }\n            var endsWithWildcard = pattern[pattern.length - 1] === '*';\n            if (endsWithWildcard) {\n                pattern = pattern.substring(0, pattern.length - 1);\n            }\n            if (startsWithWildcard && endsWithWildcard) {\n                return pattern.length <= input.length && input.indexOf(pattern, 0) !== -1;\n            }\n            if (startsWithWildcard) {\n                return Utils.endsWith(input, pattern);\n            }\n            if (endsWithWildcard) {\n                return Utils.startsWith(input, pattern);\n            }\n            return input === pattern;\n        });\n    };\n    Utils.isEmpty = function (input) {\n        return input === null || (typeof (input) === 'object' && Object.keys(input).length === 0);\n    };\n    Utils.startsWith = function (input, prefix) {\n        return input.substring(0, prefix.length) === prefix;\n    };\n    Utils.endsWith = function (input, suffix) {\n        return input.indexOf(suffix, input.length - suffix.length) !== -1;\n    };\n    Utils.stringify = function (data, exclusions, maxDepth) {\n        function stringifyImpl(obj, excludedKeys) {\n            var cache = [];\n            return JSON.stringify(obj, function (key, value) {\n                if (Utils.isMatch(key, excludedKeys)) {\n                    return;\n                }\n                if (typeof value === 'object' && !!value) {\n                    if (cache.indexOf(value) !== -1) {\n                        return;\n                    }\n                    cache.push(value);\n                }\n                return value;\n            });\n        }\n        if (({}).toString.call(data) === '[object Object]') {\n            var flattened = {};\n            for (var prop in data) {\n                var value = data[prop];\n                if (value === data) {\n                    continue;\n                }\n                flattened[prop] = data[prop];\n            }\n            return stringifyImpl(flattened, exclusions);\n        }\n        if (({}).toString.call(data) === '[object Array]') {\n            var result = [];\n            for (var index = 0; index < data.length; index++) {\n                result[index] = JSON.parse(stringifyImpl(data[index], exclusions));\n            }\n            return JSON.stringify(result);\n        }\n        return stringifyImpl(data, exclusions);\n    };\n    Utils.toBoolean = function (input, defaultValue) {\n        if (defaultValue === void 0) { defaultValue = false; }\n        if (typeof input === 'boolean') {\n            return input;\n        }\n        if (input === null || typeof input !== 'number' && typeof input !== 'string') {\n            return defaultValue;\n        }\n        switch ((input + '').toLowerCase().trim()) {\n            case 'true':\n            case 'yes':\n            case '1': return true;\n            case 'false':\n            case 'no':\n            case '0':\n            case null: return false;\n        }\n        return defaultValue;\n    };\n    return Utils;\n}());\nexports.Utils = Utils;\nvar Configuration = (function () {\n    function Configuration(configSettings) {\n        this.defaultTags = [];\n        this.defaultData = {};\n        this.enabled = true;\n        this.lastReferenceIdManager = new DefaultLastReferenceIdManager();\n        this.settings = {};\n        this._serverUrl = 'https://collector.exceptionless.io';\n        this._heartbeatServerUrl = 'https://heartbeat.exceptionless.io';\n        this._updateSettingsWhenIdleInterval = 120000;\n        this._dataExclusions = [];\n        this._userAgentBotPatterns = [];\n        this._plugins = [];\n        this._handlers = [];\n        function inject(fn) {\n            return typeof fn === 'function' ? fn(this) : fn;\n        }\n        configSettings = Utils.merge(Configuration.defaults, configSettings);\n        this.log = inject(configSettings.log) || new NullLog();\n        this.apiKey = configSettings.apiKey;\n        this.serverUrl = configSettings.serverUrl;\n        this.heartbeatServerUrl = configSettings.heartbeatServerUrl;\n        this.updateSettingsWhenIdleInterval = configSettings.updateSettingsWhenIdleInterval;\n        this.environmentInfoCollector = inject(configSettings.environmentInfoCollector);\n        this.errorParser = inject(configSettings.errorParser);\n        this.lastReferenceIdManager = inject(configSettings.lastReferenceIdManager) || new DefaultLastReferenceIdManager();\n        this.moduleCollector = inject(configSettings.moduleCollector);\n        this.requestInfoCollector = inject(configSettings.requestInfoCollector);\n        this.submissionBatchSize = inject(configSettings.submissionBatchSize) || 50;\n        this.submissionAdapter = inject(configSettings.submissionAdapter);\n        this.submissionClient = inject(configSettings.submissionClient) || new DefaultSubmissionClient();\n        this.storage = inject(configSettings.storage) || new InMemoryStorageProvider();\n        this.queue = inject(configSettings.queue) || new DefaultEventQueue(this);\n        SettingsManager.applySavedServerSettings(this);\n        EventPluginManager.addDefaultPlugins(this);\n    }\n    Object.defineProperty(Configuration.prototype, \"apiKey\", {\n        get: function () {\n            return this._apiKey;\n        },\n        set: function (value) {\n            this._apiKey = value || null;\n            this.log.info(\"apiKey: \" + this._apiKey);\n            this.changed();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Configuration.prototype, \"isValid\", {\n        get: function () {\n            return !!this.apiKey && this.apiKey.length >= 10;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Configuration.prototype, \"serverUrl\", {\n        get: function () {\n            return this._serverUrl;\n        },\n        set: function (value) {\n            if (!!value) {\n                this._serverUrl = value;\n                this._heartbeatServerUrl = value;\n                this.log.info(\"serverUrl: \" + value);\n                this.changed();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Configuration.prototype, \"heartbeatServerUrl\", {\n        get: function () {\n            return this._heartbeatServerUrl;\n        },\n        set: function (value) {\n            if (!!value) {\n                this._heartbeatServerUrl = value;\n                this.log.info(\"heartbeatServerUrl: \" + value);\n                this.changed();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Configuration.prototype, \"updateSettingsWhenIdleInterval\", {\n        get: function () {\n            return this._updateSettingsWhenIdleInterval;\n        },\n        set: function (value) {\n            if (typeof value !== 'number') {\n                return;\n            }\n            if (value <= 0) {\n                value = -1;\n            }\n            else if (value > 0 && value < 15000) {\n                value = 15000;\n            }\n            this._updateSettingsWhenIdleInterval = value;\n            this.log.info(\"updateSettingsWhenIdleInterval: \" + value);\n            this.changed();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Configuration.prototype, \"dataExclusions\", {\n        get: function () {\n            var exclusions = this.settings['@@DataExclusions'];\n            return this._dataExclusions.concat(exclusions && exclusions.split(',') || []);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Configuration.prototype.addDataExclusions = function () {\n        var exclusions = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            exclusions[_i - 0] = arguments[_i];\n        }\n        this._dataExclusions = Utils.addRange.apply(Utils, [this._dataExclusions].concat(exclusions));\n    };\n    Object.defineProperty(Configuration.prototype, \"userAgentBotPatterns\", {\n        get: function () {\n            var patterns = this.settings['@@UserAgentBotPatterns'];\n            return this._userAgentBotPatterns.concat(patterns && patterns.split(',') || []);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Configuration.prototype.addUserAgentBotPatterns = function () {\n        var userAgentBotPatterns = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            userAgentBotPatterns[_i - 0] = arguments[_i];\n        }\n        this._userAgentBotPatterns = Utils.addRange.apply(Utils, [this._userAgentBotPatterns].concat(userAgentBotPatterns));\n    };\n    Object.defineProperty(Configuration.prototype, \"plugins\", {\n        get: function () {\n            return this._plugins.sort(function (p1, p2) {\n                return (p1.priority < p2.priority) ? -1 : (p1.priority > p2.priority) ? 1 : 0;\n            });\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Configuration.prototype.addPlugin = function (pluginOrName, priority, pluginAction) {\n        var plugin = !!pluginAction ? { name: pluginOrName, priority: priority, run: pluginAction } : pluginOrName;\n        if (!plugin || !plugin.run) {\n            this.log.error('Add plugin failed: Run method not defined');\n            return;\n        }\n        if (!plugin.name) {\n            plugin.name = Utils.guid();\n        }\n        if (!plugin.priority) {\n            plugin.priority = 0;\n        }\n        var pluginExists = false;\n        var plugins = this._plugins;\n        for (var index = 0; index < plugins.length; index++) {\n            if (plugins[index].name === plugin.name) {\n                pluginExists = true;\n                break;\n            }\n        }\n        if (!pluginExists) {\n            plugins.push(plugin);\n        }\n    };\n    Configuration.prototype.removePlugin = function (pluginOrName) {\n        var name = typeof pluginOrName === 'string' ? pluginOrName : pluginOrName.name;\n        if (!name) {\n            this.log.error('Remove plugin failed: Plugin name not defined');\n            return;\n        }\n        var plugins = this._plugins;\n        for (var index = 0; index < plugins.length; index++) {\n            if (plugins[index].name === name) {\n                plugins.splice(index, 1);\n                break;\n            }\n        }\n    };\n    Configuration.prototype.setVersion = function (version) {\n        if (!!version) {\n            this.defaultData['@version'] = version;\n        }\n    };\n    Configuration.prototype.setUserIdentity = function (userInfoOrIdentity, name) {\n        var USER_KEY = '@user';\n        var userInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n        var shouldRemove = !userInfo || (!userInfo.identity && !userInfo.name);\n        if (shouldRemove) {\n            delete this.defaultData[USER_KEY];\n        }\n        else {\n            this.defaultData[USER_KEY] = userInfo;\n        }\n        this.log.info(\"user identity: \" + (shouldRemove ? 'null' : userInfo.identity));\n    };\n    Object.defineProperty(Configuration.prototype, \"userAgent\", {\n        get: function () {\n            return 'exceptionless-js/1.4.1';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Configuration.prototype.useSessions = function (sendHeartbeats, heartbeatInterval) {\n        if (sendHeartbeats === void 0) { sendHeartbeats = true; }\n        if (heartbeatInterval === void 0) { heartbeatInterval = 30000; }\n        if (sendHeartbeats) {\n            this.addPlugin(new HeartbeatPlugin(heartbeatInterval));\n        }\n    };\n    Configuration.prototype.useReferenceIds = function () {\n        this.addPlugin(new ReferenceIdPlugin());\n    };\n    Configuration.prototype.useLocalStorage = function () {\n    };\n    Configuration.prototype.useDebugLogger = function () {\n        this.log = new ConsoleLog();\n    };\n    Configuration.prototype.onChanged = function (handler) {\n        !!handler && this._handlers.push(handler);\n    };\n    Configuration.prototype.changed = function () {\n        var handlers = this._handlers;\n        for (var index = 0; index < handlers.length; index++) {\n            try {\n                handlers[index](this);\n            }\n            catch (ex) {\n                this.log.error(\"Error calling onChanged handler: \" + ex);\n            }\n        }\n    };\n    Object.defineProperty(Configuration, \"defaults\", {\n        get: function () {\n            if (Configuration._defaultSettings === null) {\n                Configuration._defaultSettings = {};\n            }\n            return Configuration._defaultSettings;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Configuration._defaultSettings = null;\n    return Configuration;\n}());\nexports.Configuration = Configuration;\nvar EventBuilder = (function () {\n    function EventBuilder(event, client, pluginContextData) {\n        this._validIdentifierErrorMessage = 'must contain between 8 and 100 alphanumeric or \\'-\\' characters.';\n        this.target = event;\n        this.client = client;\n        this.pluginContextData = pluginContextData || new ContextData();\n    }\n    EventBuilder.prototype.setType = function (type) {\n        if (!!type) {\n            this.target.type = type;\n        }\n        return this;\n    };\n    EventBuilder.prototype.setSource = function (source) {\n        if (!!source) {\n            this.target.source = source;\n        }\n        return this;\n    };\n    EventBuilder.prototype.setReferenceId = function (referenceId) {\n        if (!this.isValidIdentifier(referenceId)) {\n            throw new Error(\"ReferenceId \" + this._validIdentifierErrorMessage);\n        }\n        this.target.reference_id = referenceId;\n        return this;\n    };\n    EventBuilder.prototype.setEventReference = function (name, id) {\n        if (!name) {\n            throw new Error('Invalid name');\n        }\n        if (!id || !this.isValidIdentifier(id)) {\n            throw new Error(\"Id \" + this._validIdentifierErrorMessage);\n        }\n        this.setProperty('@ref:' + name, id);\n        return this;\n    };\n    EventBuilder.prototype.setMessage = function (message) {\n        if (!!message) {\n            this.target.message = message;\n        }\n        return this;\n    };\n    EventBuilder.prototype.setGeo = function (latitude, longitude) {\n        if (latitude < -90.0 || latitude > 90.0) {\n            throw new Error('Must be a valid latitude value between -90.0 and 90.0.');\n        }\n        if (longitude < -180.0 || longitude > 180.0) {\n            throw new Error('Must be a valid longitude value between -180.0 and 180.0.');\n        }\n        this.target.geo = latitude + \",\" + longitude;\n        return this;\n    };\n    EventBuilder.prototype.setUserIdentity = function (userInfoOrIdentity, name) {\n        var userInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n        if (!userInfo || (!userInfo.identity && !userInfo.name)) {\n            return this;\n        }\n        this.setProperty('@user', userInfo);\n        return this;\n    };\n    EventBuilder.prototype.setUserDescription = function (emailAddress, description) {\n        if (emailAddress && description) {\n            this.setProperty('@user_description', { email_address: emailAddress, description: description });\n        }\n        return this;\n    };\n    EventBuilder.prototype.setManualStackingInfo = function (signatureData, title) {\n        if (signatureData) {\n            var stack = {\n                signature_data: signatureData\n            };\n            if (title) {\n                stack.title = title;\n            }\n            this.setProperty('@stack', stack);\n        }\n        return this;\n    };\n    EventBuilder.prototype.setManualStackingKey = function (manualStackingKey, title) {\n        if (manualStackingKey) {\n            var data = {\n                'ManualStackingKey': manualStackingKey\n            };\n            this.setManualStackingInfo(data, title);\n        }\n        return this;\n    };\n    EventBuilder.prototype.setValue = function (value) {\n        if (!!value) {\n            this.target.value = value;\n        }\n        return this;\n    };\n    EventBuilder.prototype.addTags = function () {\n        var tags = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            tags[_i - 0] = arguments[_i];\n        }\n        this.target.tags = Utils.addRange.apply(Utils, [this.target.tags].concat(tags));\n        return this;\n    };\n    EventBuilder.prototype.setProperty = function (name, value, maxDepth, excludedPropertyNames) {\n        if (!name || (value === undefined || value == null)) {\n            return this;\n        }\n        if (!this.target.data) {\n            this.target.data = {};\n        }\n        var result = JSON.parse(Utils.stringify(value, this.client.config.dataExclusions.concat(excludedPropertyNames || []), maxDepth));\n        if (!Utils.isEmpty(result)) {\n            this.target.data[name] = result;\n        }\n        return this;\n    };\n    EventBuilder.prototype.markAsCritical = function (critical) {\n        if (critical) {\n            this.addTags('Critical');\n        }\n        return this;\n    };\n    EventBuilder.prototype.addRequestInfo = function (request) {\n        if (!!request) {\n            this.pluginContextData['@request'] = request;\n        }\n        return this;\n    };\n    EventBuilder.prototype.submit = function (callback) {\n        this.client.submitEvent(this.target, this.pluginContextData, callback);\n    };\n    EventBuilder.prototype.isValidIdentifier = function (value) {\n        if (!value) {\n            return true;\n        }\n        if (value.length < 8 || value.length > 100) {\n            return false;\n        }\n        for (var index = 0; index < value.length; index++) {\n            var code = value.charCodeAt(index);\n            var isDigit = (code >= 48) && (code <= 57);\n            var isLetter = ((code >= 65) && (code <= 90)) || ((code >= 97) && (code <= 122));\n            var isMinus = code === 45;\n            if (!(isDigit || isLetter) && !isMinus) {\n                return false;\n            }\n        }\n        return true;\n    };\n    return EventBuilder;\n}());\nexports.EventBuilder = EventBuilder;\nvar ContextData = (function () {\n    function ContextData() {\n    }\n    ContextData.prototype.setException = function (exception) {\n        if (exception) {\n            this['@@_Exception'] = exception;\n        }\n    };\n    Object.defineProperty(ContextData.prototype, \"hasException\", {\n        get: function () {\n            return !!this['@@_Exception'];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ContextData.prototype.getException = function () {\n        return this['@@_Exception'] || null;\n    };\n    ContextData.prototype.markAsUnhandledError = function () {\n        this['@@_IsUnhandledError'] = true;\n    };\n    Object.defineProperty(ContextData.prototype, \"isUnhandledError\", {\n        get: function () {\n            return !!this['@@_IsUnhandledError'];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ContextData.prototype.setSubmissionMethod = function (method) {\n        if (method) {\n            this['@@_SubmissionMethod'] = method;\n        }\n    };\n    ContextData.prototype.getSubmissionMethod = function () {\n        return this['@@_SubmissionMethod'] || null;\n    };\n    return ContextData;\n}());\nexports.ContextData = ContextData;\nvar ExceptionlessClient = (function () {\n    function ExceptionlessClient(settingsOrApiKey, serverUrl) {\n        var _this = this;\n        if (typeof settingsOrApiKey === 'object') {\n            this.config = new Configuration(settingsOrApiKey);\n        }\n        else {\n            this.config = new Configuration({ apiKey: settingsOrApiKey, serverUrl: serverUrl });\n        }\n        this.updateSettingsTimer(5000);\n        this.config.onChanged(function (config) { return _this.updateSettingsTimer(_this._timeoutId > 0 ? 5000 : 0); });\n        this.config.queue.onEventsPosted(function (events, response) { return _this.updateSettingsTimer(); });\n    }\n    ExceptionlessClient.prototype.createException = function (exception) {\n        var pluginContextData = new ContextData();\n        pluginContextData.setException(exception);\n        return this.createEvent(pluginContextData).setType('error');\n    };\n    ExceptionlessClient.prototype.submitException = function (exception, callback) {\n        this.createException(exception).submit(callback);\n    };\n    ExceptionlessClient.prototype.createUnhandledException = function (exception, submissionMethod) {\n        var builder = this.createException(exception);\n        builder.pluginContextData.markAsUnhandledError();\n        builder.pluginContextData.setSubmissionMethod(submissionMethod);\n        return builder;\n    };\n    ExceptionlessClient.prototype.submitUnhandledException = function (exception, submissionMethod, callback) {\n        this.createUnhandledException(exception, submissionMethod).submit(callback);\n    };\n    ExceptionlessClient.prototype.createFeatureUsage = function (feature) {\n        return this.createEvent().setType('usage').setSource(feature);\n    };\n    ExceptionlessClient.prototype.submitFeatureUsage = function (feature, callback) {\n        this.createFeatureUsage(feature).submit(callback);\n    };\n    ExceptionlessClient.prototype.createLog = function (sourceOrMessage, message, level) {\n        var builder = this.createEvent().setType('log');\n        if (message && level) {\n            builder = builder.setSource(sourceOrMessage).setMessage(message).setProperty('@level', level);\n        }\n        else if (message) {\n            builder = builder.setSource(sourceOrMessage).setMessage(message);\n        }\n        else {\n            var caller = arguments.callee.caller;\n            builder = builder.setSource(caller && caller.name).setMessage(sourceOrMessage);\n        }\n        return builder;\n    };\n    ExceptionlessClient.prototype.submitLog = function (sourceOrMessage, message, level, callback) {\n        this.createLog(sourceOrMessage, message, level).submit(callback);\n    };\n    ExceptionlessClient.prototype.createNotFound = function (resource) {\n        return this.createEvent().setType('404').setSource(resource);\n    };\n    ExceptionlessClient.prototype.submitNotFound = function (resource, callback) {\n        this.createNotFound(resource).submit(callback);\n    };\n    ExceptionlessClient.prototype.createSessionStart = function () {\n        return this.createEvent().setType('session');\n    };\n    ExceptionlessClient.prototype.submitSessionStart = function (callback) {\n        this.createSessionStart().submit(callback);\n    };\n    ExceptionlessClient.prototype.submitSessionEnd = function (sessionIdOrUserId) {\n        if (sessionIdOrUserId) {\n            this.config.log.info(\"Submitting session end: \" + sessionIdOrUserId);\n            this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, true, this.config);\n        }\n    };\n    ExceptionlessClient.prototype.submitSessionHeartbeat = function (sessionIdOrUserId) {\n        if (sessionIdOrUserId) {\n            this.config.log.info(\"Submitting session heartbeat: \" + sessionIdOrUserId);\n            this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, false, this.config);\n        }\n    };\n    ExceptionlessClient.prototype.createEvent = function (pluginContextData) {\n        return new EventBuilder({ date: new Date() }, this, pluginContextData);\n    };\n    ExceptionlessClient.prototype.submitEvent = function (event, pluginContextData, callback) {\n        function cancelled(context) {\n            if (!!context) {\n                context.cancelled = true;\n            }\n            return !!callback && callback(context);\n        }\n        var context = new EventPluginContext(this, event, pluginContextData);\n        if (!event) {\n            return cancelled(context);\n        }\n        if (!this.config.enabled) {\n            this.config.log.info('Event submission is currently disabled.');\n            return cancelled(context);\n        }\n        if (!event.data) {\n            event.data = {};\n        }\n        if (!event.tags || !event.tags.length) {\n            event.tags = [];\n        }\n        EventPluginManager.run(context, function (ctx) {\n            var config = ctx.client.config;\n            var ev = ctx.event;\n            if (!ctx.cancelled) {\n                if (!ev.type || ev.type.length === 0) {\n                    ev.type = 'log';\n                }\n                if (!ev.date) {\n                    ev.date = new Date();\n                }\n                config.queue.enqueue(ev);\n                if (ev.reference_id && ev.reference_id.length > 0) {\n                    ctx.log.info(\"Setting last reference id '\" + ev.reference_id + \"'\");\n                    config.lastReferenceIdManager.setLast(ev.reference_id);\n                }\n            }\n            !!callback && callback(ctx);\n        });\n    };\n    ExceptionlessClient.prototype.updateUserEmailAndDescription = function (referenceId, email, description, callback) {\n        var _this = this;\n        if (!referenceId || !email || !description || !this.config.enabled) {\n            return !!callback && callback(new SubmissionResponse(500, 'cancelled'));\n        }\n        var userDescription = { email_address: email, description: description };\n        this.config.submissionClient.postUserDescription(referenceId, userDescription, this.config, function (response) {\n            if (!response.success) {\n                _this.config.log.error(\"Failed to submit user email and description for event '\" + referenceId + \"': \" + response.statusCode + \" \" + response.message);\n            }\n            !!callback && callback(response);\n        });\n    };\n    ExceptionlessClient.prototype.getLastReferenceId = function () {\n        return this.config.lastReferenceIdManager.getLast();\n    };\n    ExceptionlessClient.prototype.updateSettingsTimer = function (initialDelay) {\n        var _this = this;\n        this.config.log.info(\"Updating settings timer with delay: \" + initialDelay);\n        this._timeoutId = clearTimeout(this._timeoutId);\n        this._timeoutId = clearInterval(this._intervalId);\n        var interval = this.config.updateSettingsWhenIdleInterval;\n        if (interval > 0) {\n            var updateSettings = function () { return SettingsManager.updateSettings(_this.config); };\n            if (initialDelay > 0) {\n                this._timeoutId = setTimeout(updateSettings, initialDelay);\n            }\n            this._intervalId = setInterval(updateSettings, interval);\n        }\n    };\n    Object.defineProperty(ExceptionlessClient, \"default\", {\n        get: function () {\n            if (ExceptionlessClient._instance === null) {\n                ExceptionlessClient._instance = new ExceptionlessClient(null);\n            }\n            return ExceptionlessClient._instance;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ExceptionlessClient._instance = null;\n    return ExceptionlessClient;\n}());\nexports.ExceptionlessClient = ExceptionlessClient;\nvar ConfigurationDefaultsPlugin = (function () {\n    function ConfigurationDefaultsPlugin() {\n        this.priority = 10;\n        this.name = 'ConfigurationDefaultsPlugin';\n    }\n    ConfigurationDefaultsPlugin.prototype.run = function (context, next) {\n        var config = context.client.config;\n        var defaultTags = config.defaultTags || [];\n        for (var index = 0; index < defaultTags.length; index++) {\n            var tag = defaultTags[index];\n            if (!!tag && context.event.tags.indexOf(tag) < 0) {\n                context.event.tags.push(tag);\n            }\n        }\n        var defaultData = config.defaultData || {};\n        for (var key in defaultData) {\n            if (!!defaultData[key]) {\n                var result = JSON.parse(Utils.stringify(defaultData[key], config.dataExclusions));\n                if (!Utils.isEmpty(result)) {\n                    context.event.data[key] = result;\n                }\n            }\n        }\n        next && next();\n    };\n    return ConfigurationDefaultsPlugin;\n}());\nexports.ConfigurationDefaultsPlugin = ConfigurationDefaultsPlugin;\nvar ErrorPlugin = (function () {\n    function ErrorPlugin() {\n        this.priority = 30;\n        this.name = 'ErrorPlugin';\n    }\n    ErrorPlugin.prototype.run = function (context, next) {\n        var ERROR_KEY = '@error';\n        var ignoredProperties = [\n            'arguments',\n            'column',\n            'columnNumber',\n            'description',\n            'fileName',\n            'message',\n            'name',\n            'number',\n            'line',\n            'lineNumber',\n            'opera#sourceloc',\n            'sourceId',\n            'sourceURL',\n            'stack',\n            'stackArray',\n            'stacktrace'\n        ];\n        var exception = context.contextData.getException();\n        if (!!exception) {\n            context.event.type = 'error';\n            if (!context.event.data[ERROR_KEY]) {\n                var config = context.client.config;\n                var parser = config.errorParser;\n                if (!parser) {\n                    throw new Error('No error parser was defined.');\n                }\n                var result = parser.parse(context, exception);\n                if (!!result) {\n                    var additionalData = JSON.parse(Utils.stringify(exception, config.dataExclusions.concat(ignoredProperties)));\n                    if (!Utils.isEmpty(additionalData)) {\n                        if (!result.data) {\n                            result.data = {};\n                        }\n                        result.data['@ext'] = additionalData;\n                    }\n                    context.event.data[ERROR_KEY] = result;\n                }\n            }\n        }\n        next && next();\n    };\n    return ErrorPlugin;\n}());\nexports.ErrorPlugin = ErrorPlugin;\nvar ModuleInfoPlugin = (function () {\n    function ModuleInfoPlugin() {\n        this.priority = 50;\n        this.name = 'ModuleInfoPlugin';\n    }\n    ModuleInfoPlugin.prototype.run = function (context, next) {\n        var ERROR_KEY = '@error';\n        var collector = context.client.config.moduleCollector;\n        if (context.event.data[ERROR_KEY] && !context.event.data['@error'].modules && !!collector) {\n            var modules = collector.getModules(context);\n            if (modules && modules.length > 0) {\n                context.event.data[ERROR_KEY].modules = modules;\n            }\n        }\n        next && next();\n    };\n    return ModuleInfoPlugin;\n}());\nexports.ModuleInfoPlugin = ModuleInfoPlugin;\nvar RequestInfoPlugin = (function () {\n    function RequestInfoPlugin() {\n        this.priority = 70;\n        this.name = 'RequestInfoPlugin';\n    }\n    RequestInfoPlugin.prototype.run = function (context, next) {\n        var REQUEST_KEY = '@request';\n        var config = context.client.config;\n        var collector = config.requestInfoCollector;\n        if (!context.event.data[REQUEST_KEY] && !!collector) {\n            var requestInfo = collector.getRequestInfo(context);\n            if (!!requestInfo) {\n                if (Utils.isMatch(requestInfo.user_agent, config.userAgentBotPatterns)) {\n                    context.log.info('Cancelling event as the request user agent matches a known bot pattern');\n                    context.cancelled = true;\n                }\n                else {\n                    context.event.data[REQUEST_KEY] = requestInfo;\n                }\n            }\n        }\n        next && next();\n    };\n    return RequestInfoPlugin;\n}());\nexports.RequestInfoPlugin = RequestInfoPlugin;\nvar EnvironmentInfoPlugin = (function () {\n    function EnvironmentInfoPlugin() {\n        this.priority = 80;\n        this.name = 'EnvironmentInfoPlugin';\n    }\n    EnvironmentInfoPlugin.prototype.run = function (context, next) {\n        var ENVIRONMENT_KEY = '@environment';\n        var collector = context.client.config.environmentInfoCollector;\n        if (!context.event.data[ENVIRONMENT_KEY] && collector) {\n            var environmentInfo = collector.getEnvironmentInfo(context);\n            if (!!environmentInfo) {\n                context.event.data[ENVIRONMENT_KEY] = environmentInfo;\n            }\n        }\n        next && next();\n    };\n    return EnvironmentInfoPlugin;\n}());\nexports.EnvironmentInfoPlugin = EnvironmentInfoPlugin;\nvar SubmissionMethodPlugin = (function () {\n    function SubmissionMethodPlugin() {\n        this.priority = 100;\n        this.name = 'SubmissionMethodPlugin';\n    }\n    SubmissionMethodPlugin.prototype.run = function (context, next) {\n        var submissionMethod = context.contextData.getSubmissionMethod();\n        if (!!submissionMethod) {\n            context.event.data['@submission_method'] = submissionMethod;\n        }\n        next && next();\n    };\n    return SubmissionMethodPlugin;\n}());\nexports.SubmissionMethodPlugin = SubmissionMethodPlugin;\nvar DuplicateCheckerPlugin = (function () {\n    function DuplicateCheckerPlugin(getCurrentTime) {\n        if (getCurrentTime === void 0) { getCurrentTime = function () { return Date.now(); }; }\n        this.priority = 40;\n        this.name = 'DuplicateCheckerPlugin';\n        this._processedHashcodes = [];\n        this._getCurrentTime = getCurrentTime;\n    }\n    DuplicateCheckerPlugin.prototype.run = function (context, next) {\n        function isDuplicate(error, processedHashcodes, now, log) {\n            var _loop_1 = function() {\n                var hashCode = Utils.getHashCode(error.stack_trace && JSON.stringify(error.stack_trace));\n                if (hashCode && processedHashcodes.some(function (h) { return h.hash === hashCode && h.timestamp >= (now - 2000); })) {\n                    log.info(\"Ignoring duplicate error event hash: \" + hashCode);\n                    return { value: true };\n                }\n                processedHashcodes.push({ hash: hashCode, timestamp: now });\n                while (processedHashcodes.length > 20) {\n                    processedHashcodes.shift();\n                }\n                error = error.inner;\n            };\n            while (error) {\n                var state_1 = _loop_1();\n                if (typeof state_1 === \"object\") return state_1.value;\n            }\n            return false;\n        }\n        if (context.event.type === 'error') {\n            if (isDuplicate(context.event.data['@error'], this._processedHashcodes, this._getCurrentTime(), context.log)) {\n                context.cancelled = true;\n                return;\n            }\n        }\n        next && next();\n    };\n    return DuplicateCheckerPlugin;\n}());\nexports.DuplicateCheckerPlugin = DuplicateCheckerPlugin;\nvar EventExclusionPlugin = (function () {\n    function EventExclusionPlugin() {\n        this.priority = 45;\n        this.name = 'EventExclusionPlugin';\n    }\n    EventExclusionPlugin.prototype.run = function (context, next) {\n        function getLogLevel(level) {\n            switch ((level || '').toLowerCase().trim()) {\n                case 'trace':\n                case 'true':\n                case '1':\n                case 'yes':\n                    return 0;\n                case 'debug':\n                    return 1;\n                case 'info':\n                    return 2;\n                case 'warn':\n                    return 3;\n                case 'error':\n                    return 4;\n                case 'fatal':\n                    return 5;\n                case 'off':\n                case 'false':\n                case '0':\n                case 'no':\n                    return 6;\n                default:\n                    return -1;\n            }\n        }\n        function getMinLogLevel(settings, loggerName) {\n            if (loggerName === void 0) { loggerName = '*'; }\n            return getLogLevel(getTypeAndSourceSetting(settings, 'log', loggerName, 'Trace') + '');\n        }\n        function getTypeAndSourceSetting(settings, type, source, defaultValue) {\n            if (settings === void 0) { settings = {}; }\n            if (defaultValue === void 0) { defaultValue = undefined; }\n            if (!type) {\n                return defaultValue;\n            }\n            var isLog = type === 'log';\n            var sourcePrefix = \"@@\" + type + \":\";\n            var value = settings[sourcePrefix + source];\n            if (value) {\n                return !isLog ? Utils.toBoolean(value) : value;\n            }\n            for (var key in settings) {\n                if (Utils.startsWith(key.toLowerCase(), sourcePrefix.toLowerCase()) && Utils.isMatch(source, [key.substring(sourcePrefix.length)])) {\n                    return !isLog ? Utils.toBoolean(settings[key]) : settings[key];\n                }\n            }\n            return defaultValue;\n        }\n        var ev = context.event;\n        var log = context.log;\n        var settings = context.client.config.settings;\n        if (ev.type === 'log') {\n            var minLogLevel = getMinLogLevel(settings, ev.source);\n            var logLevel = getLogLevel(ev.data['@level']);\n            if (logLevel >= 0 && (logLevel > 5 || logLevel < minLogLevel)) {\n                log.info('Cancelling log event due to minimum log level.');\n                context.cancelled = true;\n            }\n        }\n        else if (ev.type === 'error') {\n            var error = ev.data['@error'];\n            while (!context.cancelled && error) {\n                if (getTypeAndSourceSetting(settings, ev.type, error.type, true) === false) {\n                    log.info(\"Cancelling error from excluded exception type: \" + error.type);\n                    context.cancelled = true;\n                }\n                error = error.inner;\n            }\n        }\n        else if (getTypeAndSourceSetting(settings, ev.type, ev.source, true) === false) {\n            log.info(\"Cancelling event from excluded type: \" + ev.type + \" and source: \" + ev.source);\n            context.cancelled = true;\n        }\n        next && next();\n    };\n    return EventExclusionPlugin;\n}());\nexports.EventExclusionPlugin = EventExclusionPlugin;\nvar SettingsResponse = (function () {\n    function SettingsResponse(success, settings, settingsVersion, exception, message) {\n        if (settingsVersion === void 0) { settingsVersion = -1; }\n        if (exception === void 0) { exception = null; }\n        if (message === void 0) { message = null; }\n        this.success = false;\n        this.settingsVersion = -1;\n        this.success = success;\n        this.settings = settings;\n        this.settingsVersion = settingsVersion;\n        this.exception = exception;\n        this.message = message;\n    }\n    return SettingsResponse;\n}());\nexports.SettingsResponse = SettingsResponse;\nvar InMemoryStorage = (function () {\n    function InMemoryStorage(maxItems) {\n        this.items = [];\n        this.lastTimestamp = 0;\n        this.maxItems = maxItems;\n    }\n    InMemoryStorage.prototype.save = function (value) {\n        if (!value) {\n            return null;\n        }\n        var items = this.items;\n        var timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n        var item = { timestamp: timestamp, value: value };\n        if (items.push(item) > this.maxItems) {\n            items.shift();\n        }\n        this.lastTimestamp = timestamp;\n        return item.timestamp;\n    };\n    InMemoryStorage.prototype.get = function (limit) {\n        return this.items.slice(0, limit);\n    };\n    InMemoryStorage.prototype.remove = function (timestamp) {\n        var items = this.items;\n        for (var i = 0; i < items.length; i++) {\n            if (items[i].timestamp === timestamp) {\n                items.splice(i, 1);\n                return;\n            }\n        }\n    };\n    InMemoryStorage.prototype.clear = function () {\n        this.items = [];\n    };\n    return InMemoryStorage;\n}());\nexports.InMemoryStorage = InMemoryStorage;\nvar KeyValueStorageBase = (function () {\n    function KeyValueStorageBase(maxItems) {\n        this.lastTimestamp = 0;\n        this.maxItems = maxItems;\n    }\n    KeyValueStorageBase.prototype.save = function (value, single) {\n        if (!value) {\n            return null;\n        }\n        this.ensureIndex();\n        var items = this.items;\n        var timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n        var key = this.getKey(timestamp);\n        var json = JSON.stringify(value);\n        try {\n            this.write(key, json);\n            this.lastTimestamp = timestamp;\n            if (items.push(timestamp) > this.maxItems) {\n                this.delete(this.getKey(items.shift()));\n            }\n        }\n        catch (e) {\n            return null;\n        }\n        return timestamp;\n    };\n    KeyValueStorageBase.prototype.get = function (limit) {\n        var _this = this;\n        this.ensureIndex();\n        return this.items.slice(0, limit)\n            .map(function (timestamp) {\n            var key = _this.getKey(timestamp);\n            try {\n                var json = _this.read(key);\n                var value = JSON.parse(json, parseDate);\n                return { timestamp: timestamp, value: value };\n            }\n            catch (error) {\n                _this.safeDelete(key);\n                return null;\n            }\n        })\n            .filter(function (item) { return item != null; });\n    };\n    KeyValueStorageBase.prototype.remove = function (timestamp) {\n        this.ensureIndex();\n        var items = this.items;\n        var index = items.indexOf(timestamp);\n        if (index >= 0) {\n            var key = this.getKey(timestamp);\n            this.safeDelete(key);\n            items.splice(index, 1);\n        }\n        ;\n    };\n    KeyValueStorageBase.prototype.clear = function () {\n        var _this = this;\n        this.items.forEach(function (item) { return _this.safeDelete(_this.getKey(item)); });\n        this.items = [];\n    };\n    KeyValueStorageBase.prototype.ensureIndex = function () {\n        if (!this.items) {\n            this.items = this.createIndex();\n            this.lastTimestamp = Math.max.apply(Math, [0].concat(this.items)) + 1;\n        }\n    };\n    KeyValueStorageBase.prototype.safeDelete = function (key) {\n        try {\n            this.delete(key);\n        }\n        catch (error) {\n        }\n    };\n    KeyValueStorageBase.prototype.createIndex = function () {\n        var _this = this;\n        try {\n            var keys = this.readAllKeys();\n            return keys.map(function (key) {\n                try {\n                    var timestamp = _this.getTimestamp(key);\n                    if (!timestamp) {\n                        _this.safeDelete(key);\n                        return null;\n                    }\n                    return timestamp;\n                }\n                catch (error) {\n                    _this.safeDelete(key);\n                    return null;\n                }\n            }).filter(function (timestamp) { return timestamp != null; })\n                .sort(function (a, b) { return a - b; });\n        }\n        catch (error) {\n            return [];\n        }\n    };\n    return KeyValueStorageBase;\n}());\nexports.KeyValueStorageBase = KeyValueStorageBase;\nfunction parseDate(key, value) {\n    var dateRegx = /\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/g;\n    if (typeof value === 'string') {\n        var a = dateRegx.exec(value);\n        if (a) {\n            return new Date(value);\n        }\n    }\n    return value;\n}\n;\nvar BrowserStorage = (function (_super) {\n    __extends(BrowserStorage, _super);\n    function BrowserStorage(namespace, prefix, maxItems) {\n        if (prefix === void 0) { prefix = 'com.exceptionless.'; }\n        if (maxItems === void 0) { maxItems = 20; }\n        _super.call(this, maxItems);\n        this.prefix = prefix + namespace + '-';\n    }\n    BrowserStorage.isAvailable = function () {\n        try {\n            var storage = window.localStorage, x = '__storage_test__';\n            storage.setItem(x, x);\n            storage.removeItem(x);\n            return true;\n        }\n        catch (e) {\n            return false;\n        }\n    };\n    BrowserStorage.prototype.write = function (key, value) {\n        window.localStorage.setItem(key, value);\n    };\n    BrowserStorage.prototype.read = function (key) {\n        return window.localStorage.getItem(key);\n    };\n    BrowserStorage.prototype.readAllKeys = function () {\n        var _this = this;\n        return Object.keys(window.localStorage)\n            .filter(function (key) { return key.indexOf(_this.prefix) === 0; });\n    };\n    BrowserStorage.prototype.delete = function (key) {\n        window.localStorage.removeItem(key);\n    };\n    BrowserStorage.prototype.getKey = function (timestamp) {\n        return this.prefix + timestamp;\n    };\n    BrowserStorage.prototype.getTimestamp = function (key) {\n        return parseInt(key.substr(this.prefix.length), 10);\n    };\n    return BrowserStorage;\n}(KeyValueStorageBase));\nexports.BrowserStorage = BrowserStorage;\nvar DefaultErrorParser = (function () {\n    function DefaultErrorParser() {\n    }\n    DefaultErrorParser.prototype.parse = function (context, exception) {\n        function getParameters(parameters) {\n            var params = (typeof parameters === 'string' ? [parameters] : parameters) || [];\n            var result = [];\n            for (var index = 0; index < params.length; index++) {\n                result.push({ name: params[index] });\n            }\n            return result;\n        }\n        function getStackFrames(stackFrames) {\n            var ANONYMOUS = '<anonymous>';\n            var frames = [];\n            for (var index = 0; index < stackFrames.length; index++) {\n                var frame = stackFrames[index];\n                frames.push({\n                    name: (frame.func || ANONYMOUS).replace('?', ANONYMOUS),\n                    parameters: getParameters(frame.args),\n                    file_name: frame.url,\n                    line_number: frame.line || 0,\n                    column: frame.column || 0\n                });\n            }\n            return frames;\n        }\n        var TRACEKIT_STACK_TRACE_KEY = '@@_TraceKit.StackTrace';\n        var stackTrace = !!context.contextData[TRACEKIT_STACK_TRACE_KEY]\n            ? context.contextData[TRACEKIT_STACK_TRACE_KEY]\n            : TraceKit.computeStackTrace(exception, 25);\n        if (!stackTrace) {\n            throw new Error('Unable to parse the exceptions stack trace.');\n        }\n        return {\n            type: stackTrace.name,\n            message: stackTrace.message || exception.message,\n            stack_trace: getStackFrames(stackTrace.stack || [])\n        };\n    };\n    return DefaultErrorParser;\n}());\nexports.DefaultErrorParser = DefaultErrorParser;\nvar DefaultModuleCollector = (function () {\n    function DefaultModuleCollector() {\n    }\n    DefaultModuleCollector.prototype.getModules = function (context) {\n        if (document && document.getElementsByTagName) {\n            return null;\n        }\n        var modules = [];\n        var scripts = document.getElementsByTagName('script');\n        if (scripts && scripts.length > 0) {\n            for (var index = 0; index < scripts.length; index++) {\n                if (scripts[index].src) {\n                    modules.push({\n                        module_id: index,\n                        name: scripts[index].src,\n                        version: Utils.parseVersion(scripts[index].src)\n                    });\n                }\n                else if (!!scripts[index].innerHTML) {\n                    modules.push({\n                        module_id: index,\n                        name: 'Script Tag',\n                        version: Utils.getHashCode(scripts[index].innerHTML).toString()\n                    });\n                }\n            }\n        }\n        return modules;\n    };\n    return DefaultModuleCollector;\n}());\nexports.DefaultModuleCollector = DefaultModuleCollector;\nvar DefaultRequestInfoCollector = (function () {\n    function DefaultRequestInfoCollector() {\n    }\n    DefaultRequestInfoCollector.prototype.getRequestInfo = function (context) {\n        if (!document || !navigator || !location) {\n            return null;\n        }\n        var exclusions = context.client.config.dataExclusions;\n        var requestInfo = {\n            user_agent: navigator.userAgent,\n            is_secure: location.protocol === 'https:',\n            host: location.hostname,\n            port: location.port && location.port !== '' ? parseInt(location.port, 10) : 80,\n            path: location.pathname,\n            cookies: Utils.getCookies(document.cookie, exclusions),\n            query_string: Utils.parseQueryString(location.search.substring(1), exclusions)\n        };\n        if (document.referrer && document.referrer !== '') {\n            requestInfo.referrer = document.referrer;\n        }\n        return requestInfo;\n    };\n    return DefaultRequestInfoCollector;\n}());\nexports.DefaultRequestInfoCollector = DefaultRequestInfoCollector;\nvar DefaultSubmissionAdapter = (function () {\n    function DefaultSubmissionAdapter() {\n    }\n    DefaultSubmissionAdapter.prototype.sendRequest = function (request, callback, isAppExiting) {\n        var TIMEOUT = 'timeout';\n        var LOADED = 'loaded';\n        var WITH_CREDENTIALS = 'withCredentials';\n        var isCompleted = false;\n        var useSetTimeout = false;\n        function complete(mode, xhr) {\n            function parseResponseHeaders(headerStr) {\n                function trim(value) {\n                    return value.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n                }\n                var headers = {};\n                var headerPairs = (headerStr || '').split('\\u000d\\u000a');\n                for (var index = 0; index < headerPairs.length; index++) {\n                    var headerPair = headerPairs[index];\n                    var separator = headerPair.indexOf('\\u003a\\u0020');\n                    if (separator > 0) {\n                        headers[trim(headerPair.substring(0, separator).toLowerCase())] = headerPair.substring(separator + 2);\n                    }\n                }\n                return headers;\n            }\n            if (isCompleted) {\n                return;\n            }\n            isCompleted = true;\n            var message = xhr.statusText;\n            var responseText = xhr.responseText;\n            var status = xhr.status;\n            if (mode === TIMEOUT || status === 0) {\n                message = 'Unable to connect to server.';\n                status = 0;\n            }\n            else if (mode === LOADED && !status) {\n                status = request.method === 'POST' ? 202 : 200;\n            }\n            else if (status < 200 || status > 299) {\n                var responseBody = xhr.responseBody;\n                if (!!responseBody && !!responseBody.message) {\n                    message = responseBody.message;\n                }\n                else if (!!responseText && responseText.indexOf('message') !== -1) {\n                    try {\n                        message = JSON.parse(responseText).message;\n                    }\n                    catch (e) {\n                        message = responseText;\n                    }\n                }\n            }\n            callback && callback(status || 500, message || '', responseText, parseResponseHeaders(xhr.getAllResponseHeaders && xhr.getAllResponseHeaders()));\n        }\n        function createRequest(userAgent, method, url) {\n            var xhr = new XMLHttpRequest();\n            if (WITH_CREDENTIALS in xhr) {\n                xhr.open(method, url, true);\n                xhr.setRequestHeader('X-Exceptionless-Client', userAgent);\n                if (method === 'POST') {\n                    xhr.setRequestHeader('Content-Type', 'application/json');\n                }\n            }\n            else if (typeof XDomainRequest !== 'undefined') {\n                useSetTimeout = true;\n                xhr = new XDomainRequest();\n                xhr.open(method, location.protocol === 'http:' ? url.replace('https:', 'http:') : url);\n            }\n            else {\n                xhr = null;\n            }\n            if (xhr) {\n                xhr.timeout = 10000;\n            }\n            return xhr;\n        }\n        var url = \"\" + request.url + (request.url.indexOf('?') === -1 ? '?' : '&') + \"access_token=\" + encodeURIComponent(request.apiKey);\n        var xhr = createRequest(request.userAgent, request.method || 'POST', url);\n        if (!xhr) {\n            return (callback && callback(503, 'CORS not supported.'));\n        }\n        if (WITH_CREDENTIALS in xhr) {\n            xhr.onreadystatechange = function () {\n                if (xhr.readyState !== 4) {\n                    return;\n                }\n                complete(LOADED, xhr);\n            };\n        }\n        xhr.onprogress = function () { };\n        xhr.ontimeout = function () { return complete(TIMEOUT, xhr); };\n        xhr.onerror = function () { return complete('error', xhr); };\n        xhr.onload = function () { return complete(LOADED, xhr); };\n        if (useSetTimeout) {\n            setTimeout(function () { return xhr.send(request.data); }, 500);\n        }\n        else {\n            xhr.send(request.data);\n        }\n    };\n    return DefaultSubmissionAdapter;\n}());\nexports.DefaultSubmissionAdapter = DefaultSubmissionAdapter;\nvar BrowserStorageProvider = (function () {\n    function BrowserStorageProvider(prefix, maxQueueItems) {\n        if (maxQueueItems === void 0) { maxQueueItems = 250; }\n        this.queue = new BrowserStorage('q', prefix, maxQueueItems);\n        this.settings = new BrowserStorage('settings', prefix, 1);\n    }\n    return BrowserStorageProvider;\n}());\nexports.BrowserStorageProvider = BrowserStorageProvider;\nfunction getDefaultsSettingsFromScriptTag() {\n    if (!document || !document.getElementsByTagName) {\n        return null;\n    }\n    var scripts = document.getElementsByTagName('script');\n    for (var index = 0; index < scripts.length; index++) {\n        if (scripts[index].src && scripts[index].src.indexOf('/exceptionless') > -1) {\n            return Utils.parseQueryString(scripts[index].src.split('?').pop());\n        }\n    }\n    return null;\n}\nfunction processUnhandledException(stackTrace, options) {\n    var builder = ExceptionlessClient.default.createUnhandledException(new Error(stackTrace.message || (options || {}).status || 'Script error'), 'onerror');\n    builder.pluginContextData['@@_TraceKit.StackTrace'] = stackTrace;\n    builder.submit();\n}\nConfiguration.prototype.useLocalStorage = function () {\n    if (BrowserStorage.isAvailable()) {\n        this.storage = new BrowserStorageProvider();\n        SettingsManager.applySavedServerSettings(this);\n        this.changed();\n    }\n};\nvar defaults = Configuration.defaults;\nvar settings = getDefaultsSettingsFromScriptTag();\nif (settings && (settings.apiKey || settings.serverUrl)) {\n    defaults.apiKey = settings.apiKey;\n    defaults.serverUrl = settings.serverUrl;\n}\ndefaults.errorParser = new DefaultErrorParser();\ndefaults.moduleCollector = new DefaultModuleCollector();\ndefaults.requestInfoCollector = new DefaultRequestInfoCollector();\ndefaults.submissionAdapter = new DefaultSubmissionAdapter();\nTraceKit.report.subscribe(processUnhandledException);\nTraceKit.extendToAsynchronousCallbacks();\nError.stackTraceLimit = Infinity;\n\nreturn exports;\n\n}));\n\n\n","import * as TraceKit from 'TraceKit';\nexport interface IEvent {\n  type?: string;\n  source?: string;\n  date?: Date;\n  tags?: string[];\n  message?: string;\n  geo?: string;\n  value?: number;\n  data?: any;\n  reference_id?: string;\n}\n\nexport class SubmissionResponse {\n  public success: boolean = false;\n  public badRequest: boolean = false;\n  public serviceUnavailable: boolean = false;\n  public paymentRequired: boolean = false;\n  public unableToAuthenticate: boolean = false;\n  public notFound: boolean = false;\n  public requestEntityTooLarge: boolean = false;\n  public statusCode: number;\n  public message: string;\n\n  constructor(statusCode: number, message?: string) {\n    this.statusCode = statusCode;\n    this.message = message;\n\n    this.success = statusCode >= 200 && statusCode <= 299;\n    this.badRequest = statusCode === 400;\n    this.serviceUnavailable = statusCode === 503;\n    this.paymentRequired = statusCode === 402;\n    this.unableToAuthenticate = statusCode === 401 || statusCode === 403;\n    this.notFound = statusCode === 404;\n    this.requestEntityTooLarge = statusCode === 413;\n  }\n}\n\nexport interface ILastReferenceIdManager {\n  getLast(): string;\n  clearLast(): void;\n  setLast(eventId: string): void;\n}\n\nexport interface ILog {\n  info(message: string): void;\n  warn(message: string): void;\n  error(message: string): void;\n}\n\n                                                                                                                 \n\nexport interface IEventQueue {\n  enqueue(event: IEvent): void;\n  process(isAppExiting?: boolean): void;\n  suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void;\n  onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void;\n}\n\n                                                                                                                                  \n\nexport interface IEnvironmentInfoCollector {\n  getEnvironmentInfo(context: EventPluginContext): IEnvironmentInfo;\n}\n\n                                                                                                              \n\nexport interface IErrorParser {\n  parse(context: EventPluginContext, exception: Error): IError;\n}\n\n                                                                                                                \n\nexport interface IModuleCollector {\n  getModules(context: EventPluginContext): IModule[];\n}\n\n                                                                                                                          \n\nexport interface IRequestInfoCollector {\n  getRequestInfo(context: EventPluginContext): IRequestInfo;\n}\n\n                                      \n\nexport interface IStorageProvider {\n  queue: IStorage;\n  settings: IStorage;\n}\n\n                                                                                                                   \n\nexport interface ISubmissionAdapter {\n  sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean): void;\n}\n\n                                                                                                                                                                                                                                                                                           \n\nexport interface ISubmissionClient {\n  postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void;\n  postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void;\n  getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void;\n  sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void;\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            \n\nexport interface IConfigurationSettings {\n  apiKey?: string;\n  serverUrl?: string;\n  heartbeatServerUrl?: string;\n  updateSettingsWhenIdleInterval?: number;\n  environmentInfoCollector?: IEnvironmentInfoCollector;\n  errorParser?: IErrorParser;\n  lastReferenceIdManager?: ILastReferenceIdManager;\n  log?: ILog;\n  moduleCollector?: IModuleCollector;\n  requestInfoCollector?: IRequestInfoCollector;\n  submissionBatchSize?: number;\n  submissionClient?: ISubmissionClient;\n  submissionAdapter?: ISubmissionAdapter;\n  storage?: IStorageProvider;\n  queue?: IEventQueue;\n}\n\n                                                                                                                                                     \n\ninterface ISettingsWithVersion {\n  version: number;\n  settings: { [key: string]: string };\n}\n\nexport class SettingsManager {\n  /**\n   * A list of handlers that will be fired when the settings change.\n   * @type {Array}\n   * @private\n   */\n  private static _handlers: { (config: Configuration): void }[] = [];\n\n  public static onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  public static applySavedServerSettings(config: Configuration): void {\n    if (!config || !config.isValid) {\n      return;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    config.log.info(`Applying saved settings: v${savedSettings.version}`);\n    config.settings = Utils.merge(config.settings, savedSettings.settings);\n    this.changed(config);\n  }\n\n  public static getVersion(config: Configuration): number {\n    if (!config || !config.isValid) {\n      return 0;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    return savedSettings.version || 0;\n  }\n\n  public static checkVersion(version: number, config: Configuration): void {\n    let currentVersion: number = this.getVersion(config);\n    if (version <= currentVersion) {\n      return;\n    }\n\n    config.log.info(`Updating settings from v${currentVersion} to v${version}`);\n    this.updateSettings(config, currentVersion);\n  }\n\n  public static updateSettings(config: Configuration, version?: number): void {\n    if (!config || !config.enabled) {\n      return;\n    }\n\n    let unableToUpdateMessage = 'Unable to update settings';\n    if (!config.isValid) {\n      config.log.error(`${unableToUpdateMessage}: ApiKey is not set.`);\n      return;\n    }\n\n    if (!version || version < 0) {\n      version = this.getVersion(config);\n    }\n\n    config.log.info(`Checking for updated settings from: v${version}.`);\n    config.submissionClient.getSettings(config, version, (response: SettingsResponse) => {\n      if (!config || !response || !response.success || !response.settings) {\n        config.log.warn(`${unableToUpdateMessage}: ${response.message}`);\n        return;\n      }\n\n      config.settings = Utils.merge(config.settings, response.settings);\n\n      // TODO: Store snapshot of settings after reading from config and attributes and use that to revert to defaults.\n      // Remove any existing server settings that are not in the new server settings.\n      let savedServerSettings = SettingsManager.getSavedServerSettings(config);\n      for (let key in savedServerSettings) {\n        if (response.settings[key]) {\n          continue;\n        }\n\n        delete config.settings[key];\n      }\n\n      let newSettings = <ISettingsWithVersion>{\n        version: response.settingsVersion,\n        settings: response.settings\n      };\n\n      config.storage.settings.save(newSettings);\n\n      config.log.info(`Updated settings: v${newSettings.version}`);\n      this.changed(config);\n    });\n  }\n\n  private static changed(config: Configuration) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](config);\n      } catch (ex) {\n        config.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  private static getSavedServerSettings(config: Configuration): ISettingsWithVersion {\n    let item = config.storage.settings.get()[0];\n    if (item && item.value && item.value.version && item.value.settings) {\n      return item.value;\n    }\n\n    return { version: 0, settings: {} };\n  }\n}\n\n                                                                    \n\nexport class DefaultLastReferenceIdManager implements ILastReferenceIdManager {\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @type {string}\n   * @private\n   */\n  private _lastReferenceId: string = null;\n\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @returns {string}\n   */\n  public getLast(): string {\n    return this._lastReferenceId;\n  }\n\n  /**\n   * Clears the last event's reference id.\n   */\n  public clearLast(): void {\n    this._lastReferenceId = null;\n  }\n\n  /**\n   * Sets the last event's reference id.\n   * @param eventId\n   */\n  public setLast(eventId: string): void {\n    this._lastReferenceId = eventId;\n  }\n}\n\n                              \n\nexport class ConsoleLog implements ILog {\n  public info(message: string): void {\n    this.log('info', message);\n  }\n\n  public warn(message: string): void {\n    this.log('warn', message);\n  }\n\n  public error(message: string): void {\n    this.log('error', message);\n  }\n\n  private log(level: string, message: string) {\n    if (console && console[level]) {\n      console[level](`[${level}] Exceptionless: ${message}`);\n    }\n  }\n}\n\n                              \n\nexport class NullLog implements ILog {\n  public info(message: string): void { }\n  public warn(message: string): void { }\n  public error(message: string): void { }\n}\n\nexport interface IUserInfo {\n  identity?: string;\n  name?: string;\n  data?: any;\n}\n\n                                                                                                         \n\nexport interface IEventPlugin {\n  priority?: number;\n  name?: string;\n  run(context: EventPluginContext, next?: () => void): void;\n}\n\n                                                                                                                                                                                             \n\nexport class EventPluginContext {\n  public cancelled: boolean;\n  public client: ExceptionlessClient;\n  public event: IEvent;\n  public contextData: ContextData;\n\n  constructor(client: ExceptionlessClient, event: IEvent, contextData?: ContextData) {\n    this.client = client;\n    this.event = event;\n    this.contextData = contextData ? contextData : new ContextData();\n  }\n\n  public get log(): ILog {\n    return this.client.config.log;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \n\nexport class EventPluginManager {\n  public static run(context: EventPluginContext, callback: (context?: EventPluginContext) => void): void {\n    let wrap = function(plugin: IEventPlugin, next?: () => void): () => void {\n      return () => {\n        try {\n          if (!context.cancelled) {\n            plugin.run(context, next);\n          }\n        } catch (ex) {\n          context.cancelled = true;\n          context.log.error(`Error running plugin '${plugin.name}': ${ex.message}. Discarding Event.`);\n        }\n\n        if (context.cancelled && !!callback) {\n          callback(context);\n        }\n      };\n    };\n\n    let plugins: IEventPlugin[] = context.client.config.plugins; // optimization for minifier.\n    let wrappedPlugins: { (): void }[] = [];\n    if (!!callback) {\n      wrappedPlugins[plugins.length] = wrap({ name: 'cb', priority: 9007199254740992, run: callback }, null);\n    }\n\n    for (let index = plugins.length - 1; index > -1; index--) {\n      wrappedPlugins[index] = wrap(plugins[index], !!callback || (index < plugins.length - 1) ? wrappedPlugins[index + 1] : null);\n    }\n\n    wrappedPlugins[0]();\n  }\n\n  public static addDefaultPlugins(config: Configuration): void {\n    config.addPlugin(new ConfigurationDefaultsPlugin());\n    config.addPlugin(new ErrorPlugin());\n    config.addPlugin(new DuplicateCheckerPlugin());\n    config.addPlugin(new EventExclusionPlugin());\n    config.addPlugin(new ModuleInfoPlugin());\n    config.addPlugin(new RequestInfoPlugin());\n    config.addPlugin(new EnvironmentInfoPlugin());\n    config.addPlugin(new SubmissionMethodPlugin());\n  }\n}\n\n                                                                                                                                                               \n\nexport class HeartbeatPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'HeartbeatPlugin';\n\n  private _interval: number;\n  private _intervalId: any;\n\n  constructor (heartbeatInterval: number = 30000) {\n    this._interval = heartbeatInterval;\n  }\n\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    clearInterval(this._intervalId);\n\n    let user: IUserInfo = context.event.data['@user'];\n    if (user && user.identity) {\n      this._intervalId = setInterval(() => context.client.submitSessionHeartbeat(user.identity), this._interval);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ReferenceIdPlugin implements IEventPlugin {\n  public priority: number = 20;\n  public name: string = 'ReferenceIdPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    if ((!context.event.reference_id || context.event.reference_id.length === 0) && context.event.type === 'error') {\n      context.event.reference_id = Utils.guid().replace('-', '').substring(0, 10);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                     \n\nexport class DefaultEventQueue implements IEventQueue {\n  /**\n   * The configuration object.\n   * @type {Configuration}\n   * @private\n   */\n  private _config: Configuration;\n\n  /**\n   * A list of handlers that will be fired when events are submitted.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (events: IEvent[], response: SubmissionResponse): void }[] = [];\n\n  /**\n   * Suspends processing until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _suspendProcessingUntil: Date;\n\n  /**\n   * Discards queued items until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _discardQueuedItemsUntil: Date;\n\n  /**\n   * Returns true if the queue is processing.\n   * @type {boolean}\n   * @private\n   */\n  private _processingQueue: boolean = false;\n\n  /**\n   * Processes the queue every xx seconds.\n   * @type {Timer}\n   * @private\n   */\n  private _queueTimer: any;\n\n  constructor(config: Configuration) {\n    this._config = config;\n  }\n\n  public enqueue(event: IEvent): void {\n    const eventWillNotBeQueued: string = 'The event will not be queued.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (this.areQueuedItemsDiscarded()) {\n      log.info(`Queue items are currently being discarded. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    this.ensureQueueTimer();\n\n    let timestamp = config.storage.queue.save(event);\n    let logText = `type=${event.type} ${!!event.reference_id ? 'refid=' + event.reference_id : ''}`;\n    if (timestamp) {\n      log.info(`Enqueuing event: ${timestamp} ${logText}`);\n    } else {\n      log.error(`Could not enqueue event ${logText}`);\n    }\n  }\n\n  public process(isAppExiting?: boolean): void {\n    const queueNotProcessed: string = 'The queue will not be processed.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (this._processingQueue) {\n      return;\n    }\n\n    log.info('Processing queue...');\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${queueNotProcessed}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${queueNotProcessed}`);\n      return;\n    }\n\n    this._processingQueue = true;\n    this.ensureQueueTimer();\n\n    try {\n      let events = config.storage.queue.get(config.submissionBatchSize);\n      if (!events || events.length === 0) {\n        this._processingQueue = false;\n        return;\n      }\n\n      log.info(`Sending ${events.length} events to ${config.serverUrl}.`);\n      config.submissionClient.postEvents(events.map(e => e.value), config, (response: SubmissionResponse) => {\n        this.processSubmissionResponse(response, events);\n        this.eventsPosted(events.map(e => e.value), response);\n        log.info('Finished processing queue.');\n        this._processingQueue = false;\n      }, isAppExiting);\n    } catch (ex) {\n      log.error(`Error processing queue: ${ex}`);\n      this.suspendProcessing();\n      this._processingQueue = false;\n    }\n  }\n\n  public suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void {\n    let config: Configuration = this._config; // Optimization for minifier.\n\n    if (!durationInMinutes || durationInMinutes <= 0) {\n      durationInMinutes = 5;\n    }\n\n    config.log.info(`Suspending processing for ${durationInMinutes} minutes.`);\n    this._suspendProcessingUntil = new Date(new Date().getTime() + (durationInMinutes * 60000));\n\n    if (discardFutureQueuedItems) {\n      this._discardQueuedItemsUntil = this._suspendProcessingUntil;\n    }\n\n    if (clearQueue) {\n      // Account is over the limit and we want to ensure that the sample size being sent in will contain newer errors.\n      config.storage.queue.clear();\n    }\n  }\n\n  public onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private eventsPosted(events: IEvent[], response: SubmissionResponse) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](events, response);\n      } catch (ex) {\n        this._config.log.error(`Error calling onEventsPosted handler: ${ex}`);\n      }\n    }\n  }\n\n  private areQueuedItemsDiscarded(): boolean {\n    return this._discardQueuedItemsUntil && this._discardQueuedItemsUntil > new Date();\n  }\n\n  private ensureQueueTimer(): void {\n    if (!this._queueTimer) {\n      this._queueTimer = setInterval(() => this.onProcessQueue(), 10000);\n    }\n  }\n\n  private isQueueProcessingSuspended(): boolean {\n    return this._suspendProcessingUntil && this._suspendProcessingUntil > new Date();\n  }\n\n  private onProcessQueue(): void {\n    if (!this.isQueueProcessingSuspended() && !this._processingQueue) {\n      this.process();\n    }\n  }\n\n  private processSubmissionResponse(response: SubmissionResponse, events: IStorageItem[]): void {\n    const noSubmission: string = 'The event will not be submitted.'; // Optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (response.success) {\n      log.info(`Sent ${events.length} events.`);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.serviceUnavailable) {\n      // You are currently over your rate limit or the servers are under stress.\n      log.error('Server returned service unavailable.');\n      this.suspendProcessing();\n      return;\n    }\n\n    if (response.paymentRequired) {\n      // If the organization over the rate limit then discard the event.\n      log.info('Too many events have been submitted, please upgrade your plan.');\n      this.suspendProcessing(null, true, true);\n      return;\n    }\n\n    if (response.unableToAuthenticate) {\n      // The api key was suspended or could not be authorized.\n      log.info(`Unable to authenticate, please check your configuration. ${noSubmission}`);\n      this.suspendProcessing(15);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.notFound || response.badRequest) {\n      // The service end point could not be found.\n      log.error(`Error while trying to submit data: ${response.message}`);\n      this.suspendProcessing(60 * 4);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.requestEntityTooLarge) {\n      let message = 'Event submission discarded for being too large.';\n      if (config.submissionBatchSize > 1) {\n        log.error(`${message} Retrying with smaller batch size.`);\n        config.submissionBatchSize = Math.max(1, Math.round(config.submissionBatchSize / 1.5));\n      } else {\n        log.error(`${message} ${noSubmission}`);\n        this.removeEvents(events);\n      }\n\n      return;\n    }\n\n    if (!response.success) {\n      log.error(`Error submitting events: ${response.message || 'Please check the network tab for more info.'}`);\n      this.suspendProcessing();\n    }\n  }\n\n  private removeEvents(events: IStorageItem[]) {\n    for (let index = 0; index < (events || []).length; index++) {\n      this._config.storage.queue.remove(events[index].timestamp);\n    }\n  }\n}\n\n                                                                                                                                                  \n\nexport class InMemoryStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(maxQueueItems: number = 250) {\n    this.queue = new InMemoryStorage(maxQueueItems);\n    this.settings = new InMemoryStorage(1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n\ndeclare var XDomainRequest: { new (); create(); };\n\nexport class DefaultSubmissionClient implements ISubmissionClient {\n  public configurationVersionHeader: string = 'x-exceptionless-configversion';\n\n  public postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void {\n    let data = JSON.stringify(events);\n    let request = this.createRequest(config, 'POST',  `${config.serverUrl}/api/v2/events`, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb, isAppExiting);\n  }\n\n  public postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void {\n    let path = `${config.serverUrl}/api/v2/events/by-ref/${encodeURIComponent(referenceId)}/user-description`;\n    let data = JSON.stringify(description);\n    let request = this.createRequest(config, 'POST', path, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void {\n    let request = this.createRequest(config, 'GET', `${config.serverUrl}/api/v2/projects/config?v=${version}`);\n    let cb = (status, message, data?, headers?) => {\n      if (status !== 200) {\n        return callback(new SettingsResponse(false, null, -1, null, message));\n      }\n\n      let settings: IClientConfiguration;\n      try {\n        settings = JSON.parse(data);\n      } catch (e) {\n        config.log.error(`Unable to parse settings: '${data}'`);\n      }\n\n      if (!settings || isNaN(settings.version)) {\n        return callback(new SettingsResponse(false, null, -1, null, 'Invalid configuration settings.'));\n      }\n\n      callback(new SettingsResponse(true, settings.settings || {}, settings.version));\n    };\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void {\n    let request = this.createRequest(config, 'GET', `${config.heartbeatServerUrl}/api/v2/events/session/heartbeat?id=${sessionIdOrUserId}&close=${closeSession}`);\n    config.submissionAdapter.sendRequest(request);\n  }\n\n  private createRequest(config: Configuration, method: string, url: string, data: string = null): SubmissionRequest {\n    return {\n      method,\n      url,\n      data,\n      apiKey: config.apiKey,\n      userAgent: config.userAgent\n    };\n  }\n\n  private createSubmissionCallback(config: Configuration, callback: (response: SubmissionResponse) => void) {\n    return (status, message, data?, headers?) => {\n      let settingsVersion: number = headers && parseInt(headers[this.configurationVersionHeader], 10);\n      SettingsManager.checkVersion(settingsVersion, config);\n\n      callback(new SubmissionResponse(status, message));\n    };\n  }\n}\n\nexport class Utils {\n  public static addRange<T>(target: T[], ...values: T[]) {\n    if (!target) {\n      target = [];\n    }\n\n    if (!values || values.length === 0) {\n      return target;\n    }\n\n    for (let index = 0; index < values.length; index++) {\n      if (values[index] && target.indexOf(values[index]) < 0) {\n        target.push(values[index]);\n      }\n    }\n\n    return target;\n  }\n\n  public static getHashCode(source: string): number {\n    if (!source || source.length === 0) {\n      return 0;\n    }\n\n    let hash: number = 0;\n    for (let index = 0; index < source.length; index++) {\n      let character = source.charCodeAt(index);\n      hash = ((hash << 5) - hash) + character;\n      hash |= 0;\n    }\n\n    return hash;\n  }\n\n  public static getCookies(cookies: string, exclusions?: string[]): Object {\n    let result: Object = {};\n\n    let parts: string[] = (cookies || '').split('; ');\n    for (let index = 0; index < parts.length; index++) {\n      let cookie: string[] = parts[index].split('=');\n      if (!Utils.isMatch(cookie[0], exclusions)) {\n        result[cookie[0]] = cookie[1];\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static guid(): string {\n    function s4() {\n      return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n    }\n\n    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n  }\n\n  public static merge(defaultValues: Object, values: Object) {\n    let result: Object = {};\n\n    for (let key in defaultValues || {}) {\n      if (!!defaultValues[key]) {\n        result[key] = defaultValues[key];\n      }\n    }\n\n    for (let key in values || {}) {\n      if (!!values[key]) {\n        result[key] = values[key];\n      }\n    }\n\n    return result;\n  }\n\n  public static parseVersion(source: string): string {\n    if (!source) {\n      return null;\n    }\n\n    let versionRegex = /(v?((\\d+)\\.(\\d+)(\\.(\\d+))?)(?:-([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?(?:\\+([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?)/;\n    let matches = versionRegex.exec(source);\n    if (matches && matches.length > 0) {\n      return matches[0];\n    }\n\n    return null;\n  }\n\n  public static parseQueryString(query: string, exclusions?: string[]) {\n    if (!query || query.length === 0) {\n      return null;\n    }\n\n    let pairs: string[] = query.split('&');\n    if (pairs.length === 0) {\n      return null;\n    }\n\n    let result: Object = {};\n    for (let index = 0; index < pairs.length; index++) {\n      let pair = pairs[index].split('=');\n      if (!Utils.isMatch(pair[0], exclusions)) {\n        result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static randomNumber(): number {\n    return Math.floor(Math.random() * 9007199254740992);\n  }\n\n  /**\n   * Checks to see if a value matches a pattern.\n   * @param input the value to check against the @pattern.\n   * @param pattern The pattern to check, supports wild cards (*).\n   */\n  public static isMatch(input: string, patterns: string[], ignoreCase: boolean = true): boolean {\n    if (!input || typeof input !== 'string') {\n      return false;\n    }\n\n    let trim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n    input = (ignoreCase ? input.toLowerCase() : input).replace(trim, '');\n\n    return (patterns || []).some(pattern => {\n      if (typeof pattern !== 'string') {\n        return false;\n      }\n\n      pattern = (ignoreCase ? pattern.toLowerCase() : pattern).replace(trim, '');\n      if (pattern.length <= 0) {\n        return false;\n      }\n\n      let startsWithWildcard: boolean = pattern[0] === '*';\n      if (startsWithWildcard) {\n        pattern = pattern.slice(1);\n      }\n\n      let endsWithWildcard: boolean = pattern[pattern.length - 1] === '*';\n      if (endsWithWildcard) {\n        pattern = pattern.substring(0, pattern.length - 1);\n      }\n\n      if (startsWithWildcard && endsWithWildcard) {\n        return pattern.length <= input.length && input.indexOf(pattern, 0) !== -1;\n      }\n\n      if (startsWithWildcard) {\n        return Utils.endsWith(input, pattern);\n      }\n\n      if (endsWithWildcard) {\n        return Utils.startsWith(input, pattern);\n      }\n\n      return input === pattern;\n    });\n  }\n\n  public static isEmpty(input: Object) {\n    return input === null || (typeof (input) === 'object' && Object.keys(input).length === 0);\n  }\n\n  public static startsWith(input: string, prefix: string): boolean {\n    return input.substring(0, prefix.length) === prefix;\n  }\n\n  public static endsWith(input: string, suffix: string): boolean {\n    return input.indexOf(suffix, input.length - suffix.length) !== -1;\n  }\n\n  /**\n   * Stringifys an object with optional exclusions and max depth.\n   * @param data The data object to add.\n   * @param exclusions Any property names that should be excluded.\n   * @param maxDepth The max depth of the object to include.\n   */\n  public static stringify(data: any, exclusions?: string[], maxDepth?: number): string {\n    function stringifyImpl(obj: any, excludedKeys: string[]): string {\n      let cache: string[] = [];\n      return JSON.stringify(obj, function(key: string, value: any) {\n        if (Utils.isMatch(key, excludedKeys)) {\n          return;\n        }\n\n        if (typeof value === 'object' && !!value) {\n          if (cache.indexOf(value) !== -1) {\n            // Circular reference found, discard key\n            return;\n          }\n\n          cache.push(value);\n        }\n\n        return value;\n      });\n    }\n\n    if (({}).toString.call(data) === '[object Object]') {\n      let flattened = {};\n      /* tslint:disable:forin */\n      for (let prop in data) {\n        let value = data[prop];\n        if (value === data) {\n          continue;\n        }\n        flattened[prop] = data[prop];\n      }\n      /* tslint:enable:forin */\n\n      return stringifyImpl(flattened, exclusions);\n    }\n\n    if (({}).toString.call(data) === '[object Array]') {\n      let result = [];\n      for (let index = 0; index < data.length; index++) {\n        result[index] = JSON.parse(stringifyImpl(data[index], exclusions));\n      }\n\n      return JSON.stringify(result);\n    }\n\n    return stringifyImpl(data, exclusions);\n  }\n\n  public static toBoolean(input, defaultValue: boolean = false): boolean {\n    if (typeof input === 'boolean') {\n      return input;\n    }\n\n    if (input === null || typeof input !== 'number' && typeof input !== 'string') {\n      return defaultValue;\n    }\n\n    switch ((input + '').toLowerCase().trim()) {\n      case 'true': case 'yes': case '1': return true;\n      case 'false': case 'no': case '0': case null: return false;\n    }\n\n    return defaultValue;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 \n\nexport class Configuration implements IConfigurationSettings {\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @type {IConfigurationSettings}\n   * @private\n   */\n  private static _defaultSettings: IConfigurationSettings = null;\n\n  /**\n   * A default list of tags that will automatically be added to every\n   * report submitted to the server.\n   *\n   * @type {Array}\n   */\n  public defaultTags: string[] = [];\n\n  /**\n   * A default list of of extended data objects that will automatically\n   * be added to every report submitted to the server.\n   *\n   * @type {{}}\n   */\n  public defaultData: Object = {};\n\n  /**\n   * Whether the client is currently enabled or not. If it is disabled,\n   * submitted errors will be discarded and no data will be sent to the server.\n   *\n   * @returns {boolean}\n   */\n  public enabled: boolean = true;\n\n  public environmentInfoCollector: IEnvironmentInfoCollector;\n  public errorParser: IErrorParser;\n  public lastReferenceIdManager: ILastReferenceIdManager = new DefaultLastReferenceIdManager();\n  public log: ILog;\n  public moduleCollector: IModuleCollector;\n  public requestInfoCollector: IRequestInfoCollector;\n\n  /**\n   * Maximum number of events that should be sent to the server together in a batch. (Defaults to 50)\n   */\n  public submissionBatchSize: number;\n  public submissionAdapter: ISubmissionAdapter;\n  public submissionClient: ISubmissionClient;\n\n  /**\n   * Contains a dictionary of custom settings that can be used to control\n   * the client and will be automatically updated from the server.\n   */\n  public settings: Object = {};\n\n  public storage: IStorageProvider;\n\n  public queue: IEventQueue;\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @type {string}\n   * @private\n   */\n  private _apiKey: string;\n\n  /**\n   * The server url that all events will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _serverUrl: string = 'https://collector.exceptionless.io';\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _heartbeatServerUrl: string = 'https://heartbeat.exceptionless.io';\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @type {number}\n   * @private\n   */\n  private _updateSettingsWhenIdleInterval: number = 120000;\n\n  /**\n   * A list of exclusion patterns.\n   * @type {Array}\n   * @private\n   */\n  private _dataExclusions: string[] = [];\n\n  /**\n   * A list of user agent patterns.\n   * @type {Array}\n   * @private\n   */\n  private _userAgentBotPatterns: string[] = [];\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @type {Array}\n   * @private\n   */\n  private _plugins: IEventPlugin[] = [];\n\n  /**\n   * A list of handlers that will be fired when configuration changes.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (config: Configuration): void }[] = [];\n\n  constructor(configSettings?: IConfigurationSettings) {\n    function inject(fn: any) {\n      return typeof fn === 'function' ? fn(this) : fn;\n    }\n\n    configSettings = Utils.merge(Configuration.defaults, configSettings);\n\n    this.log = inject(configSettings.log) || new NullLog();\n    this.apiKey = configSettings.apiKey;\n    this.serverUrl = configSettings.serverUrl;\n    this.heartbeatServerUrl = configSettings.heartbeatServerUrl;\n    this.updateSettingsWhenIdleInterval = configSettings.updateSettingsWhenIdleInterval;\n\n    this.environmentInfoCollector = inject(configSettings.environmentInfoCollector);\n    this.errorParser = inject(configSettings.errorParser);\n    this.lastReferenceIdManager = inject(configSettings.lastReferenceIdManager) || new DefaultLastReferenceIdManager();\n    this.moduleCollector = inject(configSettings.moduleCollector);\n    this.requestInfoCollector = inject(configSettings.requestInfoCollector);\n    this.submissionBatchSize = inject(configSettings.submissionBatchSize) || 50;\n    this.submissionAdapter = inject(configSettings.submissionAdapter);\n    this.submissionClient = inject(configSettings.submissionClient) || new DefaultSubmissionClient();\n    this.storage = inject(configSettings.storage) || new InMemoryStorageProvider();\n    this.queue = inject(configSettings.queue) || new DefaultEventQueue(this);\n\n    SettingsManager.applySavedServerSettings(this);\n    EventPluginManager.addDefaultPlugins(this);\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @returns {string}\n   */\n  public get apiKey(): string {\n    return this._apiKey;\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @param value\n   */\n  public set apiKey(value: string) {\n    this._apiKey = value || null;\n    this.log.info(`apiKey: ${this._apiKey}`);\n    this.changed();\n  }\n\n  /**\n   * Returns true if the apiKey is valid.\n   * @returns {boolean}\n   */\n  public get isValid(): boolean {\n    return !!this.apiKey && this.apiKey.length >= 10;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @returns {string}\n   */\n  public get serverUrl(): string {\n    return this._serverUrl;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @param value\n   */\n  public set serverUrl(value: string) {\n    if (!!value) {\n      this._serverUrl = value;\n      this._heartbeatServerUrl = value;\n      this.log.info(`serverUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @returns {string}\n   */\n  public get heartbeatServerUrl(): string {\n    return this._heartbeatServerUrl;\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @param value\n   */\n  public set heartbeatServerUrl(value: string) {\n    if (!!value) {\n      this._heartbeatServerUrl = value;\n      this.log.info(`heartbeatServerUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @returns {number}\n   */\n  public get updateSettingsWhenIdleInterval(): number {\n    return this._updateSettingsWhenIdleInterval;\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @param value\n   */\n  public set updateSettingsWhenIdleInterval(value: number) {\n    if (typeof value !== 'number') {\n      return;\n    }\n\n    if (value <= 0) {\n      value = -1;\n    } else if (value > 0 && value < 15000) {\n      value = 15000;\n    }\n\n    this._updateSettingsWhenIdleInterval = value;\n    this.log.info(`updateSettingsWhenIdleInterval: ${value}`);\n    this.changed();\n  }\n\n  /**\n   *  A list of exclusion patterns that will automatically remove any data that\n   *  matches them from any data submitted to the server.\n   *\n   *  For example, entering CreditCard will remove any extended data properties,\n   *  form fields, cookies and query parameters from the report.\n   *\n   * @returns {string[]}\n   */\n  public get dataExclusions(): string[] {\n    let exclusions: string = this.settings['@@DataExclusions'];\n    return this._dataExclusions.concat(exclusions && exclusions.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of exclusion patterns that will automatically remove any\n   * data that matches them from any data submitted to the server.\n   *\n   * For example, entering CreditCard will remove any extended data properties, form\n   * fields, cookies and query parameters from the report.\n   *\n   * @param exclusions\n   */\n  public addDataExclusions(...exclusions: string[]) {\n    this._dataExclusions = Utils.addRange<string>(this._dataExclusions, ...exclusions);\n  }\n\n  /**\n   * A list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @returns {string[]}\n   */\n  public get userAgentBotPatterns(): string[] {\n    let patterns: string = this.settings['@@UserAgentBotPatterns'];\n    return this._userAgentBotPatterns.concat(patterns && patterns.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @param userAgentBotPatterns\n   */\n  public addUserAgentBotPatterns(...userAgentBotPatterns: string[]) {\n    this._userAgentBotPatterns = Utils.addRange<string>(this._userAgentBotPatterns, ...userAgentBotPatterns);\n  }\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @returns {IEventPlugin[]}\n   */\n  public get plugins(): IEventPlugin[] {\n    return this._plugins.sort((p1: IEventPlugin, p2: IEventPlugin) => {\n      return (p1.priority < p2.priority) ? -1 : (p1.priority > p2.priority) ? 1 : 0;\n    });\n  }\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param plugin\n   */\n  public addPlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param name The name used to identify the plugin.\n   * @param priority Used to determine plugins priority.\n   * @param pluginAction A function that is run.\n   */\n  public addPlugin(name: string, priority: number, pluginAction: (context: EventPluginContext, next?: () => void) => void): void;\n  public addPlugin(pluginOrName: IEventPlugin | string, priority?: number, pluginAction?: (context: EventPluginContext, next?: () => void) => void): void {\n    let plugin: IEventPlugin = !!pluginAction ? { name: <string>pluginOrName, priority: priority, run: pluginAction } : <IEventPlugin>pluginOrName;\n    if (!plugin || !plugin.run) {\n      this.log.error('Add plugin failed: Run method not defined');\n      return;\n    }\n\n    if (!plugin.name) {\n      plugin.name = Utils.guid();\n    }\n\n    if (!plugin.priority) {\n      plugin.priority = 0;\n    }\n\n    let pluginExists: boolean = false;\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === plugin.name) {\n        pluginExists = true;\n        break;\n      }\n    }\n\n    if (!pluginExists) {\n      plugins.push(plugin);\n    }\n  }\n\n  /**\n   * Remove the plugin from this configuration.\n   * @param plugin\n   */\n  public removePlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Remove an plugin by key from this configuration.\n   * @param name\n   */\n  public removePlugin(name: string): void;\n  public removePlugin(pluginOrName: IEventPlugin | string): void {\n    let name: string = typeof pluginOrName === 'string' ? pluginOrName : pluginOrName.name;\n    if (!name) {\n      this.log.error('Remove plugin failed: Plugin name not defined');\n      return;\n    }\n\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === name) {\n        plugins.splice(index, 1);\n        break;\n      }\n    }\n  }\n\n  /**\n   * Automatically set the application version for events.\n   * @param version\n   */\n  public setVersion(version: string): void {\n    if (!!version) {\n      this.defaultData['@version'] = version;\n    }\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): void;\n  public setUserIdentity(identity: string): void;\n  public setUserIdentity(identity: string, name: string): void;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): void {\n    const USER_KEY: string = '@user'; // optimization for minifier.\n    let userInfo: IUserInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n\n    let shouldRemove: boolean = !userInfo || (!userInfo.identity && !userInfo.name);\n    if (shouldRemove) {\n      delete this.defaultData[USER_KEY];\n    } else {\n      this.defaultData[USER_KEY] = userInfo;\n    }\n\n    this.log.info(`user identity: ${shouldRemove ? 'null' : userInfo.identity}`);\n  }\n\n  /**\n   * Used to identify the client that sent the events to the server.\n   * @returns {string}\n   */\n  public get userAgent(): string {\n    return 'exceptionless-js/1.0.0.0';\n  }\n\n  /**\n   * Automatically send a heartbeat to keep the session alive.\n   */\n  public useSessions(sendHeartbeats: boolean = true, heartbeatInterval: number = 30000): void {\n    if (sendHeartbeats) {\n      this.addPlugin(new HeartbeatPlugin(heartbeatInterval));\n    }\n  }\n\n  /**\n   * Automatically set a reference id for error events.\n   */\n  public useReferenceIds(): void {\n    this.addPlugin(new ReferenceIdPlugin());\n  }\n\n  public useLocalStorage(): void {\n    // This method will be injected via the prototype.\n  }\n\n  // TODO: Support a min log level.\n  public useDebugLogger(): void {\n    this.log = new ConsoleLog();\n  }\n\n  public onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private changed() {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](this);\n      } catch (ex) {\n        this.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @returns {IConfigurationSettings}\n   */\n  public static get defaults() {\n    if (Configuration._defaultSettings === null) {\n      Configuration._defaultSettings = {};\n    }\n\n    return Configuration._defaultSettings;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                   \n\nexport class EventBuilder {\n  public target: IEvent;\n  public client: ExceptionlessClient;\n  public pluginContextData: ContextData;\n\n  private _validIdentifierErrorMessage: string = 'must contain between 8 and 100 alphanumeric or \\'-\\' characters.'; // optimization for minifier.\n\n  constructor(event: IEvent, client: ExceptionlessClient, pluginContextData?: ContextData) {\n    this.target = event;\n    this.client = client;\n    this.pluginContextData = pluginContextData || new ContextData();\n  }\n\n  public setType(type: string): EventBuilder {\n    if (!!type) {\n      this.target.type = type;\n    }\n\n    return this;\n  }\n\n  public setSource(source: string): EventBuilder {\n    if (!!source) {\n      this.target.source = source;\n    }\n\n    return this;\n  }\n\n  public setReferenceId(referenceId: string): EventBuilder {\n    if (!this.isValidIdentifier(referenceId)) {\n      throw new Error(`ReferenceId ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.target.reference_id = referenceId;\n    return this;\n  }\n\n  /**\n   * Allows you to reference a parent event by its ReferenceId property. This allows you to have parent and child relationships.\n   * @param name Reference name\n   * @param id The reference id that points to a specific event\n   * @returns {EventBuilder}\n     */\n  public setEventReference(name: string, id: string): EventBuilder {\n    if (!name) {\n      throw new Error('Invalid name');\n    }\n\n    if (!id || !this.isValidIdentifier(id)) {\n      throw new Error(`Id ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.setProperty('@ref:' + name, id);\n    return this;\n  }\n\n  public setMessage(message: string): EventBuilder {\n    if (!!message) {\n      this.target.message = message;\n    }\n\n    return this;\n  }\n\n  public setGeo(latitude: number, longitude: number): EventBuilder {\n    if (latitude < -90.0 || latitude > 90.0) {\n      throw new Error('Must be a valid latitude value between -90.0 and 90.0.');\n    }\n\n    if (longitude < -180.0 || longitude > 180.0) {\n      throw new Error('Must be a valid longitude value between -180.0 and 180.0.');\n    }\n\n    this.target.geo = `${latitude},${longitude}`;\n    return this;\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): EventBuilder;\n  public setUserIdentity(identity: string): EventBuilder;\n  public setUserIdentity(identity: string, name: string): EventBuilder;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): EventBuilder {\n    let userInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n    if (!userInfo || (!userInfo.identity && !userInfo.name)) {\n      return this;\n    }\n\n    this.setProperty('@user', userInfo);\n    return this;\n  }\n\n  /**\n   * Sets the user's description of the event.\n   *\n   * @param emailAddress The email address\n   * @param description The user's description of the event.\n   * @returns {EventBuilder}\n     */\n  public setUserDescription(emailAddress: string, description: string): EventBuilder {\n    if (emailAddress && description) {\n      this.setProperty('@user_description', { email_address: emailAddress, description: description });\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting manual\n   * stacking information.\n   * @param signatureData A dictionary of strings to use for stacking.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingInfo(signatureData: any, title?: string) {\n    if (signatureData) {\n      let stack = <IManualStackingInfo>{\n        signature_data: signatureData\n      };\n      if (title) {\n        stack.title = title;\n      }\n      this.setProperty('@stack', stack);\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting the stacking key.\n   * @param manualStackingKey The manual stacking key.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingKey(manualStackingKey: string, title?: string): EventBuilder {\n    if (manualStackingKey) {\n      let data = {\n        'ManualStackingKey': manualStackingKey\n      };\n      this.setManualStackingInfo(data, title);\n    }\n\n    return this;\n  }\n\n  public setValue(value: number): EventBuilder {\n    if (!!value) {\n      this.target.value = value;\n    }\n\n    return this;\n  }\n\n  public addTags(...tags: string[]): EventBuilder {\n    this.target.tags = Utils.addRange<string>(this.target.tags, ...tags);\n    return this;\n  }\n\n  /**\n   * Adds the object to extended data. Uses @excludedPropertyNames\n   * to exclude data from being included in the event.\n   * @param name The data object to add.\n   * @param value The name of the object to add.\n   * @param maxDepth The max depth of the object to include.\n   * @param excludedPropertyNames Any property names that should be excluded.\n   */\n  public setProperty(name: string, value: any, maxDepth?: number, excludedPropertyNames?: string[]): EventBuilder {\n    if (!name || (value === undefined || value == null)) {\n      return this;\n    }\n\n    if (!this.target.data) {\n      this.target.data = {};\n    }\n\n    let result = JSON.parse(Utils.stringify(value, this.client.config.dataExclusions.concat(excludedPropertyNames || []), maxDepth));\n    if (!Utils.isEmpty(result)) {\n      this.target.data[name] = result;\n    }\n\n    return this;\n  }\n\n  public markAsCritical(critical: boolean): EventBuilder {\n    if (critical) {\n      this.addTags('Critical');\n    }\n\n    return this;\n  }\n\n  public addRequestInfo(request: Object): EventBuilder {\n    if (!!request) {\n      this.pluginContextData['@request'] = request;\n    }\n\n    return this;\n  }\n\n  public submit(callback?: (context: EventPluginContext) => void): void {\n    this.client.submitEvent(this.target, this.pluginContextData, callback);\n  }\n\n  private isValidIdentifier(value: string): boolean {\n    if (!value) {\n      return true;\n    }\n\n    if (value.length < 8 || value.length > 100) {\n      return false;\n    }\n\n    for (let index = 0; index < value.length; index++) {\n      let code = value.charCodeAt(index);\n      let isDigit = (code >= 48) && (code <= 57);\n      let isLetter = ((code >= 65) && (code <= 90)) || ((code >= 97) && (code <= 122));\n      let isMinus = code === 45;\n\n      if (!(isDigit || isLetter) && !isMinus) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n}\n\nexport interface IUserDescription {\n  email_address?: string;\n  description?: string;\n  data?: any;\n}\n\nexport class ContextData {\n  public setException(exception: Error): void {\n    if (exception) {\n      this['@@_Exception'] = exception;\n    }\n  }\n\n  public get hasException(): boolean {\n    return !!this['@@_Exception'];\n  }\n\n  public getException(): Error {\n    return this['@@_Exception'] || null;\n  }\n\n  public markAsUnhandledError(): void {\n    this['@@_IsUnhandledError'] = true;\n  }\n\n  public get isUnhandledError(): boolean {\n    return !!this['@@_IsUnhandledError'];\n  }\n\n  public setSubmissionMethod(method: string): void {\n    if (method) {\n      this['@@_SubmissionMethod'] = method;\n    }\n  }\n\n  public getSubmissionMethod(): string {\n    return this['@@_SubmissionMethod'] || null;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          \n\nexport class ExceptionlessClient {\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   * @private\n   */\n  private static _instance: ExceptionlessClient = null;\n\n  public config: Configuration;\n\n  private _intervalId: any;\n  private _timeoutId: any;\n\n  constructor();\n  constructor(settings: IConfigurationSettings);\n  constructor(apiKey: string, serverUrl?: string);\n  constructor(settingsOrApiKey?: IConfigurationSettings | string, serverUrl?: string) {\n    if (typeof settingsOrApiKey === 'object') {\n      this.config = new Configuration(settingsOrApiKey);\n    } else {\n      this.config = new Configuration({ apiKey: <string>settingsOrApiKey, serverUrl: serverUrl });\n    }\n\n    this.updateSettingsTimer(5000);\n    this.config.onChanged((config) => this.updateSettingsTimer(this._timeoutId > 0 ? 5000 : 0));\n    this.config.queue.onEventsPosted((events, response) =>  this.updateSettingsTimer());\n  }\n\n  public createException(exception: Error): EventBuilder {\n    let pluginContextData = new ContextData();\n    pluginContextData.setException(exception);\n    return this.createEvent(pluginContextData).setType('error');\n  }\n\n  public submitException(exception: Error, callback?: (context: EventPluginContext) => void): void {\n    this.createException(exception).submit(callback);\n  }\n\n  public createUnhandledException(exception: Error, submissionMethod?: string): EventBuilder {\n    let builder = this.createException(exception);\n    builder.pluginContextData.markAsUnhandledError();\n    builder.pluginContextData.setSubmissionMethod(submissionMethod);\n\n    return builder;\n  }\n\n  public submitUnhandledException(exception: Error, submissionMethod?: string, callback?: (context: EventPluginContext) => void) {\n    this.createUnhandledException(exception, submissionMethod).submit(callback);\n  }\n\n  public createFeatureUsage(feature: string): EventBuilder {\n    return this.createEvent().setType('usage').setSource(feature);\n  }\n\n  public submitFeatureUsage(feature: string, callback?: (context: EventPluginContext) => void): void {\n    this.createFeatureUsage(feature).submit(callback);\n  }\n\n  public createLog(message: string): EventBuilder;\n  public createLog(source: string, message: string): EventBuilder;\n  public createLog(source: string, message: string, level: string): EventBuilder;\n  public createLog(sourceOrMessage: string, message?: string, level?: string): EventBuilder {\n    let builder = this.createEvent().setType('log');\n\n    if (message && level) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message).setProperty('@level', level);\n    } else if (message) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message);\n    } else {\n      // TODO: Look into using https: //www.stevefenton.co.uk/Content/Blog/Date/201304/Blog/Obtaining-A-Class-Name-At-Runtime-In-TypeScript/\n      let caller: any = arguments.callee.caller;\n      builder = builder.setSource(caller && caller.name).setMessage(sourceOrMessage);\n    }\n\n    return builder;\n  }\n\n  public submitLog(message: string): void;\n  public submitLog(source: string, message: string): void;\n  public submitLog(source: string, message: string, level: string, callback?: (context: EventPluginContext) => void): void;\n  public submitLog(sourceOrMessage: string, message?: string, level?: string, callback?: (context: EventPluginContext) => void): void {\n    this.createLog(sourceOrMessage, message, level).submit(callback);\n  }\n\n  public createNotFound(resource: string): EventBuilder {\n    return this.createEvent().setType('404').setSource(resource);\n  }\n\n  public submitNotFound(resource: string, callback?: (context: EventPluginContext) => void): void {\n    this.createNotFound(resource).submit(callback);\n  }\n\n  public createSessionStart(): EventBuilder {\n    return this.createEvent().setType('session');\n  }\n\n  public submitSessionStart(callback?: (context: EventPluginContext) => void): void {\n    this.createSessionStart().submit(callback);\n  }\n\n  public submitSessionEnd(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session end: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, true, this.config);\n    }\n  }\n\n  public submitSessionHeartbeat(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session heartbeat: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, false, this.config);\n    }\n  }\n\n  public createEvent(pluginContextData?: ContextData): EventBuilder {\n    return new EventBuilder({ date: new Date() }, this, pluginContextData);\n  }\n\n  /**\n   * Submits the event to be sent to the server.\n   * @param event The event data.\n   * @param pluginContextData Any contextual data objects to be used by Exceptionless plugins to gather default information for inclusion in the report information.\n   * @param callback\n   */\n  public submitEvent(event: IEvent, pluginContextData?: ContextData, callback?: (context: EventPluginContext) => void): void {\n    function cancelled(context: EventPluginContext) {\n      if (!!context) {\n        context.cancelled = true;\n      }\n\n      return !!callback && callback(context);\n    }\n\n    let context = new EventPluginContext(this, event, pluginContextData);\n    if (!event) {\n      return cancelled(context);\n    }\n\n    if (!this.config.enabled) {\n      this.config.log.info('Event submission is currently disabled.');\n      return cancelled(context);\n    }\n\n    if (!event.data) {\n      event.data = {};\n    }\n\n    if (!event.tags || !event.tags.length) {\n      event.tags = [];\n    }\n\n    EventPluginManager.run(context, function (ctx: EventPluginContext) {\n      let config = ctx.client.config;\n      let ev = ctx.event;\n\n      if (!ctx.cancelled) {\n        // ensure all required data\n        if (!ev.type || ev.type.length === 0) {\n          ev.type = 'log';\n        }\n\n        if (!ev.date) {\n          ev.date = new Date();\n        }\n\n        config.queue.enqueue(ev);\n\n        if (ev.reference_id && ev.reference_id.length > 0) {\n          ctx.log.info(`Setting last reference id '${ev.reference_id}'`);\n          config.lastReferenceIdManager.setLast(ev.reference_id);\n        }\n      }\n\n      !!callback && callback(ctx);\n    });\n  }\n\n  /**\n   * Updates the user's email address and description of an event for the specified reference id.\n   * @param referenceId The reference id of the event to update.\n   * @param email The user's email address to set on the event.\n   * @param description The user's description of the event.\n   * @param callback The submission response.\n   */\n  public updateUserEmailAndDescription(referenceId: string, email: string, description: string, callback?: (response: SubmissionResponse) => void) {\n    if (!referenceId || !email || !description || !this.config.enabled) {\n      return !!callback && callback(new SubmissionResponse(500, 'cancelled'));\n    }\n\n    let userDescription: IUserDescription = { email_address: email, description: description };\n    this.config.submissionClient.postUserDescription(referenceId, userDescription, this.config, (response: SubmissionResponse) => {\n      if (!response.success) {\n        this.config.log.error(`Failed to submit user email and description for event '${referenceId}': ${response.statusCode} ${response.message}`);\n      }\n\n      !!callback && callback(response);\n    });\n  }\n\n  /**\n   * Gets the last event client id that was submitted to the server.\n   * @returns {string} The event client id.\n   */\n  public getLastReferenceId(): string {\n    return this.config.lastReferenceIdManager.getLast();\n  }\n\n  private updateSettingsTimer(initialDelay?: number) {\n    this.config.log.info(`Updating settings timer with delay: ${initialDelay}`);\n\n    this._timeoutId = clearTimeout(this._timeoutId);\n    this._timeoutId = clearInterval(this._intervalId);\n\n    let interval = this.config.updateSettingsWhenIdleInterval;\n    if (interval > 0) {\n      let updateSettings = () => SettingsManager.updateSettings(this.config);\n      if (initialDelay > 0) {\n        this._timeoutId = setTimeout(updateSettings, initialDelay);\n      }\n\n      this._intervalId = setInterval(updateSettings, interval);\n    }\n  }\n\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   */\n  public static get default() {\n    if (ExceptionlessClient._instance === null) {\n      ExceptionlessClient._instance = new ExceptionlessClient(null);\n    }\n\n    return ExceptionlessClient._instance;\n  }\n}\n\nexport interface IManualStackingInfo {\n  title?: string;\n  signature_data?: any;\n}\n\nexport interface IModule {\n  data?: any;\n\n  module_id?: number;\n  name?: string;\n  version?: string;\n  is_entry?: boolean;\n  created_date?: Date;\n  modified_date?: Date;\n}\n\nexport interface IRequestInfo {\n  user_agent?: string;\n  http_method?: string;\n  is_secure?: boolean;\n  host?: string;\n  port?: number;\n  path?: string;\n  referrer?: string;\n  client_ip_address?: string;\n  cookies?: any;\n  post_data?: any;\n  query_string?: any;\n  data?: any;\n}\n\nexport interface IEnvironmentInfo {\n  processor_count?: number;\n  total_physical_memory?: number;\n  available_physical_memory?: number;\n  command_line?: string;\n  process_name?: string;\n  process_id?: string;\n  process_memory_size?: number;\n  thread_id?: string;\n  architecture?: string;\n  o_s_name?: string;\n  o_s_version?: string;\n  ip_address?: string;\n  machine_name?: string;\n  install_id?: string;\n  runtime_version?: string;\n  data?: any;\n}\n\nexport interface IParameter {\n  data?: any;\n  generic_arguments?: string[];\n\n  name?: string;\n  type?: string;\n  type_namespace?: string;\n}\n\n                                          \n\nexport interface IMethod {\n  data?: any;\n  generic_arguments?: string[];\n  parameters?: IParameter[];\n\n  is_signature_target?: boolean;\n  declaring_namespace?: string;\n  declaring_type?: string;\n  name?: string;\n  module_id?: number;\n}\n\n                                    \n\nexport interface IStackFrame extends IMethod {\n  file_name?: string;\n  line_number?: number;\n  column?: number;\n}\n\n                                                                                 \n\nexport interface IInnerError {\n  message?: string;\n  type?: string;\n  code?: string;\n  data?: any;\n  inner?: IInnerError;\n  stack_trace?: IStackFrame[];\n  target_method?: IMethod;\n}\n\n                                                                                                                                                \n\nexport class ConfigurationDefaultsPlugin implements IEventPlugin {\n  public priority: number = 10;\n  public name: string = 'ConfigurationDefaultsPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let config = context.client.config;\n    let defaultTags: string[] = config.defaultTags || [];\n    for (let index = 0; index < defaultTags.length; index++) {\n      let tag = defaultTags[index];\n      if (!!tag && context.event.tags.indexOf(tag) < 0) {\n        context.event.tags.push(tag);\n      }\n    }\n\n    let defaultData: Object = config.defaultData || {};\n    for (let key in defaultData) {\n      if (!!defaultData[key]) {\n        let result = JSON.parse(Utils.stringify(defaultData[key], config.dataExclusions));\n        if (!Utils.isEmpty(result)) {\n          context.event.data[key] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ErrorPlugin implements IEventPlugin {\n  public priority: number = 30;\n  public name: string = 'ErrorPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n    let ignoredProperties: string[] = [\n      'arguments',\n      'column',\n      'columnNumber',\n      'description',\n      'fileName',\n      'message',\n      'name',\n      'number',\n      'line',\n      'lineNumber',\n      'opera#sourceloc',\n      'sourceId',\n      'sourceURL',\n      'stack',\n      'stackArray',\n      'stacktrace'\n    ];\n\n    let exception = context.contextData.getException();\n    if (!!exception) {\n      context.event.type = 'error';\n\n      if (!context.event.data[ERROR_KEY]) {\n        let config = context.client.config;\n        let parser = config.errorParser;\n        if (!parser) {\n          throw new Error('No error parser was defined.');\n        }\n\n        let result = parser.parse(context, exception);\n        if (!!result) {\n          let additionalData = JSON.parse(Utils.stringify(exception, config.dataExclusions.concat(ignoredProperties)));\n          if (!Utils.isEmpty(additionalData)) {\n            if (!result.data) {\n              result.data = {};\n            }\n            result.data['@ext'] = additionalData;\n          }\n\n          context.event.data[ERROR_KEY] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                           \n\nexport class ModuleInfoPlugin implements IEventPlugin {\n  public priority: number = 50;\n  public name: string = 'ModuleInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n\n    let collector = context.client.config.moduleCollector;\n    if (context.event.data[ERROR_KEY] && !context.event.data['@error'].modules && !!collector) {\n      let modules: IModule[] = collector.getModules(context);\n      if (modules && modules.length > 0) {\n        context.event.data[ERROR_KEY].modules = modules;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                          \n\nexport class RequestInfoPlugin implements IEventPlugin {\n  public priority: number = 70;\n  public name: string = 'RequestInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const REQUEST_KEY: string = '@request'; // optimization for minifier.\n\n    let config = context.client.config;\n    let collector = config.requestInfoCollector;\n    if (!context.event.data[REQUEST_KEY] && !!collector) {\n      let requestInfo: IRequestInfo = collector.getRequestInfo(context);\n      if (!!requestInfo) {\n        if (Utils.isMatch(requestInfo.user_agent, config.userAgentBotPatterns)) {\n          context.log.info('Cancelling event as the request user agent matches a known bot pattern');\n          context.cancelled = true;\n        } else {\n          context.event.data[REQUEST_KEY] = requestInfo;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                             \n\nexport class EnvironmentInfoPlugin implements IEventPlugin {\n  public priority: number = 80;\n  public name: string = 'EnvironmentInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ENVIRONMENT_KEY: string = '@environment'; // optimization for minifier.\n\n    let collector = context.client.config.environmentInfoCollector;\n    if (!context.event.data[ENVIRONMENT_KEY] && collector) {\n      let environmentInfo: IEnvironmentInfo = collector.getEnvironmentInfo(context);\n      if (!!environmentInfo) {\n        context.event.data[ENVIRONMENT_KEY] = environmentInfo;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                           \n\nexport class SubmissionMethodPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'SubmissionMethodPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let submissionMethod: string = context.contextData.getSubmissionMethod();\n    if (!!submissionMethod) {\n      context.event.data['@submission_method'] = submissionMethod;\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                   \n\nexport class DuplicateCheckerPlugin implements IEventPlugin {\n  public priority: number = 40;\n  public name: string = 'DuplicateCheckerPlugin';\n\n  private _processedHashcodes: TimestampedHash[] = [];\n  private _getCurrentTime: () => number;\n\n  constructor(getCurrentTime: () => number = () => Date.now()) {\n    this._getCurrentTime = getCurrentTime;\n  }\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function isDuplicate(error: IInnerError, processedHashcodes, now, log: ILog): boolean {\n      while (error) {\n        let hashCode = Utils.getHashCode(error.stack_trace && JSON.stringify(error.stack_trace));\n\n        // Only process the unique errors times within a 2 second window.\n        if (hashCode && processedHashcodes.some(h => h.hash === hashCode && h.timestamp >= (now - 2000))) {\n          log.info(`Ignoring duplicate error event hash: ${hashCode}`);\n          return true;\n        }\n\n        // Add this exception to our list of recent processed errors.\n        processedHashcodes.push({ hash: hashCode, timestamp: now });\n\n        // Only keep the last 20 recent errors.\n        while (processedHashcodes.length > 20) {\n          processedHashcodes.shift();\n        }\n\n        error = error.inner;\n      }\n\n      return false;\n    }\n\n    if (context.event.type === 'error') {\n      if (isDuplicate(context.event.data['@error'], this._processedHashcodes, this._getCurrentTime(), context.log)) {\n        context.cancelled = true;\n        return;\n      }\n    }\n\n    next && next();\n  }\n}\n\ninterface TimestampedHash {\n  hash: number;\n  timestamp: number;\n}\n\n                                                                                                                                                                                                        \n\nexport class EventExclusionPlugin implements IEventPlugin {\n  public priority: number = 45;\n  public name: string = 'EventExclusionPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function getLogLevel(level: string): number {\n      switch ((level || '').toLowerCase().trim()) {\n        case 'trace':\n        case 'true':\n        case '1':\n        case 'yes':\n          return 0;\n        case 'debug':\n          return 1;\n        case 'info':\n          return 2;\n        case 'warn':\n          return 3;\n        case 'error':\n          return 4;\n        case 'fatal':\n          return 5;\n        case 'off':\n        case 'false':\n        case '0':\n        case 'no':\n          return 6;\n        default:\n          return -1;\n      }\n    }\n\n    function getMinLogLevel(settings: Object, loggerName: string = '*'): number {\n      return getLogLevel(getTypeAndSourceSetting(settings, 'log', loggerName, 'Trace') + '');\n    }\n\n    function getTypeAndSourceSetting(settings: Object = {}, type: string, source: string, defaultValue: string|boolean = undefined): string|boolean {\n      if (!type) {\n        return defaultValue;\n      }\n\n      let isLog = type === 'log';\n      let sourcePrefix =  `@@${type}:`;\n\n      let value = settings[sourcePrefix + source];\n      if (value) {\n        return !isLog ? Utils.toBoolean(value) : value;\n      }\n\n      // check for wildcard match\n      for (let key in settings) {\n        if (Utils.startsWith(key.toLowerCase(), sourcePrefix.toLowerCase()) && Utils.isMatch(source, [key.substring(sourcePrefix.length)])) {\n          return !isLog ? Utils.toBoolean(settings[key]) : settings[key];\n        }\n      }\n\n      return defaultValue;\n    }\n\n    let ev = context.event;\n    let log = context.log;\n    let settings = context.client.config.settings;\n\n    if (ev.type === 'log') {\n      let minLogLevel = getMinLogLevel(settings, ev.source);\n      let logLevel = getLogLevel(ev.data['@level']);\n\n      if (logLevel >= 0 && (logLevel > 5 || logLevel < minLogLevel)) {\n        log.info('Cancelling log event due to minimum log level.');\n        context.cancelled = true;\n      }\n    } else if (ev.type === 'error') {\n      let error: IInnerError = ev.data['@error'];\n      while (!context.cancelled && error) {\n        if (getTypeAndSourceSetting(settings, ev.type, error.type, true) === false) {\n          log.info(`Cancelling error from excluded exception type: ${error.type}`);\n          context.cancelled = true;\n        }\n\n        error = error.inner;\n      }\n    } else if (getTypeAndSourceSetting(settings, ev.type, ev.source, true) === false) {\n      log.info(`Cancelling event from excluded type: ${ev.type} and source: ${ev.source}`);\n      context.cancelled = true;\n    }\n\n    next && next();\n  }\n}\n\nexport class SettingsResponse {\n  public success: boolean = false;\n  public settings: any;\n  public settingsVersion: number = -1;\n  public message: string;\n  public exception: any;\n\n  constructor(success: boolean, settings: any, settingsVersion: number = -1, exception: any = null, message: string = null) {\n    this.success = success;\n    this.settings = settings;\n    this.settingsVersion = settingsVersion;\n    this.exception = exception;\n    this.message = message;\n  }\n}\n\n                                                                                 \n\nexport interface IError extends IInnerError {\n  modules?: IModule[];\n}\n\nexport interface IStorageItem {\n  timestamp: number;\n  value: any;\n}\n\n                                              \n\nexport interface IStorage {\n  save(value: any): number;\n  get(limit?: number): IStorageItem[];\n  remove(timestamp: number): void;\n  clear(): void;\n}\n\nexport interface SubmissionCallback {\n  (status: number, message: string, data?: string, headers?: Object): void;\n}\n\nexport interface SubmissionRequest {\n  apiKey: string;\n  userAgent: string;\n  method: string;\n  url: string;\n  data: string;\n}\n\n                                                                                     \n\nexport class InMemoryStorage implements IStorage {\n  private maxItems: number;\n  private items: IStorageItem[] = [];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems: number) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any): number {\n    if (!value) {\n      return null;\n    }\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let item = { timestamp, value };\n\n    if (items.push(item) > this.maxItems) {\n      items.shift();\n    }\n\n    this.lastTimestamp = timestamp;\n    return item.timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    return this.items.slice(0, limit);\n  }\n\n  public remove(timestamp: number): void {\n    let items = this.items;\n    for (let i = 0; i < items.length; i++) {\n      if (items[i].timestamp === timestamp) {\n        items.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n  public clear(): void {\n    this.items = [];\n  }\n}\n\nexport interface IClientConfiguration {\n  settings: Object;\n  version: number;\n}\n\n                                                                                     \n\nexport abstract class KeyValueStorageBase implements IStorage {\n  private maxItems: number;\n  private items: number[];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any, single?: boolean): number {\n    if (!value) {\n      return null;\n    }\n\n    this.ensureIndex();\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let key = this.getKey(timestamp);\n    let json = JSON.stringify(value);\n\n    try {\n      this.write(key, json);\n      this.lastTimestamp = timestamp;\n      if (items.push(timestamp) > this.maxItems) {\n        this.delete(this.getKey(items.shift()));\n      }\n    } catch (e) {\n      return null;\n    }\n\n    return timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    this.ensureIndex();\n\n    return this.items.slice(0, limit)\n      .map(timestamp => {\n        // Read and parse item for this timestamp\n        let key = this.getKey(timestamp);\n        try {\n          let json = this.read(key);\n          let value = JSON.parse(json, parseDate);\n          return { timestamp, value };\n        } catch (error) {\n          // Something went wrong - try to delete the cause.\n          this.safeDelete(key);\n          return null;\n        }\n      })\n      .filter(item => item != null);\n  }\n\n  public remove(timestamp: number): void {\n    this.ensureIndex();\n\n    let items = this.items;\n    let index = items.indexOf(timestamp);\n    if (index >= 0) {\n      let key = this.getKey(timestamp);\n      this.safeDelete(key);\n      items.splice(index, 1);\n    };\n  }\n\n  public clear(): void {\n    this.items.forEach(item => this.safeDelete(this.getKey(item)));\n    this.items = [];\n  }\n\n  protected abstract write(key: string, value: string): void;\n  protected abstract read(key: string): string;\n  protected abstract readAllKeys(): string[];\n  protected abstract delete(key: string);\n  protected abstract getKey(timestamp: number): string;\n  protected abstract getTimestamp(key: string): number;\n\n  private ensureIndex() {\n    if (!this.items) {\n      this.items = this.createIndex();\n      this.lastTimestamp = Math.max(0, ...this.items) + 1;\n    }\n  }\n\n  private safeDelete(key: string): void {\n    try {\n      this.delete(key);\n    } catch (error) {\n    }\n  }\n\n  private createIndex() {\n    try {\n      let keys = this.readAllKeys();\n      return keys.map(key => {\n        try {\n          let timestamp = this.getTimestamp(key);\n          if (!timestamp) {\n            this.safeDelete(key);\n            return null;\n          }\n          return timestamp;\n        } catch (error) {\n          this.safeDelete(key);\n          return null;\n        }\n      }).filter(timestamp => timestamp != null)\n        .sort((a, b) => a - b);\n    } catch (error) {\n      return [];\n    }\n  }\n}\n\nfunction parseDate(key, value) {\n  let dateRegx = /\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/g;\n  if (typeof value === 'string') {\n    let a = dateRegx.exec(value);\n    if (a) {\n      return new Date(value);\n    }\n  }\n  return value;\n};\n\n                                                            \n\nexport class BrowserStorage extends KeyValueStorageBase {\n  private prefix: string;\n\n  public static isAvailable(): boolean {\n    try {\n      let storage = window.localStorage,\n        x = '__storage_test__';\n      storage.setItem(x, x);\n      storage.removeItem(x);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  constructor(namespace: string, prefix: string = 'com.exceptionless.', maxItems: number = 20) {\n    super(maxItems);\n\n    this.prefix = prefix + namespace + '-';\n  }\n\n  public write(key: string, value: string) {\n    window.localStorage.setItem(key, value);\n  }\n\n  public read(key: string) {\n    return window.localStorage.getItem(key);\n  }\n\n  public readAllKeys() {\n    return Object.keys(window.localStorage)\n      .filter(key => key.indexOf(this.prefix) === 0);\n  }\n\n  public delete(key: string) {\n    window.localStorage.removeItem(key);\n  }\n\n  public getKey(timestamp) {\n    return this.prefix + timestamp;\n  }\n\n  public getTimestamp(key) {\n    return parseInt(key.substr(this.prefix.length), 10);\n  }\n}\n\n                                                                                                                                                                                                                                                                                                           \n\nexport class DefaultErrorParser implements IErrorParser {\n  public parse(context: EventPluginContext, exception: Error): IError {\n    function getParameters(parameters: string | string[]): IParameter[] {\n      let params: string[] = (typeof parameters === 'string' ? [parameters] : parameters) || [];\n\n      let result: IParameter[] = [];\n      for (let index = 0; index < params.length; index++) {\n        result.push({ name: params[index] });\n      }\n\n      return result;\n    }\n\n    function getStackFrames(stackFrames: TraceKit.StackFrame[]): IStackFrame[] {\n      const ANONYMOUS: string = '<anonymous>';\n      let frames: IStackFrame[] = [];\n\n      for (let index = 0; index < stackFrames.length; index++) {\n        let frame = stackFrames[index];\n        frames.push({\n          name: (frame.func || ANONYMOUS).replace('?', ANONYMOUS),\n          parameters: getParameters(frame.args),\n          file_name: frame.url,\n          line_number: frame.line || 0,\n          column: frame.column || 0\n        });\n      }\n\n      return frames;\n    }\n\n    const TRACEKIT_STACK_TRACE_KEY: string = '@@_TraceKit.StackTrace'; // optimization for minifier.\n\n    let stackTrace: TraceKit.StackTrace = !!context.contextData[TRACEKIT_STACK_TRACE_KEY]\n      ? context.contextData[TRACEKIT_STACK_TRACE_KEY]\n      : TraceKit.computeStackTrace(exception, 25);\n\n    if (!stackTrace) {\n      throw new Error('Unable to parse the exceptions stack trace.');\n    }\n\n    return {\n      type: stackTrace.name,\n      message: stackTrace.message || exception.message,\n      stack_trace: getStackFrames(stackTrace.stack || [])\n    };\n  }\n}\n\n                                                                                                                                                                                                         \n\nexport class DefaultModuleCollector implements IModuleCollector {\n  public getModules(context: EventPluginContext): IModule[] {\n    if (document && document.getElementsByTagName) {\n      return null;\n    }\n\n    let modules: IModule[] = [];\n    let scripts: NodeListOf<HTMLScriptElement> = document.getElementsByTagName('script');\n    if (scripts && scripts.length > 0) {\n      for (let index = 0; index < scripts.length; index++) {\n        if (scripts[index].src) {\n          modules.push({\n            module_id: index,\n            name: scripts[index].src,\n            version: Utils.parseVersion(scripts[index].src)\n          });\n        } else if (!!scripts[index].innerHTML) {\n          modules.push({\n            module_id: index,\n            name: 'Script Tag',\n            version: Utils.getHashCode(scripts[index].innerHTML).toString()\n          });\n        }\n      }\n    }\n\n    return modules;\n  }\n}\n\n                                                                                                                                                                                                                             \n\nexport class DefaultRequestInfoCollector implements IRequestInfoCollector {\n  public getRequestInfo(context: EventPluginContext): IRequestInfo {\n    if (!document || !navigator || !location) {\n      return null;\n    }\n\n    let exclusions = context.client.config.dataExclusions;\n    let requestInfo: IRequestInfo = {\n      user_agent: navigator.userAgent,\n      is_secure: location.protocol === 'https:',\n      host: location.hostname,\n      port: location.port && location.port !== '' ? parseInt(location.port, 10) : 80,\n      path: location.pathname,\n      // client_ip_address: 'TODO',\n      cookies: Utils.getCookies(document.cookie, exclusions),\n      query_string: Utils.parseQueryString(location.search.substring(1), exclusions)\n    };\n\n    if (document.referrer && document.referrer !== '') {\n      requestInfo.referrer = document.referrer;\n    }\n\n    return requestInfo;\n  }\n}\n\n                                                                                                                                                                              \n\ndeclare var XDomainRequest: { new (); create(); };\n\nexport class DefaultSubmissionAdapter implements ISubmissionAdapter {\n  public sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean) {\n    // TODO: Handle sending events when app is exiting with send beacon.\n    const TIMEOUT: string = 'timeout';  // optimization for minifier.\n    const LOADED: string = 'loaded';  // optimization for minifier.\n    const WITH_CREDENTIALS: string = 'withCredentials';  // optimization for minifier.\n\n    let isCompleted: boolean = false;\n    let useSetTimeout: boolean = false;\n    function complete(mode: string, xhr: XMLHttpRequest) {\n      function parseResponseHeaders(headerStr) {\n        function trim(value) {\n          return value.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n        }\n\n        let headers = {};\n        let headerPairs = (headerStr || '').split('\\u000d\\u000a');\n        for (let index: number = 0; index < headerPairs.length; index++) {\n          let headerPair = headerPairs[index];\n          // Can't use split() here because it does the wrong thing\n          // if the header value has the string \": \" in it.\n          let separator = headerPair.indexOf('\\u003a\\u0020');\n          if (separator > 0) {\n            headers[trim(headerPair.substring(0, separator).toLowerCase())] = headerPair.substring(separator + 2);\n          }\n        }\n\n        return headers;\n      }\n\n      if (isCompleted) {\n        return;\n      }\n\n      isCompleted = true;\n\n      let message: string = xhr.statusText;\n      let responseText: string = xhr.responseText;\n      let status: number = xhr.status;\n\n      if (mode === TIMEOUT || status === 0) {\n        message = 'Unable to connect to server.';\n        status = 0;\n      } else if (mode === LOADED && !status) {\n        status = request.method === 'POST' ? 202 : 200;\n      } else if (status < 200 || status > 299) {\n        let responseBody: any = xhr.responseBody;\n        if (!!responseBody && !!responseBody.message) {\n          message = responseBody.message;\n        } else if (!!responseText && responseText.indexOf('message') !== -1) {\n          try {\n            message = JSON.parse(responseText).message;\n          } catch (e) {\n            message = responseText;\n          }\n        }\n      }\n\n      callback && callback(status || 500, message || '', responseText, parseResponseHeaders(xhr.getAllResponseHeaders && xhr.getAllResponseHeaders()));\n    }\n\n    function createRequest(userAgent: string, method: string, url: string): XMLHttpRequest {\n      let xhr: any = new XMLHttpRequest();\n      if (WITH_CREDENTIALS in xhr) {\n        xhr.open(method, url, true);\n\n        xhr.setRequestHeader('X-Exceptionless-Client', userAgent);\n        if (method === 'POST') {\n          xhr.setRequestHeader('Content-Type', 'application/json');\n        }\n      } else if (typeof XDomainRequest !== 'undefined') {\n        useSetTimeout = true;\n        xhr = new XDomainRequest();\n        xhr.open(method, location.protocol === 'http:' ? url.replace('https:', 'http:') : url);\n      } else {\n        xhr = null;\n      }\n\n      if (xhr) {\n        xhr.timeout = 10000;\n      }\n\n      return xhr;\n    }\n\n    let url = `${request.url}${(request.url.indexOf('?') === -1 ? '?' : '&')}access_token=${encodeURIComponent(request.apiKey)}`;\n    let xhr = createRequest(request.userAgent, request.method || 'POST', url);\n    if (!xhr) {\n      return (callback && callback(503, 'CORS not supported.'));\n    }\n\n    if (WITH_CREDENTIALS in xhr) {\n      xhr.onreadystatechange = () => {\n        // xhr not ready.\n        if (xhr.readyState !== 4) {\n          return;\n        }\n\n        complete(LOADED, xhr);\n      };\n    }\n\n    xhr.onprogress = () => { };\n    xhr.ontimeout = () => complete(TIMEOUT, xhr);\n    xhr.onerror = () => complete('error', xhr);\n    xhr.onload = () => complete(LOADED, xhr);\n\n    if (useSetTimeout) {\n      setTimeout(() => xhr.send(request.data), 500);\n    } else {\n      xhr.send(request.data);\n    }\n  }\n}\n\n                                                                                                                                                \n\nexport class BrowserStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(prefix?: string, maxQueueItems: number = 250) {\n    this.queue = new BrowserStorage('q', prefix, maxQueueItems);\n    this.settings = new BrowserStorage('settings', prefix, 1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    \n\nfunction getDefaultsSettingsFromScriptTag(): IConfigurationSettings {\n  if (!document || !document.getElementsByTagName) {\n    return null;\n  }\n\n  let scripts = document.getElementsByTagName('script');\n  for (let index = 0; index < scripts.length; index++) {\n    if (scripts[index].src && scripts[index].src.indexOf('/exceptionless') > -1) {\n      return Utils.parseQueryString(scripts[index].src.split('?').pop());\n    }\n  }\n  return null;\n}\n\nfunction processUnhandledException(stackTrace: TraceKit.StackTrace, options?: any): void {\n  let builder = ExceptionlessClient.default.createUnhandledException(new Error(stackTrace.message || (options || {}).status || 'Script error'), 'onerror');\n  builder.pluginContextData['@@_TraceKit.StackTrace'] = stackTrace;\n  builder.submit();\n}\n\n/*\nTODO: We currently are unable to parse string exceptions.\nfunction processJQueryAjaxError(event, xhr, settings, error:string): void {\n  let client = ExceptionlessClient.default;\n  if (xhr.status === 404) {\n    client.submitNotFound(settings.url);\n  } else if (xhr.status !== 401) {\n    client.createUnhandledException(error, 'JQuery.ajaxError')\n      .setSource(settings.url)\n      .setProperty('status', xhr.status)\n      .setProperty('request', settings.data)\n      .setProperty('response', xhr.responseText && xhr.responseText.slice && xhr.responseText.slice(0, 1024))\n      .submit();\n  }\n}\n*/\n\nConfiguration.prototype.useLocalStorage = function() {\n  if (BrowserStorage.isAvailable()) {\n    this.storage = new BrowserStorageProvider();\n    SettingsManager.applySavedServerSettings(this);\n    this.changed();\n  }\n};\n\nlet defaults = Configuration.defaults;\nlet settings = getDefaultsSettingsFromScriptTag();\nif (settings && (settings.apiKey || settings.serverUrl)) {\n  defaults.apiKey = settings.apiKey;\n  defaults.serverUrl = settings.serverUrl;\n}\n\ndefaults.errorParser = new DefaultErrorParser();\ndefaults.moduleCollector = new DefaultModuleCollector();\ndefaults.requestInfoCollector = new DefaultRequestInfoCollector();\ndefaults.submissionAdapter = new DefaultSubmissionAdapter();\n\nTraceKit.report.subscribe(processUnhandledException);\nTraceKit.extendToAsynchronousCallbacks();\n\n// window && window.addEventListener && window.addEventListener('beforeunload', function () {\n//   ExceptionlessClient.default.config.queue.process(true);\n// });\n\n// if (typeof $ !== 'undefined' && $(document)) {\n//   $(document).ajaxError(processJQueryAjaxError);\n// }\n\n(<any>Error).stackTraceLimit = Infinity;\n\ndeclare var $;\n\n"],"sourceRoot":"/source/"}
\ No newline at end of file
diff --git a/dist/exceptionless.node.js b/dist/exceptionless.node.js
index 7f5e56d7..42f49299 100644
--- a/dist/exceptionless.node.js
+++ b/dist/exceptionless.node.js
@@ -706,13 +706,13 @@ var Configuration = (function () {
         this.enabled = true;
         this.lastReferenceIdManager = new DefaultLastReferenceIdManager();
         this.settings = {};
-        this._plugins = [];
-        this._handlers = [];
         this._serverUrl = 'https://collector.exceptionless.io';
         this._heartbeatServerUrl = 'https://heartbeat.exceptionless.io';
         this._updateSettingsWhenIdleInterval = 120000;
         this._dataExclusions = [];
         this._userAgentBotPatterns = [];
+        this._plugins = [];
+        this._handlers = [];
         function inject(fn) {
             return typeof fn === 'function' ? fn(this) : fn;
         }
diff --git a/dist/exceptionless.node.js.map b/dist/exceptionless.node.js.map
index ea86fcac..9c2e3d2d 100644
--- a/dist/exceptionless.node.js.map
+++ b/dist/exceptionless.node.js.map
@@ -1 +1 @@
-{"version":3,"file":"exceptionless.node.js","sourceRoot":"/source/","sources":["exceptionless.node.ts"],"names":[],"mappings":"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","sourcesContent":["import * as events from \"events\";\nimport * as net from \"net\";\nimport * as stream from \"stream\";\nimport * as child from \"child_process\";\nimport * as tls from \"tls\";\nimport * as http from \"http\";\nimport * as crypto from \"crypto\";\nimport os = require('os');\nimport nodestacktrace = require('stack-trace');\nimport path = require('path');\nimport https = require('https');\nimport url = require('url');\nimport * as Fs from 'fs';\nimport * as Path from 'path';\nexport interface IEvent {\n  type?: string;\n  source?: string;\n  date?: Date;\n  tags?: string[];\n  message?: string;\n  geo?: string;\n  value?: number;\n  data?: any;\n  reference_id?: string;\n}\n\nexport class SubmissionResponse {\n  public success: boolean = false;\n  public badRequest: boolean = false;\n  public serviceUnavailable: boolean = false;\n  public paymentRequired: boolean = false;\n  public unableToAuthenticate: boolean = false;\n  public notFound: boolean = false;\n  public requestEntityTooLarge: boolean = false;\n  public statusCode: number;\n  public message: string;\n\n  constructor(statusCode: number, message?: string) {\n    this.statusCode = statusCode;\n    this.message = message;\n\n    this.success = statusCode >= 200 && statusCode <= 299;\n    this.badRequest = statusCode === 400;\n    this.serviceUnavailable = statusCode === 503;\n    this.paymentRequired = statusCode === 402;\n    this.unableToAuthenticate = statusCode === 401 || statusCode === 403;\n    this.notFound = statusCode === 404;\n    this.requestEntityTooLarge = statusCode === 413;\n  }\n}\n\nexport interface ILastReferenceIdManager {\n  getLast(): string;\n  clearLast(): void;\n  setLast(eventId: string): void;\n}\n\nexport interface ILog {\n  info(message: string): void;\n  warn(message: string): void;\n  error(message: string): void;\n}\n\n                                                                                                                 \n\nexport interface IEventQueue {\n  enqueue(event: IEvent): void;\n  process(isAppExiting?: boolean): void;\n  suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void;\n  onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void;\n}\n\n                                                                                                                                  \n\nexport interface IEnvironmentInfoCollector {\n  getEnvironmentInfo(context: EventPluginContext): IEnvironmentInfo;\n}\n\n                                                                                                              \n\nexport interface IErrorParser {\n  parse(context: EventPluginContext, exception: Error): IError;\n}\n\n                                                                                                                \n\nexport interface IModuleCollector {\n  getModules(context: EventPluginContext): IModule[];\n}\n\n                                                                                                                          \n\nexport interface IRequestInfoCollector {\n  getRequestInfo(context: EventPluginContext): IRequestInfo;\n}\n\n                                      \n\nexport interface IStorageProvider {\n  queue: IStorage;\n  settings: IStorage;\n}\n\n                                                                                                                   \n\nexport interface ISubmissionAdapter {\n  sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean): void;\n}\n\n                                                                                                                                                                                                                                                                                           \n\nexport interface ISubmissionClient {\n  postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void;\n  postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void;\n  getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void;\n  sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void;\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            \n\nexport interface IConfigurationSettings {\n  apiKey?: string;\n  serverUrl?: string;\n  heartbeatServerUrl?: string;\n  updateSettingsWhenIdleInterval?: number;\n  environmentInfoCollector?: IEnvironmentInfoCollector;\n  errorParser?: IErrorParser;\n  lastReferenceIdManager?: ILastReferenceIdManager;\n  log?: ILog;\n  moduleCollector?: IModuleCollector;\n  requestInfoCollector?: IRequestInfoCollector;\n  submissionBatchSize?: number;\n  submissionClient?: ISubmissionClient;\n  submissionAdapter?: ISubmissionAdapter;\n  storage?: IStorageProvider;\n  queue?: IEventQueue;\n}\n\n                                                                                                                                                     \n\ninterface ISettingsWithVersion {\n  version: number;\n  settings: { [key: string]: string };\n}\n\nexport class SettingsManager {\n  /**\n   * A list of handlers that will be fired when the settings change.\n   * @type {Array}\n   * @private\n   */\n  private static _handlers: { (config: Configuration): void }[] = [];\n\n  public static onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  public static applySavedServerSettings(config: Configuration): void {\n    if (!config || !config.isValid) {\n      return;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    config.log.info(`Applying saved settings: v${savedSettings.version}`);\n    config.settings = Utils.merge(config.settings, savedSettings.settings);\n    this.changed(config);\n  }\n\n  public static getVersion(config: Configuration): number {\n    if (!config || !config.isValid) {\n      return 0;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    return savedSettings.version || 0;\n  }\n\n  public static checkVersion(version: number, config: Configuration): void {\n    let currentVersion: number = this.getVersion(config);\n    if (version <= currentVersion) {\n      return;\n    }\n\n    config.log.info(`Updating settings from v${currentVersion} to v${version}`);\n    this.updateSettings(config, currentVersion);\n  }\n\n  public static updateSettings(config: Configuration, version?: number): void {\n    if (!config || !config.enabled) {\n      return;\n    }\n\n    let unableToUpdateMessage = 'Unable to update settings';\n    if (!config.isValid) {\n      config.log.error(`${unableToUpdateMessage}: ApiKey is not set.`);\n      return;\n    }\n\n    if (!version || version < 0) {\n      version = this.getVersion(config);\n    }\n\n    config.log.info(`Checking for updated settings from: v${version}.`);\n    config.submissionClient.getSettings(config, version, (response: SettingsResponse) => {\n      if (!config || !response || !response.success || !response.settings) {\n        config.log.warn(`${unableToUpdateMessage}: ${response.message}`);\n        return;\n      }\n\n      config.settings = Utils.merge(config.settings, response.settings);\n\n      // TODO: Store snapshot of settings after reading from config and attributes and use that to revert to defaults.\n      // Remove any existing server settings that are not in the new server settings.\n      let savedServerSettings = SettingsManager.getSavedServerSettings(config);\n      for (let key in savedServerSettings) {\n        if (response.settings[key]) {\n          continue;\n        }\n\n        delete config.settings[key];\n      }\n\n      let newSettings = <ISettingsWithVersion>{\n        version: response.settingsVersion,\n        settings: response.settings\n      };\n\n      config.storage.settings.save(newSettings);\n\n      config.log.info(`Updated settings: v${newSettings.version}`);\n      this.changed(config);\n    });\n  }\n\n  private static changed(config: Configuration) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](config);\n      } catch (ex) {\n        config.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  private static getSavedServerSettings(config: Configuration): ISettingsWithVersion {\n    let item = config.storage.settings.get()[0];\n    if (item && item.value && item.value.version && item.value.settings) {\n      return item.value;\n    }\n\n    return { version: 0, settings: {} };\n  }\n}\n\n                                                                    \n\nexport class DefaultLastReferenceIdManager implements ILastReferenceIdManager {\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @type {string}\n   * @private\n   */\n  private _lastReferenceId: string = null;\n\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @returns {string}\n   */\n  public getLast(): string {\n    return this._lastReferenceId;\n  }\n\n  /**\n   * Clears the last event's reference id.\n   */\n  public clearLast(): void {\n    this._lastReferenceId = null;\n  }\n\n  /**\n   * Sets the last event's reference id.\n   * @param eventId\n   */\n  public setLast(eventId: string): void {\n    this._lastReferenceId = eventId;\n  }\n}\n\n                              \n\nexport class ConsoleLog implements ILog {\n  public info(message: string): void {\n    this.log('info', message);\n  }\n\n  public warn(message: string): void {\n    this.log('warn', message);\n  }\n\n  public error(message: string): void {\n    this.log('error', message);\n  }\n\n  private log(level: string, message: string) {\n    if (console && console[level]) {\n      console[level](`[${level}] Exceptionless: ${message}`);\n    }\n  }\n}\n\n                              \n\nexport class NullLog implements ILog {\n  public info(message: string): void { }\n  public warn(message: string): void { }\n  public error(message: string): void { }\n}\n\nexport interface IUserInfo {\n  identity?: string;\n  name?: string;\n  data?: any;\n}\n\n                                                                                                         \n\nexport interface IEventPlugin {\n  priority?: number;\n  name?: string;\n  run(context: EventPluginContext, next?: () => void): void;\n}\n\n                                                                                                                                                                                             \n\nexport class EventPluginContext {\n  public cancelled: boolean;\n  public client: ExceptionlessClient;\n  public event: IEvent;\n  public contextData: ContextData;\n\n  constructor(client: ExceptionlessClient, event: IEvent, contextData?: ContextData) {\n    this.client = client;\n    this.event = event;\n    this.contextData = contextData ? contextData : new ContextData();\n  }\n\n  public get log(): ILog {\n    return this.client.config.log;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \n\nexport class EventPluginManager {\n  public static run(context: EventPluginContext, callback: (context?: EventPluginContext) => void): void {\n    let wrap = function(plugin: IEventPlugin, next?: () => void): () => void {\n      return () => {\n        try {\n          if (!context.cancelled) {\n            plugin.run(context, next);\n          }\n        } catch (ex) {\n          context.cancelled = true;\n          context.log.error(`Error running plugin '${plugin.name}': ${ex.message}. Discarding Event.`);\n        }\n\n        if (context.cancelled && !!callback) {\n          callback(context);\n        }\n      };\n    };\n\n    let plugins: IEventPlugin[] = context.client.config.plugins; // optimization for minifier.\n    let wrappedPlugins: { (): void }[] = [];\n    if (!!callback) {\n      wrappedPlugins[plugins.length] = wrap({ name: 'cb', priority: 9007199254740992, run: callback }, null);\n    }\n\n    for (let index = plugins.length - 1; index > -1; index--) {\n      wrappedPlugins[index] = wrap(plugins[index], !!callback || (index < plugins.length - 1) ? wrappedPlugins[index + 1] : null);\n    }\n\n    wrappedPlugins[0]();\n  }\n\n  public static addDefaultPlugins(config: Configuration): void {\n    config.addPlugin(new ConfigurationDefaultsPlugin());\n    config.addPlugin(new ErrorPlugin());\n    config.addPlugin(new DuplicateCheckerPlugin());\n    config.addPlugin(new EventExclusionPlugin());\n    config.addPlugin(new ModuleInfoPlugin());\n    config.addPlugin(new RequestInfoPlugin());\n    config.addPlugin(new EnvironmentInfoPlugin());\n    config.addPlugin(new SubmissionMethodPlugin());\n  }\n}\n\n                                                                                                                                                               \n\nexport class HeartbeatPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'HeartbeatPlugin';\n\n  private _interval: number;\n  private _intervalId: any;\n\n  constructor (heartbeatInterval: number = 30000) {\n    this._interval = heartbeatInterval;\n  }\n\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    clearInterval(this._intervalId);\n\n    let user: IUserInfo = context.event.data['@user'];\n    if (user && user.identity) {\n      this._intervalId = setInterval(() => context.client.submitSessionHeartbeat(user.identity), this._interval);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ReferenceIdPlugin implements IEventPlugin {\n  public priority: number = 20;\n  public name: string = 'ReferenceIdPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    if ((!context.event.reference_id || context.event.reference_id.length === 0) && context.event.type === 'error') {\n      context.event.reference_id = Utils.guid().replace('-', '').substring(0, 10);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                     \n\nexport class DefaultEventQueue implements IEventQueue {\n  /**\n   * The configuration object.\n   * @type {Configuration}\n   * @private\n   */\n  private _config: Configuration;\n\n  /**\n   * A list of handlers that will be fired when events are submitted.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (events: IEvent[], response: SubmissionResponse): void }[] = [];\n\n  /**\n   * Suspends processing until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _suspendProcessingUntil: Date;\n\n  /**\n   * Discards queued items until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _discardQueuedItemsUntil: Date;\n\n  /**\n   * Returns true if the queue is processing.\n   * @type {boolean}\n   * @private\n   */\n  private _processingQueue: boolean = false;\n\n  /**\n   * Processes the queue every xx seconds.\n   * @type {Timer}\n   * @private\n   */\n  private _queueTimer: any;\n\n  constructor(config: Configuration) {\n    this._config = config;\n  }\n\n  public enqueue(event: IEvent): void {\n    const eventWillNotBeQueued: string = 'The event will not be queued.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (this.areQueuedItemsDiscarded()) {\n      log.info(`Queue items are currently being discarded. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    this.ensureQueueTimer();\n\n    let timestamp = config.storage.queue.save(event);\n    let logText = `type=${event.type} ${!!event.reference_id ? 'refid=' + event.reference_id : ''}`;\n    if (timestamp) {\n      log.info(`Enqueuing event: ${timestamp} ${logText}`);\n    } else {\n      log.error(`Could not enqueue event ${logText}`);\n    }\n  }\n\n  public process(isAppExiting?: boolean): void {\n    const queueNotProcessed: string = 'The queue will not be processed.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (this._processingQueue) {\n      return;\n    }\n\n    log.info('Processing queue...');\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${queueNotProcessed}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${queueNotProcessed}`);\n      return;\n    }\n\n    this._processingQueue = true;\n    this.ensureQueueTimer();\n\n    try {\n      let events = config.storage.queue.get(config.submissionBatchSize);\n      if (!events || events.length === 0) {\n        this._processingQueue = false;\n        return;\n      }\n\n      log.info(`Sending ${events.length} events to ${config.serverUrl}.`);\n      config.submissionClient.postEvents(events.map(e => e.value), config, (response: SubmissionResponse) => {\n        this.processSubmissionResponse(response, events);\n        this.eventsPosted(events.map(e => e.value), response);\n        log.info('Finished processing queue.');\n        this._processingQueue = false;\n      }, isAppExiting);\n    } catch (ex) {\n      log.error(`Error processing queue: ${ex}`);\n      this.suspendProcessing();\n      this._processingQueue = false;\n    }\n  }\n\n  public suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void {\n    let config: Configuration = this._config; // Optimization for minifier.\n\n    if (!durationInMinutes || durationInMinutes <= 0) {\n      durationInMinutes = 5;\n    }\n\n    config.log.info(`Suspending processing for ${durationInMinutes} minutes.`);\n    this._suspendProcessingUntil = new Date(new Date().getTime() + (durationInMinutes * 60000));\n\n    if (discardFutureQueuedItems) {\n      this._discardQueuedItemsUntil = this._suspendProcessingUntil;\n    }\n\n    if (clearQueue) {\n      // Account is over the limit and we want to ensure that the sample size being sent in will contain newer errors.\n      config.storage.queue.clear();\n    }\n  }\n\n  public onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private eventsPosted(events: IEvent[], response: SubmissionResponse) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](events, response);\n      } catch (ex) {\n        this._config.log.error(`Error calling onEventsPosted handler: ${ex}`);\n      }\n    }\n  }\n\n  private areQueuedItemsDiscarded(): boolean {\n    return this._discardQueuedItemsUntil && this._discardQueuedItemsUntil > new Date();\n  }\n\n  private ensureQueueTimer(): void {\n    if (!this._queueTimer) {\n      this._queueTimer = setInterval(() => this.onProcessQueue(), 10000);\n    }\n  }\n\n  private isQueueProcessingSuspended(): boolean {\n    return this._suspendProcessingUntil && this._suspendProcessingUntil > new Date();\n  }\n\n  private onProcessQueue(): void {\n    if (!this.isQueueProcessingSuspended() && !this._processingQueue) {\n      this.process();\n    }\n  }\n\n  private processSubmissionResponse(response: SubmissionResponse, events: IStorageItem[]): void {\n    const noSubmission: string = 'The event will not be submitted.'; // Optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (response.success) {\n      log.info(`Sent ${events.length} events.`);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.serviceUnavailable) {\n      // You are currently over your rate limit or the servers are under stress.\n      log.error('Server returned service unavailable.');\n      this.suspendProcessing();\n      return;\n    }\n\n    if (response.paymentRequired) {\n      // If the organization over the rate limit then discard the event.\n      log.info('Too many events have been submitted, please upgrade your plan.');\n      this.suspendProcessing(null, true, true);\n      return;\n    }\n\n    if (response.unableToAuthenticate) {\n      // The api key was suspended or could not be authorized.\n      log.info(`Unable to authenticate, please check your configuration. ${noSubmission}`);\n      this.suspendProcessing(15);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.notFound || response.badRequest) {\n      // The service end point could not be found.\n      log.error(`Error while trying to submit data: ${response.message}`);\n      this.suspendProcessing(60 * 4);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.requestEntityTooLarge) {\n      let message = 'Event submission discarded for being too large.';\n      if (config.submissionBatchSize > 1) {\n        log.error(`${message} Retrying with smaller batch size.`);\n        config.submissionBatchSize = Math.max(1, Math.round(config.submissionBatchSize / 1.5));\n      } else {\n        log.error(`${message} ${noSubmission}`);\n        this.removeEvents(events);\n      }\n\n      return;\n    }\n\n    if (!response.success) {\n      log.error(`Error submitting events: ${response.message || 'Please check the network tab for more info.'}`);\n      this.suspendProcessing();\n    }\n  }\n\n  private removeEvents(events: IStorageItem[]) {\n    for (let index = 0; index < (events || []).length; index++) {\n      this._config.storage.queue.remove(events[index].timestamp);\n    }\n  }\n}\n\n                                                                                                                                                  \n\nexport class InMemoryStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(maxQueueItems: number = 250) {\n    this.queue = new InMemoryStorage(maxQueueItems);\n    this.settings = new InMemoryStorage(1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n\ndeclare var XDomainRequest: { new (); create(); };\n\nexport class DefaultSubmissionClient implements ISubmissionClient {\n  public configurationVersionHeader: string = 'x-exceptionless-configversion';\n\n  public postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void {\n    let data = JSON.stringify(events);\n    let request = this.createRequest(config, 'POST',  `${config.serverUrl}/api/v2/events`, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb, isAppExiting);\n  }\n\n  public postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void {\n    let path = `${config.serverUrl}/api/v2/events/by-ref/${encodeURIComponent(referenceId)}/user-description`;\n    let data = JSON.stringify(description);\n    let request = this.createRequest(config, 'POST', path, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void {\n    let request = this.createRequest(config, 'GET', `${config.serverUrl}/api/v2/projects/config?v=${version}`);\n    let cb = (status, message, data?, headers?) => {\n      if (status !== 200) {\n        return callback(new SettingsResponse(false, null, -1, null, message));\n      }\n\n      let settings: IClientConfiguration;\n      try {\n        settings = JSON.parse(data);\n      } catch (e) {\n        config.log.error(`Unable to parse settings: '${data}'`);\n      }\n\n      if (!settings || isNaN(settings.version)) {\n        return callback(new SettingsResponse(false, null, -1, null, 'Invalid configuration settings.'));\n      }\n\n      callback(new SettingsResponse(true, settings.settings || {}, settings.version));\n    };\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void {\n    let request = this.createRequest(config, 'GET', `${config.heartbeatServerUrl}/api/v2/events/session/heartbeat?id=${sessionIdOrUserId}&close=${closeSession}`);\n    config.submissionAdapter.sendRequest(request);\n  }\n\n  private createRequest(config: Configuration, method: string, url: string, data: string = null): SubmissionRequest {\n    return {\n      method,\n      url,\n      data,\n      apiKey: config.apiKey,\n      userAgent: config.userAgent\n    };\n  }\n\n  private createSubmissionCallback(config: Configuration, callback: (response: SubmissionResponse) => void) {\n    return (status, message, data?, headers?) => {\n      let settingsVersion: number = headers && parseInt(headers[this.configurationVersionHeader], 10);\n      SettingsManager.checkVersion(settingsVersion, config);\n\n      callback(new SubmissionResponse(status, message));\n    };\n  }\n}\n\nexport class Utils {\n  public static addRange<T>(target: T[], ...values: T[]) {\n    if (!target) {\n      target = [];\n    }\n\n    if (!values || values.length === 0) {\n      return target;\n    }\n\n    for (let index = 0; index < values.length; index++) {\n      if (values[index] && target.indexOf(values[index]) < 0) {\n        target.push(values[index]);\n      }\n    }\n\n    return target;\n  }\n\n  public static getHashCode(source: string): number {\n    if (!source || source.length === 0) {\n      return 0;\n    }\n\n    let hash: number = 0;\n    for (let index = 0; index < source.length; index++) {\n      let character = source.charCodeAt(index);\n      hash = ((hash << 5) - hash) + character;\n      hash |= 0;\n    }\n\n    return hash;\n  }\n\n  public static getCookies(cookies: string, exclusions?: string[]): Object {\n    let result: Object = {};\n\n    let parts: string[] = (cookies || '').split('; ');\n    for (let index = 0; index < parts.length; index++) {\n      let cookie: string[] = parts[index].split('=');\n      if (!Utils.isMatch(cookie[0], exclusions)) {\n        result[cookie[0]] = cookie[1];\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static guid(): string {\n    function s4() {\n      return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n    }\n\n    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n  }\n\n  public static merge(defaultValues: Object, values: Object) {\n    let result: Object = {};\n\n    for (let key in defaultValues || {}) {\n      if (!!defaultValues[key]) {\n        result[key] = defaultValues[key];\n      }\n    }\n\n    for (let key in values || {}) {\n      if (!!values[key]) {\n        result[key] = values[key];\n      }\n    }\n\n    return result;\n  }\n\n  public static parseVersion(source: string): string {\n    if (!source) {\n      return null;\n    }\n\n    let versionRegex = /(v?((\\d+)\\.(\\d+)(\\.(\\d+))?)(?:-([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?(?:\\+([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?)/;\n    let matches = versionRegex.exec(source);\n    if (matches && matches.length > 0) {\n      return matches[0];\n    }\n\n    return null;\n  }\n\n  public static parseQueryString(query: string, exclusions?: string[]) {\n    if (!query || query.length === 0) {\n      return null;\n    }\n\n    let pairs: string[] = query.split('&');\n    if (pairs.length === 0) {\n      return null;\n    }\n\n    let result: Object = {};\n    for (let index = 0; index < pairs.length; index++) {\n      let pair = pairs[index].split('=');\n      if (!Utils.isMatch(pair[0], exclusions)) {\n        result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static randomNumber(): number {\n    return Math.floor(Math.random() * 9007199254740992);\n  }\n\n  /**\n   * Checks to see if a value matches a pattern.\n   * @param input the value to check against the @pattern.\n   * @param pattern The pattern to check, supports wild cards (*).\n   */\n  public static isMatch(input: string, patterns: string[], ignoreCase: boolean = true): boolean {\n    if (!input || typeof input !== 'string') {\n      return false;\n    }\n\n    let trim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n    input = (ignoreCase ? input.toLowerCase() : input).replace(trim, '');\n\n    return (patterns || []).some(pattern => {\n      if (typeof pattern !== 'string') {\n        return false;\n      }\n\n      pattern = (ignoreCase ? pattern.toLowerCase() : pattern).replace(trim, '');\n      if (pattern.length <= 0) {\n        return false;\n      }\n\n      let startsWithWildcard: boolean = pattern[0] === '*';\n      if (startsWithWildcard) {\n        pattern = pattern.slice(1);\n      }\n\n      let endsWithWildcard: boolean = pattern[pattern.length - 1] === '*';\n      if (endsWithWildcard) {\n        pattern = pattern.substring(0, pattern.length - 1);\n      }\n\n      if (startsWithWildcard && endsWithWildcard) {\n        return pattern.length <= input.length && input.indexOf(pattern, 0) !== -1;\n      }\n\n      if (startsWithWildcard) {\n        return Utils.endsWith(input, pattern);\n      }\n\n      if (endsWithWildcard) {\n        return Utils.startsWith(input, pattern);\n      }\n\n      return input === pattern;\n    });\n  }\n\n  public static isEmpty(input: Object) {\n    return input === null || (typeof (input) === 'object' && Object.keys(input).length === 0);\n  }\n\n  public static startsWith(input: string, prefix: string): boolean {\n    return input.substring(0, prefix.length) === prefix;\n  }\n\n  public static endsWith(input: string, suffix: string): boolean {\n    return input.indexOf(suffix, input.length - suffix.length) !== -1;\n  }\n\n  /**\n   * Stringifys an object with optional exclusions and max depth.\n   * @param data The data object to add.\n   * @param exclusions Any property names that should be excluded.\n   * @param maxDepth The max depth of the object to include.\n   */\n  public static stringify(data: any, exclusions?: string[], maxDepth?: number): string {\n    function stringifyImpl(obj: any, excludedKeys: string[]): string {\n      let cache: string[] = [];\n      return JSON.stringify(obj, function(key: string, value: any) {\n        if (Utils.isMatch(key, excludedKeys)) {\n          return;\n        }\n\n        if (typeof value === 'object' && !!value) {\n          if (cache.indexOf(value) !== -1) {\n            // Circular reference found, discard key\n            return;\n          }\n\n          cache.push(value);\n        }\n\n        return value;\n      });\n    }\n\n    if (({}).toString.call(data) === '[object Object]') {\n      let flattened = {};\n      /* tslint:disable:forin */\n      for (let prop in data) {\n        let value = data[prop];\n        if (value === data) {\n          continue;\n        }\n        flattened[prop] = data[prop];\n      }\n      /* tslint:enable:forin */\n\n      return stringifyImpl(flattened, exclusions);\n    }\n\n    if (({}).toString.call(data) === '[object Array]') {\n      let result = [];\n      for (let index = 0; index < data.length; index++) {\n        result[index] = JSON.parse(stringifyImpl(data[index], exclusions));\n      }\n\n      return JSON.stringify(result);\n    }\n\n    return stringifyImpl(data, exclusions);\n  }\n\n  public static toBoolean(input, defaultValue: boolean = false): boolean {\n    if (typeof input === 'boolean') {\n      return input;\n    }\n\n    if (input === null || typeof input !== 'number' && typeof input !== 'string') {\n      return defaultValue;\n    }\n\n    switch ((input + '').toLowerCase().trim()) {\n      case 'true': case 'yes': case '1': return true;\n      case 'false': case 'no': case '0': case null: return false;\n    }\n\n    return defaultValue;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 \n\nexport class Configuration implements IConfigurationSettings {\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @type {IConfigurationSettings}\n   * @private\n   */\n  private static _defaultSettings: IConfigurationSettings = null;\n\n  /**\n   * A default list of tags that will automatically be added to every\n   * report submitted to the server.\n   *\n   * @type {Array}\n   */\n  public defaultTags: string[] = [];\n\n  /**\n   * A default list of of extended data objects that will automatically\n   * be added to every report submitted to the server.\n   *\n   * @type {{}}\n   */\n  public defaultData: Object = {};\n\n  /**\n   * Whether the client is currently enabled or not. If it is disabled,\n   * submitted errors will be discarded and no data will be sent to the server.\n   *\n   * @returns {boolean}\n   */\n  public enabled: boolean = true;\n\n  public environmentInfoCollector: IEnvironmentInfoCollector;\n  public errorParser: IErrorParser;\n  public lastReferenceIdManager: ILastReferenceIdManager = new DefaultLastReferenceIdManager();\n  public log: ILog;\n  public moduleCollector: IModuleCollector;\n  public requestInfoCollector: IRequestInfoCollector;\n\n  /**\n   * Maximum number of events that should be sent to the server together in a batch. (Defaults to 50)\n   */\n  public submissionBatchSize: number;\n  public submissionAdapter: ISubmissionAdapter;\n  public submissionClient: ISubmissionClient;\n\n  /**\n   * Contains a dictionary of custom settings that can be used to control\n   * the client and will be automatically updated from the server.\n   */\n  public settings: Object = {};\n\n  public storage: IStorageProvider;\n\n  public queue: IEventQueue;\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @type {Array}\n   * @private\n   */\n  private _plugins: IEventPlugin[] = [];\n\n  /**\n   * A list of handlers that will be fired when configuration changes.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (config: Configuration): void }[] = [];\n\n  constructor(configSettings?: IConfigurationSettings) {\n    function inject(fn: any) {\n      return typeof fn === 'function' ? fn(this) : fn;\n    }\n\n    configSettings = Utils.merge(Configuration.defaults, configSettings);\n\n    this.log = inject(configSettings.log) || new NullLog();\n    this.apiKey = configSettings.apiKey;\n    this.serverUrl = configSettings.serverUrl;\n    this.heartbeatServerUrl = configSettings.heartbeatServerUrl;\n    this.updateSettingsWhenIdleInterval = configSettings.updateSettingsWhenIdleInterval;\n\n    this.environmentInfoCollector = inject(configSettings.environmentInfoCollector);\n    this.errorParser = inject(configSettings.errorParser);\n    this.lastReferenceIdManager = inject(configSettings.lastReferenceIdManager) || new DefaultLastReferenceIdManager();\n    this.moduleCollector = inject(configSettings.moduleCollector);\n    this.requestInfoCollector = inject(configSettings.requestInfoCollector);\n    this.submissionBatchSize = inject(configSettings.submissionBatchSize) || 50;\n    this.submissionAdapter = inject(configSettings.submissionAdapter);\n    this.submissionClient = inject(configSettings.submissionClient) || new DefaultSubmissionClient();\n    this.storage = inject(configSettings.storage) || new InMemoryStorageProvider();\n    this.queue = inject(configSettings.queue) || new DefaultEventQueue(this);\n\n    SettingsManager.applySavedServerSettings(this);\n    EventPluginManager.addDefaultPlugins(this);\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @type {string}\n   * @private\n   */\n  private _apiKey: string;\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @returns {string}\n   */\n  public get apiKey(): string {\n    return this._apiKey;\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @param value\n   */\n  public set apiKey(value: string) {\n    this._apiKey = value || null;\n    this.log.info(`apiKey: ${this._apiKey}`);\n    this.changed();\n  }\n\n  /**\n   * Returns true if the apiKey is valid.\n   * @returns {boolean}\n   */\n  public get isValid(): boolean {\n    return !!this.apiKey && this.apiKey.length >= 10;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _serverUrl: string = 'https://collector.exceptionless.io';\n\n  /**\n   * The server url that all events will be sent to.\n   * @returns {string}\n   */\n  public get serverUrl(): string {\n    return this._serverUrl;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @param value\n   */\n  public set serverUrl(value: string) {\n    if (!!value) {\n      this._serverUrl = value;\n      this._heartbeatServerUrl = value;\n      this.log.info(`serverUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _heartbeatServerUrl: string = 'https://heartbeat.exceptionless.io';\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @returns {string}\n   */\n  public get heartbeatServerUrl(): string {\n    return this._heartbeatServerUrl;\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @param value\n   */\n  public set heartbeatServerUrl(value: string) {\n    if (!!value) {\n      this._heartbeatServerUrl = value;\n      this.log.info(`heartbeatServerUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @type {number}\n   * @private\n   */\n  private _updateSettingsWhenIdleInterval: number = 120000;\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @returns {number}\n   */\n  public get updateSettingsWhenIdleInterval(): number {\n    return this._updateSettingsWhenIdleInterval;\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @param value\n   */\n  public set updateSettingsWhenIdleInterval(value: number) {\n    if (typeof value !== 'number') {\n      return;\n    }\n\n    if (value <= 0) {\n      value = -1;\n    } else if (value > 0 && value < 15000) {\n      value = 15000;\n    }\n\n    this._updateSettingsWhenIdleInterval = value;\n    this.log.info(`updateSettingsWhenIdleInterval: ${value}`);\n    this.changed();\n  }\n\n  /**\n   * A list of exclusion patterns.\n   * @type {Array}\n   * @private\n   */\n  private _dataExclusions: string[] = [];\n\n  /**\n   * A list of user agent patterns.\n   * @type {Array}\n   * @private\n   */\n  private _userAgentBotPatterns: string[] = [];\n\n  /**\n   *  A list of exclusion patterns that will automatically remove any data that\n   *  matches them from any data submitted to the server.\n   *\n   *  For example, entering CreditCard will remove any extended data properties,\n   *  form fields, cookies and query parameters from the report.\n   *\n   * @returns {string[]}\n   */\n  public get dataExclusions(): string[] {\n    let exclusions: string = this.settings['@@DataExclusions'];\n    return this._dataExclusions.concat(exclusions && exclusions.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of exclusion patterns that will automatically remove any\n   * data that matches them from any data submitted to the server.\n   *\n   * For example, entering CreditCard will remove any extended data properties, form\n   * fields, cookies and query parameters from the report.\n   *\n   * @param exclusions\n   */\n  public addDataExclusions(...exclusions: string[]) {\n    this._dataExclusions = Utils.addRange<string>(this._dataExclusions, ...exclusions);\n  }\n\n  /**\n   * A list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @returns {string[]}\n   */\n  public get userAgentBotPatterns(): string[] {\n    let patterns: string = this.settings['@@UserAgentBotPatterns'];\n    return this._userAgentBotPatterns.concat(patterns && patterns.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @param userAgentBotPatterns\n   */\n  public addUserAgentBotPatterns(...userAgentBotPatterns: string[]) {\n    this._userAgentBotPatterns = Utils.addRange<string>(this._userAgentBotPatterns, ...userAgentBotPatterns);\n  }\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @returns {IEventPlugin[]}\n   */\n  public get plugins(): IEventPlugin[] {\n    return this._plugins.sort((p1: IEventPlugin, p2: IEventPlugin) => {\n      return (p1.priority < p2.priority) ? -1 : (p1.priority > p2.priority) ? 1 : 0;\n    });\n  }\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param plugin\n   */\n  public addPlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param name The name used to identify the plugin.\n   * @param priority Used to determine plugins priority.\n   * @param pluginAction A function that is run.\n   */\n  public addPlugin(name: string, priority: number, pluginAction: (context: EventPluginContext, next?: () => void) => void): void;\n  public addPlugin(pluginOrName: IEventPlugin | string, priority?: number, pluginAction?: (context: EventPluginContext, next?: () => void) => void): void {\n    let plugin: IEventPlugin = !!pluginAction ? { name: <string>pluginOrName, priority: priority, run: pluginAction } : <IEventPlugin>pluginOrName;\n    if (!plugin || !plugin.run) {\n      this.log.error('Add plugin failed: Run method not defined');\n      return;\n    }\n\n    if (!plugin.name) {\n      plugin.name = Utils.guid();\n    }\n\n    if (!plugin.priority) {\n      plugin.priority = 0;\n    }\n\n    let pluginExists: boolean = false;\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === plugin.name) {\n        pluginExists = true;\n        break;\n      }\n    }\n\n    if (!pluginExists) {\n      plugins.push(plugin);\n    }\n  }\n\n  /**\n   * Remove the plugin from this configuration.\n   * @param plugin\n   */\n  public removePlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Remove an plugin by key from this configuration.\n   * @param name\n   */\n  public removePlugin(name: string): void;\n  public removePlugin(pluginOrName: IEventPlugin | string): void {\n    let name: string = typeof pluginOrName === 'string' ? pluginOrName : pluginOrName.name;\n    if (!name) {\n      this.log.error('Remove plugin failed: Plugin name not defined');\n      return;\n    }\n\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === name) {\n        plugins.splice(index, 1);\n        break;\n      }\n    }\n  }\n\n  /**\n   * Automatically set the application version for events.\n   * @param version\n   */\n  public setVersion(version: string): void {\n    if (!!version) {\n      this.defaultData['@version'] = version;\n    }\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): void;\n  public setUserIdentity(identity: string): void;\n  public setUserIdentity(identity: string, name: string): void;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): void {\n    const USER_KEY: string = '@user'; // optimization for minifier.\n    let userInfo: IUserInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n\n    let shouldRemove: boolean = !userInfo || (!userInfo.identity && !userInfo.name);\n    if (shouldRemove) {\n      delete this.defaultData[USER_KEY];\n    } else {\n      this.defaultData[USER_KEY] = userInfo;\n    }\n\n    this.log.info(`user identity: ${shouldRemove ? 'null' : userInfo.identity}`);\n  }\n\n  /**\n   * Used to identify the client that sent the events to the server.\n   * @returns {string}\n   */\n  public get userAgent(): string {\n    return 'exceptionless-js/1.0.0.0';\n  }\n\n  /**\n   * Automatically send a heartbeat to keep the session alive.\n   */\n  public useSessions(sendHeartbeats: boolean = true, heartbeatInterval: number = 30000): void {\n    if (sendHeartbeats) {\n      this.addPlugin(new HeartbeatPlugin(heartbeatInterval));\n    }\n  }\n\n  /**\n   * Automatically set a reference id for error events.\n   */\n  public useReferenceIds(): void {\n    this.addPlugin(new ReferenceIdPlugin());\n  }\n\n  public useLocalStorage(): void {\n    // This method will be injected via the prototype.\n  }\n\n  // TODO: Support a min log level.\n  public useDebugLogger(): void {\n    this.log = new ConsoleLog();\n  }\n\n  public onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private changed() {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](this);\n      } catch (ex) {\n        this.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @returns {IConfigurationSettings}\n   */\n  public static get defaults() {\n    if (Configuration._defaultSettings === null) {\n      Configuration._defaultSettings = {};\n    }\n\n    return Configuration._defaultSettings;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                   \n\nexport class EventBuilder {\n  public target: IEvent;\n  public client: ExceptionlessClient;\n  public pluginContextData: ContextData;\n\n  private _validIdentifierErrorMessage: string = 'must contain between 8 and 100 alphanumeric or \\'-\\' characters.'; // optimization for minifier.\n\n  constructor(event: IEvent, client: ExceptionlessClient, pluginContextData?: ContextData) {\n    this.target = event;\n    this.client = client;\n    this.pluginContextData = pluginContextData || new ContextData();\n  }\n\n  public setType(type: string): EventBuilder {\n    if (!!type) {\n      this.target.type = type;\n    }\n\n    return this;\n  }\n\n  public setSource(source: string): EventBuilder {\n    if (!!source) {\n      this.target.source = source;\n    }\n\n    return this;\n  }\n\n  public setReferenceId(referenceId: string): EventBuilder {\n    if (!this.isValidIdentifier(referenceId)) {\n      throw new Error(`ReferenceId ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.target.reference_id = referenceId;\n    return this;\n  }\n\n  /**\n   * Allows you to reference a parent event by its ReferenceId property. This allows you to have parent and child relationships.\n   * @param name Reference name\n   * @param id The reference id that points to a specific event\n   * @returns {EventBuilder}\n     */\n  public setEventReference(name: string, id: string): EventBuilder {\n    if (!name) {\n      throw new Error('Invalid name');\n    }\n\n    if (!id || !this.isValidIdentifier(id)) {\n      throw new Error(`Id ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.setProperty('@ref:' + name, id);\n    return this;\n  }\n\n  public setMessage(message: string): EventBuilder {\n    if (!!message) {\n      this.target.message = message;\n    }\n\n    return this;\n  }\n\n  public setGeo(latitude: number, longitude: number): EventBuilder {\n    if (latitude < -90.0 || latitude > 90.0) {\n      throw new Error('Must be a valid latitude value between -90.0 and 90.0.');\n    }\n\n    if (longitude < -180.0 || longitude > 180.0) {\n      throw new Error('Must be a valid longitude value between -180.0 and 180.0.');\n    }\n\n    this.target.geo = `${latitude},${longitude}`;\n    return this;\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): EventBuilder;\n  public setUserIdentity(identity: string): EventBuilder;\n  public setUserIdentity(identity: string, name: string): EventBuilder;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): EventBuilder {\n    let userInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n    if (!userInfo || (!userInfo.identity && !userInfo.name)) {\n      return this;\n    }\n\n    this.setProperty('@user', userInfo);\n    return this;\n  }\n\n  /**\n   * Sets the user's description of the event.\n   *\n   * @param emailAddress The email address\n   * @param description The user's description of the event.\n   * @returns {EventBuilder}\n     */\n  public setUserDescription(emailAddress: string, description: string): EventBuilder {\n    if (emailAddress && description) {\n      this.setProperty('@user_description', { email_address: emailAddress, description: description });\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting manual\n   * stacking information.\n   * @param signatureData A dictionary of strings to use for stacking.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingInfo(signatureData: any, title?: string) {\n    if (signatureData) {\n      let stack = <IManualStackingInfo>{\n        signature_data: signatureData\n      };\n      if (title) {\n        stack.title = title;\n      }\n      this.setProperty('@stack', stack);\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting the stacking key.\n   * @param manualStackingKey The manual stacking key.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingKey(manualStackingKey: string, title?: string): EventBuilder {\n    if (manualStackingKey) {\n      let data = {\n        'ManualStackingKey': manualStackingKey\n      };\n      this.setManualStackingInfo(data, title);\n    }\n\n    return this;\n  }\n\n  public setValue(value: number): EventBuilder {\n    if (!!value) {\n      this.target.value = value;\n    }\n\n    return this;\n  }\n\n  public addTags(...tags: string[]): EventBuilder {\n    this.target.tags = Utils.addRange<string>(this.target.tags, ...tags);\n    return this;\n  }\n\n  /**\n   * Adds the object to extended data. Uses @excludedPropertyNames\n   * to exclude data from being included in the event.\n   * @param name The data object to add.\n   * @param value The name of the object to add.\n   * @param maxDepth The max depth of the object to include.\n   * @param excludedPropertyNames Any property names that should be excluded.\n   */\n  public setProperty(name: string, value: any, maxDepth?: number, excludedPropertyNames?: string[]): EventBuilder {\n    if (!name || (value === undefined || value == null)) {\n      return this;\n    }\n\n    if (!this.target.data) {\n      this.target.data = {};\n    }\n\n    let result = JSON.parse(Utils.stringify(value, this.client.config.dataExclusions.concat(excludedPropertyNames || []), maxDepth));\n    if (!Utils.isEmpty(result)) {\n      this.target.data[name] = result;\n    }\n\n    return this;\n  }\n\n  public markAsCritical(critical: boolean): EventBuilder {\n    if (critical) {\n      this.addTags('Critical');\n    }\n\n    return this;\n  }\n\n  public addRequestInfo(request: Object): EventBuilder {\n    if (!!request) {\n      this.pluginContextData['@request'] = request;\n    }\n\n    return this;\n  }\n\n  public submit(callback?: (context: EventPluginContext) => void): void {\n    this.client.submitEvent(this.target, this.pluginContextData, callback);\n  }\n\n  private isValidIdentifier(value: string): boolean {\n    if (!value) {\n      return true;\n    }\n\n    if (value.length < 8 || value.length > 100) {\n      return false;\n    }\n\n    for (let index = 0; index < value.length; index++) {\n      let code = value.charCodeAt(index);\n      let isDigit = (code >= 48) && (code <= 57);\n      let isLetter = ((code >= 65) && (code <= 90)) || ((code >= 97) && (code <= 122));\n      let isMinus = code === 45;\n\n      if (!(isDigit || isLetter) && !isMinus) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n}\n\nexport interface IUserDescription {\n  email_address?: string;\n  description?: string;\n  data?: any;\n}\n\nexport class ContextData {\n  public setException(exception: Error): void {\n    if (exception) {\n      this['@@_Exception'] = exception;\n    }\n  }\n\n  public get hasException(): boolean {\n    return !!this['@@_Exception'];\n  }\n\n  public getException(): Error {\n    return this['@@_Exception'] || null;\n  }\n\n  public markAsUnhandledError(): void {\n    this['@@_IsUnhandledError'] = true;\n  }\n\n  public get isUnhandledError(): boolean {\n    return !!this['@@_IsUnhandledError'];\n  }\n\n  public setSubmissionMethod(method: string): void {\n    if (method) {\n      this['@@_SubmissionMethod'] = method;\n    }\n  }\n\n  public getSubmissionMethod(): string {\n    return this['@@_SubmissionMethod'] || null;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          \n\nexport class ExceptionlessClient {\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   * @private\n   */\n  private static _instance: ExceptionlessClient = null;\n\n  public config: Configuration;\n\n  private _intervalId: any;\n  private _timeoutId: any;\n\n  constructor();\n  constructor(settings: IConfigurationSettings);\n  constructor(apiKey: string, serverUrl?: string);\n  constructor(settingsOrApiKey?: IConfigurationSettings | string, serverUrl?: string) {\n    if (typeof settingsOrApiKey === 'object') {\n      this.config = new Configuration(settingsOrApiKey);\n    } else {\n      this.config = new Configuration({ apiKey: <string>settingsOrApiKey, serverUrl: serverUrl });\n    }\n\n    this.updateSettingsTimer(5000);\n    this.config.onChanged((config) => this.updateSettingsTimer(this._timeoutId > 0 ? 5000 : 0));\n    this.config.queue.onEventsPosted((events, response) =>  this.updateSettingsTimer());\n  }\n\n  public createException(exception: Error): EventBuilder {\n    let pluginContextData = new ContextData();\n    pluginContextData.setException(exception);\n    return this.createEvent(pluginContextData).setType('error');\n  }\n\n  public submitException(exception: Error, callback?: (context: EventPluginContext) => void): void {\n    this.createException(exception).submit(callback);\n  }\n\n  public createUnhandledException(exception: Error, submissionMethod?: string): EventBuilder {\n    let builder = this.createException(exception);\n    builder.pluginContextData.markAsUnhandledError();\n    builder.pluginContextData.setSubmissionMethod(submissionMethod);\n\n    return builder;\n  }\n\n  public submitUnhandledException(exception: Error, submissionMethod?: string, callback?: (context: EventPluginContext) => void) {\n    this.createUnhandledException(exception, submissionMethod).submit(callback);\n  }\n\n  public createFeatureUsage(feature: string): EventBuilder {\n    return this.createEvent().setType('usage').setSource(feature);\n  }\n\n  public submitFeatureUsage(feature: string, callback?: (context: EventPluginContext) => void): void {\n    this.createFeatureUsage(feature).submit(callback);\n  }\n\n  public createLog(message: string): EventBuilder;\n  public createLog(source: string, message: string): EventBuilder;\n  public createLog(source: string, message: string, level: string): EventBuilder;\n  public createLog(sourceOrMessage: string, message?: string, level?: string): EventBuilder {\n    let builder = this.createEvent().setType('log');\n\n    if (message && level) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message).setProperty('@level', level);\n    } else if (message) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message);\n    } else {\n      // TODO: Look into using https: //www.stevefenton.co.uk/Content/Blog/Date/201304/Blog/Obtaining-A-Class-Name-At-Runtime-In-TypeScript/\n      let caller: any = arguments.callee.caller;\n      builder = builder.setSource(caller && caller.name).setMessage(sourceOrMessage);\n    }\n\n    return builder;\n  }\n\n  public submitLog(message: string): void;\n  public submitLog(source: string, message: string): void;\n  public submitLog(source: string, message: string, level: string, callback?: (context: EventPluginContext) => void): void;\n  public submitLog(sourceOrMessage: string, message?: string, level?: string, callback?: (context: EventPluginContext) => void): void {\n    this.createLog(sourceOrMessage, message, level).submit(callback);\n  }\n\n  public createNotFound(resource: string): EventBuilder {\n    return this.createEvent().setType('404').setSource(resource);\n  }\n\n  public submitNotFound(resource: string, callback?: (context: EventPluginContext) => void): void {\n    this.createNotFound(resource).submit(callback);\n  }\n\n  public createSessionStart(): EventBuilder {\n    return this.createEvent().setType('session');\n  }\n\n  public submitSessionStart(callback?: (context: EventPluginContext) => void): void {\n    this.createSessionStart().submit(callback);\n  }\n\n  public submitSessionEnd(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session end: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, true, this.config);\n    }\n  }\n\n  public submitSessionHeartbeat(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session heartbeat: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, false, this.config);\n    }\n  }\n\n  public createEvent(pluginContextData?: ContextData): EventBuilder {\n    return new EventBuilder({ date: new Date() }, this, pluginContextData);\n  }\n\n  /**\n   * Submits the event to be sent to the server.\n   * @param event The event data.\n   * @param pluginContextData Any contextual data objects to be used by Exceptionless plugins to gather default information for inclusion in the report information.\n   * @param callback\n   */\n  public submitEvent(event: IEvent, pluginContextData?: ContextData, callback?: (context: EventPluginContext) => void): void {\n    function cancelled(context: EventPluginContext) {\n      if (!!context) {\n        context.cancelled = true;\n      }\n\n      return !!callback && callback(context);\n    }\n\n    let context = new EventPluginContext(this, event, pluginContextData);\n    if (!event) {\n      return cancelled(context);\n    }\n\n    if (!this.config.enabled) {\n      this.config.log.info('Event submission is currently disabled.');\n      return cancelled(context);\n    }\n\n    if (!event.data) {\n      event.data = {};\n    }\n\n    if (!event.tags || !event.tags.length) {\n      event.tags = [];\n    }\n\n    EventPluginManager.run(context, function (ctx: EventPluginContext) {\n      let config = ctx.client.config;\n      let ev = ctx.event;\n\n      if (!ctx.cancelled) {\n        // ensure all required data\n        if (!ev.type || ev.type.length === 0) {\n          ev.type = 'log';\n        }\n\n        if (!ev.date) {\n          ev.date = new Date();\n        }\n\n        config.queue.enqueue(ev);\n\n        if (ev.reference_id && ev.reference_id.length > 0) {\n          ctx.log.info(`Setting last reference id '${ev.reference_id}'`);\n          config.lastReferenceIdManager.setLast(ev.reference_id);\n        }\n      }\n\n      !!callback && callback(ctx);\n    });\n  }\n\n  /**\n   * Updates the user's email address and description of an event for the specified reference id.\n   * @param referenceId The reference id of the event to update.\n   * @param email The user's email address to set on the event.\n   * @param description The user's description of the event.\n   * @param callback The submission response.\n   */\n  public updateUserEmailAndDescription(referenceId: string, email: string, description: string, callback?: (response: SubmissionResponse) => void) {\n    if (!referenceId || !email || !description || !this.config.enabled) {\n      return !!callback && callback(new SubmissionResponse(500, 'cancelled'));\n    }\n\n    let userDescription: IUserDescription = { email_address: email, description: description };\n    this.config.submissionClient.postUserDescription(referenceId, userDescription, this.config, (response: SubmissionResponse) => {\n      if (!response.success) {\n        this.config.log.error(`Failed to submit user email and description for event '${referenceId}': ${response.statusCode} ${response.message}`);\n      }\n\n      !!callback && callback(response);\n    });\n  }\n\n  /**\n   * Gets the last event client id that was submitted to the server.\n   * @returns {string} The event client id.\n   */\n  public getLastReferenceId(): string {\n    return this.config.lastReferenceIdManager.getLast();\n  }\n\n  private updateSettingsTimer(initialDelay?: number) {\n    this.config.log.info(`Updating settings timer with delay: ${initialDelay}`);\n\n    this._timeoutId = clearTimeout(this._timeoutId);\n    this._timeoutId = clearInterval(this._intervalId);\n\n    let interval = this.config.updateSettingsWhenIdleInterval;\n    if (interval > 0) {\n      let updateSettings = () => SettingsManager.updateSettings(this.config);\n      if (initialDelay > 0) {\n        this._timeoutId = setTimeout(updateSettings, initialDelay);\n      }\n\n      this._intervalId = setInterval(updateSettings, interval);\n    }\n  }\n\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   */\n  public static get default() {\n    if (ExceptionlessClient._instance === null) {\n      ExceptionlessClient._instance = new ExceptionlessClient(null);\n    }\n\n    return ExceptionlessClient._instance;\n  }\n}\n\nexport interface IManualStackingInfo {\n  title?: string;\n  signature_data?: any;\n}\n\nexport interface IModule {\n  data?: any;\n\n  module_id?: number;\n  name?: string;\n  version?: string;\n  is_entry?: boolean;\n  created_date?: Date;\n  modified_date?: Date;\n}\n\nexport interface IRequestInfo {\n  user_agent?: string;\n  http_method?: string;\n  is_secure?: boolean;\n  host?: string;\n  port?: number;\n  path?: string;\n  referrer?: string;\n  client_ip_address?: string;\n  cookies?: any;\n  post_data?: any;\n  query_string?: any;\n  data?: any;\n}\n\nexport interface IEnvironmentInfo {\n  processor_count?: number;\n  total_physical_memory?: number;\n  available_physical_memory?: number;\n  command_line?: string;\n  process_name?: string;\n  process_id?: string;\n  process_memory_size?: number;\n  thread_id?: string;\n  architecture?: string;\n  o_s_name?: string;\n  o_s_version?: string;\n  ip_address?: string;\n  machine_name?: string;\n  install_id?: string;\n  runtime_version?: string;\n  data?: any;\n}\n\nexport interface IParameter {\n  data?: any;\n  generic_arguments?: string[];\n\n  name?: string;\n  type?: string;\n  type_namespace?: string;\n}\n\n                                          \n\nexport interface IMethod {\n  data?: any;\n  generic_arguments?: string[];\n  parameters?: IParameter[];\n\n  is_signature_target?: boolean;\n  declaring_namespace?: string;\n  declaring_type?: string;\n  name?: string;\n  module_id?: number;\n}\n\n                                    \n\nexport interface IStackFrame extends IMethod {\n  file_name?: string;\n  line_number?: number;\n  column?: number;\n}\n\n                                                                                 \n\nexport interface IInnerError {\n  message?: string;\n  type?: string;\n  code?: string;\n  data?: any;\n  inner?: IInnerError;\n  stack_trace?: IStackFrame[];\n  target_method?: IMethod;\n}\n\n                                                                                                                                                \n\nexport class ConfigurationDefaultsPlugin implements IEventPlugin {\n  public priority: number = 10;\n  public name: string = 'ConfigurationDefaultsPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let config = context.client.config;\n    let defaultTags: string[] = config.defaultTags || [];\n    for (let index = 0; index < defaultTags.length; index++) {\n      let tag = defaultTags[index];\n      if (!!tag && context.event.tags.indexOf(tag) < 0) {\n        context.event.tags.push(tag);\n      }\n    }\n\n    let defaultData: Object = config.defaultData || {};\n    for (let key in defaultData) {\n      if (!!defaultData[key]) {\n        let result = JSON.parse(Utils.stringify(defaultData[key], config.dataExclusions));\n        if (!Utils.isEmpty(result)) {\n          context.event.data[key] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ErrorPlugin implements IEventPlugin {\n  public priority: number = 30;\n  public name: string = 'ErrorPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n    let ignoredProperties: string[] = [\n      'arguments',\n      'column',\n      'columnNumber',\n      'description',\n      'fileName',\n      'message',\n      'name',\n      'number',\n      'line',\n      'lineNumber',\n      'opera#sourceloc',\n      'sourceId',\n      'sourceURL',\n      'stack',\n      'stackArray',\n      'stacktrace'\n    ];\n\n    let exception = context.contextData.getException();\n    if (!!exception) {\n      context.event.type = 'error';\n\n      if (!context.event.data[ERROR_KEY]) {\n        let config = context.client.config;\n        let parser = config.errorParser;\n        if (!parser) {\n          throw new Error('No error parser was defined.');\n        }\n\n        let result = parser.parse(context, exception);\n        if (!!result) {\n          let additionalData = JSON.parse(Utils.stringify(exception, config.dataExclusions.concat(ignoredProperties)));\n          if (!Utils.isEmpty(additionalData)) {\n            if (!result.data) {\n              result.data = {};\n            }\n            result.data['@ext'] = additionalData;\n          }\n\n          context.event.data[ERROR_KEY] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                           \n\nexport class ModuleInfoPlugin implements IEventPlugin {\n  public priority: number = 50;\n  public name: string = 'ModuleInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n\n    let collector = context.client.config.moduleCollector;\n    if (context.event.data[ERROR_KEY] && !context.event.data['@error'].modules && !!collector) {\n      let modules: IModule[] = collector.getModules(context);\n      if (modules && modules.length > 0) {\n        context.event.data[ERROR_KEY].modules = modules;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                          \n\nexport class RequestInfoPlugin implements IEventPlugin {\n  public priority: number = 70;\n  public name: string = 'RequestInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const REQUEST_KEY: string = '@request'; // optimization for minifier.\n\n    let config = context.client.config;\n    let collector = config.requestInfoCollector;\n    if (!context.event.data[REQUEST_KEY] && !!collector) {\n      let requestInfo: IRequestInfo = collector.getRequestInfo(context);\n      if (!!requestInfo) {\n        if (Utils.isMatch(requestInfo.user_agent, config.userAgentBotPatterns)) {\n          context.log.info('Cancelling event as the request user agent matches a known bot pattern');\n          context.cancelled = true;\n        } else {\n          context.event.data[REQUEST_KEY] = requestInfo;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                             \n\nexport class EnvironmentInfoPlugin implements IEventPlugin {\n  public priority: number = 80;\n  public name: string = 'EnvironmentInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ENVIRONMENT_KEY: string = '@environment'; // optimization for minifier.\n\n    let collector = context.client.config.environmentInfoCollector;\n    if (!context.event.data[ENVIRONMENT_KEY] && collector) {\n      let environmentInfo: IEnvironmentInfo = collector.getEnvironmentInfo(context);\n      if (!!environmentInfo) {\n        context.event.data[ENVIRONMENT_KEY] = environmentInfo;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                           \n\nexport class SubmissionMethodPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'SubmissionMethodPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let submissionMethod: string = context.contextData.getSubmissionMethod();\n    if (!!submissionMethod) {\n      context.event.data['@submission_method'] = submissionMethod;\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                   \n\nexport class DuplicateCheckerPlugin implements IEventPlugin {\n  public priority: number = 40;\n  public name: string = 'DuplicateCheckerPlugin';\n\n  private _processedHashcodes: TimestampedHash[] = [];\n  private _getCurrentTime: () => number;\n\n  constructor(getCurrentTime: () => number = () => Date.now()) {\n    this._getCurrentTime = getCurrentTime;\n  }\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function isDuplicate(error: IInnerError, processedHashcodes, now, log: ILog): boolean {\n      while (error) {\n        let hashCode = Utils.getHashCode(error.stack_trace && JSON.stringify(error.stack_trace));\n\n        // Only process the unique errors times within a 2 second window.\n        if (hashCode && processedHashcodes.some(h => h.hash === hashCode && h.timestamp >= (now - 2000))) {\n          log.info(`Ignoring duplicate error event hash: ${hashCode}`);\n          return true;\n        }\n\n        // Add this exception to our list of recent processed errors.\n        processedHashcodes.push({ hash: hashCode, timestamp: now });\n\n        // Only keep the last 20 recent errors.\n        while (processedHashcodes.length > 20) {\n          processedHashcodes.shift();\n        }\n\n        error = error.inner;\n      }\n\n      return false;\n    }\n\n    if (context.event.type === 'error') {\n      if (isDuplicate(context.event.data['@error'], this._processedHashcodes, this._getCurrentTime(), context.log)) {\n        context.cancelled = true;\n        return;\n      }\n    }\n\n    next && next();\n  }\n}\n\ninterface TimestampedHash {\n  hash: number;\n  timestamp: number;\n}\n\n                                                                                                                                                                                                        \n\nexport class EventExclusionPlugin implements IEventPlugin {\n  public priority: number = 45;\n  public name: string = 'EventExclusionPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function getLogLevel(level: string): number {\n      switch ((level || '').toLowerCase().trim()) {\n        case 'trace':\n        case 'true':\n        case '1':\n        case 'yes':\n          return 0;\n        case 'debug':\n          return 1;\n        case 'info':\n          return 2;\n        case 'warn':\n          return 3;\n        case 'error':\n          return 4;\n        case 'fatal':\n          return 5;\n        case 'off':\n        case 'false':\n        case '0':\n        case 'no':\n          return 6;\n        default:\n          return -1;\n      }\n    }\n\n    function getMinLogLevel(settings: Object, loggerName: string = '*'): number {\n      return getLogLevel(getTypeAndSourceSetting(settings, 'log', loggerName, 'Trace') + '');\n    }\n\n    function getTypeAndSourceSetting(settings: Object = {}, type: string, source: string, defaultValue: string|boolean = undefined): string|boolean {\n      if (!type) {\n        return defaultValue;\n      }\n\n      let isLog = type === 'log';\n      let sourcePrefix =  `@@${type}:`;\n\n      let value = settings[sourcePrefix + source];\n      if (value) {\n        return !isLog ? Utils.toBoolean(value) : value;\n      }\n\n      // check for wildcard match\n      for (let key in settings) {\n        if (Utils.startsWith(key.toLowerCase(), sourcePrefix.toLowerCase()) && Utils.isMatch(source, [key.substring(sourcePrefix.length)])) {\n          return !isLog ? Utils.toBoolean(settings[key]) : settings[key];\n        }\n      }\n\n      return defaultValue;\n    }\n\n    let ev = context.event;\n    let log = context.log;\n    let settings = context.client.config.settings;\n\n    if (ev.type === 'log') {\n      let minLogLevel = getMinLogLevel(settings, ev.source);\n      let logLevel = getLogLevel(ev.data['@level']);\n\n      if (logLevel >= 0 && (logLevel > 5 || logLevel < minLogLevel)) {\n        log.info('Cancelling log event due to minimum log level.');\n        context.cancelled = true;\n      }\n    } else if (ev.type === 'error') {\n      let error: IInnerError = ev.data['@error'];\n      while (!context.cancelled && error) {\n        if (getTypeAndSourceSetting(settings, ev.type, error.type, true) === false) {\n          log.info(`Cancelling error from excluded exception type: ${error.type}`);\n          context.cancelled = true;\n        }\n\n        error = error.inner;\n      }\n    } else if (getTypeAndSourceSetting(settings, ev.type, ev.source, true) === false) {\n      log.info(`Cancelling event from excluded type: ${ev.type} and source: ${ev.source}`);\n      context.cancelled = true;\n    }\n\n    next && next();\n  }\n}\n\nexport class SettingsResponse {\n  public success: boolean = false;\n  public settings: any;\n  public settingsVersion: number = -1;\n  public message: string;\n  public exception: any;\n\n  constructor(success: boolean, settings: any, settingsVersion: number = -1, exception: any = null, message: string = null) {\n    this.success = success;\n    this.settings = settings;\n    this.settingsVersion = settingsVersion;\n    this.exception = exception;\n    this.message = message;\n  }\n}\n\n                                                                                 \n\nexport interface IError extends IInnerError {\n  modules?: IModule[];\n}\n\nexport interface IStorageItem {\n  timestamp: number;\n  value: any;\n}\n\n                                              \n\nexport interface IStorage {\n  save(value: any): number;\n  get(limit?: number): IStorageItem[];\n  remove(timestamp: number): void;\n  clear(): void;\n}\n\nexport interface SubmissionCallback {\n  (status: number, message: string, data?: string, headers?: Object): void;\n}\n\nexport interface SubmissionRequest {\n  apiKey: string;\n  userAgent: string;\n  method: string;\n  url: string;\n  data: string;\n}\n\n                                                                                     \n\nexport class InMemoryStorage implements IStorage {\n  private maxItems: number;\n  private items: IStorageItem[] = [];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems: number) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any): number {\n    if (!value) {\n      return null;\n    }\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let item = { timestamp, value };\n\n    if (items.push(item) > this.maxItems) {\n      items.shift();\n    }\n\n    this.lastTimestamp = timestamp;\n    return item.timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    return this.items.slice(0, limit);\n  }\n\n  public remove(timestamp: number): void {\n    let items = this.items;\n    for (let i = 0; i < items.length; i++) {\n      if (items[i].timestamp === timestamp) {\n        items.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n  public clear(): void {\n    this.items = [];\n  }\n}\n\nexport interface IClientConfiguration {\n  settings: Object;\n  version: number;\n}\n\n                                                                                     \n\nexport abstract class KeyValueStorageBase implements IStorage {\n  private maxItems: number;\n  private items: number[];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any, single?: boolean): number {\n    if (!value) {\n      return null;\n    }\n\n    this.ensureIndex();\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let key = this.getKey(timestamp);\n    let json = JSON.stringify(value);\n\n    try {\n      this.write(key, json);\n      this.lastTimestamp = timestamp;\n      if (items.push(timestamp) > this.maxItems) {\n        this.delete(this.getKey(items.shift()));\n      }\n    } catch (e) {\n      return null;\n    }\n\n    return timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    this.ensureIndex();\n\n    return this.items.slice(0, limit)\n      .map(timestamp => {\n        // Read and parse item for this timestamp\n        let key = this.getKey(timestamp);\n        try {\n          let json = this.read(key);\n          let value = JSON.parse(json, parseDate);\n          return { timestamp, value };\n        } catch (error) {\n          // Something went wrong - try to delete the cause.\n          this.safeDelete(key);\n          return null;\n        }\n      })\n      .filter(item => item != null);\n  }\n\n  public remove(timestamp: number): void {\n    this.ensureIndex();\n\n    let items = this.items;\n    let index = items.indexOf(timestamp);\n    if (index >= 0) {\n      let key = this.getKey(timestamp);\n      this.safeDelete(key);\n      items.splice(index, 1);\n    };\n  }\n\n  public clear(): void {\n    this.items.forEach(item => this.safeDelete(this.getKey(item)));\n    this.items = [];\n  }\n\n  protected abstract write(key: string, value: string): void;\n  protected abstract read(key: string): string;\n  protected abstract readAllKeys(): string[];\n  protected abstract delete(key: string);\n  protected abstract getKey(timestamp: number): string;\n  protected abstract getTimestamp(key: string): number;\n\n  private ensureIndex() {\n    if (!this.items) {\n      this.items = this.createIndex();\n      this.lastTimestamp = Math.max(0, ...this.items) + 1;\n    }\n  }\n\n  private safeDelete(key: string): void {\n    try {\n      this.delete(key);\n    } catch (error) {\n    }\n  }\n\n  private createIndex() {\n    try {\n      let keys = this.readAllKeys();\n      return keys.map(key => {\n        try {\n          let timestamp = this.getTimestamp(key);\n          if (!timestamp) {\n            this.safeDelete(key);\n            return null;\n          }\n          return timestamp;\n        } catch (error) {\n          this.safeDelete(key);\n          return null;\n        }\n      }).filter(timestamp => timestamp != null)\n        .sort((a, b) => a - b);\n    } catch (error) {\n      return [];\n    }\n  }\n}\n\nfunction parseDate(key, value) {\n  let dateRegx = /\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/g;\n  if (typeof value === 'string') {\n    let a = dateRegx.exec(value);\n    if (a) {\n      return new Date(value);\n    }\n  }\n  return value;\n};\n\n                                                                                                                     \n\nexport class NodeFileStorage extends KeyValueStorageBase {\n  private directory: string;\n  private prefix: string;\n  private fs: any;\n\n  constructor(namespace: string, folder?: string, prefix: string = 'ex-', maxItems: number = 20, fs?: any) {\n    super(maxItems);\n\n    if (!folder) {\n      folder = Path.join(Path.dirname(require.main.filename), '.exceptionless');\n    }\n    let subfolder = Path.join(folder, namespace);\n\n    this.directory = Path.resolve(subfolder);\n    this.prefix = prefix;\n    this.fs = fs ? fs : Fs;\n\n    this.mkdir(this.directory);\n  }\n\n  public write(key: string, value: string) {\n    this.fs.writeFileSync(key, value);\n  }\n\n  public read(key: string) {\n    return this.fs.readFileSync(key, 'utf8');\n  }\n\n  public readAllKeys() {\n    return this.fs.readdirSync(this.directory)\n      .filter(file => file.indexOf(this.prefix) === 0)\n      .map(file => Path.join(this.directory, file));\n  }\n\n  public delete(key: string) {\n    this.fs.unlinkSync(key);\n  }\n\n  public getKey(timestamp) {\n    return Path.join(this.directory, `${this.prefix}${timestamp}.json`);\n  }\n\n  public getTimestamp(key) {\n    return parseInt(Path.basename(key, '.json')\n      .substr(this.prefix.length), 10);\n  }\n\n  private mkdir(path) {\n    let dirs = path.split(Path.sep);\n    let root = '';\n\n    while (dirs.length > 0) {\n      let dir = dirs.shift();\n      if (dir === '') {\n        root = Path.sep;\n      }\n      if (!this.fs.existsSync(root + dir)) {\n        this.fs.mkdirSync(root + dir);\n      }\n      root += dir + Path.sep;\n    }\n  };\n}\n\n                                                                                                                                                                                                                                       \n\nexport class NodeEnvironmentInfoCollector implements IEnvironmentInfoCollector {\n  public getEnvironmentInfo(context: EventPluginContext): IEnvironmentInfo {\n    function getIpAddresses(): string {\n      let ips: string[] = [];\n      let interfaces = os.networkInterfaces();\n      Object.keys(interfaces).forEach((name) => {\n        interfaces[name].forEach((iface: any) => {\n          if ('IPv4' === iface.family && !iface.internal) {\n            ips.push(iface.address);\n          }\n        });\n      });\n\n      return ips.join(', ');\n    }\n\n    if (!os) {\n      return null;\n    }\n\n    let environmentInfo: IEnvironmentInfo = {\n      processor_count: os.cpus().length,\n      total_physical_memory: os.totalmem(),\n      available_physical_memory: os.freemem(),\n      command_line: process.argv.join(' '),\n      process_name: (process.title || '').replace(/[\\uE000-\\uF8FF]/g, ''),\n      process_id: process.pid + '',\n      process_memory_size: process.memoryUsage().heapTotal,\n      // thread_id: '',\n      architecture: os.arch(),\n      o_s_name: os.type(),\n      o_s_version: os.release(),\n      ip_address: getIpAddresses(),\n      machine_name: os.hostname(),\n      // install_id: '',\n      runtime_version: process.version,\n      data: {\n        loadavg: os.loadavg(),\n        platform: os.platform(),\n        tmpdir: os.tmpdir(),\n        uptime: os.uptime()\n      }\n    };\n\n    if ((<any>os).endianness) {\n      environmentInfo.data.endianness = (<any>os).endianness();\n    }\n\n    return environmentInfo;\n  }\n}\n\n                                                                                                                                                                                                                                                                   \n\nexport class NodeErrorParser implements IErrorParser {\n  public parse(context: EventPluginContext, exception: Error): IError {\n    function getStackFrames(stackFrames: any[]): IStackFrame[] {\n      let frames: IStackFrame[] = [];\n\n      for (let index = 0; index < stackFrames.length; index++) {\n        let frame = stackFrames[index];\n        frames.push({\n          name: frame.getMethodName() || frame.getFunctionName(),\n          // parameters: frame.args,\n          file_name: frame.getFileName(),\n          line_number: frame.getLineNumber() || 0,\n          column: frame.getColumnNumber() || 0,\n          declaring_type: frame.getTypeName(),\n          data: {\n            is_native: frame.isNative() || (!!frame.filename && frame.filename[0] !== '/' && frame.filename[0] !== '.')\n          }\n        });\n      }\n\n      return frames;\n    }\n\n    if (!nodestacktrace) {\n      throw new Error('Unable to load the stack trace library.');\n    }\n\n    let stackFrames = nodestacktrace.parse(exception) || [];\n    return {\n      type: exception.name,\n      message: exception.message,\n      stack_trace: getStackFrames(stackFrames)\n    };\n  }\n}\n\n                                                                                                                                                                                                                                                \n\nexport class NodeModuleCollector implements IModuleCollector {\n\n  private initialized: boolean = false;\n  private installedModules: { [id: string]: IModule } = {};\n\n  public getModules(context: EventPluginContext): IModule[] {\n    this.initialize();\n\n    if (!require.main) {\n      return [];\n    }\n\n    let modulePath = path.dirname(require.main.filename) + '/node_modules/';\n    let pathLength = modulePath.length;\n\n    let loadedKeys = Object.keys(require.cache);\n    let loadedModules = {};\n\n    loadedKeys.forEach(key => {\n      let id = key.substr(pathLength);\n      id = id.substr(0, id.indexOf('/'));\n      loadedModules[id] = true;\n    });\n\n    return Object.keys(loadedModules)\n      .map(key => this.installedModules[key])\n      .filter(m => m !== undefined);\n  }\n\n  private initialize() {\n    if (this.initialized) {\n      return;\n    }\n\n    this.initialized = true;\n\n    let output = child.spawnSync('npm', ['ls', '--depth=0', '--json']).stdout;\n\n    if (!output) {\n      return;\n    }\n\n    let json;\n    try {\n      json = JSON.parse(output.toString());\n    } catch (e) {\n      return;\n    }\n\n    let items = json.dependencies;\n    if (!items) {\n      return;\n    }\n\n    let id = 0;\n    this.installedModules = {};\n\n    Object.keys(items).forEach(key => {\n      let item = items[key];\n      let theModule = <IModule>{\n        module_id: id++,\n        name: key,\n        version: item.version\n      };\n\n      this.installedModules[key] = theModule;\n    });\n  }\n}\n\n                                                                                                                                                                                                                             \n\nexport class NodeRequestInfoCollector implements IRequestInfoCollector {\n  public getRequestInfo(context: EventPluginContext): IRequestInfo {\n    const REQUEST_KEY: string = '@request'; // optimization for minifier.\n    if (!context.contextData[REQUEST_KEY]) {\n      return null;\n    }\n\n    let exclusions = context.client.config.dataExclusions;\n\n    // TODO: include referrer\n    let request = context.contextData[REQUEST_KEY];\n    let requestInfo: IRequestInfo = {\n      client_ip_address: request.ip,\n      user_agent: request.headers['user-agent'],\n      is_secure: request.secure,\n      http_method: request.method,\n      host: request.hostname || request.host,\n      path: request.path,\n      post_data: JSON.parse(Utils.stringify(request.body || {}, exclusions)),\n      cookies: Utils.getCookies(request.headers.cookie, exclusions),\n      query_string: JSON.parse(Utils.stringify(request.params || {}, exclusions))\n    };\n\n    let host = request.headers.host;\n    let port: number = host && parseInt(host.slice(host.indexOf(':') + 1), 10);\n    if (port > 0) {\n      requestInfo.port = port;\n    }\n\n    return requestInfo;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                     \n\nexport class NodeSubmissionAdapter implements ISubmissionAdapter {\n  public sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean) {\n    if (isAppExiting) {\n      this.sendRequestSync(request, callback);\n      return;\n    }\n\n    let parsedHost = url.parse(request.url);\n\n    let options: https.RequestOptions = {\n      auth: `client:${request.apiKey}`,\n      headers: {},\n      hostname: parsedHost.hostname,\n      method: request.method,\n      port: parsedHost.port && parseInt(parsedHost.port, 10),\n      path: request.url\n    };\n\n    options.headers['User-Agent'] = request.userAgent;\n\n    if (request.method === 'POST') {\n      options.headers = {\n        'Content-Type': 'application/json',\n        'Content-Length': request.data.length\n      };\n    }\n\n    let protocol = (parsedHost.protocol === 'https' ? https : http);\n    let clientRequest: http.ClientRequest = protocol.request(options, (response: http.IncomingMessage) => {\n      let body = '';\n      response.setEncoding('utf8');\n      response.on('data', (chunk) => body += chunk);\n      response.on('end', () => this.complete(response, body, response.headers, callback));\n    });\n\n    clientRequest.on('error', (error: Error) => callback && callback(500, error.message));\n    clientRequest.end(request.data);\n  }\n\n  private complete(response: http.IncomingMessage, responseBody: string, responseHeaders: Object, callback: SubmissionCallback): void {\n    let message: string;\n    if (response.statusCode === 0) {\n      message = 'Unable to connect to server.';\n    } else if (response.statusCode < 200 || response.statusCode > 299) {\n      message = response.statusMessage || (<any>response).message;\n    }\n\n    callback && callback(response.statusCode || 500, message, responseBody, responseHeaders);\n  }\n\n  private sendRequestSync(request: SubmissionRequest, callback: SubmissionCallback): void {\n    let requestJson = JSON.stringify(request);\n    let res = child.spawnSync(process.execPath, [require.resolve('./submitSync.js')],\n      {\n        input: requestJson,\n        stdio: ['pipe', 'pipe', process.stderr]\n      });\n\n    let out = res.stdout.toString();\n    let result = JSON.parse(out);\n\n    callback && callback(result.status, result.message, result.data, result.headers);\n  }\n}\n\n                                                                                                                                                  \n\nexport class NodeFileStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(folder?: string, prefix?: string, maxQueueItems: number = 250) {\n    this.queue = new NodeFileStorage('q', folder, prefix, maxQueueItems);\n    this.settings = new NodeFileStorage('settings', folder, prefix, 1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   \n\nconst EXIT: string = 'exit';\nconst UNCAUGHT_EXCEPTION: string = 'uncaughtException';\nconst SIGINT: string = 'SIGINT';\nconst SIGINT_CODE: number = 2;\n\nlet defaults = Configuration.defaults;\ndefaults.environmentInfoCollector = new NodeEnvironmentInfoCollector();\ndefaults.errorParser = new NodeErrorParser();\ndefaults.moduleCollector = new NodeModuleCollector();\ndefaults.requestInfoCollector = new NodeRequestInfoCollector();\ndefaults.submissionAdapter = new NodeSubmissionAdapter();\n\nConfiguration.prototype.useLocalStorage = function() {\n  this.storage = new NodeFileStorageProvider();\n  SettingsManager.applySavedServerSettings(this);\n  this.changed();\n};\n\nfunction getListenerCount(emitter, event: string): number {\n  if (emitter.listenerCount) {\n    return emitter.listenerCount(event);\n  }\n  return require('events').listenerCount(emitter, event);\n}\n\n/*\n * Adding a event handler for 'uncaughtException' modifies the default\n * Node behavior, so it won't exit or log to the console. Instead,\n * we hijack the event emitter and forward the exception to the callback.\n */\nfunction onUncaughtException(callback: (error: Error) => void) {\n  let originalEmit = process.emit;\n\n  process.emit = function(type: string, error: Error) {\n    if (type === UNCAUGHT_EXCEPTION) {\n      callback(error);\n    }\n\n    return originalEmit.apply(this, arguments);\n  };\n}\n\nonUncaughtException(function(error: Error) {\n  ExceptionlessClient.default.submitUnhandledException(error, UNCAUGHT_EXCEPTION);\n});\n\n/*\n * We cannot hijack SIGINT, so if there are no other handlers,\n * we just reproduce default Node.js behavior by exiting.\n */\nprocess.on(SIGINT, function() {\n  if (getListenerCount(process, SIGINT) <= 1) {\n    process.exit(128 + SIGINT_CODE);\n  }\n});\n\nprocess.on(EXIT, function(code: number) {\n  /**\n   * exit codes: https://nodejs.org/api/process.html#process_event_exit\n   * From now on, only synchronous code may run. As soon as this method\n   * ends, the application inevitably will exit.\n   */\n  function getExitCodeReason(exitCode: number): string {\n    if (exitCode === 1) {\n      return 'Uncaught Fatal Exception';\n    }\n\n    if (exitCode === 3) {\n      return 'Internal JavaScript Parse Error';\n    }\n\n    if (exitCode === 4) {\n      return 'Internal JavaScript Evaluation Failure';\n    }\n\n    if (exitCode === 5) {\n      return 'Fatal Exception';\n    }\n\n    if (exitCode === 6) {\n      return 'Non-function Internal Exception Handler ';\n    }\n\n    if (exitCode === 7) {\n      return 'Internal Exception Handler Run-Time Failure';\n    }\n\n    if (exitCode === 8) {\n      return 'Uncaught Exception';\n    }\n\n    if (exitCode === 9) {\n      return 'Invalid Argument';\n    }\n\n    if (exitCode === 10) {\n      return 'Internal JavaScript Run-Time Failure';\n    }\n\n    if (exitCode === 12) {\n      return 'Invalid Debug Argument';\n    }\n\n    return null;\n  }\n\n  let client = ExceptionlessClient.default;\n  let message = getExitCodeReason(code);\n\n  if (message !== null) {\n    client.submitLog(EXIT, message, 'Error');\n  }\n\n  client.config.queue.process(true);\n  // Application will now exit.\n});\n\n(<any>Error).stackTraceLimit = Infinity;\n\n"]}
\ No newline at end of file
+{"version":3,"file":"exceptionless.node.js","sourceRoot":"/source/","sources":["exceptionless.node.ts"],"names":[],"mappings":"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","sourcesContent":["import * as events from \"events\";\nimport * as net from \"net\";\nimport * as stream from \"stream\";\nimport * as child from \"child_process\";\nimport * as tls from \"tls\";\nimport * as http from \"http\";\nimport * as crypto from \"crypto\";\nimport os = require('os');\nimport nodestacktrace = require('stack-trace');\nimport path = require('path');\nimport https = require('https');\nimport url = require('url');\nimport * as Fs from 'fs';\nimport * as Path from 'path';\nexport interface IEvent {\n  type?: string;\n  source?: string;\n  date?: Date;\n  tags?: string[];\n  message?: string;\n  geo?: string;\n  value?: number;\n  data?: any;\n  reference_id?: string;\n}\n\nexport class SubmissionResponse {\n  public success: boolean = false;\n  public badRequest: boolean = false;\n  public serviceUnavailable: boolean = false;\n  public paymentRequired: boolean = false;\n  public unableToAuthenticate: boolean = false;\n  public notFound: boolean = false;\n  public requestEntityTooLarge: boolean = false;\n  public statusCode: number;\n  public message: string;\n\n  constructor(statusCode: number, message?: string) {\n    this.statusCode = statusCode;\n    this.message = message;\n\n    this.success = statusCode >= 200 && statusCode <= 299;\n    this.badRequest = statusCode === 400;\n    this.serviceUnavailable = statusCode === 503;\n    this.paymentRequired = statusCode === 402;\n    this.unableToAuthenticate = statusCode === 401 || statusCode === 403;\n    this.notFound = statusCode === 404;\n    this.requestEntityTooLarge = statusCode === 413;\n  }\n}\n\nexport interface ILastReferenceIdManager {\n  getLast(): string;\n  clearLast(): void;\n  setLast(eventId: string): void;\n}\n\nexport interface ILog {\n  info(message: string): void;\n  warn(message: string): void;\n  error(message: string): void;\n}\n\n                                                                                                                 \n\nexport interface IEventQueue {\n  enqueue(event: IEvent): void;\n  process(isAppExiting?: boolean): void;\n  suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void;\n  onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void;\n}\n\n                                                                                                                                  \n\nexport interface IEnvironmentInfoCollector {\n  getEnvironmentInfo(context: EventPluginContext): IEnvironmentInfo;\n}\n\n                                                                                                              \n\nexport interface IErrorParser {\n  parse(context: EventPluginContext, exception: Error): IError;\n}\n\n                                                                                                                \n\nexport interface IModuleCollector {\n  getModules(context: EventPluginContext): IModule[];\n}\n\n                                                                                                                          \n\nexport interface IRequestInfoCollector {\n  getRequestInfo(context: EventPluginContext): IRequestInfo;\n}\n\n                                      \n\nexport interface IStorageProvider {\n  queue: IStorage;\n  settings: IStorage;\n}\n\n                                                                                                                   \n\nexport interface ISubmissionAdapter {\n  sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean): void;\n}\n\n                                                                                                                                                                                                                                                                                           \n\nexport interface ISubmissionClient {\n  postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void;\n  postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void;\n  getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void;\n  sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void;\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            \n\nexport interface IConfigurationSettings {\n  apiKey?: string;\n  serverUrl?: string;\n  heartbeatServerUrl?: string;\n  updateSettingsWhenIdleInterval?: number;\n  environmentInfoCollector?: IEnvironmentInfoCollector;\n  errorParser?: IErrorParser;\n  lastReferenceIdManager?: ILastReferenceIdManager;\n  log?: ILog;\n  moduleCollector?: IModuleCollector;\n  requestInfoCollector?: IRequestInfoCollector;\n  submissionBatchSize?: number;\n  submissionClient?: ISubmissionClient;\n  submissionAdapter?: ISubmissionAdapter;\n  storage?: IStorageProvider;\n  queue?: IEventQueue;\n}\n\n                                                                                                                                                     \n\ninterface ISettingsWithVersion {\n  version: number;\n  settings: { [key: string]: string };\n}\n\nexport class SettingsManager {\n  /**\n   * A list of handlers that will be fired when the settings change.\n   * @type {Array}\n   * @private\n   */\n  private static _handlers: { (config: Configuration): void }[] = [];\n\n  public static onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  public static applySavedServerSettings(config: Configuration): void {\n    if (!config || !config.isValid) {\n      return;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    config.log.info(`Applying saved settings: v${savedSettings.version}`);\n    config.settings = Utils.merge(config.settings, savedSettings.settings);\n    this.changed(config);\n  }\n\n  public static getVersion(config: Configuration): number {\n    if (!config || !config.isValid) {\n      return 0;\n    }\n\n    let savedSettings = this.getSavedServerSettings(config);\n    return savedSettings.version || 0;\n  }\n\n  public static checkVersion(version: number, config: Configuration): void {\n    let currentVersion: number = this.getVersion(config);\n    if (version <= currentVersion) {\n      return;\n    }\n\n    config.log.info(`Updating settings from v${currentVersion} to v${version}`);\n    this.updateSettings(config, currentVersion);\n  }\n\n  public static updateSettings(config: Configuration, version?: number): void {\n    if (!config || !config.enabled) {\n      return;\n    }\n\n    let unableToUpdateMessage = 'Unable to update settings';\n    if (!config.isValid) {\n      config.log.error(`${unableToUpdateMessage}: ApiKey is not set.`);\n      return;\n    }\n\n    if (!version || version < 0) {\n      version = this.getVersion(config);\n    }\n\n    config.log.info(`Checking for updated settings from: v${version}.`);\n    config.submissionClient.getSettings(config, version, (response: SettingsResponse) => {\n      if (!config || !response || !response.success || !response.settings) {\n        config.log.warn(`${unableToUpdateMessage}: ${response.message}`);\n        return;\n      }\n\n      config.settings = Utils.merge(config.settings, response.settings);\n\n      // TODO: Store snapshot of settings after reading from config and attributes and use that to revert to defaults.\n      // Remove any existing server settings that are not in the new server settings.\n      let savedServerSettings = SettingsManager.getSavedServerSettings(config);\n      for (let key in savedServerSettings) {\n        if (response.settings[key]) {\n          continue;\n        }\n\n        delete config.settings[key];\n      }\n\n      let newSettings = <ISettingsWithVersion>{\n        version: response.settingsVersion,\n        settings: response.settings\n      };\n\n      config.storage.settings.save(newSettings);\n\n      config.log.info(`Updated settings: v${newSettings.version}`);\n      this.changed(config);\n    });\n  }\n\n  private static changed(config: Configuration) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](config);\n      } catch (ex) {\n        config.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  private static getSavedServerSettings(config: Configuration): ISettingsWithVersion {\n    let item = config.storage.settings.get()[0];\n    if (item && item.value && item.value.version && item.value.settings) {\n      return item.value;\n    }\n\n    return { version: 0, settings: {} };\n  }\n}\n\n                                                                    \n\nexport class DefaultLastReferenceIdManager implements ILastReferenceIdManager {\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @type {string}\n   * @private\n   */\n  private _lastReferenceId: string = null;\n\n  /**\n   * Gets the last event's reference id that was submitted to the server.\n   * @returns {string}\n   */\n  public getLast(): string {\n    return this._lastReferenceId;\n  }\n\n  /**\n   * Clears the last event's reference id.\n   */\n  public clearLast(): void {\n    this._lastReferenceId = null;\n  }\n\n  /**\n   * Sets the last event's reference id.\n   * @param eventId\n   */\n  public setLast(eventId: string): void {\n    this._lastReferenceId = eventId;\n  }\n}\n\n                              \n\nexport class ConsoleLog implements ILog {\n  public info(message: string): void {\n    this.log('info', message);\n  }\n\n  public warn(message: string): void {\n    this.log('warn', message);\n  }\n\n  public error(message: string): void {\n    this.log('error', message);\n  }\n\n  private log(level: string, message: string) {\n    if (console && console[level]) {\n      console[level](`[${level}] Exceptionless: ${message}`);\n    }\n  }\n}\n\n                              \n\nexport class NullLog implements ILog {\n  public info(message: string): void { }\n  public warn(message: string): void { }\n  public error(message: string): void { }\n}\n\nexport interface IUserInfo {\n  identity?: string;\n  name?: string;\n  data?: any;\n}\n\n                                                                                                         \n\nexport interface IEventPlugin {\n  priority?: number;\n  name?: string;\n  run(context: EventPluginContext, next?: () => void): void;\n}\n\n                                                                                                                                                                                             \n\nexport class EventPluginContext {\n  public cancelled: boolean;\n  public client: ExceptionlessClient;\n  public event: IEvent;\n  public contextData: ContextData;\n\n  constructor(client: ExceptionlessClient, event: IEvent, contextData?: ContextData) {\n    this.client = client;\n    this.event = event;\n    this.contextData = contextData ? contextData : new ContextData();\n  }\n\n  public get log(): ILog {\n    return this.client.config.log;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \n\nexport class EventPluginManager {\n  public static run(context: EventPluginContext, callback: (context?: EventPluginContext) => void): void {\n    let wrap = function(plugin: IEventPlugin, next?: () => void): () => void {\n      return () => {\n        try {\n          if (!context.cancelled) {\n            plugin.run(context, next);\n          }\n        } catch (ex) {\n          context.cancelled = true;\n          context.log.error(`Error running plugin '${plugin.name}': ${ex.message}. Discarding Event.`);\n        }\n\n        if (context.cancelled && !!callback) {\n          callback(context);\n        }\n      };\n    };\n\n    let plugins: IEventPlugin[] = context.client.config.plugins; // optimization for minifier.\n    let wrappedPlugins: { (): void }[] = [];\n    if (!!callback) {\n      wrappedPlugins[plugins.length] = wrap({ name: 'cb', priority: 9007199254740992, run: callback }, null);\n    }\n\n    for (let index = plugins.length - 1; index > -1; index--) {\n      wrappedPlugins[index] = wrap(plugins[index], !!callback || (index < plugins.length - 1) ? wrappedPlugins[index + 1] : null);\n    }\n\n    wrappedPlugins[0]();\n  }\n\n  public static addDefaultPlugins(config: Configuration): void {\n    config.addPlugin(new ConfigurationDefaultsPlugin());\n    config.addPlugin(new ErrorPlugin());\n    config.addPlugin(new DuplicateCheckerPlugin());\n    config.addPlugin(new EventExclusionPlugin());\n    config.addPlugin(new ModuleInfoPlugin());\n    config.addPlugin(new RequestInfoPlugin());\n    config.addPlugin(new EnvironmentInfoPlugin());\n    config.addPlugin(new SubmissionMethodPlugin());\n  }\n}\n\n                                                                                                                                                               \n\nexport class HeartbeatPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'HeartbeatPlugin';\n\n  private _interval: number;\n  private _intervalId: any;\n\n  constructor (heartbeatInterval: number = 30000) {\n    this._interval = heartbeatInterval;\n  }\n\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    clearInterval(this._intervalId);\n\n    let user: IUserInfo = context.event.data['@user'];\n    if (user && user.identity) {\n      this._intervalId = setInterval(() => context.client.submitSessionHeartbeat(user.identity), this._interval);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ReferenceIdPlugin implements IEventPlugin {\n  public priority: number = 20;\n  public name: string = 'ReferenceIdPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    if ((!context.event.reference_id || context.event.reference_id.length === 0) && context.event.type === 'error') {\n      context.event.reference_id = Utils.guid().replace('-', '').substring(0, 10);\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                     \n\nexport class DefaultEventQueue implements IEventQueue {\n  /**\n   * The configuration object.\n   * @type {Configuration}\n   * @private\n   */\n  private _config: Configuration;\n\n  /**\n   * A list of handlers that will be fired when events are submitted.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (events: IEvent[], response: SubmissionResponse): void }[] = [];\n\n  /**\n   * Suspends processing until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _suspendProcessingUntil: Date;\n\n  /**\n   * Discards queued items until the specified time.\n   * @type {Date}\n   * @private\n   */\n  private _discardQueuedItemsUntil: Date;\n\n  /**\n   * Returns true if the queue is processing.\n   * @type {boolean}\n   * @private\n   */\n  private _processingQueue: boolean = false;\n\n  /**\n   * Processes the queue every xx seconds.\n   * @type {Timer}\n   * @private\n   */\n  private _queueTimer: any;\n\n  constructor(config: Configuration) {\n    this._config = config;\n  }\n\n  public enqueue(event: IEvent): void {\n    const eventWillNotBeQueued: string = 'The event will not be queued.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    if (this.areQueuedItemsDiscarded()) {\n      log.info(`Queue items are currently being discarded. ${eventWillNotBeQueued}`);\n      return;\n    }\n\n    this.ensureQueueTimer();\n\n    let timestamp = config.storage.queue.save(event);\n    let logText = `type=${event.type} ${!!event.reference_id ? 'refid=' + event.reference_id : ''}`;\n    if (timestamp) {\n      log.info(`Enqueuing event: ${timestamp} ${logText}`);\n    } else {\n      log.error(`Could not enqueue event ${logText}`);\n    }\n  }\n\n  public process(isAppExiting?: boolean): void {\n    const queueNotProcessed: string = 'The queue will not be processed.'; // optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (this._processingQueue) {\n      return;\n    }\n\n    log.info('Processing queue...');\n    if (!config.enabled) {\n      log.info(`Configuration is disabled. ${queueNotProcessed}`);\n      return;\n    }\n\n    if (!config.isValid) {\n      log.info(`Invalid Api Key. ${queueNotProcessed}`);\n      return;\n    }\n\n    this._processingQueue = true;\n    this.ensureQueueTimer();\n\n    try {\n      let events = config.storage.queue.get(config.submissionBatchSize);\n      if (!events || events.length === 0) {\n        this._processingQueue = false;\n        return;\n      }\n\n      log.info(`Sending ${events.length} events to ${config.serverUrl}.`);\n      config.submissionClient.postEvents(events.map(e => e.value), config, (response: SubmissionResponse) => {\n        this.processSubmissionResponse(response, events);\n        this.eventsPosted(events.map(e => e.value), response);\n        log.info('Finished processing queue.');\n        this._processingQueue = false;\n      }, isAppExiting);\n    } catch (ex) {\n      log.error(`Error processing queue: ${ex}`);\n      this.suspendProcessing();\n      this._processingQueue = false;\n    }\n  }\n\n  public suspendProcessing(durationInMinutes?: number, discardFutureQueuedItems?: boolean, clearQueue?: boolean): void {\n    let config: Configuration = this._config; // Optimization for minifier.\n\n    if (!durationInMinutes || durationInMinutes <= 0) {\n      durationInMinutes = 5;\n    }\n\n    config.log.info(`Suspending processing for ${durationInMinutes} minutes.`);\n    this._suspendProcessingUntil = new Date(new Date().getTime() + (durationInMinutes * 60000));\n\n    if (discardFutureQueuedItems) {\n      this._discardQueuedItemsUntil = this._suspendProcessingUntil;\n    }\n\n    if (clearQueue) {\n      // Account is over the limit and we want to ensure that the sample size being sent in will contain newer errors.\n      config.storage.queue.clear();\n    }\n  }\n\n  public onEventsPosted(handler: (events: IEvent[], response: SubmissionResponse) => void): void {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private eventsPosted(events: IEvent[], response: SubmissionResponse) {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](events, response);\n      } catch (ex) {\n        this._config.log.error(`Error calling onEventsPosted handler: ${ex}`);\n      }\n    }\n  }\n\n  private areQueuedItemsDiscarded(): boolean {\n    return this._discardQueuedItemsUntil && this._discardQueuedItemsUntil > new Date();\n  }\n\n  private ensureQueueTimer(): void {\n    if (!this._queueTimer) {\n      this._queueTimer = setInterval(() => this.onProcessQueue(), 10000);\n    }\n  }\n\n  private isQueueProcessingSuspended(): boolean {\n    return this._suspendProcessingUntil && this._suspendProcessingUntil > new Date();\n  }\n\n  private onProcessQueue(): void {\n    if (!this.isQueueProcessingSuspended() && !this._processingQueue) {\n      this.process();\n    }\n  }\n\n  private processSubmissionResponse(response: SubmissionResponse, events: IStorageItem[]): void {\n    const noSubmission: string = 'The event will not be submitted.'; // Optimization for minifier.\n    let config: Configuration = this._config; // Optimization for minifier.\n    let log: ILog = config.log; // Optimization for minifier.\n\n    if (response.success) {\n      log.info(`Sent ${events.length} events.`);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.serviceUnavailable) {\n      // You are currently over your rate limit or the servers are under stress.\n      log.error('Server returned service unavailable.');\n      this.suspendProcessing();\n      return;\n    }\n\n    if (response.paymentRequired) {\n      // If the organization over the rate limit then discard the event.\n      log.info('Too many events have been submitted, please upgrade your plan.');\n      this.suspendProcessing(null, true, true);\n      return;\n    }\n\n    if (response.unableToAuthenticate) {\n      // The api key was suspended or could not be authorized.\n      log.info(`Unable to authenticate, please check your configuration. ${noSubmission}`);\n      this.suspendProcessing(15);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.notFound || response.badRequest) {\n      // The service end point could not be found.\n      log.error(`Error while trying to submit data: ${response.message}`);\n      this.suspendProcessing(60 * 4);\n      this.removeEvents(events);\n      return;\n    }\n\n    if (response.requestEntityTooLarge) {\n      let message = 'Event submission discarded for being too large.';\n      if (config.submissionBatchSize > 1) {\n        log.error(`${message} Retrying with smaller batch size.`);\n        config.submissionBatchSize = Math.max(1, Math.round(config.submissionBatchSize / 1.5));\n      } else {\n        log.error(`${message} ${noSubmission}`);\n        this.removeEvents(events);\n      }\n\n      return;\n    }\n\n    if (!response.success) {\n      log.error(`Error submitting events: ${response.message || 'Please check the network tab for more info.'}`);\n      this.suspendProcessing();\n    }\n  }\n\n  private removeEvents(events: IStorageItem[]) {\n    for (let index = 0; index < (events || []).length; index++) {\n      this._config.storage.queue.remove(events[index].timestamp);\n    }\n  }\n}\n\n                                                                                                                                                  \n\nexport class InMemoryStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(maxQueueItems: number = 250) {\n    this.queue = new InMemoryStorage(maxQueueItems);\n    this.settings = new InMemoryStorage(1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n\ndeclare var XDomainRequest: { new (); create(); };\n\nexport class DefaultSubmissionClient implements ISubmissionClient {\n  public configurationVersionHeader: string = 'x-exceptionless-configversion';\n\n  public postEvents(events: IEvent[], config: Configuration, callback: (response: SubmissionResponse) => void, isAppExiting?: boolean): void {\n    let data = JSON.stringify(events);\n    let request = this.createRequest(config, 'POST',  `${config.serverUrl}/api/v2/events`, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb, isAppExiting);\n  }\n\n  public postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void {\n    let path = `${config.serverUrl}/api/v2/events/by-ref/${encodeURIComponent(referenceId)}/user-description`;\n    let data = JSON.stringify(description);\n    let request = this.createRequest(config, 'POST', path, data);\n    let cb = this.createSubmissionCallback(config, callback);\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public getSettings(config: Configuration, version: number, callback: (response: SettingsResponse) => void): void {\n    let request = this.createRequest(config, 'GET', `${config.serverUrl}/api/v2/projects/config?v=${version}`);\n    let cb = (status, message, data?, headers?) => {\n      if (status !== 200) {\n        return callback(new SettingsResponse(false, null, -1, null, message));\n      }\n\n      let settings: IClientConfiguration;\n      try {\n        settings = JSON.parse(data);\n      } catch (e) {\n        config.log.error(`Unable to parse settings: '${data}'`);\n      }\n\n      if (!settings || isNaN(settings.version)) {\n        return callback(new SettingsResponse(false, null, -1, null, 'Invalid configuration settings.'));\n      }\n\n      callback(new SettingsResponse(true, settings.settings || {}, settings.version));\n    };\n\n    return config.submissionAdapter.sendRequest(request, cb);\n  }\n\n  public sendHeartbeat(sessionIdOrUserId: string, closeSession: boolean, config: Configuration): void {\n    let request = this.createRequest(config, 'GET', `${config.heartbeatServerUrl}/api/v2/events/session/heartbeat?id=${sessionIdOrUserId}&close=${closeSession}`);\n    config.submissionAdapter.sendRequest(request);\n  }\n\n  private createRequest(config: Configuration, method: string, url: string, data: string = null): SubmissionRequest {\n    return {\n      method,\n      url,\n      data,\n      apiKey: config.apiKey,\n      userAgent: config.userAgent\n    };\n  }\n\n  private createSubmissionCallback(config: Configuration, callback: (response: SubmissionResponse) => void) {\n    return (status, message, data?, headers?) => {\n      let settingsVersion: number = headers && parseInt(headers[this.configurationVersionHeader], 10);\n      SettingsManager.checkVersion(settingsVersion, config);\n\n      callback(new SubmissionResponse(status, message));\n    };\n  }\n}\n\nexport class Utils {\n  public static addRange<T>(target: T[], ...values: T[]) {\n    if (!target) {\n      target = [];\n    }\n\n    if (!values || values.length === 0) {\n      return target;\n    }\n\n    for (let index = 0; index < values.length; index++) {\n      if (values[index] && target.indexOf(values[index]) < 0) {\n        target.push(values[index]);\n      }\n    }\n\n    return target;\n  }\n\n  public static getHashCode(source: string): number {\n    if (!source || source.length === 0) {\n      return 0;\n    }\n\n    let hash: number = 0;\n    for (let index = 0; index < source.length; index++) {\n      let character = source.charCodeAt(index);\n      hash = ((hash << 5) - hash) + character;\n      hash |= 0;\n    }\n\n    return hash;\n  }\n\n  public static getCookies(cookies: string, exclusions?: string[]): Object {\n    let result: Object = {};\n\n    let parts: string[] = (cookies || '').split('; ');\n    for (let index = 0; index < parts.length; index++) {\n      let cookie: string[] = parts[index].split('=');\n      if (!Utils.isMatch(cookie[0], exclusions)) {\n        result[cookie[0]] = cookie[1];\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static guid(): string {\n    function s4() {\n      return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n    }\n\n    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n  }\n\n  public static merge(defaultValues: Object, values: Object) {\n    let result: Object = {};\n\n    for (let key in defaultValues || {}) {\n      if (!!defaultValues[key]) {\n        result[key] = defaultValues[key];\n      }\n    }\n\n    for (let key in values || {}) {\n      if (!!values[key]) {\n        result[key] = values[key];\n      }\n    }\n\n    return result;\n  }\n\n  public static parseVersion(source: string): string {\n    if (!source) {\n      return null;\n    }\n\n    let versionRegex = /(v?((\\d+)\\.(\\d+)(\\.(\\d+))?)(?:-([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?(?:\\+([\\dA-Za-z\\-]+(?:\\.[\\dA-Za-z\\-]+)*))?)/;\n    let matches = versionRegex.exec(source);\n    if (matches && matches.length > 0) {\n      return matches[0];\n    }\n\n    return null;\n  }\n\n  public static parseQueryString(query: string, exclusions?: string[]) {\n    if (!query || query.length === 0) {\n      return null;\n    }\n\n    let pairs: string[] = query.split('&');\n    if (pairs.length === 0) {\n      return null;\n    }\n\n    let result: Object = {};\n    for (let index = 0; index < pairs.length; index++) {\n      let pair = pairs[index].split('=');\n      if (!Utils.isMatch(pair[0], exclusions)) {\n        result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n      }\n    }\n\n    return !Utils.isEmpty(result) ? result : null;\n  }\n\n  public static randomNumber(): number {\n    return Math.floor(Math.random() * 9007199254740992);\n  }\n\n  /**\n   * Checks to see if a value matches a pattern.\n   * @param input the value to check against the @pattern.\n   * @param pattern The pattern to check, supports wild cards (*).\n   */\n  public static isMatch(input: string, patterns: string[], ignoreCase: boolean = true): boolean {\n    if (!input || typeof input !== 'string') {\n      return false;\n    }\n\n    let trim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n    input = (ignoreCase ? input.toLowerCase() : input).replace(trim, '');\n\n    return (patterns || []).some(pattern => {\n      if (typeof pattern !== 'string') {\n        return false;\n      }\n\n      pattern = (ignoreCase ? pattern.toLowerCase() : pattern).replace(trim, '');\n      if (pattern.length <= 0) {\n        return false;\n      }\n\n      let startsWithWildcard: boolean = pattern[0] === '*';\n      if (startsWithWildcard) {\n        pattern = pattern.slice(1);\n      }\n\n      let endsWithWildcard: boolean = pattern[pattern.length - 1] === '*';\n      if (endsWithWildcard) {\n        pattern = pattern.substring(0, pattern.length - 1);\n      }\n\n      if (startsWithWildcard && endsWithWildcard) {\n        return pattern.length <= input.length && input.indexOf(pattern, 0) !== -1;\n      }\n\n      if (startsWithWildcard) {\n        return Utils.endsWith(input, pattern);\n      }\n\n      if (endsWithWildcard) {\n        return Utils.startsWith(input, pattern);\n      }\n\n      return input === pattern;\n    });\n  }\n\n  public static isEmpty(input: Object) {\n    return input === null || (typeof (input) === 'object' && Object.keys(input).length === 0);\n  }\n\n  public static startsWith(input: string, prefix: string): boolean {\n    return input.substring(0, prefix.length) === prefix;\n  }\n\n  public static endsWith(input: string, suffix: string): boolean {\n    return input.indexOf(suffix, input.length - suffix.length) !== -1;\n  }\n\n  /**\n   * Stringifys an object with optional exclusions and max depth.\n   * @param data The data object to add.\n   * @param exclusions Any property names that should be excluded.\n   * @param maxDepth The max depth of the object to include.\n   */\n  public static stringify(data: any, exclusions?: string[], maxDepth?: number): string {\n    function stringifyImpl(obj: any, excludedKeys: string[]): string {\n      let cache: string[] = [];\n      return JSON.stringify(obj, function(key: string, value: any) {\n        if (Utils.isMatch(key, excludedKeys)) {\n          return;\n        }\n\n        if (typeof value === 'object' && !!value) {\n          if (cache.indexOf(value) !== -1) {\n            // Circular reference found, discard key\n            return;\n          }\n\n          cache.push(value);\n        }\n\n        return value;\n      });\n    }\n\n    if (({}).toString.call(data) === '[object Object]') {\n      let flattened = {};\n      /* tslint:disable:forin */\n      for (let prop in data) {\n        let value = data[prop];\n        if (value === data) {\n          continue;\n        }\n        flattened[prop] = data[prop];\n      }\n      /* tslint:enable:forin */\n\n      return stringifyImpl(flattened, exclusions);\n    }\n\n    if (({}).toString.call(data) === '[object Array]') {\n      let result = [];\n      for (let index = 0; index < data.length; index++) {\n        result[index] = JSON.parse(stringifyImpl(data[index], exclusions));\n      }\n\n      return JSON.stringify(result);\n    }\n\n    return stringifyImpl(data, exclusions);\n  }\n\n  public static toBoolean(input, defaultValue: boolean = false): boolean {\n    if (typeof input === 'boolean') {\n      return input;\n    }\n\n    if (input === null || typeof input !== 'number' && typeof input !== 'string') {\n      return defaultValue;\n    }\n\n    switch ((input + '').toLowerCase().trim()) {\n      case 'true': case 'yes': case '1': return true;\n      case 'false': case 'no': case '0': case null: return false;\n    }\n\n    return defaultValue;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 \n\nexport class Configuration implements IConfigurationSettings {\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @type {IConfigurationSettings}\n   * @private\n   */\n  private static _defaultSettings: IConfigurationSettings = null;\n\n  /**\n   * A default list of tags that will automatically be added to every\n   * report submitted to the server.\n   *\n   * @type {Array}\n   */\n  public defaultTags: string[] = [];\n\n  /**\n   * A default list of of extended data objects that will automatically\n   * be added to every report submitted to the server.\n   *\n   * @type {{}}\n   */\n  public defaultData: Object = {};\n\n  /**\n   * Whether the client is currently enabled or not. If it is disabled,\n   * submitted errors will be discarded and no data will be sent to the server.\n   *\n   * @returns {boolean}\n   */\n  public enabled: boolean = true;\n\n  public environmentInfoCollector: IEnvironmentInfoCollector;\n  public errorParser: IErrorParser;\n  public lastReferenceIdManager: ILastReferenceIdManager = new DefaultLastReferenceIdManager();\n  public log: ILog;\n  public moduleCollector: IModuleCollector;\n  public requestInfoCollector: IRequestInfoCollector;\n\n  /**\n   * Maximum number of events that should be sent to the server together in a batch. (Defaults to 50)\n   */\n  public submissionBatchSize: number;\n  public submissionAdapter: ISubmissionAdapter;\n  public submissionClient: ISubmissionClient;\n\n  /**\n   * Contains a dictionary of custom settings that can be used to control\n   * the client and will be automatically updated from the server.\n   */\n  public settings: Object = {};\n\n  public storage: IStorageProvider;\n\n  public queue: IEventQueue;\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @type {string}\n   * @private\n   */\n  private _apiKey: string;\n\n  /**\n   * The server url that all events will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _serverUrl: string = 'https://collector.exceptionless.io';\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @type {string}\n   * @private\n   */\n  private _heartbeatServerUrl: string = 'https://heartbeat.exceptionless.io';\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @type {number}\n   * @private\n   */\n  private _updateSettingsWhenIdleInterval: number = 120000;\n\n  /**\n   * A list of exclusion patterns.\n   * @type {Array}\n   * @private\n   */\n  private _dataExclusions: string[] = [];\n\n  /**\n   * A list of user agent patterns.\n   * @type {Array}\n   * @private\n   */\n  private _userAgentBotPatterns: string[] = [];\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @type {Array}\n   * @private\n   */\n  private _plugins: IEventPlugin[] = [];\n\n  /**\n   * A list of handlers that will be fired when configuration changes.\n   * @type {Array}\n   * @private\n   */\n  private _handlers: { (config: Configuration): void }[] = [];\n\n  constructor(configSettings?: IConfigurationSettings) {\n    function inject(fn: any) {\n      return typeof fn === 'function' ? fn(this) : fn;\n    }\n\n    configSettings = Utils.merge(Configuration.defaults, configSettings);\n\n    this.log = inject(configSettings.log) || new NullLog();\n    this.apiKey = configSettings.apiKey;\n    this.serverUrl = configSettings.serverUrl;\n    this.heartbeatServerUrl = configSettings.heartbeatServerUrl;\n    this.updateSettingsWhenIdleInterval = configSettings.updateSettingsWhenIdleInterval;\n\n    this.environmentInfoCollector = inject(configSettings.environmentInfoCollector);\n    this.errorParser = inject(configSettings.errorParser);\n    this.lastReferenceIdManager = inject(configSettings.lastReferenceIdManager) || new DefaultLastReferenceIdManager();\n    this.moduleCollector = inject(configSettings.moduleCollector);\n    this.requestInfoCollector = inject(configSettings.requestInfoCollector);\n    this.submissionBatchSize = inject(configSettings.submissionBatchSize) || 50;\n    this.submissionAdapter = inject(configSettings.submissionAdapter);\n    this.submissionClient = inject(configSettings.submissionClient) || new DefaultSubmissionClient();\n    this.storage = inject(configSettings.storage) || new InMemoryStorageProvider();\n    this.queue = inject(configSettings.queue) || new DefaultEventQueue(this);\n\n    SettingsManager.applySavedServerSettings(this);\n    EventPluginManager.addDefaultPlugins(this);\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @returns {string}\n   */\n  public get apiKey(): string {\n    return this._apiKey;\n  }\n\n  /**\n   * The API key that will be used when sending events to the server.\n   * @param value\n   */\n  public set apiKey(value: string) {\n    this._apiKey = value || null;\n    this.log.info(`apiKey: ${this._apiKey}`);\n    this.changed();\n  }\n\n  /**\n   * Returns true if the apiKey is valid.\n   * @returns {boolean}\n   */\n  public get isValid(): boolean {\n    return !!this.apiKey && this.apiKey.length >= 10;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @returns {string}\n   */\n  public get serverUrl(): string {\n    return this._serverUrl;\n  }\n\n  /**\n   * The server url that all events will be sent to.\n   * @param value\n   */\n  public set serverUrl(value: string) {\n    if (!!value) {\n      this._serverUrl = value;\n      this._heartbeatServerUrl = value;\n      this.log.info(`serverUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @returns {string}\n   */\n  public get heartbeatServerUrl(): string {\n    return this._heartbeatServerUrl;\n  }\n\n  /**\n   * The heartbeat server url that all heartbeats will be sent to.\n   * @param value\n   */\n  public set heartbeatServerUrl(value: string) {\n    if (!!value) {\n      this._heartbeatServerUrl = value;\n      this.log.info(`heartbeatServerUrl: ${value}`);\n      this.changed();\n    }\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @returns {number}\n   */\n  public get updateSettingsWhenIdleInterval(): number {\n    return this._updateSettingsWhenIdleInterval;\n  }\n\n  /**\n   * How often the client should check for updated server settings when idle. The default is every 2 minutes.\n   * @param value\n   */\n  public set updateSettingsWhenIdleInterval(value: number) {\n    if (typeof value !== 'number') {\n      return;\n    }\n\n    if (value <= 0) {\n      value = -1;\n    } else if (value > 0 && value < 15000) {\n      value = 15000;\n    }\n\n    this._updateSettingsWhenIdleInterval = value;\n    this.log.info(`updateSettingsWhenIdleInterval: ${value}`);\n    this.changed();\n  }\n\n  /**\n   *  A list of exclusion patterns that will automatically remove any data that\n   *  matches them from any data submitted to the server.\n   *\n   *  For example, entering CreditCard will remove any extended data properties,\n   *  form fields, cookies and query parameters from the report.\n   *\n   * @returns {string[]}\n   */\n  public get dataExclusions(): string[] {\n    let exclusions: string = this.settings['@@DataExclusions'];\n    return this._dataExclusions.concat(exclusions && exclusions.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of exclusion patterns that will automatically remove any\n   * data that matches them from any data submitted to the server.\n   *\n   * For example, entering CreditCard will remove any extended data properties, form\n   * fields, cookies and query parameters from the report.\n   *\n   * @param exclusions\n   */\n  public addDataExclusions(...exclusions: string[]) {\n    this._dataExclusions = Utils.addRange<string>(this._dataExclusions, ...exclusions);\n  }\n\n  /**\n   * A list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @returns {string[]}\n   */\n  public get userAgentBotPatterns(): string[] {\n    let patterns: string = this.settings['@@UserAgentBotPatterns'];\n    return this._userAgentBotPatterns.concat(patterns && patterns.split(',') || []);\n  }\n\n  /**\n   * Add items to the list of user agent patterns that will cause any event with a matching user agent to not be submitted.\n   *\n   * For example, entering *Bot* will cause any events that contains a user agent of Bot will not be submitted.\n   *\n   * @param userAgentBotPatterns\n   */\n  public addUserAgentBotPatterns(...userAgentBotPatterns: string[]) {\n    this._userAgentBotPatterns = Utils.addRange<string>(this._userAgentBotPatterns, ...userAgentBotPatterns);\n  }\n\n  /**\n   * The list of plugins that will be used in this configuration.\n   * @returns {IEventPlugin[]}\n   */\n  public get plugins(): IEventPlugin[] {\n    return this._plugins.sort((p1: IEventPlugin, p2: IEventPlugin) => {\n      return (p1.priority < p2.priority) ? -1 : (p1.priority > p2.priority) ? 1 : 0;\n    });\n  }\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param plugin\n   */\n  public addPlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Register an plugin to be used in this configuration.\n   * @param name The name used to identify the plugin.\n   * @param priority Used to determine plugins priority.\n   * @param pluginAction A function that is run.\n   */\n  public addPlugin(name: string, priority: number, pluginAction: (context: EventPluginContext, next?: () => void) => void): void;\n  public addPlugin(pluginOrName: IEventPlugin | string, priority?: number, pluginAction?: (context: EventPluginContext, next?: () => void) => void): void {\n    let plugin: IEventPlugin = !!pluginAction ? { name: <string>pluginOrName, priority: priority, run: pluginAction } : <IEventPlugin>pluginOrName;\n    if (!plugin || !plugin.run) {\n      this.log.error('Add plugin failed: Run method not defined');\n      return;\n    }\n\n    if (!plugin.name) {\n      plugin.name = Utils.guid();\n    }\n\n    if (!plugin.priority) {\n      plugin.priority = 0;\n    }\n\n    let pluginExists: boolean = false;\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === plugin.name) {\n        pluginExists = true;\n        break;\n      }\n    }\n\n    if (!pluginExists) {\n      plugins.push(plugin);\n    }\n  }\n\n  /**\n   * Remove the plugin from this configuration.\n   * @param plugin\n   */\n  public removePlugin(plugin: IEventPlugin): void;\n\n  /**\n   * Remove an plugin by key from this configuration.\n   * @param name\n   */\n  public removePlugin(name: string): void;\n  public removePlugin(pluginOrName: IEventPlugin | string): void {\n    let name: string = typeof pluginOrName === 'string' ? pluginOrName : pluginOrName.name;\n    if (!name) {\n      this.log.error('Remove plugin failed: Plugin name not defined');\n      return;\n    }\n\n    let plugins = this._plugins; // optimization for minifier.\n    for (let index = 0; index < plugins.length; index++) {\n      if (plugins[index].name === name) {\n        plugins.splice(index, 1);\n        break;\n      }\n    }\n  }\n\n  /**\n   * Automatically set the application version for events.\n   * @param version\n   */\n  public setVersion(version: string): void {\n    if (!!version) {\n      this.defaultData['@version'] = version;\n    }\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): void;\n  public setUserIdentity(identity: string): void;\n  public setUserIdentity(identity: string, name: string): void;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): void {\n    const USER_KEY: string = '@user'; // optimization for minifier.\n    let userInfo: IUserInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n\n    let shouldRemove: boolean = !userInfo || (!userInfo.identity && !userInfo.name);\n    if (shouldRemove) {\n      delete this.defaultData[USER_KEY];\n    } else {\n      this.defaultData[USER_KEY] = userInfo;\n    }\n\n    this.log.info(`user identity: ${shouldRemove ? 'null' : userInfo.identity}`);\n  }\n\n  /**\n   * Used to identify the client that sent the events to the server.\n   * @returns {string}\n   */\n  public get userAgent(): string {\n    return 'exceptionless-js/1.0.0.0';\n  }\n\n  /**\n   * Automatically send a heartbeat to keep the session alive.\n   */\n  public useSessions(sendHeartbeats: boolean = true, heartbeatInterval: number = 30000): void {\n    if (sendHeartbeats) {\n      this.addPlugin(new HeartbeatPlugin(heartbeatInterval));\n    }\n  }\n\n  /**\n   * Automatically set a reference id for error events.\n   */\n  public useReferenceIds(): void {\n    this.addPlugin(new ReferenceIdPlugin());\n  }\n\n  public useLocalStorage(): void {\n    // This method will be injected via the prototype.\n  }\n\n  // TODO: Support a min log level.\n  public useDebugLogger(): void {\n    this.log = new ConsoleLog();\n  }\n\n  public onChanged(handler: (config: Configuration) => void) {\n    !!handler && this._handlers.push(handler);\n  }\n\n  private changed() {\n    let handlers = this._handlers; // optimization for minifier.\n    for (let index = 0; index < handlers.length; index++) {\n      try {\n        handlers[index](this);\n      } catch (ex) {\n        this.log.error(`Error calling onChanged handler: ${ex}`);\n      }\n    }\n  }\n\n  /**\n   * The default configuration settings that are applied to new configuration instances.\n   * @returns {IConfigurationSettings}\n   */\n  public static get defaults() {\n    if (Configuration._defaultSettings === null) {\n      Configuration._defaultSettings = {};\n    }\n\n    return Configuration._defaultSettings;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                   \n\nexport class EventBuilder {\n  public target: IEvent;\n  public client: ExceptionlessClient;\n  public pluginContextData: ContextData;\n\n  private _validIdentifierErrorMessage: string = 'must contain between 8 and 100 alphanumeric or \\'-\\' characters.'; // optimization for minifier.\n\n  constructor(event: IEvent, client: ExceptionlessClient, pluginContextData?: ContextData) {\n    this.target = event;\n    this.client = client;\n    this.pluginContextData = pluginContextData || new ContextData();\n  }\n\n  public setType(type: string): EventBuilder {\n    if (!!type) {\n      this.target.type = type;\n    }\n\n    return this;\n  }\n\n  public setSource(source: string): EventBuilder {\n    if (!!source) {\n      this.target.source = source;\n    }\n\n    return this;\n  }\n\n  public setReferenceId(referenceId: string): EventBuilder {\n    if (!this.isValidIdentifier(referenceId)) {\n      throw new Error(`ReferenceId ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.target.reference_id = referenceId;\n    return this;\n  }\n\n  /**\n   * Allows you to reference a parent event by its ReferenceId property. This allows you to have parent and child relationships.\n   * @param name Reference name\n   * @param id The reference id that points to a specific event\n   * @returns {EventBuilder}\n     */\n  public setEventReference(name: string, id: string): EventBuilder {\n    if (!name) {\n      throw new Error('Invalid name');\n    }\n\n    if (!id || !this.isValidIdentifier(id)) {\n      throw new Error(`Id ${this._validIdentifierErrorMessage}`);\n    }\n\n    this.setProperty('@ref:' + name, id);\n    return this;\n  }\n\n  public setMessage(message: string): EventBuilder {\n    if (!!message) {\n      this.target.message = message;\n    }\n\n    return this;\n  }\n\n  public setGeo(latitude: number, longitude: number): EventBuilder {\n    if (latitude < -90.0 || latitude > 90.0) {\n      throw new Error('Must be a valid latitude value between -90.0 and 90.0.');\n    }\n\n    if (longitude < -180.0 || longitude > 180.0) {\n      throw new Error('Must be a valid longitude value between -180.0 and 180.0.');\n    }\n\n    this.target.geo = `${latitude},${longitude}`;\n    return this;\n  }\n\n  public setUserIdentity(userInfo: IUserInfo): EventBuilder;\n  public setUserIdentity(identity: string): EventBuilder;\n  public setUserIdentity(identity: string, name: string): EventBuilder;\n  public setUserIdentity(userInfoOrIdentity: IUserInfo | string, name?: string): EventBuilder {\n    let userInfo = typeof userInfoOrIdentity !== 'string' ? userInfoOrIdentity : { identity: userInfoOrIdentity, name: name };\n    if (!userInfo || (!userInfo.identity && !userInfo.name)) {\n      return this;\n    }\n\n    this.setProperty('@user', userInfo);\n    return this;\n  }\n\n  /**\n   * Sets the user's description of the event.\n   *\n   * @param emailAddress The email address\n   * @param description The user's description of the event.\n   * @returns {EventBuilder}\n     */\n  public setUserDescription(emailAddress: string, description: string): EventBuilder {\n    if (emailAddress && description) {\n      this.setProperty('@user_description', { email_address: emailAddress, description: description });\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting manual\n   * stacking information.\n   * @param signatureData A dictionary of strings to use for stacking.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingInfo(signatureData: any, title?: string) {\n    if (signatureData) {\n      let stack = <IManualStackingInfo>{\n        signature_data: signatureData\n      };\n      if (title) {\n        stack.title = title;\n      }\n      this.setProperty('@stack', stack);\n    }\n\n    return this;\n  }\n\n  /**\n   * Changes default stacking behavior by setting the stacking key.\n   * @param manualStackingKey The manual stacking key.\n   * @param title An optional title for the stacking information.\n   * @returns {EventBuilder}\n     */\n  public setManualStackingKey(manualStackingKey: string, title?: string): EventBuilder {\n    if (manualStackingKey) {\n      let data = {\n        'ManualStackingKey': manualStackingKey\n      };\n      this.setManualStackingInfo(data, title);\n    }\n\n    return this;\n  }\n\n  public setValue(value: number): EventBuilder {\n    if (!!value) {\n      this.target.value = value;\n    }\n\n    return this;\n  }\n\n  public addTags(...tags: string[]): EventBuilder {\n    this.target.tags = Utils.addRange<string>(this.target.tags, ...tags);\n    return this;\n  }\n\n  /**\n   * Adds the object to extended data. Uses @excludedPropertyNames\n   * to exclude data from being included in the event.\n   * @param name The data object to add.\n   * @param value The name of the object to add.\n   * @param maxDepth The max depth of the object to include.\n   * @param excludedPropertyNames Any property names that should be excluded.\n   */\n  public setProperty(name: string, value: any, maxDepth?: number, excludedPropertyNames?: string[]): EventBuilder {\n    if (!name || (value === undefined || value == null)) {\n      return this;\n    }\n\n    if (!this.target.data) {\n      this.target.data = {};\n    }\n\n    let result = JSON.parse(Utils.stringify(value, this.client.config.dataExclusions.concat(excludedPropertyNames || []), maxDepth));\n    if (!Utils.isEmpty(result)) {\n      this.target.data[name] = result;\n    }\n\n    return this;\n  }\n\n  public markAsCritical(critical: boolean): EventBuilder {\n    if (critical) {\n      this.addTags('Critical');\n    }\n\n    return this;\n  }\n\n  public addRequestInfo(request: Object): EventBuilder {\n    if (!!request) {\n      this.pluginContextData['@request'] = request;\n    }\n\n    return this;\n  }\n\n  public submit(callback?: (context: EventPluginContext) => void): void {\n    this.client.submitEvent(this.target, this.pluginContextData, callback);\n  }\n\n  private isValidIdentifier(value: string): boolean {\n    if (!value) {\n      return true;\n    }\n\n    if (value.length < 8 || value.length > 100) {\n      return false;\n    }\n\n    for (let index = 0; index < value.length; index++) {\n      let code = value.charCodeAt(index);\n      let isDigit = (code >= 48) && (code <= 57);\n      let isLetter = ((code >= 65) && (code <= 90)) || ((code >= 97) && (code <= 122));\n      let isMinus = code === 45;\n\n      if (!(isDigit || isLetter) && !isMinus) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n}\n\nexport interface IUserDescription {\n  email_address?: string;\n  description?: string;\n  data?: any;\n}\n\nexport class ContextData {\n  public setException(exception: Error): void {\n    if (exception) {\n      this['@@_Exception'] = exception;\n    }\n  }\n\n  public get hasException(): boolean {\n    return !!this['@@_Exception'];\n  }\n\n  public getException(): Error {\n    return this['@@_Exception'] || null;\n  }\n\n  public markAsUnhandledError(): void {\n    this['@@_IsUnhandledError'] = true;\n  }\n\n  public get isUnhandledError(): boolean {\n    return !!this['@@_IsUnhandledError'];\n  }\n\n  public setSubmissionMethod(method: string): void {\n    if (method) {\n      this['@@_SubmissionMethod'] = method;\n    }\n  }\n\n  public getSubmissionMethod(): string {\n    return this['@@_SubmissionMethod'] || null;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          \n\nexport class ExceptionlessClient {\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   * @private\n   */\n  private static _instance: ExceptionlessClient = null;\n\n  public config: Configuration;\n\n  private _intervalId: any;\n  private _timeoutId: any;\n\n  constructor();\n  constructor(settings: IConfigurationSettings);\n  constructor(apiKey: string, serverUrl?: string);\n  constructor(settingsOrApiKey?: IConfigurationSettings | string, serverUrl?: string) {\n    if (typeof settingsOrApiKey === 'object') {\n      this.config = new Configuration(settingsOrApiKey);\n    } else {\n      this.config = new Configuration({ apiKey: <string>settingsOrApiKey, serverUrl: serverUrl });\n    }\n\n    this.updateSettingsTimer(5000);\n    this.config.onChanged((config) => this.updateSettingsTimer(this._timeoutId > 0 ? 5000 : 0));\n    this.config.queue.onEventsPosted((events, response) =>  this.updateSettingsTimer());\n  }\n\n  public createException(exception: Error): EventBuilder {\n    let pluginContextData = new ContextData();\n    pluginContextData.setException(exception);\n    return this.createEvent(pluginContextData).setType('error');\n  }\n\n  public submitException(exception: Error, callback?: (context: EventPluginContext) => void): void {\n    this.createException(exception).submit(callback);\n  }\n\n  public createUnhandledException(exception: Error, submissionMethod?: string): EventBuilder {\n    let builder = this.createException(exception);\n    builder.pluginContextData.markAsUnhandledError();\n    builder.pluginContextData.setSubmissionMethod(submissionMethod);\n\n    return builder;\n  }\n\n  public submitUnhandledException(exception: Error, submissionMethod?: string, callback?: (context: EventPluginContext) => void) {\n    this.createUnhandledException(exception, submissionMethod).submit(callback);\n  }\n\n  public createFeatureUsage(feature: string): EventBuilder {\n    return this.createEvent().setType('usage').setSource(feature);\n  }\n\n  public submitFeatureUsage(feature: string, callback?: (context: EventPluginContext) => void): void {\n    this.createFeatureUsage(feature).submit(callback);\n  }\n\n  public createLog(message: string): EventBuilder;\n  public createLog(source: string, message: string): EventBuilder;\n  public createLog(source: string, message: string, level: string): EventBuilder;\n  public createLog(sourceOrMessage: string, message?: string, level?: string): EventBuilder {\n    let builder = this.createEvent().setType('log');\n\n    if (message && level) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message).setProperty('@level', level);\n    } else if (message) {\n      builder = builder.setSource(sourceOrMessage).setMessage(message);\n    } else {\n      // TODO: Look into using https: //www.stevefenton.co.uk/Content/Blog/Date/201304/Blog/Obtaining-A-Class-Name-At-Runtime-In-TypeScript/\n      let caller: any = arguments.callee.caller;\n      builder = builder.setSource(caller && caller.name).setMessage(sourceOrMessage);\n    }\n\n    return builder;\n  }\n\n  public submitLog(message: string): void;\n  public submitLog(source: string, message: string): void;\n  public submitLog(source: string, message: string, level: string, callback?: (context: EventPluginContext) => void): void;\n  public submitLog(sourceOrMessage: string, message?: string, level?: string, callback?: (context: EventPluginContext) => void): void {\n    this.createLog(sourceOrMessage, message, level).submit(callback);\n  }\n\n  public createNotFound(resource: string): EventBuilder {\n    return this.createEvent().setType('404').setSource(resource);\n  }\n\n  public submitNotFound(resource: string, callback?: (context: EventPluginContext) => void): void {\n    this.createNotFound(resource).submit(callback);\n  }\n\n  public createSessionStart(): EventBuilder {\n    return this.createEvent().setType('session');\n  }\n\n  public submitSessionStart(callback?: (context: EventPluginContext) => void): void {\n    this.createSessionStart().submit(callback);\n  }\n\n  public submitSessionEnd(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session end: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, true, this.config);\n    }\n  }\n\n  public submitSessionHeartbeat(sessionIdOrUserId: string): void {\n    if (sessionIdOrUserId) {\n      this.config.log.info(`Submitting session heartbeat: ${sessionIdOrUserId}`);\n      this.config.submissionClient.sendHeartbeat(sessionIdOrUserId, false, this.config);\n    }\n  }\n\n  public createEvent(pluginContextData?: ContextData): EventBuilder {\n    return new EventBuilder({ date: new Date() }, this, pluginContextData);\n  }\n\n  /**\n   * Submits the event to be sent to the server.\n   * @param event The event data.\n   * @param pluginContextData Any contextual data objects to be used by Exceptionless plugins to gather default information for inclusion in the report information.\n   * @param callback\n   */\n  public submitEvent(event: IEvent, pluginContextData?: ContextData, callback?: (context: EventPluginContext) => void): void {\n    function cancelled(context: EventPluginContext) {\n      if (!!context) {\n        context.cancelled = true;\n      }\n\n      return !!callback && callback(context);\n    }\n\n    let context = new EventPluginContext(this, event, pluginContextData);\n    if (!event) {\n      return cancelled(context);\n    }\n\n    if (!this.config.enabled) {\n      this.config.log.info('Event submission is currently disabled.');\n      return cancelled(context);\n    }\n\n    if (!event.data) {\n      event.data = {};\n    }\n\n    if (!event.tags || !event.tags.length) {\n      event.tags = [];\n    }\n\n    EventPluginManager.run(context, function (ctx: EventPluginContext) {\n      let config = ctx.client.config;\n      let ev = ctx.event;\n\n      if (!ctx.cancelled) {\n        // ensure all required data\n        if (!ev.type || ev.type.length === 0) {\n          ev.type = 'log';\n        }\n\n        if (!ev.date) {\n          ev.date = new Date();\n        }\n\n        config.queue.enqueue(ev);\n\n        if (ev.reference_id && ev.reference_id.length > 0) {\n          ctx.log.info(`Setting last reference id '${ev.reference_id}'`);\n          config.lastReferenceIdManager.setLast(ev.reference_id);\n        }\n      }\n\n      !!callback && callback(ctx);\n    });\n  }\n\n  /**\n   * Updates the user's email address and description of an event for the specified reference id.\n   * @param referenceId The reference id of the event to update.\n   * @param email The user's email address to set on the event.\n   * @param description The user's description of the event.\n   * @param callback The submission response.\n   */\n  public updateUserEmailAndDescription(referenceId: string, email: string, description: string, callback?: (response: SubmissionResponse) => void) {\n    if (!referenceId || !email || !description || !this.config.enabled) {\n      return !!callback && callback(new SubmissionResponse(500, 'cancelled'));\n    }\n\n    let userDescription: IUserDescription = { email_address: email, description: description };\n    this.config.submissionClient.postUserDescription(referenceId, userDescription, this.config, (response: SubmissionResponse) => {\n      if (!response.success) {\n        this.config.log.error(`Failed to submit user email and description for event '${referenceId}': ${response.statusCode} ${response.message}`);\n      }\n\n      !!callback && callback(response);\n    });\n  }\n\n  /**\n   * Gets the last event client id that was submitted to the server.\n   * @returns {string} The event client id.\n   */\n  public getLastReferenceId(): string {\n    return this.config.lastReferenceIdManager.getLast();\n  }\n\n  private updateSettingsTimer(initialDelay?: number) {\n    this.config.log.info(`Updating settings timer with delay: ${initialDelay}`);\n\n    this._timeoutId = clearTimeout(this._timeoutId);\n    this._timeoutId = clearInterval(this._intervalId);\n\n    let interval = this.config.updateSettingsWhenIdleInterval;\n    if (interval > 0) {\n      let updateSettings = () => SettingsManager.updateSettings(this.config);\n      if (initialDelay > 0) {\n        this._timeoutId = setTimeout(updateSettings, initialDelay);\n      }\n\n      this._intervalId = setInterval(updateSettings, interval);\n    }\n  }\n\n  /**\n   * The default ExceptionlessClient instance.\n   * @type {ExceptionlessClient}\n   */\n  public static get default() {\n    if (ExceptionlessClient._instance === null) {\n      ExceptionlessClient._instance = new ExceptionlessClient(null);\n    }\n\n    return ExceptionlessClient._instance;\n  }\n}\n\nexport interface IManualStackingInfo {\n  title?: string;\n  signature_data?: any;\n}\n\nexport interface IModule {\n  data?: any;\n\n  module_id?: number;\n  name?: string;\n  version?: string;\n  is_entry?: boolean;\n  created_date?: Date;\n  modified_date?: Date;\n}\n\nexport interface IRequestInfo {\n  user_agent?: string;\n  http_method?: string;\n  is_secure?: boolean;\n  host?: string;\n  port?: number;\n  path?: string;\n  referrer?: string;\n  client_ip_address?: string;\n  cookies?: any;\n  post_data?: any;\n  query_string?: any;\n  data?: any;\n}\n\nexport interface IEnvironmentInfo {\n  processor_count?: number;\n  total_physical_memory?: number;\n  available_physical_memory?: number;\n  command_line?: string;\n  process_name?: string;\n  process_id?: string;\n  process_memory_size?: number;\n  thread_id?: string;\n  architecture?: string;\n  o_s_name?: string;\n  o_s_version?: string;\n  ip_address?: string;\n  machine_name?: string;\n  install_id?: string;\n  runtime_version?: string;\n  data?: any;\n}\n\nexport interface IParameter {\n  data?: any;\n  generic_arguments?: string[];\n\n  name?: string;\n  type?: string;\n  type_namespace?: string;\n}\n\n                                          \n\nexport interface IMethod {\n  data?: any;\n  generic_arguments?: string[];\n  parameters?: IParameter[];\n\n  is_signature_target?: boolean;\n  declaring_namespace?: string;\n  declaring_type?: string;\n  name?: string;\n  module_id?: number;\n}\n\n                                    \n\nexport interface IStackFrame extends IMethod {\n  file_name?: string;\n  line_number?: number;\n  column?: number;\n}\n\n                                                                                 \n\nexport interface IInnerError {\n  message?: string;\n  type?: string;\n  code?: string;\n  data?: any;\n  inner?: IInnerError;\n  stack_trace?: IStackFrame[];\n  target_method?: IMethod;\n}\n\n                                                                                                                                                \n\nexport class ConfigurationDefaultsPlugin implements IEventPlugin {\n  public priority: number = 10;\n  public name: string = 'ConfigurationDefaultsPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let config = context.client.config;\n    let defaultTags: string[] = config.defaultTags || [];\n    for (let index = 0; index < defaultTags.length; index++) {\n      let tag = defaultTags[index];\n      if (!!tag && context.event.tags.indexOf(tag) < 0) {\n        context.event.tags.push(tag);\n      }\n    }\n\n    let defaultData: Object = config.defaultData || {};\n    for (let key in defaultData) {\n      if (!!defaultData[key]) {\n        let result = JSON.parse(Utils.stringify(defaultData[key], config.dataExclusions));\n        if (!Utils.isEmpty(result)) {\n          context.event.data[key] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                \n\nexport class ErrorPlugin implements IEventPlugin {\n  public priority: number = 30;\n  public name: string = 'ErrorPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n    let ignoredProperties: string[] = [\n      'arguments',\n      'column',\n      'columnNumber',\n      'description',\n      'fileName',\n      'message',\n      'name',\n      'number',\n      'line',\n      'lineNumber',\n      'opera#sourceloc',\n      'sourceId',\n      'sourceURL',\n      'stack',\n      'stackArray',\n      'stacktrace'\n    ];\n\n    let exception = context.contextData.getException();\n    if (!!exception) {\n      context.event.type = 'error';\n\n      if (!context.event.data[ERROR_KEY]) {\n        let config = context.client.config;\n        let parser = config.errorParser;\n        if (!parser) {\n          throw new Error('No error parser was defined.');\n        }\n\n        let result = parser.parse(context, exception);\n        if (!!result) {\n          let additionalData = JSON.parse(Utils.stringify(exception, config.dataExclusions.concat(ignoredProperties)));\n          if (!Utils.isEmpty(additionalData)) {\n            if (!result.data) {\n              result.data = {};\n            }\n            result.data['@ext'] = additionalData;\n          }\n\n          context.event.data[ERROR_KEY] = result;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                           \n\nexport class ModuleInfoPlugin implements IEventPlugin {\n  public priority: number = 50;\n  public name: string = 'ModuleInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ERROR_KEY: string = '@error'; // optimization for minifier.\n\n    let collector = context.client.config.moduleCollector;\n    if (context.event.data[ERROR_KEY] && !context.event.data['@error'].modules && !!collector) {\n      let modules: IModule[] = collector.getModules(context);\n      if (modules && modules.length > 0) {\n        context.event.data[ERROR_KEY].modules = modules;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                          \n\nexport class RequestInfoPlugin implements IEventPlugin {\n  public priority: number = 70;\n  public name: string = 'RequestInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const REQUEST_KEY: string = '@request'; // optimization for minifier.\n\n    let config = context.client.config;\n    let collector = config.requestInfoCollector;\n    if (!context.event.data[REQUEST_KEY] && !!collector) {\n      let requestInfo: IRequestInfo = collector.getRequestInfo(context);\n      if (!!requestInfo) {\n        if (Utils.isMatch(requestInfo.user_agent, config.userAgentBotPatterns)) {\n          context.log.info('Cancelling event as the request user agent matches a known bot pattern');\n          context.cancelled = true;\n        } else {\n          context.event.data[REQUEST_KEY] = requestInfo;\n        }\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                             \n\nexport class EnvironmentInfoPlugin implements IEventPlugin {\n  public priority: number = 80;\n  public name: string = 'EnvironmentInfoPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    const ENVIRONMENT_KEY: string = '@environment'; // optimization for minifier.\n\n    let collector = context.client.config.environmentInfoCollector;\n    if (!context.event.data[ENVIRONMENT_KEY] && collector) {\n      let environmentInfo: IEnvironmentInfo = collector.getEnvironmentInfo(context);\n      if (!!environmentInfo) {\n        context.event.data[ENVIRONMENT_KEY] = environmentInfo;\n      }\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                           \n\nexport class SubmissionMethodPlugin implements IEventPlugin {\n  public priority: number = 100;\n  public name: string = 'SubmissionMethodPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    let submissionMethod: string = context.contextData.getSubmissionMethod();\n    if (!!submissionMethod) {\n      context.event.data['@submission_method'] = submissionMethod;\n    }\n\n    next && next();\n  }\n}\n\n                                                                                                                                                                                                                                                   \n\nexport class DuplicateCheckerPlugin implements IEventPlugin {\n  public priority: number = 40;\n  public name: string = 'DuplicateCheckerPlugin';\n\n  private _processedHashcodes: TimestampedHash[] = [];\n  private _getCurrentTime: () => number;\n\n  constructor(getCurrentTime: () => number = () => Date.now()) {\n    this._getCurrentTime = getCurrentTime;\n  }\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function isDuplicate(error: IInnerError, processedHashcodes, now, log: ILog): boolean {\n      while (error) {\n        let hashCode = Utils.getHashCode(error.stack_trace && JSON.stringify(error.stack_trace));\n\n        // Only process the unique errors times within a 2 second window.\n        if (hashCode && processedHashcodes.some(h => h.hash === hashCode && h.timestamp >= (now - 2000))) {\n          log.info(`Ignoring duplicate error event hash: ${hashCode}`);\n          return true;\n        }\n\n        // Add this exception to our list of recent processed errors.\n        processedHashcodes.push({ hash: hashCode, timestamp: now });\n\n        // Only keep the last 20 recent errors.\n        while (processedHashcodes.length > 20) {\n          processedHashcodes.shift();\n        }\n\n        error = error.inner;\n      }\n\n      return false;\n    }\n\n    if (context.event.type === 'error') {\n      if (isDuplicate(context.event.data['@error'], this._processedHashcodes, this._getCurrentTime(), context.log)) {\n        context.cancelled = true;\n        return;\n      }\n    }\n\n    next && next();\n  }\n}\n\ninterface TimestampedHash {\n  hash: number;\n  timestamp: number;\n}\n\n                                                                                                                                                                                                        \n\nexport class EventExclusionPlugin implements IEventPlugin {\n  public priority: number = 45;\n  public name: string = 'EventExclusionPlugin';\n\n  public run(context: EventPluginContext, next?: () => void): void {\n    function getLogLevel(level: string): number {\n      switch ((level || '').toLowerCase().trim()) {\n        case 'trace':\n        case 'true':\n        case '1':\n        case 'yes':\n          return 0;\n        case 'debug':\n          return 1;\n        case 'info':\n          return 2;\n        case 'warn':\n          return 3;\n        case 'error':\n          return 4;\n        case 'fatal':\n          return 5;\n        case 'off':\n        case 'false':\n        case '0':\n        case 'no':\n          return 6;\n        default:\n          return -1;\n      }\n    }\n\n    function getMinLogLevel(settings: Object, loggerName: string = '*'): number {\n      return getLogLevel(getTypeAndSourceSetting(settings, 'log', loggerName, 'Trace') + '');\n    }\n\n    function getTypeAndSourceSetting(settings: Object = {}, type: string, source: string, defaultValue: string|boolean = undefined): string|boolean {\n      if (!type) {\n        return defaultValue;\n      }\n\n      let isLog = type === 'log';\n      let sourcePrefix =  `@@${type}:`;\n\n      let value = settings[sourcePrefix + source];\n      if (value) {\n        return !isLog ? Utils.toBoolean(value) : value;\n      }\n\n      // check for wildcard match\n      for (let key in settings) {\n        if (Utils.startsWith(key.toLowerCase(), sourcePrefix.toLowerCase()) && Utils.isMatch(source, [key.substring(sourcePrefix.length)])) {\n          return !isLog ? Utils.toBoolean(settings[key]) : settings[key];\n        }\n      }\n\n      return defaultValue;\n    }\n\n    let ev = context.event;\n    let log = context.log;\n    let settings = context.client.config.settings;\n\n    if (ev.type === 'log') {\n      let minLogLevel = getMinLogLevel(settings, ev.source);\n      let logLevel = getLogLevel(ev.data['@level']);\n\n      if (logLevel >= 0 && (logLevel > 5 || logLevel < minLogLevel)) {\n        log.info('Cancelling log event due to minimum log level.');\n        context.cancelled = true;\n      }\n    } else if (ev.type === 'error') {\n      let error: IInnerError = ev.data['@error'];\n      while (!context.cancelled && error) {\n        if (getTypeAndSourceSetting(settings, ev.type, error.type, true) === false) {\n          log.info(`Cancelling error from excluded exception type: ${error.type}`);\n          context.cancelled = true;\n        }\n\n        error = error.inner;\n      }\n    } else if (getTypeAndSourceSetting(settings, ev.type, ev.source, true) === false) {\n      log.info(`Cancelling event from excluded type: ${ev.type} and source: ${ev.source}`);\n      context.cancelled = true;\n    }\n\n    next && next();\n  }\n}\n\nexport class SettingsResponse {\n  public success: boolean = false;\n  public settings: any;\n  public settingsVersion: number = -1;\n  public message: string;\n  public exception: any;\n\n  constructor(success: boolean, settings: any, settingsVersion: number = -1, exception: any = null, message: string = null) {\n    this.success = success;\n    this.settings = settings;\n    this.settingsVersion = settingsVersion;\n    this.exception = exception;\n    this.message = message;\n  }\n}\n\n                                                                                 \n\nexport interface IError extends IInnerError {\n  modules?: IModule[];\n}\n\nexport interface IStorageItem {\n  timestamp: number;\n  value: any;\n}\n\n                                              \n\nexport interface IStorage {\n  save(value: any): number;\n  get(limit?: number): IStorageItem[];\n  remove(timestamp: number): void;\n  clear(): void;\n}\n\nexport interface SubmissionCallback {\n  (status: number, message: string, data?: string, headers?: Object): void;\n}\n\nexport interface SubmissionRequest {\n  apiKey: string;\n  userAgent: string;\n  method: string;\n  url: string;\n  data: string;\n}\n\n                                                                                     \n\nexport class InMemoryStorage implements IStorage {\n  private maxItems: number;\n  private items: IStorageItem[] = [];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems: number) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any): number {\n    if (!value) {\n      return null;\n    }\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let item = { timestamp, value };\n\n    if (items.push(item) > this.maxItems) {\n      items.shift();\n    }\n\n    this.lastTimestamp = timestamp;\n    return item.timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    return this.items.slice(0, limit);\n  }\n\n  public remove(timestamp: number): void {\n    let items = this.items;\n    for (let i = 0; i < items.length; i++) {\n      if (items[i].timestamp === timestamp) {\n        items.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n  public clear(): void {\n    this.items = [];\n  }\n}\n\nexport interface IClientConfiguration {\n  settings: Object;\n  version: number;\n}\n\n                                                                                     \n\nexport abstract class KeyValueStorageBase implements IStorage {\n  private maxItems: number;\n  private items: number[];\n  private lastTimestamp: number = 0;\n\n  constructor(maxItems) {\n    this.maxItems = maxItems;\n  }\n\n  public save(value: any, single?: boolean): number {\n    if (!value) {\n      return null;\n    }\n\n    this.ensureIndex();\n\n    let items = this.items;\n    let timestamp = Math.max(Date.now(), this.lastTimestamp + 1);\n    let key = this.getKey(timestamp);\n    let json = JSON.stringify(value);\n\n    try {\n      this.write(key, json);\n      this.lastTimestamp = timestamp;\n      if (items.push(timestamp) > this.maxItems) {\n        this.delete(this.getKey(items.shift()));\n      }\n    } catch (e) {\n      return null;\n    }\n\n    return timestamp;\n  }\n\n  public get(limit?: number): IStorageItem[] {\n    this.ensureIndex();\n\n    return this.items.slice(0, limit)\n      .map(timestamp => {\n        // Read and parse item for this timestamp\n        let key = this.getKey(timestamp);\n        try {\n          let json = this.read(key);\n          let value = JSON.parse(json, parseDate);\n          return { timestamp, value };\n        } catch (error) {\n          // Something went wrong - try to delete the cause.\n          this.safeDelete(key);\n          return null;\n        }\n      })\n      .filter(item => item != null);\n  }\n\n  public remove(timestamp: number): void {\n    this.ensureIndex();\n\n    let items = this.items;\n    let index = items.indexOf(timestamp);\n    if (index >= 0) {\n      let key = this.getKey(timestamp);\n      this.safeDelete(key);\n      items.splice(index, 1);\n    };\n  }\n\n  public clear(): void {\n    this.items.forEach(item => this.safeDelete(this.getKey(item)));\n    this.items = [];\n  }\n\n  protected abstract write(key: string, value: string): void;\n  protected abstract read(key: string): string;\n  protected abstract readAllKeys(): string[];\n  protected abstract delete(key: string);\n  protected abstract getKey(timestamp: number): string;\n  protected abstract getTimestamp(key: string): number;\n\n  private ensureIndex() {\n    if (!this.items) {\n      this.items = this.createIndex();\n      this.lastTimestamp = Math.max(0, ...this.items) + 1;\n    }\n  }\n\n  private safeDelete(key: string): void {\n    try {\n      this.delete(key);\n    } catch (error) {\n    }\n  }\n\n  private createIndex() {\n    try {\n      let keys = this.readAllKeys();\n      return keys.map(key => {\n        try {\n          let timestamp = this.getTimestamp(key);\n          if (!timestamp) {\n            this.safeDelete(key);\n            return null;\n          }\n          return timestamp;\n        } catch (error) {\n          this.safeDelete(key);\n          return null;\n        }\n      }).filter(timestamp => timestamp != null)\n        .sort((a, b) => a - b);\n    } catch (error) {\n      return [];\n    }\n  }\n}\n\nfunction parseDate(key, value) {\n  let dateRegx = /\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/g;\n  if (typeof value === 'string') {\n    let a = dateRegx.exec(value);\n    if (a) {\n      return new Date(value);\n    }\n  }\n  return value;\n};\n\n                                                                                                                     \n\nexport class NodeFileStorage extends KeyValueStorageBase {\n  private directory: string;\n  private prefix: string;\n  private fs: any;\n\n  constructor(namespace: string, folder?: string, prefix: string = 'ex-', maxItems: number = 20, fs?: any) {\n    super(maxItems);\n\n    if (!folder) {\n      folder = Path.join(Path.dirname(require.main.filename), '.exceptionless');\n    }\n    let subfolder = Path.join(folder, namespace);\n\n    this.directory = Path.resolve(subfolder);\n    this.prefix = prefix;\n    this.fs = fs ? fs : Fs;\n\n    this.mkdir(this.directory);\n  }\n\n  public write(key: string, value: string) {\n    this.fs.writeFileSync(key, value);\n  }\n\n  public read(key: string) {\n    return this.fs.readFileSync(key, 'utf8');\n  }\n\n  public readAllKeys() {\n    return this.fs.readdirSync(this.directory)\n      .filter(file => file.indexOf(this.prefix) === 0)\n      .map(file => Path.join(this.directory, file));\n  }\n\n  public delete(key: string) {\n    this.fs.unlinkSync(key);\n  }\n\n  public getKey(timestamp) {\n    return Path.join(this.directory, `${this.prefix}${timestamp}.json`);\n  }\n\n  public getTimestamp(key) {\n    return parseInt(Path.basename(key, '.json')\n      .substr(this.prefix.length), 10);\n  }\n\n  private mkdir(path) {\n    let dirs = path.split(Path.sep);\n    let root = '';\n\n    while (dirs.length > 0) {\n      let dir = dirs.shift();\n      if (dir === '') {\n        root = Path.sep;\n      }\n      if (!this.fs.existsSync(root + dir)) {\n        this.fs.mkdirSync(root + dir);\n      }\n      root += dir + Path.sep;\n    }\n  };\n}\n\n                                                                                                                                                                                                                                       \n\nexport class NodeEnvironmentInfoCollector implements IEnvironmentInfoCollector {\n  public getEnvironmentInfo(context: EventPluginContext): IEnvironmentInfo {\n    function getIpAddresses(): string {\n      let ips: string[] = [];\n      let interfaces = os.networkInterfaces();\n      Object.keys(interfaces).forEach((name) => {\n        interfaces[name].forEach((iface: any) => {\n          if ('IPv4' === iface.family && !iface.internal) {\n            ips.push(iface.address);\n          }\n        });\n      });\n\n      return ips.join(', ');\n    }\n\n    if (!os) {\n      return null;\n    }\n\n    let environmentInfo: IEnvironmentInfo = {\n      processor_count: os.cpus().length,\n      total_physical_memory: os.totalmem(),\n      available_physical_memory: os.freemem(),\n      command_line: process.argv.join(' '),\n      process_name: (process.title || '').replace(/[\\uE000-\\uF8FF]/g, ''),\n      process_id: process.pid + '',\n      process_memory_size: process.memoryUsage().heapTotal,\n      // thread_id: '',\n      architecture: os.arch(),\n      o_s_name: os.type(),\n      o_s_version: os.release(),\n      ip_address: getIpAddresses(),\n      machine_name: os.hostname(),\n      // install_id: '',\n      runtime_version: process.version,\n      data: {\n        loadavg: os.loadavg(),\n        platform: os.platform(),\n        tmpdir: os.tmpdir(),\n        uptime: os.uptime()\n      }\n    };\n\n    if ((<any>os).endianness) {\n      environmentInfo.data.endianness = (<any>os).endianness();\n    }\n\n    return environmentInfo;\n  }\n}\n\n                                                                                                                                                                                                                                                                   \n\nexport class NodeErrorParser implements IErrorParser {\n  public parse(context: EventPluginContext, exception: Error): IError {\n    function getStackFrames(stackFrames: any[]): IStackFrame[] {\n      let frames: IStackFrame[] = [];\n\n      for (let index = 0; index < stackFrames.length; index++) {\n        let frame = stackFrames[index];\n        frames.push({\n          name: frame.getMethodName() || frame.getFunctionName(),\n          // parameters: frame.args,\n          file_name: frame.getFileName(),\n          line_number: frame.getLineNumber() || 0,\n          column: frame.getColumnNumber() || 0,\n          declaring_type: frame.getTypeName(),\n          data: {\n            is_native: frame.isNative() || (!!frame.filename && frame.filename[0] !== '/' && frame.filename[0] !== '.')\n          }\n        });\n      }\n\n      return frames;\n    }\n\n    if (!nodestacktrace) {\n      throw new Error('Unable to load the stack trace library.');\n    }\n\n    let stackFrames = nodestacktrace.parse(exception) || [];\n    return {\n      type: exception.name,\n      message: exception.message,\n      stack_trace: getStackFrames(stackFrames)\n    };\n  }\n}\n\n                                                                                                                                                                                                                                                \n\nexport class NodeModuleCollector implements IModuleCollector {\n\n  private initialized: boolean = false;\n  private installedModules: { [id: string]: IModule } = {};\n\n  public getModules(context: EventPluginContext): IModule[] {\n    this.initialize();\n\n    if (!require.main) {\n      return [];\n    }\n\n    let modulePath = path.dirname(require.main.filename) + '/node_modules/';\n    let pathLength = modulePath.length;\n\n    let loadedKeys = Object.keys(require.cache);\n    let loadedModules = {};\n\n    loadedKeys.forEach(key => {\n      let id = key.substr(pathLength);\n      id = id.substr(0, id.indexOf('/'));\n      loadedModules[id] = true;\n    });\n\n    return Object.keys(loadedModules)\n      .map(key => this.installedModules[key])\n      .filter(m => m !== undefined);\n  }\n\n  private initialize() {\n    if (this.initialized) {\n      return;\n    }\n\n    this.initialized = true;\n\n    let output = child.spawnSync('npm', ['ls', '--depth=0', '--json']).stdout;\n\n    if (!output) {\n      return;\n    }\n\n    let json;\n    try {\n      json = JSON.parse(output.toString());\n    } catch (e) {\n      return;\n    }\n\n    let items = json.dependencies;\n    if (!items) {\n      return;\n    }\n\n    let id = 0;\n    this.installedModules = {};\n\n    Object.keys(items).forEach(key => {\n      let item = items[key];\n      let theModule = <IModule>{\n        module_id: id++,\n        name: key,\n        version: item.version\n      };\n\n      this.installedModules[key] = theModule;\n    });\n  }\n}\n\n                                                                                                                                                                                                                             \n\nexport class NodeRequestInfoCollector implements IRequestInfoCollector {\n  public getRequestInfo(context: EventPluginContext): IRequestInfo {\n    const REQUEST_KEY: string = '@request'; // optimization for minifier.\n    if (!context.contextData[REQUEST_KEY]) {\n      return null;\n    }\n\n    let exclusions = context.client.config.dataExclusions;\n\n    // TODO: include referrer\n    let request = context.contextData[REQUEST_KEY];\n    let requestInfo: IRequestInfo = {\n      client_ip_address: request.ip,\n      user_agent: request.headers['user-agent'],\n      is_secure: request.secure,\n      http_method: request.method,\n      host: request.hostname || request.host,\n      path: request.path,\n      post_data: JSON.parse(Utils.stringify(request.body || {}, exclusions)),\n      cookies: Utils.getCookies(request.headers.cookie, exclusions),\n      query_string: JSON.parse(Utils.stringify(request.params || {}, exclusions))\n    };\n\n    let host = request.headers.host;\n    let port: number = host && parseInt(host.slice(host.indexOf(':') + 1), 10);\n    if (port > 0) {\n      requestInfo.port = port;\n    }\n\n    return requestInfo;\n  }\n}\n\n                                                                                                                                                                                                                                                                                                                     \n\nexport class NodeSubmissionAdapter implements ISubmissionAdapter {\n  public sendRequest(request: SubmissionRequest, callback?: SubmissionCallback, isAppExiting?: boolean) {\n    if (isAppExiting) {\n      this.sendRequestSync(request, callback);\n      return;\n    }\n\n    let parsedHost = url.parse(request.url);\n\n    let options: https.RequestOptions = {\n      auth: `client:${request.apiKey}`,\n      headers: {},\n      hostname: parsedHost.hostname,\n      method: request.method,\n      port: parsedHost.port && parseInt(parsedHost.port, 10),\n      path: request.url\n    };\n\n    options.headers['User-Agent'] = request.userAgent;\n\n    if (request.method === 'POST') {\n      options.headers = {\n        'Content-Type': 'application/json',\n        'Content-Length': request.data.length\n      };\n    }\n\n    let protocol = (parsedHost.protocol === 'https' ? https : http);\n    let clientRequest: http.ClientRequest = protocol.request(options, (response: http.IncomingMessage) => {\n      let body = '';\n      response.setEncoding('utf8');\n      response.on('data', (chunk) => body += chunk);\n      response.on('end', () => this.complete(response, body, response.headers, callback));\n    });\n\n    clientRequest.on('error', (error: Error) => callback && callback(500, error.message));\n    clientRequest.end(request.data);\n  }\n\n  private complete(response: http.IncomingMessage, responseBody: string, responseHeaders: Object, callback: SubmissionCallback): void {\n    let message: string;\n    if (response.statusCode === 0) {\n      message = 'Unable to connect to server.';\n    } else if (response.statusCode < 200 || response.statusCode > 299) {\n      message = response.statusMessage || (<any>response).message;\n    }\n\n    callback && callback(response.statusCode || 500, message, responseBody, responseHeaders);\n  }\n\n  private sendRequestSync(request: SubmissionRequest, callback: SubmissionCallback): void {\n    let requestJson = JSON.stringify(request);\n    let res = child.spawnSync(process.execPath, [require.resolve('./submitSync.js')],\n      {\n        input: requestJson,\n        stdio: ['pipe', 'pipe', process.stderr]\n      });\n\n    let out = res.stdout.toString();\n    let result = JSON.parse(out);\n\n    callback && callback(result.status, result.message, result.data, result.headers);\n  }\n}\n\n                                                                                                                                                  \n\nexport class NodeFileStorageProvider implements IStorageProvider {\n  public queue: IStorage;\n  public settings: IStorage;\n\n  constructor(folder?: string, prefix?: string, maxQueueItems: number = 250) {\n    this.queue = new NodeFileStorage('q', folder, prefix, maxQueueItems);\n    this.settings = new NodeFileStorage('settings', folder, prefix, 1);\n  }\n\n}\n\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   \n\nconst EXIT: string = 'exit';\nconst UNCAUGHT_EXCEPTION: string = 'uncaughtException';\nconst SIGINT: string = 'SIGINT';\nconst SIGINT_CODE: number = 2;\n\nlet defaults = Configuration.defaults;\ndefaults.environmentInfoCollector = new NodeEnvironmentInfoCollector();\ndefaults.errorParser = new NodeErrorParser();\ndefaults.moduleCollector = new NodeModuleCollector();\ndefaults.requestInfoCollector = new NodeRequestInfoCollector();\ndefaults.submissionAdapter = new NodeSubmissionAdapter();\n\nConfiguration.prototype.useLocalStorage = function() {\n  this.storage = new NodeFileStorageProvider();\n  SettingsManager.applySavedServerSettings(this);\n  this.changed();\n};\n\nfunction getListenerCount(emitter, event: string): number {\n  if (emitter.listenerCount) {\n    return emitter.listenerCount(event);\n  }\n  return require('events').listenerCount(emitter, event);\n}\n\n/*\n * Adding a event handler for 'uncaughtException' modifies the default\n * Node behavior, so it won't exit or log to the console. Instead,\n * we hijack the event emitter and forward the exception to the callback.\n */\nfunction onUncaughtException(callback: (error: Error) => void) {\n  let originalEmit = process.emit;\n\n  process.emit = function(type: string, error: Error) {\n    if (type === UNCAUGHT_EXCEPTION) {\n      callback(error);\n    }\n\n    return originalEmit.apply(this, arguments);\n  };\n}\n\nonUncaughtException(function(error: Error) {\n  ExceptionlessClient.default.submitUnhandledException(error, UNCAUGHT_EXCEPTION);\n});\n\n/*\n * We cannot hijack SIGINT, so if there are no other handlers,\n * we just reproduce default Node.js behavior by exiting.\n */\nprocess.on(SIGINT, function() {\n  if (getListenerCount(process, SIGINT) <= 1) {\n    process.exit(128 + SIGINT_CODE);\n  }\n});\n\nprocess.on(EXIT, function(code: number) {\n  /**\n   * exit codes: https://nodejs.org/api/process.html#process_event_exit\n   * From now on, only synchronous code may run. As soon as this method\n   * ends, the application inevitably will exit.\n   */\n  function getExitCodeReason(exitCode: number): string {\n    if (exitCode === 1) {\n      return 'Uncaught Fatal Exception';\n    }\n\n    if (exitCode === 3) {\n      return 'Internal JavaScript Parse Error';\n    }\n\n    if (exitCode === 4) {\n      return 'Internal JavaScript Evaluation Failure';\n    }\n\n    if (exitCode === 5) {\n      return 'Fatal Exception';\n    }\n\n    if (exitCode === 6) {\n      return 'Non-function Internal Exception Handler ';\n    }\n\n    if (exitCode === 7) {\n      return 'Internal Exception Handler Run-Time Failure';\n    }\n\n    if (exitCode === 8) {\n      return 'Uncaught Exception';\n    }\n\n    if (exitCode === 9) {\n      return 'Invalid Argument';\n    }\n\n    if (exitCode === 10) {\n      return 'Internal JavaScript Run-Time Failure';\n    }\n\n    if (exitCode === 12) {\n      return 'Invalid Debug Argument';\n    }\n\n    return null;\n  }\n\n  let client = ExceptionlessClient.default;\n  let message = getExitCodeReason(code);\n\n  if (message !== null) {\n    client.submitLog(EXIT, message, 'Error');\n  }\n\n  client.config.queue.process(true);\n  // Application will now exit.\n});\n\n(<any>Error).stackTraceLimit = Infinity;\n\n"]}
\ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
index c3393f42..16f47766 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -1,3 +1,4 @@
+var fs = require("fs");
 var pkg = require('./package.json');
 var gulp = require('gulp');
 var replace = require('gulp-replace');
@@ -28,10 +29,10 @@ gulp.task('exceptionless.umd', ['typescript', 'typescript.integrations'], functi
     .pipe(umd({
       exports: 'exports',
       globalName: 'exceptionless',
-      namespace: 'exceptionless'
+      namespace: 'exceptionless',
+      deps: ['TraceKit'],
+      template: fs.readFileSync('./umd.template.jst', 'utf8')
     }))
-    .pipe(replace("define(factory);", "define('exceptionless', factory);"))
-    .pipe(replace('}(this, function(require, exports, module) {', '}(this, function(require, exports, module) {\nif (!require) {\n\trequire = function(name) {\n\t\treturn (typeof window !== "undefined" ? window : global)[name];\n\t}\n}\nif (!exports) {\n\tvar exports = {};\n}'))
     .pipe(sourcemaps.write('.'))
     .pipe(gulp.dest('dist/temp'));
 });
@@ -91,8 +92,8 @@ gulp.task('watch', ['build'], function () {
 gulp.task('lint', function () {
   var tslint = require('gulp-tslint');
   return gulp.src(['src/**/*.ts', '!src/typings/**/*.ts'])
-    .pipe(tslint())
-    .pipe(tslint.report('verbose'));
+    .pipe(tslint({ formatter: 'verbose' }))
+    .pipe(tslint.report());
 });
 
 gulp.task('build', ['clean', 'lint', 'exceptionless', 'exceptionless.node']);
diff --git a/package.json b/package.json
index aab9fa7b..8ac4cb8a 100644
--- a/package.json
+++ b/package.json
@@ -28,26 +28,26 @@
   },
   "devDependencies": {
     "chai": "3.5.0",
-    "del": "2.2.0",
-    "es5-shim": "4.5.8",
-    "es6-shim": "0.35.0",
+    "del": "2.2.1",
+    "es5-shim": "4.5.9",
+    "es6-shim": "0.35.1",
     "gulp": "3.9.1",
     "gulp-concat": "2.6.0",
     "gulp-exec": "2.1.2",
     "gulp-mocha": "2.2.0",
     "gulp-replace": "0.5.4",
     "gulp-sourcemaps": "1.6.0",
-    "gulp-tslint": "5.0.0",
-    "gulp-uglify": "1.5.3",
+    "gulp-tslint": "6.0.1",
+    "gulp-uglify": "1.5.4",
     "gulp-wrap-umd": "0.2.1",
-    "rimraf": "2.5.2",
-    "source-map-support": "0.4.0",
-    "mock-fs": "3.9.0",
+    "rimraf": "2.5.3",
+    "source-map-support": "0.4.2",
+    "mock-fs": "3.11.0",
     "tracekit": "0.4.3",
-    "tslint": "3.8.1",
+    "tslint": "3.13.0",
     "tsproject": "1.2.1",
     "typescript": "1.8.10",
-    "typescript-formatter": "2.1.0"
+    "typescript-formatter": "2.2.1"
   },
   "dependencies": {
     "stack-trace": "0.0.9"
diff --git a/src/configuration/Configuration.ts b/src/configuration/Configuration.ts
index 462efd23..859e847f 100644
--- a/src/configuration/Configuration.ts
+++ b/src/configuration/Configuration.ts
@@ -80,6 +80,48 @@ export class Configuration implements IConfigurationSettings {
 
   public queue: IEventQueue;
 
+  /**
+   * The API key that will be used when sending events to the server.
+   * @type {string}
+   * @private
+   */
+  private _apiKey: string;
+
+  /**
+   * The server url that all events will be sent to.
+   * @type {string}
+   * @private
+   */
+  private _serverUrl: string = 'https://collector.exceptionless.io';
+
+  /**
+   * The heartbeat server url that all heartbeats will be sent to.
+   * @type {string}
+   * @private
+   */
+  private _heartbeatServerUrl: string = 'https://heartbeat.exceptionless.io';
+
+  /**
+   * How often the client should check for updated server settings when idle. The default is every 2 minutes.
+   * @type {number}
+   * @private
+   */
+  private _updateSettingsWhenIdleInterval: number = 120000;
+
+  /**
+   * A list of exclusion patterns.
+   * @type {Array}
+   * @private
+   */
+  private _dataExclusions: string[] = [];
+
+  /**
+   * A list of user agent patterns.
+   * @type {Array}
+   * @private
+   */
+  private _userAgentBotPatterns: string[] = [];
+
   /**
    * The list of plugins that will be used in this configuration.
    * @type {Array}
@@ -122,13 +164,6 @@ export class Configuration implements IConfigurationSettings {
     EventPluginManager.addDefaultPlugins(this);
   }
 
-  /**
-   * The API key that will be used when sending events to the server.
-   * @type {string}
-   * @private
-   */
-  private _apiKey: string;
-
   /**
    * The API key that will be used when sending events to the server.
    * @returns {string}
@@ -155,13 +190,6 @@ export class Configuration implements IConfigurationSettings {
     return !!this.apiKey && this.apiKey.length >= 10;
   }
 
-  /**
-   * The server url that all events will be sent to.
-   * @type {string}
-   * @private
-   */
-  private _serverUrl: string = 'https://collector.exceptionless.io';
-
   /**
    * The server url that all events will be sent to.
    * @returns {string}
@@ -183,13 +211,6 @@ export class Configuration implements IConfigurationSettings {
     }
   }
 
-  /**
-   * The heartbeat server url that all heartbeats will be sent to.
-   * @type {string}
-   * @private
-   */
-  private _heartbeatServerUrl: string = 'https://heartbeat.exceptionless.io';
-
   /**
    * The heartbeat server url that all heartbeats will be sent to.
    * @returns {string}
@@ -210,13 +231,6 @@ export class Configuration implements IConfigurationSettings {
     }
   }
 
-  /**
-   * How often the client should check for updated server settings when idle. The default is every 2 minutes.
-   * @type {number}
-   * @private
-   */
-  private _updateSettingsWhenIdleInterval: number = 120000;
-
   /**
    * How often the client should check for updated server settings when idle. The default is every 2 minutes.
    * @returns {number}
@@ -245,20 +259,6 @@ export class Configuration implements IConfigurationSettings {
     this.changed();
   }
 
-  /**
-   * A list of exclusion patterns.
-   * @type {Array}
-   * @private
-   */
-  private _dataExclusions: string[] = [];
-
-  /**
-   * A list of user agent patterns.
-   * @type {Array}
-   * @private
-   */
-  private _userAgentBotPatterns: string[] = [];
-
   /**
    *  A list of exclusion patterns that will automatically remove any data that
    *  matches them from any data submitted to the server.
diff --git a/umd.template.jst b/umd.template.jst
new file mode 100644
index 00000000..cbaeca98
--- /dev/null
+++ b/umd.template.jst
@@ -0,0 +1,35 @@
+<%
+var stdDeps = ['require', 'exports', 'module'];
+
+var amdDeps = stdDeps.concat(_.pluck(deps, 'amdName'));
+var cjsDeps = _.without(_.pluck(deps, 'cjsName'), stdDeps);
+cjsDeps = cjsDeps ? stdDeps.concat(_.map(cjsDeps, function(dep) { return "require('" + dep + "')" })) : stdDeps;
+
+var depNames = deps ? stdDeps.concat(_.pluck(deps, 'paramName')) : stdDeps;
+var globalDeps = deps ? stdDeps.concat(_.map(deps, function(dep) { return 'root.' + dep.globalName })) : stdDeps;
+
+%>
+(function(root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    define('<%= namespace %>', <%= amdDeps ? JSON.stringify(amdDeps) + ', ' : '[], ' %>factory);
+  } else if (typeof exports === 'object') {
+    module.exports = factory(<%= cjsDeps.join(', ') %>);
+  } else {
+    root.<%= namespace %> = factory(<%= globalDeps.join(', ') %>);
+  }
+}(this, function(<%= depNames.join(', ') %>) {
+if (!require) {
+	require = function(name) {
+		return (typeof window !== "undefined" ? window : global)[name];
+	}
+}
+if (!exports) {
+	var exports = {};
+}
+<% if (exports) { %>
+<%= contents %>
+return <%= exports %>;
+<% } else { %>
+return <%= contents %>;
+<% } %>
+}));