{"version":3,"file":"assets/js/pcf_bundle_content.js","mappings":"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","sources":["webpack:///../node_modules/element-remove/index.js","webpack:///../node_modules/eligrey-classlist-js-polyfill/classList.js","webpack:///../node_modules/smart-timeout/index.js","webpack:///../node_modules/smart-timeout/lib/timeout.js","webpack:///./typescript/PCF/flyout-content-controller.ts","webpack:///./typescript/PCF/flyout-content.ts","webpack:///./typescript/PCF/flyout-controller.ts","webpack:///./typescript/PCF/notification-service.ts","webpack:///./typescript/PCF/stickyFlyOutNotificationService.ts","webpack:///./typescript/TP/CompareButton.ts","webpack:///./typescript/TP/MobileToolbarButton.ts","webpack:///./typescript/TP/TileScaleButton.ts","webpack:///./typescript/TP/TileScaleButtonEx.ts","webpack:///./typescript/TP/TouchPointFactory.ts","webpack:///./typescript/TP/TouchPointIdentifier.ts","webpack:///./typescript/errorhandler.ts","webpack:///./typescript/helpers/MpcScopeDetection.ts","webpack:///./typescript/helpers/MpcSettings.ts","webpack:///./typescript/helpers/call-limiter.ts","webpack:///./typescript/helpers/comparePageButtonUrlUpdater.ts","webpack:///./typescript/helpers/deviceDetectionHelper.ts","webpack:///./typescript/helpers/event-bus.ts","webpack:///./typescript/helpers/htmlElementsHelper.ts","webpack:///./typescript/helpers/navigationService.ts","webpack:///./typescript/helpers/polyfills.ts","webpack:///./typescript/helpers/scrollLock.ts","webpack:///./typescript/helpers/vanillajax.ts","webpack:///./typescript/local-storage-service.ts","webpack:///../node_modules/axios/dist/browser/axios.cjs","webpack:///webpack/bootstrap","webpack:///webpack/runtime/global","webpack:///webpack/runtime/make namespace object","webpack:///./pcf-bundle-content.ts"],"sourcesContent":["(function (arr) {\n arr.forEach(function (item) {\n if (item.hasOwnProperty('remove')) {\n return;\n }\n Object.defineProperty(item, 'remove', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function remove() {\n this.parentNode && this.parentNode.removeChild(this);\n }\n });\n });\n})([Element.prototype, CharacterData.prototype, DocumentType.prototype].filter(Boolean));\n","/*\n * classList.js: Cross-browser full element.classList implementation.\n * 1.2.20180112\n *\n * By Eli Grey, http://eligrey.com\n * License: Dedicated to the public domain.\n * See https://github.com/eligrey/classList.js/blob/master/LICENSE.md\n */\n\n/*global self, document, DOMException */\n\n/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js */\n\nif (\"document\" in self) {\n\n// Full polyfill for browsers with no classList support\n// Including IE < Edge missing SVGElement.classList\nif (\n\t !(\"classList\" in document.createElement(\"_\")) \n\t|| document.createElementNS\n\t&& !(\"classList\" in document.createElementNS(\"http://www.w3.org/2000/svg\",\"g\"))\n) {\n\n(function (view) {\n\n\"use strict\";\n\nif (!('Element' in view)) return;\n\nvar\n\t classListProp = \"classList\"\n\t, protoProp = \"prototype\"\n\t, elemCtrProto = view.Element[protoProp]\n\t, objCtr = Object\n\t, strTrim = String[protoProp].trim || function () {\n\t\treturn this.replace(/^\\s+|\\s+$/g, \"\");\n\t}\n\t, arrIndexOf = Array[protoProp].indexOf || function (item) {\n\t\tvar\n\t\t\t i = 0\n\t\t\t, len = this.length\n\t\t;\n\t\tfor (; i < len; i++) {\n\t\t\tif (i in this && this[i] === item) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\t// Vendors: please allow content code to instantiate DOMExceptions\n\t, DOMEx = function (type, message) {\n\t\tthis.name = type;\n\t\tthis.code = DOMException[type];\n\t\tthis.message = message;\n\t}\n\t, checkTokenAndGetIndex = function (classList, token) {\n\t\tif (token === \"\") {\n\t\t\tthrow new DOMEx(\n\t\t\t\t \"SYNTAX_ERR\"\n\t\t\t\t, \"The token must not be empty.\"\n\t\t\t);\n\t\t}\n\t\tif (/\\s/.test(token)) {\n\t\t\tthrow new DOMEx(\n\t\t\t\t \"INVALID_CHARACTER_ERR\"\n\t\t\t\t, \"The token must not contain space characters.\"\n\t\t\t);\n\t\t}\n\t\treturn arrIndexOf.call(classList, token);\n\t}\n\t, ClassList = function (elem) {\n\t\tvar\n\t\t\t trimmedClasses = strTrim.call(elem.getAttribute(\"class\") || \"\")\n\t\t\t, classes = trimmedClasses ? trimmedClasses.split(/\\s+/) : []\n\t\t\t, i = 0\n\t\t\t, len = classes.length\n\t\t;\n\t\tfor (; i < len; i++) {\n\t\t\tthis.push(classes[i]);\n\t\t}\n\t\tthis._updateClassName = function () {\n\t\t\telem.setAttribute(\"class\", this.toString());\n\t\t};\n\t}\n\t, classListProto = ClassList[protoProp] = []\n\t, classListGetter = function () {\n\t\treturn new ClassList(this);\n\t}\n;\n// Most DOMException implementations don't allow calling DOMException's toString()\n// on non-DOMExceptions. Error's toString() is sufficient here.\nDOMEx[protoProp] = Error[protoProp];\nclassListProto.item = function (i) {\n\treturn this[i] || null;\n};\nclassListProto.contains = function (token) {\n\treturn ~checkTokenAndGetIndex(this, token + \"\");\n};\nclassListProto.add = function () {\n\tvar\n\t\t tokens = arguments\n\t\t, i = 0\n\t\t, l = tokens.length\n\t\t, token\n\t\t, updated = false\n\t;\n\tdo {\n\t\ttoken = tokens[i] + \"\";\n\t\tif (!~checkTokenAndGetIndex(this, token)) {\n\t\t\tthis.push(token);\n\t\t\tupdated = true;\n\t\t}\n\t}\n\twhile (++i < l);\n\n\tif (updated) {\n\t\tthis._updateClassName();\n\t}\n};\nclassListProto.remove = function () {\n\tvar\n\t\t tokens = arguments\n\t\t, i = 0\n\t\t, l = tokens.length\n\t\t, token\n\t\t, updated = false\n\t\t, index\n\t;\n\tdo {\n\t\ttoken = tokens[i] + \"\";\n\t\tindex = checkTokenAndGetIndex(this, token);\n\t\twhile (~index) {\n\t\t\tthis.splice(index, 1);\n\t\t\tupdated = true;\n\t\t\tindex = checkTokenAndGetIndex(this, token);\n\t\t}\n\t}\n\twhile (++i < l);\n\n\tif (updated) {\n\t\tthis._updateClassName();\n\t}\n};\nclassListProto.toggle = function (token, force) {\n\tvar\n\t\t result = this.contains(token)\n\t\t, method = result ?\n\t\t\tforce !== true && \"remove\"\n\t\t:\n\t\t\tforce !== false && \"add\"\n\t;\n\n\tif (method) {\n\t\tthis[method](token);\n\t}\n\n\tif (force === true || force === false) {\n\t\treturn force;\n\t} else {\n\t\treturn !result;\n\t}\n};\nclassListProto.replace = function (token, replacement_token) {\n\tvar index = checkTokenAndGetIndex(token + \"\");\n\tif (~index) {\n\t\tthis.splice(index, 1, replacement_token);\n\t\tthis._updateClassName();\n\t}\n}\nclassListProto.toString = function () {\n\treturn this.join(\" \");\n};\n\nif (objCtr.defineProperty) {\n\tvar classListPropDesc = {\n\t\t get: classListGetter\n\t\t, enumerable: true\n\t\t, configurable: true\n\t};\n\ttry {\n\t\tobjCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);\n\t} catch (ex) { // IE 8 doesn't support enumerable:true\n\t\t// adding undefined to fight this issue https://github.com/eligrey/classList.js/issues/36\n\t\t// modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected\n\t\tif (ex.number === undefined || ex.number === -0x7FF5EC54) {\n\t\t\tclassListPropDesc.enumerable = false;\n\t\t\tobjCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);\n\t\t}\n\t}\n} else if (objCtr[protoProp].__defineGetter__) {\n\telemCtrProto.__defineGetter__(classListProp, classListGetter);\n}\n\n}(self));\n\n}\n\n// There is full or partial native classList support, so just check if we need\n// to normalize the add/remove and toggle APIs.\n\n(function () {\n\t\"use strict\";\n\n\tvar testElement = document.createElement(\"_\");\n\n\ttestElement.classList.add(\"c1\", \"c2\");\n\n\t// Polyfill for IE 10/11 and Firefox <26, where classList.add and\n\t// classList.remove exist but support only one argument at a time.\n\tif (!testElement.classList.contains(\"c2\")) {\n\t\tvar createMethod = function(method) {\n\t\t\tvar original = DOMTokenList.prototype[method];\n\n\t\t\tDOMTokenList.prototype[method] = function(token) {\n\t\t\t\tvar i, len = arguments.length;\n\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\ttoken = arguments[i];\n\t\t\t\t\toriginal.call(this, token);\n\t\t\t\t}\n\t\t\t};\n\t\t};\n\t\tcreateMethod('add');\n\t\tcreateMethod('remove');\n\t}\n\n\ttestElement.classList.toggle(\"c3\", false);\n\n\t// Polyfill for IE 10 and Firefox <24, where classList.toggle does not\n\t// support the second argument.\n\tif (testElement.classList.contains(\"c3\")) {\n\t\tvar _toggle = DOMTokenList.prototype.toggle;\n\n\t\tDOMTokenList.prototype.toggle = function(token, force) {\n\t\t\tif (1 in arguments && !this.contains(token) === !force) {\n\t\t\t\treturn force;\n\t\t\t} else {\n\t\t\t\treturn _toggle.call(this, token);\n\t\t\t}\n\t\t};\n\n\t}\n\n\t// replace() polyfill\n\tif (!(\"replace\" in document.createElement(\"_\").classList)) {\n\t\tDOMTokenList.prototype.replace = function (token, replacement_token) {\n\t\t\tvar\n\t\t\t\t tokens = this.toString().split(\" \")\n\t\t\t\t, index = tokens.indexOf(token + \"\")\n\t\t\t;\n\t\t\tif (~index) {\n\t\t\t\ttokens = tokens.slice(index);\n\t\t\t\tthis.remove.apply(this, tokens);\n\t\t\t\tthis.add(replacement_token);\n\t\t\t\tthis.add.apply(this, tokens.slice(1));\n\t\t\t}\n\t\t}\n\t}\n\n\ttestElement = null;\n}());\n\n}","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar timeout_1 = require(\"./lib/timeout\");\nmodule.exports = timeout_1.Timeout;\n//# sourceMappingURL=index.js.map\n","\"use strict\";\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MetadataRecord = /** @class */ (function () {\n function MetadataRecord(callback, key, ms, params) {\n this.callback = callback;\n this.key = key;\n this.ms = ms;\n this.params = params;\n this.paused = false;\n this.startTime = new Date().getTime();\n this.timeSpentWaiting = 0;\n }\n return MetadataRecord;\n}());\nvar Timeout = /** @class */ (function () {\n function Timeout() {\n }\n /**\n * clear timeout and optionally erase all knowledge of its existence\n * @param key\n * @param erase\n */\n Timeout.clear = function (key, erase) {\n if (erase === void 0) { erase = true; }\n clearTimeout(Timeout.keyId[key]);\n delete Timeout.keyId[key];\n delete Timeout.keyCall[key];\n if (erase) {\n delete Timeout.metadata[key];\n delete Timeout.originalMs[key];\n }\n };\n Timeout.set = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var key;\n var ms;\n var params;\n var callback;\n if (args.length === 0) {\n throw Error('Timeout.set() requires at least one argument');\n }\n if (typeof args[1] === 'function') {\n key = args[0], callback = args[1], ms = args[2], params = args.slice(3);\n }\n else {\n callback = args[0], ms = args[1], params = args.slice(2);\n key = callback.toString();\n }\n if (!callback) {\n throw Error('Timeout.set() requires a callback parameter');\n }\n Timeout.clear(key);\n var invoke = function () {\n Timeout.metadata[key].executedTime = new Date().getTime();\n callback.apply(void 0, params);\n };\n Timeout.keyId[key] = setTimeout(invoke, ms || 0);\n Timeout.keyCall[key] = function () { return callback.apply(void 0, params); };\n Timeout.originalMs[key] = Timeout.originalMs[key] || ms;\n Timeout.metadata[key] = new MetadataRecord(callback, key, ms, params);\n return function () { return Timeout.executed(key); };\n };\n Timeout.create = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (args.length === 0) {\n throw Error('Timeout.create() requires at least one argument');\n }\n var key;\n if (typeof args[1] === 'function') {\n key = args[0];\n }\n else {\n var callback = args[0];\n key = callback.toString();\n }\n return Timeout.exists(key) ? false : Timeout.set.apply(Timeout, args);\n };\n /**\n * elapsed time since the timeout was created\n * @param key\n */\n Timeout.elapsed = function (key) {\n var metaDataRecord = Timeout.metadata[key];\n if (!metaDataRecord)\n return 0;\n return Math.max(0, new Date().getTime() - metaDataRecord.startTime);\n };\n /**\n * timeout has been created\n * @param key\n */\n Timeout.exists = function (key) {\n return key in Timeout.keyId || (Timeout.metadata)[key] !== undefined;\n };\n /**\n * fire the callback on demand, without affecting the timeout or meta data (execution time)\n * @param key\n * @returns {(false|any)} false if timeout does not exist or the return value of the callback\n */\n Timeout.call = function (key) {\n return Timeout.exists(key) && (Timeout.keyCall)[key]();\n };\n /**\n * test if a timeout has run\n * @param key\n */\n Timeout.executed = function (key) {\n return Timeout.exists(key) && !!Timeout.metadata[key].executedTime;\n };\n /**\n * when timeout was last executed\n * @param key\n */\n Timeout.lastExecuted = function (key) {\n return !Timeout.executed(key)\n ? null\n : new Date(Timeout.metadata[key].executedTime);\n };\n /**\n * metadata about a timeout\n * @param key\n */\n Timeout.meta = function (key) {\n return Timeout.metadata[key];\n };\n /**\n * timeout does exist, but has not yet run\n * @param key\n */\n Timeout.pending = function (key) {\n return Timeout.exists(key) && !Timeout.executed(key);\n };\n /**\n * timeout does exist, but will not execute because it is paused\n * @param key\n */\n Timeout.paused = function (key) {\n return Timeout.exists(key)\n && !Timeout.executed(key)\n && Timeout.metadata[key].paused;\n };\n /**\n * remaining time until timeout will occur\n * @param key\n */\n Timeout.remaining = function (key) {\n if (!Timeout.metadata[key])\n return 0;\n var metaDataRecord = Timeout.metadata[key];\n return Timeout.paused(key)\n ? metaDataRecord.ms - metaDataRecord.timeSpentWaiting\n : Math.max(0, metaDataRecord.startTime + metaDataRecord.ms - new Date().getTime());\n };\n /**\n * set timeout anew, optionally with new time and params\n * @param key\n * @param ms new millisecs before execution\n * @param params new parameters to callback\n */\n Timeout.reset = function (key, ms) {\n var params = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n params[_i - 2] = arguments[_i];\n }\n var metaDataRecord = Timeout.metadata[key];\n if (!metaDataRecord)\n return false;\n Timeout.clear(key, false);\n if (metaDataRecord.paused) {\n metaDataRecord.paused = false;\n }\n return Timeout.set.apply(Timeout, __spreadArrays([key,\n metaDataRecord.callback, ms !== null && ms !== void 0 ? ms : Timeout.originalMs[key]], (params || metaDataRecord.params)));\n };\n /**\n * restart timeout with original time\n * @param key\n * @param force restart even even if not yet executed\n */\n Timeout.restart = function (key, force) {\n if (force === void 0) { force = false; }\n if (!Timeout.metadata[key] || (!force && Timeout.executed(key)))\n return false;\n var metaDataRecord = Timeout.metadata[key];\n Timeout.clear(key, false);\n if (metaDataRecord.paused) {\n metaDataRecord.paused = false;\n }\n return Timeout.set.apply(Timeout, __spreadArrays([key, metaDataRecord.callback, Timeout.originalMs[key]], metaDataRecord.params));\n };\n /**\n * pause our execution countdown until we're ready for it to resume\n * @param key\n */\n Timeout.pause = function (key) {\n if (!Timeout.metadata[key] || Timeout.paused(key) || Timeout.executed(key))\n return false;\n Timeout.clear(key, false);\n var metaDataRecord = Timeout.metadata[key];\n metaDataRecord.paused = true;\n metaDataRecord.timeSpentWaiting = new Date().getTime() - metaDataRecord.startTime;\n return metaDataRecord.timeSpentWaiting;\n };\n /**\n * resume paused Timeout with the remaining time\n * @param key\n */\n Timeout.resume = function (key) {\n if (!Timeout.metadata[key] || Timeout.executed(key))\n return false;\n var metaDataRecord = Timeout.metadata[key];\n if (!metaDataRecord.paused)\n return false;\n var originalMs = Timeout.originalMs[key];\n var remainingTime = metaDataRecord.ms - metaDataRecord.timeSpentWaiting;\n var result = Timeout.set.apply(Timeout, __spreadArrays([key, metaDataRecord.callback, remainingTime], metaDataRecord.params));\n Timeout.originalMs[key] = originalMs;\n return result;\n };\n Timeout.instantiate = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var key;\n var ms;\n var params;\n var callback;\n if (args.length === 0) {\n throw Error('Timeout.set() requires at least one argument');\n }\n var linkToExisting = args.length === 1 && typeof args[0] !== 'function';\n // hooking up to an existing timeout\n if (linkToExisting) {\n key = args[0];\n var metadata = Timeout.meta(key);\n if (!metadata) {\n throw Error('Timeout.instantiate() attempted to link to nonexistent object by key');\n }\n ms = metadata.ms;\n params = metadata.params;\n callback = metadata.callback;\n }\n else if (typeof args[1] === 'function') {\n key = args[0], callback = args[1], ms = args[2], params = args.slice(3);\n }\n else {\n callback = args[0], ms = args[1], params = args.slice(2);\n key = (\"\" + Math.random() + callback).replace(/\\s/g, '');\n }\n if (!callback) {\n throw Error('Timeout.instantiate() requires a function parameter');\n }\n if (!linkToExisting) {\n Timeout.set.apply(Timeout, __spreadArrays([key, callback, ms], params));\n }\n return {\n call: function () { return Timeout.call(key); },\n clear: function (erase) {\n if (erase === void 0) { erase = true; }\n return Timeout.clear(key, erase);\n },\n elapsed: function () { return Timeout.elapsed(key); },\n executed: function () { return Timeout.executed(key); },\n exists: function () { return Timeout.exists(key); },\n lastExecuted: function () { return Timeout.lastExecuted(key); },\n meta: function () { return Timeout.meta(key); },\n pause: function () { return Timeout.pause(key); },\n paused: function () { return Timeout.paused(key); },\n pending: function () { return Timeout.pending(key); },\n remaining: function () { return Timeout.remaining(key); },\n reset: function (ms) {\n var params = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n params[_i - 1] = arguments[_i];\n }\n return Timeout.reset.apply(Timeout, __spreadArrays([key, ms], params));\n },\n restart: function () { return Timeout.restart(key); },\n resume: function () { return Timeout.resume(key); },\n set: function (newCallback, newMs) {\n if (newMs === void 0) { newMs = 0; }\n var newParams = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n newParams[_i - 2] = arguments[_i];\n }\n return Timeout.set.apply(Timeout, __spreadArrays([key, newCallback, newMs], newParams));\n },\n };\n };\n Timeout.keyId = {};\n Timeout.keyCall = {};\n Timeout.originalMs = {};\n Timeout.metadata = {};\n return Timeout;\n}());\nexports.Timeout = Timeout;\n//# sourceMappingURL=timeout.js.map","import { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\nimport { MPCFlyoutContent } from \"./flyout-content\";\nimport { MPCNotificationService } from \"./notification-service\";\nimport { MPCNavigationService } from \"../helpers/navigationService\";\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\nimport { ProductComparisonModel, Product } from \"../../../Models/Product.generated\";\nimport { MPCComparePageButtonUrlUpdater } from \"../helpers/comparePageButtonUrlUpdater\";\nimport { MPCLocalStorageService } from \"../local-storage-service\";\nimport { MPCScopeDetection } from \"../helpers/MpcScopeDetection\";\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\n\nconst ArrowUpIcon = require(\"../../images/arrow-up.svg\") as string;\nconst ArrowRightIcon = require(\"../../images/arrow-right-2021.svg\") as string;\n\nexport module MPCFlyoutContentController {\n import IFlyoutContentController = MPCIFlyoutContentController.IFlyoutContentController;\n import NotificationService = MPCNotificationService.NotificationService;\n import FlyoutContent = MPCFlyoutContent.FlyoutContent;\n import NavigationService = MPCNavigationService.NavigationService;\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n import ComparePageButtonUrlUpdater = MPCComparePageButtonUrlUpdater.ComparePageButtonUrlUpdater;\n import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\n import ScopeDetection = MPCScopeDetection.ScopeDetection;\n import MpcSettings = MpcSettingsModule.MpcSettings;\n\n export class FlyoutContentController implements IFlyoutContentController {\n private flyoutContentObject: FlyoutContent;\n private static _instance: FlyoutContentController;\n private flyoutContentContainer: HTMLElement;\n private readonly flyoutContentScope: HTMLElement;\n private notificationService: NotificationService;\n private navigationService: NavigationService;\n private flyoutHeader: HTMLElement;\n private deviceDetectionHelper: DeviceDetectionHelper;\n private comparePageButtonUrlUpdater: ComparePageButtonUrlUpdater;\n private productComparisonModelManager: ProductComparisonModelManager;\n private flyoutIconContainer: HTMLElement;\n private disabledFromFocus: boolean;\n \n static get instance() {\n return this._instance || (this._instance = new this());\n }\n \n constructor() {\n this.flyoutContentScope = document.querySelector('.pcf-flyout-content-scope');\n\n if (!this.flyoutContentScope) {\n return;\n }\n\n this.init();\n this.handleFicClick = this.handleFicClick.bind(this);\n }\n \n private init(): void {\n this.disabledFromFocus = true;\n this.flyoutIconContainer = document.querySelector('.pcf-scope');\n\n MpcSettings.instance.init(this.flyoutIconContainer);\n\n this.loadFlyoutIcons();\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n this.notificationService = NotificationService.instance;\n this.notificationService.flyoutContentController = this;\n\n if(!this.deviceDetectionHelper.isMobileShop()) {\n this.comparePageButtonUrlUpdater = ComparePageButtonUrlUpdater.instance;\n this.comparePageButtonUrlUpdater.init(this.flyoutContentScope);\n }\n\n // check local storage\n this.productComparisonModelManager = ProductComparisonModelManager.instance;\n this.checkCurrentLocalStorage();\n \n this.flyoutContentContainer = this.flyoutContentScope.querySelector('.flyout');\n this.flyoutHeader = this.flyoutContentContainer.querySelector('.flyout-header');\n\n this.flyoutContentObject = new FlyoutContent();\n\n this.navigationService = NavigationService.instance;\n this.navigationService.init(this.flyoutHeader, 'data-pcf-navigation-key', this.flyoutContentObject);\n\n const closeFlyoutBtn = this.flyoutHeader.querySelector('.close-flyout-btn');\n\n this.flyoutContentObject.init(this.flyoutContentContainer, this.navigationService, this, closeFlyoutBtn);\n \n // close/show flyout events\n this.registerEventHandlers();\n }\n\n private loadFlyoutIcons(): void {\n const closeArrow: HTMLElement = this.flyoutContentScope.querySelector('.close-arrow');\n const compareButtonIcon: HTMLElement = this.flyoutContentScope.querySelector('.compare-button-icon');\n\n closeArrow.innerHTML = ArrowUpIcon;\n compareButtonIcon.innerHTML = ArrowRightIcon;\n }\n\n private registerEventHandlers(): void {\n // For tab navigation:\n this.flyoutIconContainer.addEventListener('click', () => { this.handleFicClick() });\n\n const titleContainer: HTMLElement = this.flyoutHeader.querySelector('.title-container');\n const titleCloseFlyoutBtn: HTMLElement = titleContainer.querySelector('.close-flyout-btn');\n titleCloseFlyoutBtn.addEventListener('click', () => { this.handleCloseClickFromFlyoutFragment() }); \n\n window.shell.subscribeTo('ESMKT.HeadR.FlyoutClosed', () => { this.cleanUpEmptyContent(); }, 'ESMKT.HeadR.FlyoutClosed');\n }\n\n private handleFicClick(): void {\n this.disabledFromFocus = !this.disabledFromFocus;\n this.flyoutContentScope.toggleAttribute('disabled', this.disabledFromFocus);\n this.flyoutContentScope.toggleAttribute('group', !this.disabledFromFocus);\n }\n\n public hideFlyoutContent(): void {\n this.flyoutContentContainer.classList.remove('pcf-show-flyout');\n }\n\n public handleFlyoutIconClick(): void {\n if (!this.flyoutContentContainer.classList.toggle('pcf-show-flyout')) {\n this.cleanUpEmptyContent();\n }\n }\n\n private handleCloseClickFromFlyoutFragment(): void {\n window.shell.publishTo('ESMKT.HeadR.ToggleFlyout', 'ManualProductComparison');\n this.cleanUpEmptyContent();\n }\n\n public refresh(model: ProductComparisonModel): void {\n this.flyoutContentObject.refresh(model);\n if (model && model.activeNavigationTab) {\n const newTabActivated: boolean = this.flyoutContentObject.setActiveNavigationTab(model.activeNavigationTab);\n \n // in case when user click go to category page from empty tab with removed all products. \n // We will still have same active tab, because another one was not clicked yet.\n if(!newTabActivated) {\n this.flyoutContentObject.updateContainerListVisibility(this.navigationService.markAnyNavigationTabActive());\n }\n }\n }\n\n public addProduct(salesArticleVariantKey: string, seoSlug: string, origin: string): void {\n this.flyoutContentObject.addProduct(salesArticleVariantKey, seoSlug, origin).then((product: Product) => {\n this.flyoutContentObject.setActiveNavigationTab(product.categoryName);\n });\n\n // show Pcf Scope:\n if (!this.deviceDetectionHelper.isMobileShop()) {\n window.shell.publishTo('ManualProductComparison.ShowPcfScope', undefined);\n }\n }\n\n public addProductByCompareLink(maNo: number, colorCode: number): void {\n this.flyoutContentObject.addProductByMasterArticleNo(maNo, colorCode, \"content-page\").then((product: Product) => {\n this.flyoutContentObject.setActiveNavigationTab(product.categoryName);\n });\n\n // show Pcf Scope:\n if (!this.deviceDetectionHelper.isMobileShop()) {\n window.shell.publishTo('ManualProductComparison.ShowPcfScope', undefined);\n }\n }\n\n public removeProductTP(salesArticleVariantKey: string): void {\n this.flyoutContentObject.removeProductTP(salesArticleVariantKey);\n \n this.cleanUpEmptyContent();\n }\n\n public updateProductsCounter(counterNumber: number): void {\n const productsCounter: HTMLElement = this.flyoutIconContainer.querySelector('.products-counter');\n \n let counter: number = Number(productsCounter.textContent.trim());\n counter += counterNumber;\n \n productsCounter.innerText = counter.toString();\n }\n\n private cleanUpEmptyContent(): void {\n this.disabledFromFocus = true;\n this.flyoutContentScope.toggleAttribute('disabled', this.disabledFromFocus);\n\n this.flyoutContentObject.removeEmptyContainerList();\n this.navigationService.removeEmptyNavigationTabs();\n\n if (this.isFlyoutContentEmpty()) {\n if (!this.deviceDetectionHelper.isMobileShop()) {\n window.shell.publishTo('ManualProductComparison.HidePcfScope', undefined);\n }\n }\n }\n\n private isFlyoutContentEmpty(): boolean {\n return this.flyoutContentObject.isFlyoutContentEmpty();\n }\n\n private announceNavigationTabCleanUpOutsidePcp(productComparisonModel: ProductComparisonModel): void {\n const emptyNavigationTabs = productComparisonModel.emptyNavigationTabs;\n\n if (emptyNavigationTabs.length && ScopeDetection.hasScopes(false, true))\n this.productComparisonModelManager.setClearStoredEmptyNavigationTabs(true);\n }\n\n private checkCurrentLocalStorage(): void {\n this.productComparisonModelManager.getModel()\n .then((productComparisonModel: ProductComparisonModel) => {\n if (productComparisonModel && productComparisonModel.products && productComparisonModel.products.length > 0) {\n // init and update flyout:\n this.refresh(productComparisonModel);\n }\n else {\n // clear existing flyout content\n this.refresh(null);\n }\n this.announceNavigationTabCleanUpOutsidePcp(productComparisonModel);\n });\n }\n\n public checkIsProductAlreadyAdded(salesArticleVariantKey: string): boolean {\n return this.productComparisonModelManager.checkIsProductAlreadyAdded(salesArticleVariantKey);\n }\n\n }\n}\n\nif (window.shell)\n MPCFlyoutContentController.FlyoutContentController.instance;","import { MPCLocalStorageService } from \"../local-storage-service\";\nimport {MPCAddElementContext} from \"../typings/addElementContext\";\nimport {MPCGetProductInfoByCompareLinkContext} from '../typings/GetProductInfoByCompareLinkContext';\nimport {NlVanillajax, INlVanillajaxParams} from \"../helpers/vanillajax\";\nimport {MPCINavigationService} from \"../typings/iNavigationService\";\nimport {MPCIAbstractContent} from \"../typings/iAbstractContent\";\nimport { MPCIFlyoutContentController} from \"../typings/iFlyoutContentController\";\nimport {MPCEventBus} from \"../helpers/event-bus\";\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\nimport { ProductComparisonModel, Product } from \"../../../Models/Product.generated\";\nconst RecycleBinIcon = require(\"../../images/icon_remove.svg\") as string;\nconst PlusIcon = require(\"../../images/plus-2021.svg\") as string;\nimport { MPCErrorHandlerModule } from \"../errorhandler\";\nimport { ErrorMessage } from \"../../../Models/ErrorMessage.generated\";\n\nexport module MPCFlyoutContent {\n import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\n import AddElementContext = MPCAddElementContext.AddElementContext;\n import GetProductInfoByCompareLinkContext = MPCGetProductInfoByCompareLinkContext.GetProductInfoByCompareLinkContext;\n import INavigationService = MPCINavigationService.INavigationService;\n import IAbstractContent = MPCIAbstractContent.IAbstractContent;\n import IFlyoutContentController = MPCIFlyoutContentController.IFlyoutContentController;\n import EventBus = MPCEventBus.EventBus;\n import MpcSettings = MpcSettingsModule.MpcSettings;\n import ErrorHandlerManager = MPCErrorHandlerModule.ErrorHandlerManager;\n\n export class FlyoutContent implements IAbstractContent {\n private productComparisonModelManager: ProductComparisonModelManager;\n private eventBus: EventBus;\n private listContainersArray: Array;\n private flyoutContent: HTMLElement;\n private navigationService: INavigationService;\n private oldListContainer: HTMLElement;\n private iFlyoutContentController: IFlyoutContentController;\n private emptyProductSlotTitle: string;\n private clearFlyoutCategoryBtnTitle: string;\n private activeCategoryTabName: string;\n private closeFlyoutBtn: Element;\n\n init(flyout: Element, navigationService: INavigationService, iFlyoutContentController: IFlyoutContentController, closeFlyoutBtn: Element): void {\n this.productComparisonModelManager = ProductComparisonModelManager.instance;\n this.eventBus = MPCEventBus.EventBus.instance;\n this.flyoutContent = flyout.querySelector('.flyout-content');\n this.emptyProductSlotTitle = this.flyoutContent.getAttribute(\"data-EmptyProductSlotTitle\");\n this.clearFlyoutCategoryBtnTitle = this.flyoutContent.getAttribute(\"data-ClearFlyoutCategoryBtnTitle\");\n this.listContainersArray = new Array();\n this.navigationService = navigationService;\n this.iFlyoutContentController = iFlyoutContentController;\n this.closeFlyoutBtn = closeFlyoutBtn;\n }\n\n private clearCategoryProducts(listContainer: HTMLElement): void {\n const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\n const listItems: NodeListOf = itemsContainer.querySelectorAll('.list-item:not(.empty-list-item)');\n const listItemsArray: Array = Array.prototype.slice.call(listItems);\n \n for (const listItem of listItemsArray) {\n this.removeProduct(listContainer, listItem, true);\n }\n\n const categoryName: string = this.getListContainerCategoryName(listContainer);\n this.productComparisonModelManager.removeAllProductsOfCategory(categoryName);\n }\n\n public refresh(model: ProductComparisonModel): void {\n if(model && model.products && model.products.length) {\n for (const newProduct of model.products) {\n this.addProductToFlyoutContent(newProduct);\n }\n if (!model.activeNavigationTab) {\n this.navigationService.markActiveNavigationTab(model.products[0].categoryName);\n }\n }\n else {\n if(this.listContainersArray) {\n for (const listContainer of this.listContainersArray) {\n this.clearCategoryProducts(listContainer);\n }\n }\n }\n }\n \n public addProduct(savKey: string, seoSlug: string, origin: string): Promise {\n const context: AddElementContext = new class implements AddElementContext {\n salesArticleVariantKey: string;\n originSeoSlug: string;\n origin: string;\n };\n context.salesArticleVariantKey = savKey;\n context.originSeoSlug = seoSlug;\n context.origin = origin;\n\n // Call controller method, via ajax, and get image and text info from MPC\n let params: INlVanillajaxParams = {};\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\"Products/GetProductInfo\";\n params.data = JSON.stringify(context);\n\n let nlVanillajax = new NlVanillajax(params);\n let postWithPromise = nlVanillajax.postWithPromise();\n postWithPromise.then((productDataFromService: Product) => {\n this.handleProductInfoToAdd(productDataFromService);\n return productDataFromService;\n })\n .catch((err) => {\n //TODO user notification\n //console.error('could not retrieve product info', err.statusText);\n });\n return postWithPromise;\n }\n \n public addProductByMasterArticleNo(maNo: number, colorCode: number, origin: string): Promise {\n const context = {} as GetProductInfoByCompareLinkContext;\n context.masterArticleNo = maNo;\n context.colorCode = colorCode;\n context.origin = origin;\n\n // Call controller method, via ajax, and get image and text info from MPC\n let params: INlVanillajaxParams = {};\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\"Products/GetProductInfoByCompareLink\";\n params.data = JSON.stringify(context);\n\n return new NlVanillajax(params).postWithPromise()\n .then((productDataFromService: Product) => {\n this.handleProductInfoToAdd(productDataFromService);\n return productDataFromService;\n })\n .catch((err) => {\n ErrorHandlerManager.instance.LogError({\n message: \"error getting product info because: \" +\n err +\n \", masterArticleNo: \" +\n maNo\n }); \n });\n }\n\n private handleProductInfoToAdd(productDataFromService: Product) {\n // Handle the response and add article or show notification for customer\n let productAdded: MPCLocalStorageService.AddResult;\n\n if (productDataFromService) {\n productAdded = this.productComparisonModelManager.addProduct(productDataFromService);\n if (productAdded === MPCLocalStorageService.AddResult.Added) {\n this.addProductToFlyoutContent(productDataFromService);\n\n // notify touch points that products are added\n this.eventBus.publish(\"flyout.product-added\", productDataFromService.articleId.salesArticleVariantKey);\n } else if (productAdded === MPCLocalStorageService.AddResult.Replaced) {\n this.changeProductVariantInFlyoutContent(productDataFromService);\n this.eventBus.publish(\"flyout.product-replaced\", productDataFromService.articleId.salesArticleVariantKey);\n }\n if (productAdded !== MPCLocalStorageService.AddResult.RejectedCapacity) {\n this.setActiveNavigationTab(productDataFromService.categoryName);\n }\n }\n }\n\n private removeProduct(listContainer: HTMLElement, listItem: HTMLElement, onlyDom: boolean = false): void {\n // current element will be removed from DOM, so we need to move to next one:\n if (window.shell.tabNav !== undefined)\n window.shell.tabNav.focusNext();\n\n const categoryName: string = this.getListContainerCategoryName(listContainer);\n const savKey: string = listItem.getAttribute('data-pcf-sav-key');\n const categoryUrl: string = listContainer.getAttribute('data-pcf-categoryUrl');\n const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\n\n let productRemoved: boolean = true;\n if (!onlyDom) {\n // call remove method on service:\n productRemoved = this.productComparisonModelManager.removeProduct(categoryName, savKey) != null;\n }\n\n if (productRemoved) {\n // store order number before item will be removed from list:\n const tabOrder = listItem.getAttribute('order');\n\n // remove product from flyout:\n itemsContainer.removeChild(listItem);\n itemsContainer.appendChild(this.createEmptyListItem(categoryUrl, tabOrder));\n\n // update flyout header\n this.navigationService.createOrUpdateNavigationTab(categoryName, -1, null, null);\n this.iFlyoutContentController.updateProductsCounter(-1);\n\n // notify touch points and flyout footer\n this.eventBus.publish(\"flyout.product-removed\", savKey);\n }\n }\n\n private changeProductVariantInFlyoutContent(newProduct: Product): void {\n let categoryName: string;\n for (const listContainer of this.listContainersArray) {\n categoryName = this.getListContainerCategoryName(listContainer);\n\n if (categoryName == newProduct.categoryName) {\n for (const item of this.getContainerListItems(listContainer)) {\n if (item.getAttribute(\"data-pcf-masterArticleNo\") === newProduct.articleId.masterArticleNo.toString()) {\n item.setAttribute('data-pcf-sav-key', newProduct.articleId.salesArticleVariantKey);\n item.setAttribute('href', newProduct.detailsPageUrl);\n item.querySelector('.image-slot').setAttribute('src', newProduct.mainImage);\n item.querySelector('.image-slot').setAttribute('alt', newProduct.altTag);\n }\n }\n break;\n }\n }\n }\n\n private addProductToFlyoutContent(newProduct: Product): void {\n let currentListContainer: HTMLElement;\n let listContainerNotExists: boolean = true;\n let categoryName: string;\n\n // look for \"list-container\" with same categoryName or create new one\n for (const listContainer of this.listContainersArray) {\n categoryName = this.getListContainerCategoryName(listContainer);\n \n if(categoryName === newProduct.categoryName)\n {\n this.createListItem(listContainer, newProduct);\n currentListContainer = listContainer;\n listContainerNotExists = false;\n break;\n }\n else {\n listContainerNotExists = true;\n }\n }\n\n if (listContainerNotExists) {\n let newListContainer: HTMLElement = this.createListContainer(newProduct);\n this.createListItem(newListContainer, newProduct);\n this.listContainersArray.push(newListContainer);\n this.flyoutContent.appendChild(newListContainer);\n currentListContainer = newListContainer;\n }\n \n // hide old list container:\n if (this.oldListContainer) {\n this.oldListContainer.style.display = 'none';\n }\n\n currentListContainer.style.display = 'flex';\n this.oldListContainer = currentListContainer;\n\n // update navigation tab:\n this.navigationService.createOrUpdateNavigationTab(newProduct.categoryName, 1, newProduct.navigationOrder, newProduct.articleId.salesArticleVariantKey);\n this.iFlyoutContentController.updateProductsCounter(1);\n }\n \n private createListContainer(newProduct: Product): HTMLElement {\n const newListContainer: HTMLElement = document.createElement('div');\n const newClearListBtn: HTMLElement = document.createElement('div');\n const newItemsContainer: HTMLElement = document.createElement('div');\n const btnId = 'cl_' + newProduct.categoryName;\n\n newItemsContainer.className = 'items-container';\n \n newClearListBtn.className = 'clear-list-btn';\n newClearListBtn.setAttribute('focusable', '');\n newClearListBtn.setAttribute('order', '0');\n\n newClearListBtn.innerHTML = this.clearFlyoutCategoryBtnTitle;\n newClearListBtn.id = btnId;\n newListContainer.className = 'list-container';\n newListContainer.setAttribute('data-pcf-categoryName', newProduct.categoryName);\n newListContainer.setAttribute('data-pcf-categoryUrl', newProduct.categoryUrl);\n newListContainer.setAttribute('group', '');\n\n newListContainer.appendChild(newClearListBtn);\n\n // create empty list items:\n for (let i: number = 0; i < MpcSettings.instance.maxProducts; i++) {\n newItemsContainer.appendChild(\n this.createEmptyListItem(newProduct.categoryUrl, i.toString()));\n }\n\n newClearListBtn.addEventListener('click', () => { this.clearCategoryProducts(newListContainer) });\n newListContainer.appendChild(newItemsContainer);\n\n if (window.shell.tabNav !== undefined)\n window.shell.tabNav.onActivated('#' + btnId, \n () => { window.shell.tabNav.focus(this.closeFlyoutBtn); });\n \n return newListContainer;\n }\n \n private createEmptyListItem(categoryUrl: string, index: string): HTMLElement {\n const newListItem: HTMLElement = document.createElement('a');\n const newProductImageHolder = document.createElement('div');\n const newRemoveProductButton = document.createElement('div');\n const newProductDescription = document.createElement('div');\n const plusIcon: HTMLElement = document.createElement('div');\n\n plusIcon.setAttribute('class', 'mpc-plus');\n plusIcon.innerHTML = PlusIcon;\n\n newProductDescription.innerHTML = this.emptyProductSlotTitle;\n newProductDescription.className = 'description-slot';\n newRemoveProductButton.className = 'remove-item-container';\n newProductImageHolder.className = 'image-holder';\n newListItem.setAttribute(\"href\", categoryUrl);\n newListItem.className = 'list-item empty-list-item';\n newListItem.setAttribute('focusable', '');\n\n newProductImageHolder.appendChild(plusIcon);\n newListItem.appendChild(newProductImageHolder);\n newListItem.appendChild(newRemoveProductButton);\n newListItem.appendChild(newProductDescription);\n \n return newListItem;\n }\n \n private createListItem(listContainer: HTMLElement, newProduct: Product): void {\n const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\n const newListItem: HTMLElement = document.createElement('a');\n const newProductImageHolder = document.createElement('div');\n const newProductImageSlot = document.createElement('img');\n const newRemoveProductButton: HTMLElement = document.createElement('div');\n const newProductDescription = document.createElement('div');\n const itemOriginDetailsPageUrl: string = newProduct.detailsPageUrl.indexOf('?') !== -1 ?\n newProduct.detailsPageUrl + '&itemorigin=productcomparison_flyout' :\n newProduct.detailsPageUrl + '?itemorigin=productcomparison_flyout';\n\n newProductDescription.innerHTML = newProduct.title;\n newProductDescription.className = 'description-slot';\n\n newRemoveProductButton.setAttribute('class', 'mpc-recycle');\n newRemoveProductButton.setAttribute('focusable', '');\n newRemoveProductButton.setAttribute('order', '0');\n newRemoveProductButton.addEventListener('click', (event: MouseEvent) => {\n this.removeProduct(listContainer, newListItem, false);\n event.stopPropagation();\n event.preventDefault();\n });\n newRemoveProductButton.innerHTML = RecycleBinIcon;\n \n newProductImageSlot.className = 'image-slot';\n newProductImageSlot.setAttribute('src', newProduct.mainImage);\n newProductImageSlot.setAttribute('alt', newProduct.altTag);\n \n newProductImageHolder.className = 'image-holder';\n newProductImageHolder.setAttribute('focusable', '');\n newProductImageHolder.setAttribute('order', '1');\n \n newListItem.setAttribute(\"href\", itemOriginDetailsPageUrl);\n\n newListItem.setAttribute(\"data-pcf-masterArticleNo\", newProduct.articleId.masterArticleNo.toString());\n newListItem.className = 'list-item';\n newListItem.setAttribute('data-pcf-sav-key', newProduct.articleId.salesArticleVariantKey);\n newListItem.setAttribute('group', '');\n\n newProductImageHolder.appendChild(newProductImageSlot);\n newListItem.appendChild(newProductImageHolder);\n newListItem.appendChild(newRemoveProductButton);\n newListItem.appendChild(newProductDescription);\n \n // remove empty list item:\n const emptyListItem: HTMLElement = itemsContainer.querySelector('.empty-list-item');\n\n if (!emptyListItem)\n return;\n\n let nextEmpty = emptyListItem.nextElementSibling;\n itemsContainer.removeChild(emptyListItem);\n\n // add new list item\n if (nextEmpty) {\n itemsContainer.insertBefore(newListItem, nextEmpty);\n } else {\n itemsContainer.appendChild(newListItem);\n }\n }\n \n private getListContainerCategoryName(listContainer: HTMLElement): string {\n return listContainer.getAttribute('data-pcf-categoryName');\n }\n \n public removeEmptyContainerList(): void {\n // remove all empty list containers\n if (!this.listContainersArray || this.listContainersArray.length <= 0)\n return;\n\n let removableContainers: Array = new Array();\n let selectFirstTab: boolean = false;\n\n for (const listContainer of this.listContainersArray) {\n const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\n const listItems: NodeListOf = itemsContainer.querySelectorAll('.empty-list-item');\n\n if (listItems.length == MpcSettings.instance.maxProducts) {\n removableContainers.push(listContainer);\n }\n }\n\n for (const tmpContainer of removableContainers) {\n this.flyoutContent.removeChild(tmpContainer);\n this.listContainersArray.splice(this.listContainersArray.indexOf(tmpContainer), 1);\n\n // check does the active navigation tab will be removed like empty one:\n const emptyTabCatName: string = this.getListContainerCategoryName(tmpContainer);\n\n if (emptyTabCatName == this.activeCategoryTabName)\n selectFirstTab = true;\n }\n \n if (this.listContainersArray.length > 0) {\n if (selectFirstTab) {\n const selectedCategoryName: string = this.getListContainerCategoryName(this.listContainersArray[0]);\n this.setActiveNavigationTab(selectedCategoryName);\n }\n else {\n this.setActiveNavigationTab(this.activeCategoryTabName);\n }\n }\n }\n\n public updateContainerListVisibility(activeCategoryTabName: string): void {\n for (const listContainer of this.listContainersArray) {\n const tmpContainerCategoryName: string = this.getListContainerCategoryName(listContainer);\n \n if (tmpContainerCategoryName === activeCategoryTabName) {\n listContainer.style.display = 'flex';\n this.oldListContainer = listContainer;\n } else {\n listContainer.style.display = 'none';\n }\n }\n\n // write it to the localStorage:\n this.activeCategoryTabName = activeCategoryTabName;\n this.productComparisonModelManager.setActiveNavigationTab(activeCategoryTabName);\n }\n\n public isFlyoutContentEmpty(): boolean {\n return this.listContainersArray == null \n || this.listContainersArray == undefined \n || this.listContainersArray.length == 0;\n }\n\n private getContainerListItems(listContainer: HTMLElement): Array {\n const listItems: NodeListOf = listContainer.querySelector('.items-container')\n .querySelectorAll('.list-item');\n return Array.prototype.slice.call(listItems);\n }\n\n public removeProductTP(salesArticleVariantKey: string): void {\n for (const listContainer of this.listContainersArray) {\n const listItemsArray: Array = this.getContainerListItems(listContainer);\n\n for (const listItem of listItemsArray) {\n const savKey: string = listItem.getAttribute('data-pcf-sav-key');\n\n if (savKey === salesArticleVariantKey) {\n this.removeProduct(listContainer, listItem, false);\n break;\n }\n }\n }\n }\n\n setActiveNavigationTab(activeNavigationTab: string): boolean {\n const newTabActivated: boolean = this.navigationService.markActiveNavigationTab(activeNavigationTab);\n \n if(newTabActivated)\n this.updateContainerListVisibility(activeNavigationTab);\n\n return newTabActivated;\n }\n }\n}","import { MPCLocalStorageService } from \"../local-storage-service\";\nimport { MPCIFlyoutController } from \"../typings/iFlyoutController\";\nimport { MPCStickyFlyOutNotificationService } from \"./stickyFlyOutNotificationService\";\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\nimport { MPCComparePageButtonUrlUpdater } from \"../helpers/comparePageButtonUrlUpdater\";\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\nconst ArrowRightIcon = require(\"../../images/arrow-right.svg\") as string;\n\nexport module MPCFlyoutController {\n import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\n import IFlyoutController = MPCIFlyoutController.IFlyoutController;\n import StickyFlyOutNotificationService = MPCStickyFlyOutNotificationService.StickyFlyOutNotificationService;\n import MpcSettings = MpcSettingsModule.MpcSettings;\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n import ComparePageButtonUrlUpdater = MPCComparePageButtonUrlUpdater.ComparePageButtonUrlUpdater;\n\n export class FlyoutController implements IFlyoutController {\n private static _instance: FlyoutController;\n private readonly scope: HTMLElement;\n private productComparisonModelManager: ProductComparisonModelManager;\n private pcfScopeRendered: boolean;\n private stickyFlyOutNotificationService: StickyFlyOutNotificationService;\n private deviceDetectionHelper: DeviceDetectionHelper;\n private comparePageButtonUrlUpdater: ComparePageButtonUrlUpdater;\n\n static get instance() {\n return this._instance || (this._instance = new this());\n }\n \n public constructor() {\n this.scope = document.querySelector('.pcf-scope');\n\n if(!this.scope){\n return;\n }\n\n this.init();\n }\n\n private init(): void {\n this.pcfScopeRendered = false;\n MpcSettings.instance.init(this.scope);\n\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n\n if(this.deviceDetectionHelper.isMobileShop()) {\n this.prepareMobile();\n }\n\n this.productComparisonModelManager = ProductComparisonModelManager.instance;\n\n this.stickyFlyOutNotificationService = new StickyFlyOutNotificationService();\n this.stickyFlyOutNotificationService.init(this.scope);\n this.getCurrentProductsAmount();\n this.loadFlyoutIcons();\n\n this.registerEventHandlers();\n }\n\n private prepareMobile(): void {\n document.body.appendChild(this.scope);\n\n this.comparePageButtonUrlUpdater = ComparePageButtonUrlUpdater.instance;\n this.comparePageButtonUrlUpdater.init(this.scope);\n }\n\n private registerEventHandlers(): void {\n window.shell.subscribeTo(\"ManualProductComparison.ShowPcfScope\", () => {\n this.showPcfScope();\n }, \"ManualProductComparison.ShowPcfScope\");\n\n window.shell.subscribeTo(\"ManualProductComparison.HidePcfScope\", () => {\n this.hidePcfScope();\n }, \"ManualProductComparison.HidePcfScope\");\n\n const flyoutIconContainer: HTMLElement = this.scope.querySelector('.flyout-icon-container');\n flyoutIconContainer.addEventListener('click', () => { this.handleFlyoutIconClick(); });\n }\n\n private handleFlyoutIconClick(): void {\n window.shell.publishTo('ESMKT.HeadR.ToggleFlyout', 'ManualProductComparison');\n }\n\n private loadFlyoutIcons(): void {\n // ie11 fix, works on other browsers too, but ie11 is special :( \n const flyoutIconContainer: HTMLElement = this.scope.querySelector('.flyout-icon-container');\n\n const scaleIcon: HTMLElement = document.createElement(\"div\");\n\n if(flyoutIconContainer.classList.contains('mkt-headr-icon-wrapper')) {\n // mkt-headr-icon all styles comes from header:\n scaleIcon.className = \"mkt-headr-icon mpc-scale\";\n }\n else {\n scaleIcon.className = \"flyout-icon mpc-scale\";\n }\n\n scaleIcon.innerHTML = ScaleIcon2021;\n flyoutIconContainer.appendChild(scaleIcon);\n\n const productsCounter: HTMLElement = document.createElement(\"div\");\n productsCounter.className = \"products-counter\";\n flyoutIconContainer.appendChild(productsCounter);\n // ---------------------------------------------------------------\n\n const compareButtonIcons: NodeListOf = this.scope.querySelectorAll('.compare-button-icon');\n const compareButtonIconsArray: Array = Array.prototype.slice.call(compareButtonIcons);\n\n for (const compareButtonIcon of compareButtonIconsArray) {\n compareButtonIcon.innerHTML = ArrowRightIcon;\n }\n }\n\n private getCurrentProductsAmount(): void {\n this.productComparisonModelManager.getModel().then(model => {\n if (model.products.length > 0) {\n\n // show Pcf Scope:\n if (!this.deviceDetectionHelper.isMobileShop()) {\n this.showPcfScope(true);\n }\n }\n });\n }\n\n private showPcfScope(renderWithoutAnimation: boolean = false): void {\n // check for existing pcf scope:\n if (!this.pcfScopeRendered) {\n this.scope.style.display = 'block';\n this.scope.classList.add('pcf-scope-position');\n\n if (renderWithoutAnimation)\n this.scope.classList.add('pcf-no-animation');\n \n this.scope.classList.add('show-pcf-scope');\n this.pcfScopeRendered = true;\n }\n }\n\n hidePcfScope(): void {\n this.scope.classList.remove('pcf-no-animation');\n this.scope.classList.remove('show-pcf-scope');\n setTimeout(()=>{ this.scope.classList.remove('pcf-scope-position'); }, 400);\n setTimeout(()=>{ this.scope.style.display = 'none'; }, 400);\n this.pcfScopeRendered = false;\n }\n }\n}\n\nif(window.shell)\n MPCFlyoutController.FlyoutController.instance;","import { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\nimport { MPCScrollLock } from \"../helpers/scrollLock\";\nconst SmartTimeout = require(\"smart-timeout\");\nconst ArrowRightIcon = require(\"../../images/arrow-right.svg\") as string;\n\nexport module MPCNotificationService {\n import IFlyoutContentController = MPCIFlyoutContentController.IFlyoutContentController;\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n import ScrollLock = MPCScrollLock.ScrollLock;\n\n export class NotificationService {\n private readonly scope: HTMLElement;\n public flyoutContentController: IFlyoutContentController;\n private static _instance: NotificationService;\n private existingNotificationTimeout: any;\n private deviceDetectionHelper : DeviceDetectionHelper;\n private flyoutContainer: HTMLElement;\n private scrollLock: ScrollLock;\n\n private maxProductsCountNotification: HTMLElement;\n private newProductNotification: HTMLElement;\n private emptyListNotification: HTMLElement;\n private flyoutIconContainer: HTMLElement;\n\n static get instance() {\n return this._instance || (this._instance = new this());\n }\n\n constructor() {\n this.scope = document.querySelector('.pcf-scope');\n\n if(this.scope)\n {\n this.init();\n }\n }\n \n private init(): void {\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n this.scrollLock = ScrollLock.instance;\n this.flyoutContainer = this.scope.querySelector('.flyout-container');\n const notifications = this.flyoutContainer.querySelectorAll(\".notification\");\n\n for (let notification of notifications) {\n const closeBtns = notification.querySelectorAll('.close-flyout-btn'); //multiple because there is the x for Web and the footer button for Mobile\n const openFlyoutBtns = notification.querySelectorAll('.open-flyout-button');//multiple because \"new-product' has two (Web has a compact layout without footer)\n const navigationBtn = notification.querySelector('.navigate-to-products-button');\n\n for (let comparisonListButton of openFlyoutBtns) {\n const iconSlot: HTMLElement = comparisonListButton.querySelector('.open-flyout-button-icon');\n iconSlot.innerHTML = ArrowRightIcon;\n comparisonListButton.addEventListener('click', ()=> { this.goToFlyoutComparisonList(notification); });\n }\n\n for (let closeBtn of closeBtns) {\n closeBtn.addEventListener('click', () => { this.closeNotification(notification); });\n }\n\n if (navigationBtn != null) {\n const iconSlot: HTMLElement = navigationBtn.querySelector('.navigate-products-button-icon');\n iconSlot.innerHTML = ArrowRightIcon;\n }\n }\n \n this.maxProductsCountNotification = this.scope.querySelector('.max-products-count-notification');\n this.newProductNotification = this.scope.querySelector('.new-product-notification');\n this.emptyListNotification = this.scope.querySelector('.empty-list-notification');\n this.flyoutIconContainer = this.scope.querySelector('.flyout-icon-container');\n\n // close any active notification flyout if any other flyout is opening from headR:\n // we need it because notification flyouts are not fragments and headR is not responsible for them\n window.shell.subscribeTo('ESMKT.HeadR.FlyoutOpening', () => { this.closeAnyActiveNotification(); }, 'ESMKT.HeadR.FlyoutOpening');\n }\n\n notifyNewProductAdded(title: string, mainImage: string, altTag: string): void {\n this.showNotification(this.newProductNotification, () => {\n this.replaceNotificationContent(title, mainImage, altTag);\n });\n }\n \n notifyMaximumProductsCountReached(): void {\n this.showNotification(this.maxProductsCountNotification, null);\n }\n\n notifyEmptyList(): void {\n this.initializeNavigationButtonOnEmptyNotificationOnce(); //Workaround because this class exists twice (PCF & PCP)\n this.showNotification(this.emptyListNotification, null);\n }\n\n closeAnyActiveNotification(): void {\n if (this.maxProductsCountNotification.classList.contains('show-notification'))\n this.closeNotification(this.maxProductsCountNotification);\n\n if (this.newProductNotification.classList.contains('show-notification'))\n this.closeNotification(this.newProductNotification);\n \n if (this.emptyListNotification.classList.contains('show-notification'))\n this.closeNotification(this.emptyListNotification);\n }\n\n private initializeNavigationButtonOnEmptyNotificationOnce(): void {\n const navigationBtn = this.emptyListNotification.querySelector('.navigate-to-products-button');\n\n const eventFunction: EventListener = () => {\n this.showMobileHeaderMenu();\n this.closeNotification(this.emptyListNotification);\n navigationBtn.removeEventListener('click', eventFunction);\n }\n\n if (navigationBtn != null && window.headrapi)\n navigationBtn.addEventListener('click', eventFunction);\n }\n\n private showMobileHeaderMenu(): void {\n if (window.headrapi)\n window.headrapi.toggleMenu();\n }\n\n private replaceNotificationContent(title: string, mainImage: string, altTag: string): void {\n const productInfoContainer: HTMLElement\n = this.newProductNotification.querySelector('.product-info-container');\n\n productInfoContainer.querySelector('.description-container')\n .querySelector('.title').innerHTML = title;\n productInfoContainer.querySelector('.image-slot').setAttribute('src', mainImage);\n productInfoContainer.querySelector('.image-slot').setAttribute('alt', altTag);\n }\n\n private goToFlyoutComparisonList(notification: HTMLElement): void {\n this.closeNotification(notification);\n\n window.shell.publishTo('ESMKT.HeadR.ToggleFlyout', 'ManualProductComparison');\n }\n\n private closeExistingNotification(): void {\n const existingNotification: HTMLElement = this.flyoutContainer.querySelector('.show-notification');\n\n if (existingNotification) {\n SmartTimeout.clear(this.closeExistingNotification);\n existingNotification.classList.remove('show-notification');\n this.renderFlyoutContainerOverlay(false);\n }\n }\n\n private closeNotification(notification: HTMLElement): void {\n SmartTimeout.clear(this.closeExistingNotification);\n notification.classList.remove('show-notification');\n this.flyoutIconContainer.classList.remove('notification_background');\n this.renderFlyoutContainerOverlay(false);\n }\n\n private showNotification(notification: HTMLElement, updateNotificationContent?: () => void): void {\n this.triggerAppShellPublish();\n\n // on category page, you can click many compare buttons fast, so check for older notification\n let deferNotification = false;\n if (this.existingNotificationTimeout ||\n notification.classList.contains('show-notification')) {\n this.closeExistingNotification();\n deferNotification = true;\n } \n\n let showInner = () => {\n if (this.flyoutContentController)\n this.flyoutContentController.hideFlyoutContent();\n\n if (updateNotificationContent)\n updateNotificationContent();\n\n this.renderFlyoutContainerOverlay(true);\n\n notification.classList.add('show-notification');\n this.flyoutIconContainer.classList.add('notification_background');\n\n if (!this.deviceDetectionHelper.isMobileShop()) {\n // close new product notification after 4500 ms\n this.existingNotificationTimeout =\n SmartTimeout.set(() => { this.closeNotification(notification) }, 4500);\n }\n };\n\n if(deferNotification)\n SmartTimeout.set(showInner, 500);\n else \n showInner();\n }\n\n private triggerAppShellPublish(): void {\n // close modal dialogs in legacy WF\n if (window.shell) {\n window.shell.publishTo('mpc.close-modal', '');\n window.shell.publishTo('ESPP.OrderModal.Close', '');\n }\n }\n\n private renderFlyoutContainerOverlay(renderOverlay: boolean): void {\n if(this.deviceDetectionHelper.isMobileShop()) {\n if(renderOverlay) {\n this.scope.classList.add('render-overlay');\n this.scope.ontouchmove = (event: TouchEvent) => { event.preventDefault(); }; // iOS ScrollLock\n this.scrollLock.lock();\n }\n else {\n if(this.scope.classList.contains('render-overlay')) {\n this.scope.classList.remove('render-overlay');\n this.scope.ontouchmove = () => { };\n this.scrollLock.unlock();\n }\n }\n }\n }\n\n }\n}","import { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\n\nexport module MPCStickyFlyOutNotificationService {\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n \n export class StickyFlyOutNotificationService {\n private scope: HTMLElement;\n private deviceDetectionHelper : DeviceDetectionHelper;\n private maxProductsCountNotification: HTMLElement;\n private flyoutNewProductNotification: HTMLElement;\n private flyout: HTMLElement;\n private tabletHeaderHeightCalculated: number;\n\n public constructor() {\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n }\n\n public init(scope: HTMLElement): void {\n this.scope = scope;\n this.tabletHeaderHeightCalculated = 38;\n const flyoutContainer: HTMLElement = this.scope.querySelector('.flyout-container');\n\n if (flyoutContainer && this.deviceDetectionHelper.isTabletHandHeldDevice()) {\n this.maxProductsCountNotification = flyoutContainer.querySelector('.max-products-count-notification');\n this.flyoutNewProductNotification = flyoutContainer.querySelector('.new-product-notification');\n this.maxProductsCountNotification.classList.add('sticky-flyout-notification');\n this.flyoutNewProductNotification.classList.add('sticky-flyout-notification');\n\n // todo: remove with ESPP-2482\n /* if(!mktHeaderOnline) {\n this.flyout = flyoutContainer.querySelector('.flyout');\n this.flyout.classList.add('sticky-flyout');\n\n window.addEventListener('scroll', () => { this.handleFlyOutNotificationOnScroll() });\n window.addEventListener('scroll', () => { this.handleFlyOutOnScroll() });\n\n this.handleFlyOutOnScroll();\n } */\n\n this.handleFlyOutNotificationOnScroll();\n \n }\n }\n\n private handleFlyOutNotificationOnScroll(): void {\n if(this.tabletHeaderHeightCalculated >= window.pageYOffset) {\n this.maxProductsCountNotification.classList.remove(\"fixed\");\n this.flyoutNewProductNotification.classList.remove(\"fixed\");\n }\n else {\n this.maxProductsCountNotification.classList.add(\"fixed\");\n this.flyoutNewProductNotification.classList.add(\"fixed\");\n }\n }\n\n private handleFlyOutOnScroll(): void {\n if(this.tabletHeaderHeightCalculated >= window.pageYOffset) {\n this.flyout.classList.remove(\"fixed\");\n }\n else {\n this.flyout.classList.add(\"fixed\");\n }\n }\n }\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\r\nimport { MPCCallLimiter } from \"../helpers/call-limiter\";\r\nimport { NlVanillajax, INlVanillajaxParams, ContentType, HtmlResult } from \"../helpers/vanillajax\";\r\nimport { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\r\nimport { MPCFlyoutContentController } from \"../PCF/flyout-content-controller\";\r\nimport { IResponseData } from \"../typings/VariantSelection\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nconst ScaleIcon = require(\"../../images/scale-2021.svg\") as string;\r\n\r\nexport module MPCCompareButton {\r\n import ITouchPoint = MPCITouchPoint.ITouchPoint;\r\n import TouchPointContext = MPCITouchPoint.TouchPointContext;\r\n\r\n export class CompareButton implements ITouchPoint {\r\n private markerElement: HTMLElement;\r\n private parentContainer: HTMLElement;\r\n private touchPointElement: HTMLElement;\r\n private slug: string;\r\n private origin: string;\r\n private salesArticleVariantKey: string;\r\n private displayedInCategoryNavKey: string;\r\n private iFlyoutContentController: MPCIFlyoutContentController.IFlyoutContentController; \r\n\r\n constructor(marker: HTMLElement, salesArticleVariantKey: string, slug: string, origin: string, displayedInCategoryNavKey: string,\r\n parentContainer: HTMLElement) {\r\n this.iFlyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\r\n this.parentContainer = parentContainer;\r\n this.markerElement = marker;\r\n this.salesArticleVariantKey = salesArticleVariantKey;\r\n this.slug = slug;\r\n this.origin = origin;\r\n this.displayedInCategoryNavKey = displayedInCategoryNavKey;\r\n \r\n // only for new details page:\r\n if(this.parentContainer)\r\n this.initializeNew();\r\n else\r\n this.getTouchPoint();\r\n\r\n // Subscribe to new details page and update necessary changed variant info:\r\n if (typeof window !== 'undefined' && window.shell) {\r\n window.shell.subscribeTo(\r\n 'ESPP.DetailPage.PageUpdate',\r\n (response: IResponseData) => {\r\n this.updateSaveKeyFromOutsideTheScope(\r\n response.orderModule.articleInfo.salesArticleVariantKey);\r\n },\r\n 'ESCID.ESPP.ManualProductComparison');\r\n }\r\n\r\n if (typeof window !== 'undefined' && window.shell) {\r\n window.shell.subscribeTo(\r\n 'ESPP.OrderModal.Update',\r\n ({ response }: { response: IResponseData } ) => {\r\n this.updateSaveKeyFromOutsideTheScope(\r\n response.orderModule.articleInfo.salesArticleVariantKey);\r\n },\r\n 'ESCID.ESPP.ManualProductComparison');\r\n }\r\n }\r\n\r\n private updateSaveKeyFromOutsideTheScope(savKey: string): void {\r\n this.salesArticleVariantKey = savKey;\r\n }\r\n\r\n update(oldSavKey: string, newSavKey: string): void {\r\n return;\r\n }\r\n\r\n private getTouchPoint(): void {\r\n const context: TouchPointContext = new class implements TouchPointContext {\r\n SeoSlug: string;\r\n };\r\n context.SeoSlug = this.slug;\r\n\r\n let params: INlVanillajaxParams = {};\r\n const subPath = this.markerElement.classList.contains(\"scope-om-new\")\r\n ? \"TouchPoint/ForOrderModalNew/\"\r\n : \"TouchPoint/ForDetailsPage/\";\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl + subPath;\r\n params.url += \"?context.SeoSlug=\" + this.slug;\r\n params.url += \"&context.SavKey=\" + this.salesArticleVariantKey;\r\n params.url += \"&context.ItemOrigin=\" + this.origin;\r\n if(this.displayedInCategoryNavKey)\r\n params.url += \"&context.DisplayedInCategoryNavKey=\" + this.displayedInCategoryNavKey;\r\n params.contentType = ContentType.Plain;\r\n new NlVanillajax(params).getWithPromise()\r\n .then((response: HtmlResult) => {\r\n let container: HTMLElement = document.createElement('div');\r\n container.innerHTML = response.Html;\r\n this.touchPointElement = container.querySelector(\".touchpoint\"); //there might be text nodes in there, so not childNodes[0]\r\n if (!this.touchPointElement) {\r\n throw new Error(\"no touchpoint returned from service\");\r\n } \r\n this.removePreviousButton();\r\n this.markerElement.parentNode.replaceChild(this.touchPointElement, this.markerElement);\r\n this.initialize();\r\n })\r\n .catch(() => {\r\n //empty response indicates this article has disabled comparing for some reason\r\n if (this.markerElement) {\r\n this.markerElement.remove();\r\n } else if (this.touchPointElement) {\r\n this.touchPointElement.remove();\r\n }\r\n });\r\n }\r\n\r\n private removePreviousButton(): void {\r\n const previousButton: HTMLElement =\r\n this.markerElement.parentElement.querySelector('.compare-button-wrapper');\r\n\r\n if (previousButton)\r\n previousButton.remove();\r\n }\r\n\r\n\r\n private initialize(): void {\r\n this.touchPointElement.querySelector('.comparison-icon').innerHTML = ScaleIcon;\r\n this.touchPointElement.addEventListener('click', (event: Event) => {\r\n event.preventDefault();\r\n });\r\n this.touchPointElement.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\r\n this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\r\n }, 1000, true).bind(this));\r\n }\r\n\r\n // only for new details page:\r\n private initializeNew(): void {\r\n this.parentContainer.querySelector('.comparison-icon').innerHTML = ScaleIcon;\r\n this.parentContainer.addEventListener('click', (event: Event) => {\r\n event.preventDefault();\r\n });\r\n this.parentContainer.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\r\n this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\r\n }, 1000, true).bind(this));\r\n }\r\n }\r\n}","import { MPCEventBus } from \"../helpers/event-bus\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nimport { MPCLocalStorageService } from \"../local-storage-service\";\r\nconst ScaleIcon = require(\"../../images/scale-2021.svg\") as string;\r\n\r\nexport module MPCMobileToolbarButton {\r\n import EventBus = MPCEventBus.EventBus;\r\n import MpcSettings = MpcSettingsModule.MpcSettings;\r\n import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\r\n\r\n export class MobileToolbarButton {\r\n private static _instance: MobileToolbarButton;\r\n private eventBus: EventBus;\r\n private toolbarButtons: NodeListOf;\r\n private compareButtons: HTMLElement[];\r\n private tbw_mlt: string;\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n private constructor() {\r\n this.eventBus = EventBus.instance;\r\n document.addEventListener(\"DOMContentLoaded\", () => {\r\n this.initialize();\r\n });\r\n }\r\n\r\n private initialize() {\r\n this.toolbarButtons = document.querySelectorAll(\".mpc-scope .toolbar-button-wrapper\");\r\n if (!this.toolbarButtons || !this.toolbarButtons.length) {\r\n return;\r\n }\r\n\r\n this.compareButtons = new Array();\r\n\r\n // for TouchPoint Accessibility:\r\n if(this.toolbarButtons[0].children && this.toolbarButtons[0].children.length > 0) {\r\n this.tbw_mlt = this.toolbarButtons[0].children[0].innerHTML;\r\n }\r\n\r\n this.toolbarButtons.forEach((toolbarButton: HTMLElement) => {\r\n // compareButton exists only in legacy shop, all other places contains toolbar-button-wrapper\r\n if (toolbarButton.closest('.compare-button'))\r\n this.compareButtons.push(toolbarButton.closest('.compare-button'));\r\n else\r\n this.compareButtons.push(toolbarButton);\r\n\r\n toolbarButton.querySelector('.comparison-icon').innerHTML = ScaleIcon;\r\n toolbarButton.addEventListener(\"click\", () => {\r\n // New category page:\r\n window.shell.publishTo('ArticleTileService.Mobile.ToggleTouchPointOnTile', undefined);\r\n\r\n // Legacy category page, remove later!!!: \r\n this.eventBus.publish(\"mobile-toolbar-button.clicked\");\r\n let categoryNavKey: string;\r\n if (MpcSettings.instance.MobileCategoryNavKey) {\r\n categoryNavKey = MpcSettings.instance.MobileCategoryNavKey;\r\n }\r\n\r\n this.compareButtons.forEach((compareButton: HTMLElement) => {\r\n if (compareButton.classList.contains('active')) {\r\n compareButton.classList.remove('active');\r\n if (categoryNavKey) {\r\n ProductComparisonModelManager.instance.deactivateOnMobileCategory(categoryNavKey);\r\n }\r\n } else {\r\n compareButton.classList.add('active');\r\n if (categoryNavKey) {\r\n ProductComparisonModelManager.instance.activateOnMobileCategory(categoryNavKey);\r\n }\r\n }\r\n });\r\n });\r\n\r\n const categoryNavKey = MpcSettings.instance.MobileCategoryNavKey;\r\n if (categoryNavKey && ProductComparisonModelManager.instance.isActivatedOnMobileCategory(categoryNavKey)) {\r\n this.eventBus.publish(\"mobile-toolbar-button.clicked\");\r\n this.compareButtons[this.compareButtons.length-1].classList.add('active');\r\n }\r\n });\r\n }\r\n\r\n public getTBW_Mlt(): string {\r\n return this.tbw_mlt;\r\n }\r\n }\r\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\r\nimport { MPCCallLimiter } from \"../helpers/call-limiter\";\r\nimport { NlVanillajax, INlVanillajaxParams, ContentType, HtmlResult } from \"../helpers/vanillajax\";\r\nimport { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\r\nimport { MPCFlyoutContentController } from \"../PCF/flyout-content-controller\";\r\nimport { MPCEventBus } from \"../helpers/event-bus\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\r\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\r\nconst ScaleEmptyIcon = require(\"../../images/scale-empty.svg\") as string;\r\n\r\nexport module MPCTileScaleButton {\r\n import ITouchPoint = MPCITouchPoint.ITouchPoint;\r\n import EventBus = MPCEventBus.EventBus;\r\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\r\n\r\n export class TileScaleButton implements ITouchPoint {\r\n private markerElement: HTMLElement;\r\n private touchPointElement: HTMLElement;\r\n private slug: string;\r\n private origin: string;\r\n private salesArticleVariantKey: string;\r\n private displayedInCategoryNavKey: string;\r\n private isMobileShop: boolean;\r\n private iFlyoutContentController: MPCIFlyoutContentController.IFlyoutContentController;\r\n private eventBus: EventBus;\r\n private deviceDetectionHelper : DeviceDetectionHelper;\r\n\r\n constructor(element: HTMLElement, salesArticleVariantKey: string, slug: string, origin: string, displayedInCategoryNavKey: string, prerendered: boolean = false) {\r\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\r\n this.isMobileShop = this.deviceDetectionHelper.isMobileShop();\r\n this.iFlyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\r\n this.eventBus = MPCEventBus.EventBus.instance;\r\n this.salesArticleVariantKey = salesArticleVariantKey;\r\n this.displayedInCategoryNavKey = displayedInCategoryNavKey;\r\n this.slug = slug;\r\n this.origin = origin;\r\n\r\n if (prerendered) {\r\n this.touchPointElement = element;\r\n\r\n if (!this.touchPointElement) {\r\n return;\r\n }\r\n\r\n this.initialize();\r\n } else {\r\n this.markerElement = element;\r\n this.getTouchPoint();\r\n }\r\n }\r\n\r\n update(oldSavKey: string, newSavKey: string): void {\r\n if (!this.touchPointElement) {\r\n return;\r\n }\r\n\r\n if (!oldSavKey) {\r\n // backwards compatibility - can be removed after ATS is deployed on PROD\r\n const selectedVariantElement: HTMLElement = this.touchPointElement.closest('.article-tile')\r\n .querySelector('.colors .selected img');\r\n const thisButtonIsForSavKey: string = selectedVariantElement ? selectedVariantElement.getAttribute('data-colorid') : null;\r\n\r\n if (thisButtonIsForSavKey != newSavKey) {\r\n // this event is received by all touchpoints on the site, \r\n // on categorypage, unrelated touchpoints need to ignore this\r\n return;\r\n }\r\n this.salesArticleVariantKey = newSavKey;\r\n this.toggle();\r\n } else {\r\n // new way\r\n if (this.salesArticleVariantKey != oldSavKey) {\r\n return;\r\n }\r\n\r\n this.salesArticleVariantKey = newSavKey;\r\n this.toggle();\r\n }\r\n }\r\n\r\n private getTouchPoint(): void {\r\n let params: INlVanillajaxParams = {};\r\n const scopeClass = this.markerElement.classList.contains(\"scope-ats\")\r\n ? \"ats\"\r\n : \"\";\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl + \"TouchPoint/ForArticleTile/\";\r\n params.url += \"?context.SeoSlug=\" + this.slug;\r\n params.url += \"&context.SavKey=\" + this.salesArticleVariantKey;\r\n params.url += \"&context.ItemOrigin=\" + this.origin;\r\n params.url += \"&context.ScopeClass=\" + scopeClass;\r\n if(this.displayedInCategoryNavKey)\r\n params.url += \"&context.DisplayedInCategoryNavKey=\" + this.displayedInCategoryNavKey;\r\n params.contentType = ContentType.Plain;\r\n new NlVanillajax(params).getWithPromise()\r\n .then((response: HtmlResult) => {\r\n let container: HTMLElement = document.createElement('div');\r\n container.innerHTML = response.Html;\r\n this.touchPointElement = container.querySelector(\".touchpoint\"); //there might be text nodes in there, so not childNodes[0]\r\n if (!this.touchPointElement) {\r\n throw new Error(\"no touchpoint returned from service\");\r\n }\r\n this.markerElement.parentNode.replaceChild(this.touchPointElement, this.markerElement);\r\n this.initialize();\r\n })\r\n .catch(() => {\r\n //empty response indicates this article has disabled comparing for some reason\r\n if (this.markerElement) {\r\n this.markerElement.remove();\r\n } else if (this.touchPointElement) {\r\n this.touchPointElement.remove();\r\n }\r\n });\r\n }\r\n\r\n\r\n private initialize(): void {\r\n this.toggle();\r\n this.touchPointElement.querySelector('.comparison-empty-icon').innerHTML = ScaleEmptyIcon + ScaleIcon2021;\r\n this.touchPointElement.querySelector('.comparison-icon').innerHTML = ScaleIcon2021;\r\n\r\n this.touchPointElement.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\r\n this.updateFlyout();\r\n }, 1000, true).bind(this));\r\n this.eventBus.subscribe(\"flyout.product-removed\", (salesArticleVariantKey: string) => {\r\n if (salesArticleVariantKey === this.salesArticleVariantKey) {\r\n this.touchPointElement.classList.remove('active');\r\n }\r\n });\r\n this.eventBus.subscribe([\"flyout.product-added\", \"flyout.product-replaced\"], (salesArticleVariantKey: string) => {\r\n if (salesArticleVariantKey === this.salesArticleVariantKey) {\r\n this.touchPointElement.classList.add('active');\r\n }\r\n });\r\n\r\n if (this.isMobileShop) {\r\n this.eventBus.subscribe(\"mobile-toolbar-button.clicked\", this.updateVisibility.bind(this));\r\n }\r\n }\r\n\r\n private updateVisibility(): void {\r\n if (this.touchPointElement.classList.contains(\"ats\")) {\r\n if (this.touchPointElement.parentElement.classList.contains('fas_hidden')) {\r\n this.touchPointElement.parentElement.classList.remove('fas_hidden');\r\n } else {\r\n this.touchPointElement.parentElement.classList.add('fas_hidden');\r\n }\r\n } else {\r\n if (this.touchPointElement.classList.contains(\"visible\")) {\r\n this.touchPointElement.classList.remove(\"visible\");\r\n } else {\r\n this.touchPointElement.classList.add(\"visible\");\r\n }\r\n }\r\n }\r\n\r\n private updateFlyout(): void {\r\n if (!this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\r\n this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\r\n } else {\r\n this.iFlyoutContentController.removeProductTP(this.salesArticleVariantKey);\r\n }\r\n }\r\n\r\n private toggle(): void {\r\n if (this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\r\n this.touchPointElement.classList.add('active');\r\n } else {\r\n this.touchPointElement.classList.remove('active');\r\n }\r\n }\r\n }\r\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\nimport { MPCCallLimiter } from \"../helpers/call-limiter\";\nimport { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\nimport { MPCFlyoutContentController } from \"../PCF/flyout-content-controller\";\nimport { MPCEventBus } from \"../helpers/event-bus\";\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\nconst ScaleEmptyIcon = require(\"../../images/scale-empty.svg\") as string;\n\nexport module MPCTileScaleButtonEx {\n import ITouchPoint = MPCITouchPoint.ITouchPoint;\n import EventBus = MPCEventBus.EventBus;\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n\n export class TileScaleButtonEx implements ITouchPoint {\n private markerElement: HTMLElement;\n private touchPointElement: HTMLElement;\n private slug: string;\n private origin: string;\n private salesArticleVariantKey: string;\n private isMobileShop: boolean;\n private iFlyoutContentController: MPCIFlyoutContentController.IFlyoutContentController;\n private eventBus: EventBus;\n private deviceDetectionHelper : DeviceDetectionHelper;\n\n constructor(element: HTMLElement, salesArticleVariantKey: string, slug: string, origin: string, displayedInCategoryNavKey: string, private tbw_mlt: string) {\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n this.isMobileShop = this.deviceDetectionHelper.isMobileShop();\n this.iFlyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\n this.eventBus = MPCEventBus.EventBus.instance;\n this.salesArticleVariantKey = salesArticleVariantKey; \n this.slug = slug;\n this.origin = origin;\n\n this.markerElement = element;\n this.getTouchPoint();\n }\n\n update(oldSavKey: string, newSavKey: string): void {\n if (!this.touchPointElement) {\n return;\n }\n\n if (!oldSavKey) {\n // backwards compatibility - can be removed after ATS is deployed on PROD\n const selectedVariantElement: HTMLElement = this.touchPointElement.closest('.article-tile')\n .querySelector('.colors .selected img');\n const thisButtonIsForSavKey: string = selectedVariantElement ? selectedVariantElement.getAttribute('data-colorid') : null;\n\n if (thisButtonIsForSavKey != newSavKey) {\n // this event is received by all touchpoints on the site, \n // on categorypage, unrelated touchpoints need to ignore this\n return;\n }\n this.salesArticleVariantKey = newSavKey;\n this.toggle();\n } else {\n // new way\n if (this.salesArticleVariantKey != oldSavKey) {\n return;\n }\n\n this.salesArticleVariantKey = newSavKey;\n this.toggle();\n }\n }\n\n private getTouchPoint(): void {\n const scopeClass = this.markerElement.classList.contains('scope-ats')\n ? ' ats'\n : '';\n\n const forArticleTile: HTMLElement = document.createElement('div');\n forArticleTile.className = 'mpc-scope scale-tile-container touchpoint' + scopeClass;\n forArticleTile.setAttribute(\"title\", this.tbw_mlt);\n forArticleTile.setAttribute(\"data-savkey\", this.salesArticleVariantKey);\n forArticleTile.setAttribute(\"data-item-origin\", this.origin);\n forArticleTile.setAttribute('focusable', '');\n forArticleTile.setAttribute('order', '0');\n\n const emptyIcon: HTMLElement = document.createElement('div');\n emptyIcon.className = 'comparison-empty-icon';\n\n const icon: HTMLElement = document.createElement('div');\n icon.className = 'comparison-icon';\n \n forArticleTile.appendChild(emptyIcon);\n forArticleTile.appendChild(icon);\n\n this.touchPointElement = forArticleTile;\n \n if (!this.touchPointElement) {\n throw new Error(\"no touchpoint returned from service\");\n }\n\n this.markerElement.parentNode.replaceChild(this.touchPointElement, this.markerElement);\n \n this.initialize();\n }\n\n private initialize(): void {\n this.toggle();\n this.touchPointElement.querySelector('.comparison-empty-icon').innerHTML = ScaleEmptyIcon + ScaleIcon2021;\n this.touchPointElement.querySelector('.comparison-icon').innerHTML = ScaleIcon2021;\n\n this.touchPointElement.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\n this.updateFlyout();\n }, 1000, true).bind(this));\n\n this.touchPointElement.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === ' ') { // space btn\n event.preventDefault();\n event.stopPropagation();\n\n this.updateFlyout();\n }\n });\n\n this.eventBus.subscribe(\"flyout.product-removed\", (salesArticleVariantKey: string) => {\n if (salesArticleVariantKey === this.salesArticleVariantKey) {\n this.touchPointElement.classList.remove('active');\n }\n });\n this.eventBus.subscribe([\"flyout.product-added\", \"flyout.product-replaced\"], (salesArticleVariantKey: string) => {\n if (salesArticleVariantKey === this.salesArticleVariantKey) {\n this.touchPointElement.classList.add('active');\n }\n });\n\n if (this.isMobileShop) {\n this.eventBus.subscribe(\"mobile-toolbar-button.clicked\", this.updateVisibility.bind(this));\n }\n }\n\n private updateVisibility(): void {\n if (this.touchPointElement.classList.contains(\"ats\")) {\n if (this.touchPointElement.parentElement.classList.contains('fas_hidden')) {\n this.touchPointElement.parentElement.classList.remove('fas_hidden');\n } else {\n this.touchPointElement.parentElement.classList.add('fas_hidden');\n }\n } else {\n if (this.touchPointElement.classList.contains(\"visible\")) {\n this.touchPointElement.classList.remove(\"visible\");\n } else {\n this.touchPointElement.classList.add(\"visible\");\n }\n }\n }\n\n private updateFlyout(): void {\n if (!this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\n this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\n } else {\n this.iFlyoutContentController.removeProductTP(this.salesArticleVariantKey);\n }\n }\n\n private toggle(): void {\n if (this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\n this.touchPointElement.classList.add('active');\n } else {\n this.touchPointElement.classList.remove('active');\n }\n }\n }\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\r\nimport { MPCITouchPointIdentifier } from \"../typings/TouchPointIdentifier\";\r\nimport { MPCTouchPointIdentifier } from \"./TouchPointIdentifier\";\r\nimport { MPCCompareButton } from \"./CompareButton\";\r\nimport { MPCTileScaleButton } from \"./TileScaleButton\";\r\nimport { MPCTileScaleButtonEx } from \"./TileScaleButtonEx\";\r\nimport { MPCMobileToolbarButton } from \"./MobileToolbarButton\";\r\nimport { MPCFlyoutContentController } from '../PCF/flyout-content-controller';\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\r\nconst ScaleEmptyIcon = require(\"../../images/scale-empty.svg\") as string;\r\nimport axios, { AxiosError, AxiosResponse } from 'axios';\r\n\r\nexport module MPCTouchPointFactory {\r\n import ITouchPoint = MPCITouchPoint.ITouchPoint;\r\n import TouchPointPayload = MPCITouchPoint.TouchPointPayload;\r\n import ITouchPointIdentifier = MPCITouchPointIdentifier.ITouchPointIdentifier;\r\n import ServiceCallName = MPCITouchPointIdentifier.ServiceCallName;\r\n import TouchPointIdentifier = MPCTouchPointIdentifier.TouchPointIdentifier;\r\n import CompareButton = MPCCompareButton.CompareButton;\r\n import TileScaleButton = MPCTileScaleButton.TileScaleButton;\r\n import TileScaleButtonEx = MPCTileScaleButtonEx.TileScaleButtonEx;\r\n import MobileToolbarButton = MPCMobileToolbarButton.MobileToolbarButton;\r\n import MpcSettings = MpcSettingsModule.MpcSettings;\r\n\r\n export class TouchPointFactory {\r\n private static _instance: TouchPointFactory;\r\n private touchPointIdentifier: ITouchPointIdentifier;\r\n private touchPoints: ITouchPoint[];\r\n private isMobileView = window.innerWidth <= 1199; \r\n private isNewDetailsPage: HTMLElement = document.querySelector('.pdp-details_page_container'); // only for new details page:\r\n private compareButtonSavKeySelector: string = this.isMobileView ?\r\n 'input[name=SalesarticleVariantKey]' : 'input[name=SalesArticleVariantKey]';\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n private constructor() {\r\n this.touchPointIdentifier = TouchPointIdentifier.instance;\r\n this.touchPoints = [];\r\n\r\n if (window.shell) {\r\n this.initializeEvents();\r\n\r\n // we have to init it because of variety of resolution on tablet devices\r\n MobileToolbarButton.instance;\r\n }\r\n }\r\n\r\n private initializeEvents() { \r\n if(this.isNewDetailsPage) {\r\n this.CreateTouchPointsForNewPDP();\r\n }\r\n else {\r\n window.shell.subscribeTo(\"ManualProductComparison.CreateTouchPoints\", (scope: HTMLElement) => {\r\n this.createByMarkersPayload(scope);\r\n }, \"ManualProductComparison.CreateTouchPoints\");\r\n }\r\n\r\n // for legacy category page:\r\n window.shell.subscribeTo(\"ManualProductComparison.CreateScaleIconTouchPoints\", (tile: HTMLElement) => {\r\n const salesArticleVariantKey: string =\r\n tile.getAttribute('data-selected-colorid');\r\n this.createByMarkers(salesArticleVariantKey, \"mpc-scale-tile\", tile);\r\n }, \"ManualProductComparison.CreateScaleIconTouchPoints\");\r\n\r\n // for new ATS and search page:\r\n window.shell.subscribeTo(\"ManualProductComparison.CreateTouchPointsBatch\", (placeHoldersData: {savKey: string;\r\n seoSlug: string; displayedInCategoryNavKey: string;}[]) => {\r\n this.createByMarkersEx(placeHoldersData, \"mpc-scale-tile\");\r\n }, \"ManualProductComparison.CreateTouchPointsBatch\");\r\n\r\n window.shell.subscribeTo(\"ManualProductComparison.CreateCompareButtonTouchPoints\", (form: HTMLElement) => {\r\n let savKeyElement = form.querySelector(this.compareButtonSavKeySelector);\r\n if (!savKeyElement) {\r\n //TODO on mobile after clicking basket icon, order modal opens, but it contains no compare button... \r\n return;\r\n }\r\n const salesArticleVariantKey: string = savKeyElement.getAttribute('value');\r\n this.createByMarkers(salesArticleVariantKey, \"mpc-compare-button\", form);\r\n }, \"ManualProductComparison.CreateCompareButtonTouchPoints\");\r\n\r\n window.shell.subscribeTo(\"ManualProductComparison.UpdateTouchPoints\", (payload: { oldSavKey: string, newSavKey: string }) => {\r\n if (typeof payload == 'string') {\r\n // backwards compatibility - can be removed after ATS is deployed on PROD\r\n payload = { oldSavKey: null, newSavKey: payload };\r\n }\r\n for (const touchPoint of this.touchPoints) {\r\n touchPoint.update(payload.oldSavKey, payload.newSavKey);\r\n }\r\n }, \"ManualProductComparison.UpdateTouchPoints\");\r\n \r\n document.addEventListener(\"DOMContentLoaded\",\r\n () => {\r\n this.initializePrerenderedMobileTouchPoints();\r\n });\r\n \r\n document.addEventListener(\"DOMContentLoaded\",\r\n () => {\r\n this.initializeCompareLinkTouchPoints();\r\n });\r\n }\r\n\r\n // only for new details page:\r\n private CreateTouchPointsForNewPDP() {\r\n // Necessary for AAS fragment:\r\n window.shell.subscribeTo(\"ManualProductComparison.CreateTouchPoints\", (scope: HTMLElement) => {\r\n this.createByMarkersPayload(scope);\r\n }, \"ManualProductComparison.CreateTouchPoints\");\r\n\r\n const newBtnLst: NodeListOf = this.isNewDetailsPage.querySelectorAll('.mpc-compare-btn');\r\n if (!newBtnLst || newBtnLst.length === 0) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < newBtnLst.length; i++) {\r\n const newBtn = newBtnLst[i];\r\n const salesArticleVariantKey: string = newBtn.getAttribute('data-savkey');\r\n const slug: string = newBtn.getAttribute('data-slug');\r\n const origin: string = newBtn.getAttribute('data-item-origin');\r\n\r\n new CompareButton(null, salesArticleVariantKey, slug, origin, '', newBtn);\r\n }\r\n }\r\n\r\n private initializePrerenderedMobileTouchPoints(): void {\r\n const touchPoints: NodeListOf = this.touchPointIdentifier.getTileScaleTouchPoints();\r\n const touchPointPlaceholders: NodeListOf = this.touchPointIdentifier.getMobileTouchPointPlaceholders();\r\n const savKeyToPlaceholder: {[id:string] : HTMLElement} = {};\r\n for (const touchPointPlaceholder of Array.prototype.slice.call(touchPointPlaceholders)) {\r\n savKeyToPlaceholder[touchPointPlaceholder.getAttribute(\"data-savkey\")] = touchPointPlaceholder;\r\n }\r\n let parentElement: HTMLElement;\r\n if (touchPoints.length > 0) { \r\n parentElement = touchPoints[0].parentElement;\r\n }\r\n for (const touchPoint of Array.prototype.slice.call(touchPoints)) {\r\n\r\n touchPoint.querySelector('.comparison-empty-icon').innerHtml = ScaleEmptyIcon;\r\n touchPoint.querySelector('.comparison-icon').innerHtml = ScaleIcon2021;\r\n\r\n const slug: string = touchPoint.dataset.slug;\r\n const salesArticleVariantKey: string = touchPoint.dataset.savkey;\r\n const itemOrigin: string = touchPoint.getAttribute(\"data-item-origin\");\r\n const displayedInCategoryNavKey: string = touchPoint.getAttribute(\"data-displayed-in-category-navkey\");\r\n if (slug && salesArticleVariantKey) {\r\n this.touchPoints.push(new TileScaleButton(touchPoint, salesArticleVariantKey, slug, itemOrigin, displayedInCategoryNavKey, true));\r\n }\r\n\r\n //move in DOM (they are batch-rendered below the article list and need to be sorted into their article tile)\r\n const placeholder = savKeyToPlaceholder[touchPoint.getAttribute(\"data-savkey\")];\r\n if (placeholder) {\r\n placeholder.parentNode.replaceChild(touchPoint, placeholder);\r\n }\r\n }\r\n if (parentElement) {\r\n const currentCategoryNavKey = parentElement.getAttribute(\"data-category-navkey\");\r\n MpcSettings.instance.MobileCategoryNavKey = currentCategoryNavKey;\r\n parentElement.remove();\r\n }\r\n }\r\n\r\n private initializeCompareLinkTouchPoints(): void {\r\n const flyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\r\n const compareLinks = this.touchPointIdentifier.getCompareLinks();\r\n for (let i = 0; i < compareLinks.length; i++) {\r\n const compareLink = compareLinks[i];\r\n const htmlIndex = compareLink.href.indexOf(\".html\");\r\n const url = compareLink.href.substring(0, htmlIndex);\r\n const splitted = url.split(\"-\").reverse();\r\n const maNo = parseInt(splitted[2]);\r\n const colorCode = parseInt(splitted[0]);\r\n compareLink.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n flyoutContentController.addProductByCompareLink(maNo, colorCode);\r\n });\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private isAxiosError(error: any): error is AxiosError {\r\n return typeof error.toJSON !== 'undefined';\r\n }\r\n\r\n private createByMarkersEx(articlesContext: {savKey: string; seoSlug: string;\r\n displayedInCategoryNavKey: string;}[], type?: ServiceCallName): void {\r\n \r\n // Call MPC endpoint:\r\n axios.post(MpcSettingsModule.MpcSettings.instance.apiUrl + \"TouchPoint/IsBatchComparable/\", \r\n articlesContext, {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n })\r\n .then((response: AxiosResponse) => {\r\n if (response.status >= 200 && response.status < 300 && response.data && response.data.length > 0) {\r\n const validSavKeys = response.data;\r\n\r\n // Create TP from valid sav keys array:\r\n const markers: HTMLElement[] = this.touchPointIdentifier.getMarkersFromDomEx(type, validSavKeys);\r\n\r\n for (const markerElement of markers) {\r\n if (markerElement) {\r\n this.touchPoints.push(this.createTouchPointEx(markerElement));\r\n }\r\n }\r\n }\r\n })\r\n .catch((error: Error | AxiosError) => {\r\n const errorMsg = this.isAxiosError(error)\r\n ? error.message\r\n : `${error.name}: ${error.message}`;\r\n const errorStack = this.isAxiosError(error)\r\n ? JSON.stringify(error.toJSON())\r\n : error.stack;\r\n\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n `fetch() failed with \"${errorMsg}\". Full error:\\n${errorStack}`\r\n );\r\n });\r\n }\r\n\r\n private createByMarkers(salesArticleVariantKey: string, type?: ServiceCallName, scope?: HTMLElement): void {\r\n const markers: NodeListOf = this.touchPointIdentifier.getMarkersFromDom(scope, type);\r\n for (const markerElement of Array.prototype.slice.call(markers)) {\r\n this.touchPoints.push(this.createTouchPoint(markerElement, salesArticleVariantKey));\r\n }\r\n }\r\n\r\n // Todo: This will replace the createByMarkers method. Legacy frontends needs to be adjusted first before this refactor step\r\n private createByMarkersPayload(scope?: HTMLElement): void {\r\n const markers: NodeListOf = this.touchPointIdentifier.getMarkersFromDom(scope, \"ESCID.ESPP.ManualProductComparison\");\r\n for (const markerElement of Array.prototype.slice.call(markers)) {\r\n const markerPayloadObject: TouchPointPayload = JSON.parse(markerElement.dataset.payload);\r\n\r\n if (markerPayloadObject) {}\r\n this.touchPoints.push(this.createTouchPointByPayloadObject(markerElement, markerPayloadObject));\r\n }\r\n }\r\n\r\n private createTouchPointEx(marker: HTMLElement): ITouchPoint {\r\n // const type: ServiceCallName = marker.dataset.serviceCall as ServiceCallName;\r\n const slug: string = marker.dataset.slug;\r\n const origin: string = marker.getAttribute(\"data-item-origin\");\r\n const displayedInCategoryNavKey: string = marker.getAttribute(\"data-displayed-in-category-navkey\");\r\n const salesArticleVariantKey: string = marker.getAttribute(\"data-selected-colorid\");\r\n\r\n const touchPoint = new TileScaleButtonEx(marker, salesArticleVariantKey, slug, \r\n origin, displayedInCategoryNavKey, MobileToolbarButton.instance.getTBW_Mlt());\r\n return touchPoint;\r\n }\r\n\r\n private createTouchPoint(marker: HTMLElement, salesArticleVariantKey: string): ITouchPoint {\r\n const type: ServiceCallName = marker.dataset.serviceCall as ServiceCallName;\r\n const slug: string = marker.dataset.slug;\r\n const origin: string = marker.getAttribute(\"data-item-origin\");\r\n const displayedInCategoryNavKey: string = marker.getAttribute(\"data-displayed-in-category-navkey\");\r\n\r\n let touchPoint: ITouchPoint = null;\r\n\r\n if (type === \"mpc-compare-button\") {\r\n touchPoint = new CompareButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey, null);\r\n } else if (type === \"mpc-scale-tile\") {\r\n touchPoint = new TileScaleButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey);\r\n }\r\n\r\n return touchPoint;\r\n }\r\n\r\n // Todo: This will replace the createTouchPoint method. Legacy frontend needs to be adjusted first before this refactor step\r\n private createTouchPointByPayloadObject(marker: HTMLElement, dataObject: TouchPointPayload): ITouchPoint {\r\n const type: ServiceCallName = dataObject.type;\r\n const salesArticleVariantKey: string = dataObject.savKey;\r\n const slug: string = dataObject.slug;\r\n const origin: string = marker.getAttribute(\"data-item-origin\");\r\n const displayedInCategoryNavKey: string = marker.getAttribute(\"data-displayed-in-category-navkey\");\r\n\r\n let touchPoint: ITouchPoint = null;\r\n\r\n if (type === \"mpc-compare-button\") {\r\n touchPoint = new CompareButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey, null);\r\n } else if (type === \"mpc-scale-tile\") {\r\n touchPoint = new TileScaleButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey);\r\n }\r\n\r\n return touchPoint;\r\n }\r\n }\r\n}\r\n\r\nif(window.shell)\r\n MPCTouchPointFactory.TouchPointFactory.instance;","import { MPCITouchPointIdentifier} from \"../typings/TouchPointIdentifier\";\n\nexport module MPCTouchPointIdentifier {\n import ITouchPointIdentifier = MPCITouchPointIdentifier.ITouchPointIdentifier;\n import ServiceCallName = MPCITouchPointIdentifier.ServiceCallName;\n\n export class TouchPointIdentifier implements ITouchPointIdentifier {\n private static _instance: TouchPointIdentifier;\n private scope: HTMLElement;\n private compareButtonMarker: string = 'mpc-compare-button';\n private tileScaleMarker: string = 'mpc-scale-tile';\n\n static get instance() {\n return this._instance || (this._instance = new this());\n }\n\n constructor() {\n this.scope = document.body;\n }\n\n // For ATS and search page\n getMarkersFromDomEx(type: ServiceCallName, savKeys: string[]): HTMLElement[] {\n let scope = document.querySelector('.fas_article_tile_grid_root');\n\n if(!scope)\n scope = this.scope;\n\n let result: HTMLElement[] = [];\n\n savKeys.forEach((key) => {\n result.push(scope.querySelector('[data-service-call=\"' + type + '\"][data-selected-colorid=\"' + key + '\"]'));\n });\n\n return result;\n }\n\n getMarkersFromDom(scope?: HTMLElement, type?: ServiceCallName): NodeListOf {\n if (!scope) {\n scope = this.scope;\n }\n\n if (type) {\n return scope.querySelectorAll('[data-service-call=\"' + type + '\"]');\n } else {\n return scope.querySelectorAll('[data-service-call=' + this.compareButtonMarker + '], [data-service-call=' + this.tileScaleMarker + ']');\n }\n }\n \n getTileScaleTouchPoints(scope?: HTMLElement): NodeListOf {\n if (!scope) {\n scope = this.scope;\n }\n\n return scope.querySelectorAll('.mpc-scope.scale-tile-container');\n }\n\n getCompareLinks(scope?: HTMLElement): Array {\n if (!scope) {\n scope = this.scope;\n }\n\n const allLinks = scope.querySelectorAll('area[href], .imagemap-inner-container>a');\n const compareLinks: Array = [];\n for (let i = 0; i < allLinks.length; ++i) {\n const link = allLinks[i];\n const href = link.href;\n if (href.indexOf('.html') >= 0 && (href.indexOf('&compare=true') >= 0 || href.indexOf('?compare=true') >= 0)) {\n compareLinks.push(link);\n }\n }\n return compareLinks;\n }\n\n getMobileTouchPointPlaceholders(): NodeListOf {\n const scope = this.scope;\n\n return scope.querySelectorAll('.mobile-touchpoint-placeholder');\n }\n } \n}","import { MpcSettingsModule } from \"./helpers/MpcSettings\";\r\nimport { NlVanillajax, INlVanillajaxParams, ContentType } from \"./helpers/vanillajax\";\r\nimport { ErrorMessage } from \"../../Models/ErrorMessage.generated\"\r\n\r\ndeclare const window: Window;\r\n\r\nexport module MPCErrorHandlerModule {\r\n import MpcSettings = MpcSettingsModule.MpcSettings;\r\n\r\n export class ErrorHandlerManager {\r\n private static _instance: ErrorHandlerManager;\r\n private static _errorCount: number = 0;\r\n private _settings: MpcSettings;\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n constructor() {\r\n this.Init();\r\n }\r\n\r\n public Init(): void {\r\n this._settings = MpcSettings.instance;\r\n window.onerror = (msg, url, line, col, error) => {\r\n ErrorHandlerManager._errorCount++;\r\n if (ErrorHandlerManager._errorCount > 10) {\r\n return true;\r\n }\r\n\r\n const string = msg.toString().toLowerCase();\r\n const substring = \"script error\";\r\n if (string.indexOf(substring) === 0) {\r\n console.warn(\"cannot handle JS error. probably CORS issue.\");\r\n return false;\r\n }\r\n\r\n if (typeof (msg) !== \"string\") {\r\n let errorEvent: ErrorEvent = (msg);\r\n if (errorEvent.error) {\r\n msg = errorEvent.error.message + \"\\n\"+ errorEvent.error.stack;\r\n line = errorEvent.lineno;\r\n col = errorEvent.colno;\r\n url = errorEvent.filename;\r\n } else {\r\n msg = JSON.stringify(msg);\r\n }\r\n }\r\n //log error to service\r\n let errStr: string = undefined;\r\n if(error)\r\n errStr = JSON.stringify(error);\r\n const errorMsg = {\r\n message: msg,\r\n url: url,\r\n line: line,\r\n col: col,\r\n error: errStr\r\n };\r\n this.LogError(errorMsg);\r\n\r\n // for development, we want to see errors in console \r\n const suppressDefaultErrorHandlerAkaConsolePrint = !this._settings.isDevelopment;\r\n \r\n return suppressDefaultErrorHandlerAkaConsolePrint;\r\n };\r\n }\r\n\r\n public LogError(error: ErrorMessage): Promise {\r\n // handle only mpc errors:\r\n\r\n // source off error has to be known, if there is bundle/ file url, skip this logging:\r\n if (!error.url)\r\n return;\r\n\r\n // asset url has to contain mpc scope name\r\n if(error.url.indexOf('manualproductcomparison') === -1)\r\n return;\r\n \r\n // MPC is made on pure html and ts, we are not responsible for any react or other frameworks:\r\n if(error.message.indexOf('ReactDOM') > 0)\r\n return;\r\n \r\n // read local storage and stringify it. This will help to solve problems and get better feeling what data was used on exception:\r\n const mpcLocalStorage = this.collectAllLocalStorageObjects();\r\n if (mpcLocalStorage && Object.keys(mpcLocalStorage).length > 0) {\r\n error.mpcLocalStorage = JSON.stringify(mpcLocalStorage);\r\n }\r\n else {\r\n error.mpcLocalStorage = 'local storage was not found';\r\n }\r\n\r\n let params: INlVanillajaxParams = {};\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\r\n 'Debug/LogJavascriptError';\r\n params.data = JSON.stringify(error);\r\n\r\n return new NlVanillajax(params).postWithPromise()\r\n .then(() => {\r\n })\r\n .catch((reason) => {\r\n console.log(\"error could not be logged to service. reason: \"+reason.status+\" \"+reason.statusText);\r\n });\r\n }\r\n\r\n private collectAllLocalStorageObjects(): Record {\r\n const oldPrefix = 'productComparison'; //no ref to LocalStorageAbstraction to avoid circular ref\r\n const combinedData: Record = {};\r\n\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && key.startsWith(oldPrefix)) {\r\n const itemStr = localStorage.getItem(key);\r\n if (itemStr) {\r\n combinedData[key] = itemStr;\r\n }\r\n }\r\n }\r\n\r\n return combinedData;\r\n }\r\n }\r\n}\r\n\r\nMPCErrorHandlerModule.ErrorHandlerManager.instance.Init();","export module MPCScopeDetection {\n export class ScopeDetection {\n public static hasScopes(comparisonPage: boolean, comparisonFlyout: boolean): boolean {\n const PcfScope: NodeListOf = document.querySelectorAll(\".pcf-scope\");\n const PcpScope: NodeListOf = document.querySelectorAll(\".mpc-scope .grid\");\n\n return comparisonFlyout === PcfScope.length > 0 && comparisonPage === PcpScope.length > 0;\n }\n }\n}","export module MpcSettingsModule {\n export class MpcSettings {\n private static _instance: MpcSettings;\n private static initDone: boolean = false;\n\n static get instance() {\n return this._instance || (this._instance = new this());\n }\n\n public init(scope: HTMLElement): void {\n this._culture = scope.getAttribute(\"data-culture\");\n this._portal = scope.getAttribute(\"data-portal\");\n this._portalMandantToken = scope.getAttribute(\"data-portalmandanttoken\");\n this._maxProducts = parseInt(scope.getAttribute(\"data-maxProducts\"));\n this._isLoggedIn = scope.getAttribute(\"data-isLoggedIn\") === \"true\";\n this._isDevelopment = scope.getAttribute(\"data-isDevelopment\") === \"true\";\n this._apiUrl = scope.getAttribute(\"data-apiUrl\");\n \n MpcSettings.initDone = true;\n }\n\n private _culture:string;\n get culture():string {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._culture;\n }\n\n private _portalMandantToken: string;\n get portalMandantToken(): string {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._portalMandantToken;\n }\n\n private _apiUrl: string;\n get apiUrl(): string {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._apiUrl;\n }\n \n private _maxProducts:number;\n get maxProducts():number {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._maxProducts;\n }\n\n private _isLoggedIn: boolean;\n get isLoggedIn(): boolean {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._isLoggedIn;\n }\n \n private _isDevelopment: boolean;\n get isDevelopment(): boolean {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._isDevelopment;\n }\n\n private _portal:string;\n get portal():string {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._portal;\n }\n\n public MobileCategoryNavKey: string;\n\n }\n}","export module MPCCallLimiter {\r\n export abstract class CallLimiter {\r\n static debounce(callback: Function, delay: number, immediate: boolean = false): Function {\r\n let timer: number;\r\n return function () {\r\n const context = this;\r\n const args: IArguments = arguments;\r\n\r\n const delayedCall: Function = function () {\r\n timer = null;\r\n if (!immediate) {\r\n callback.apply(context, args);\r\n }\r\n };\r\n\r\n const instantCall: boolean = immediate && !timer;\r\n clearTimeout(timer);\r\n timer = setTimeout(delayedCall, delay);\r\n\r\n if (instantCall) {\r\n callback.apply(context, args);\r\n }\r\n };\r\n }\r\n\r\n static throttle(callback: Function, interval: number, leadCall: boolean = true, trailCall: boolean = true): Function {\r\n let blockExecution = leadCall;\r\n let resetTimer: Timer;\r\n\r\n return function () {\r\n const context = this;\r\n const args: IArguments = arguments;\r\n\r\n if (leadCall && !resetTimer) {\r\n callback.apply(context, args);\r\n blockExecution = false;\r\n\r\n if (!trailCall) {\r\n resetTimer = setTimeout(function () {\r\n resetTimer = null;\r\n }, interval);\r\n }\r\n }\r\n\r\n if (!blockExecution && trailCall) {\r\n blockExecution = true;\r\n\r\n setTimeout(function () {\r\n callback.apply(context, args);\r\n blockExecution = false;\r\n }, interval);\r\n\r\n clearTimeout(resetTimer);\r\n resetTimer = setTimeout(function () {\r\n resetTimer = null;\r\n }, interval + 250);\r\n }\r\n };\r\n }\r\n }\r\n\r\n type Timer = ReturnType;\r\n}\r\n","import { ProductComparisonModel } from \"../../../Models/Product.generated\";\n\nexport module MPCComparePageButtonUrlUpdater {\n export class ComparePageButtonUrlUpdater {\n private static _instance: ComparePageButtonUrlUpdater;\n private scope: HTMLElement;\n private comparisonPageBaseUri: string;\n\n public init(scope: HTMLElement): void {\n this.scope = scope;\n this.comparisonPageBaseUri = scope.getAttribute('data-comparisonpage-baseurl');\n }\n\n static get instance() {\n return this._instance || (this._instance = new this());\n }\n\n private _comparePageUrl:string = \"\";\n get ComparePageUrl():string {\n return this._comparePageUrl;\n }\n\n public onUpdatedModel(model : ProductComparisonModel): void {\n let result: string = \"\";\n\n if(model && model.activeNavigationTab) {\n const activeNavigationTab = model.activeNavigationTab;\n\n let comparisonPageUri: string = '?category=' + encodeURIComponent(activeNavigationTab);\n\n for (const storageProduct of model.products) {\n if (storageProduct.categoryName === activeNavigationTab) {\n comparisonPageUri = comparisonPageUri + '&savKeys=' + storageProduct.articleId.salesArticleVariantKey;\n }\n }\n\n result = comparisonPageUri;\n }\n\n if(!this.scope || this.scope === null) {\n // get root mpc place holder:\n this.scope = document.querySelector('.pcf-scope');\n this.comparisonPageBaseUri = this.scope.getAttribute('data-comparisonpage-baseurl');\n }\n\n this._comparePageUrl = this.comparisonPageBaseUri+result;\n\n if (this.scope) {\n const links = this.scope.querySelectorAll(\".comparison-page-link\");\n\n for (let link of links) {\n link.setAttribute('href', this._comparePageUrl);\n }\n }\n }\n }\n}","export module MPCDeviceDetectionHelper {\r\n export class DeviceDetectionHelper {\r\n private static _instance: DeviceDetectionHelper;\r\n private isTabletHandHeldDeviceEnvironment: boolean;\r\n private isMobileShopEnvironment: boolean;\r\n private isMicrosoftBrowserEnvironment: boolean;\r\n private sniffJson: HTMLElement;\r\n\r\n constructor() {\r\n this.init();\r\n }\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n private init(): void {\r\n this.isTabletHandHeldDeviceEnvironment = \r\n document.documentElement.className.indexOf('tablet') >= 0 || document.documentElement.className.indexOf('handheld') >= 0;\r\n\r\n this.isMobileShopEnvironment = \r\n document.documentElement.className.indexOf('mobileshop') >= 0;\r\n\r\n this.isMicrosoftBrowserEnvironment =\r\n document.documentElement.classList.contains(\"isMsie\") || document.documentElement.classList.contains(\"isEdge\");\r\n\r\n this.sniffJson = document.getElementById(\"sniff\");\r\n if (!this.sniffJson)\r\n return;\r\n\r\n const sniffJsonResult = JSON.parse(this.sniffJson.innerHTML);\r\n let resultingClasses: string = '';\r\n if (sniffJsonResult.isTablet) {\r\n document.body.dataset.cap = \"IsHandheld=true,IsLowendDevice=false\";\r\n resultingClasses += ' tablet';\r\n }\r\n if (sniffJsonResult.isPhone) \r\n resultingClasses = ' phone';\r\n if (sniffJsonResult.isHandheld) \r\n resultingClasses += ' handheld';\r\n if (sniffJsonResult.isAndroid) \r\n resultingClasses += ' android';\r\n if (sniffJsonResult.isIOS) \r\n resultingClasses += ' ios';\r\n if (!resultingClasses)\r\n return;\r\n\r\n const htmlClasses: string = document.documentElement.className;\r\n document.documentElement.className = htmlClasses.replace('desktop', resultingClasses);\r\n\r\n if (sniffJsonResult.isMsie)\r\n document.documentElement.classList.add('isMsie');\r\n if (sniffJsonResult.isEdge)\r\n document.documentElement.classList.add('isEdge');\r\n }\r\n\r\n public isTabletHandHeldDevice(): boolean {\r\n return this.isTabletHandHeldDeviceEnvironment;\r\n }\r\n\r\n public isMobileShop(): boolean {\r\n return this.isMobileShopEnvironment;\r\n }\r\n\r\n public isMicrosoftBrowser(): boolean {\r\n return this.isMicrosoftBrowserEnvironment;\r\n }\r\n\r\n // removed because of ESPP-4706\r\n // public adaptLegacySniff(): void {\r\n // const deviceDetector = new DeviceDetector();\r\n // const device: DeviceDetector.DeviceDetectorResult = \r\n // deviceDetector.parse(window.navigator.userAgent);\r\n\r\n // let resultingClasses: string = '';\r\n // let sniffResult: string = '{';\r\n\r\n // if (device.device.type === 'desktop')\r\n // sniffResult += '\"isDesktop\": true';\r\n // else \r\n // sniffResult += '\"isDesktop\": false';\r\n\r\n // if (device.device.type === 'tablet') {\r\n // document.body.dataset.cap = \"IsHandheld=true,IsLowendDevice=false\";\r\n // resultingClasses = 'tablet';\r\n // sniffResult += ', \"isTablet\": true';\r\n // }\r\n // else \r\n // sniffResult += ', \"isTablet\": false';\r\n\r\n // if (device.device.model === 'iPad')\r\n // sniffResult += ', \"isIPad\": true';\r\n // else \r\n // sniffResult += ', \"isIPad\": false';\r\n \r\n // sniffResult += '}';\r\n\r\n // if (resultingClasses) {\r\n // const htmlClasses: string = document.documentElement.className;\r\n // document.documentElement.className = htmlClasses.replace('desktop', resultingClasses);\r\n // }\r\n\r\n // this.sniffJson.innerHTML = sniffResult;\r\n // }\r\n }\r\n}","import { MPCIEventBus } from \"../typings/iEventBus\";\r\n\r\nexport module MPCEventBus {\r\n import IEventBus = MPCIEventBus.IEventBus;\r\n import EventName = MPCIEventBus.EventName;\r\n import CallbackLists = MPCIEventBus.CallbackLists;\r\n import ICallback = MPCIEventBus.ICallback;\r\n import ISubscription = MPCIEventBus.ISubscription;\r\n import ISubscriptionId = MPCIEventBus.ISubscriptionId;\r\n\r\n export class EventBus implements IEventBus {\r\n private static _instance: EventBus;\r\n private callbackLists: CallbackLists;\r\n\r\n private constructor() {\r\n this.callbackLists = [];\r\n }\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n subscribe(eventName: EventName | EventName[], callback: ICallback): ISubscriptionId[] {\r\n if (this.isArray(eventName)) {\r\n const subscriptionsIds: ISubscriptionId[] = [];\r\n\r\n for (const message of eventName) {\r\n subscriptionsIds.push(this.createSubscription(message, callback));\r\n }\r\n\r\n return subscriptionsIds;\r\n } else {\r\n return [this.createSubscription(eventName, callback)];\r\n }\r\n }\r\n\r\n subscribeMultiple(subscriptions: ISubscription[]): ISubscriptionId[] {\r\n const subscriptionIds: ISubscriptionId[] = [];\r\n\r\n if (!subscriptions) {\r\n return subscriptionIds;\r\n }\r\n\r\n for (const subscription of subscriptions) {\r\n const subscriptionId: ISubscriptionId = this.addSubscription(subscription);\r\n\r\n subscriptionIds.push(subscriptionId);\r\n }\r\n return subscriptionIds;\r\n }\r\n\r\n unsubscribe(subscriptionId: ISubscriptionId | ISubscriptionId[]): void {\r\n if (this.isArray(subscriptionId)) {\r\n this.unSubscribeMultiple(subscriptionId);\r\n } else {\r\n this.removeSubscription(subscriptionId);\r\n }\r\n }\r\n\r\n publish(eventName: EventName, payload?: any): void {\r\n if (!this.callbackLists[eventName]) {\r\n return;\r\n }\r\n\r\n // to prevent to also iterate over subscriptions, which are created while iterating\r\n const callbacksClone: ICallback[] = this.callbackLists[eventName].slice(0);\r\n for (const callback of callbacksClone) {\r\n if (callback) {\r\n callback(payload);\r\n }\r\n }\r\n }\r\n\r\n private createSubscription(eventName: EventName, callback: ICallback): ISubscriptionId {\r\n return this.addSubscription({\r\n eventName: eventName,\r\n callback: callback\r\n });\r\n }\r\n\r\n private addSubscription(subscription: ISubscription): ISubscriptionId {\r\n if (!this.callbackLists[subscription.eventName]) {\r\n this.callbackLists[subscription.eventName] = [];\r\n }\r\n\r\n const subscriptionId: ISubscriptionId = {\r\n eventName: subscription.eventName,\r\n id: (this.callbackLists[subscription.eventName].push(subscription.callback)) - 1\r\n };\r\n\r\n return subscriptionId;\r\n }\r\n\r\n private unSubscribeMultiple(subscriptionIds: ISubscriptionId[]): void {\r\n for (const subscriptionId of subscriptionIds) {\r\n this.removeSubscription(subscriptionId);\r\n }\r\n }\r\n\r\n private removeSubscription(subscriptionId: ISubscriptionId): void {\r\n const subscription: ICallback = this.callbackLists[subscriptionId.eventName][subscriptionId.id];\r\n if (subscription) {\r\n this.callbackLists[subscriptionId.eventName][subscriptionId.id] = undefined;\r\n }\r\n }\r\n\r\n private isArray(element: any): element is any[] {\r\n return Array.isArray(element);\r\n }\r\n }\r\n}","export module MPCElementsHelper {\n export class HtmlElementsHelper {\n public static appendChildAtIndex(child: HTMLElement, index: number, parent: HTMLElement): void {\n if(index >= parent.children.length) {\n parent.appendChild(child);\n }\n else {\n parent.insertBefore(child, parent.children[index]);\n }\n }\n }\n}","import {MPCElementsHelper} from \"../helpers/htmlElementsHelper\";\nimport {MPCINavigationService} from \"../typings/iNavigationService\";\nimport { MPCIAbstractContent } from \"../typings/iAbstractContent\";\nimport { MPCNotificationService } from \"../PCF/notification-service\";\nimport { NavigationTab } from \"../../../Models/Product.generated\";\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\nimport { MPCLocalStorageService } from \"../local-storage-service\";\n\nexport module MPCNavigationService {\n import INavigationService = MPCINavigationService.INavigationService;\n import HtmlElementsHelper = MPCElementsHelper.HtmlElementsHelper;\n import IAbstractContent = MPCIAbstractContent.IAbstractContent;\n import NotificationService = MPCNotificationService.NotificationService;\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\n\n //extend the service interface by some properties that are only used in TS\n interface NavigationTabTs extends NavigationTab {\n domNode: HTMLElement;\n savKeys: string[];\n }\n\n export class NavigationService implements INavigationService {\n private static _instance: NavigationService;\n private navigationTabs: HTMLElement;\n private selectCategoryButton: HTMLElement;\n private navigationTabsArray: Array;\n private activeNavigationTab: NavigationTabTs;\n private parentElement: HTMLElement;\n private navigationTabKeyName: string;\n private abstractContent: IAbstractContent;\n private notificationService: NotificationService;\n private deviceDetectionHelper: DeviceDetectionHelper;\n private productComparisonModelManager: ProductComparisonModelManager;\n\n static get instance() {\n return this._instance || (this._instance = new this());\n }\n\n init(parentElement: HTMLElement, navigationTabKeyName: string, abstractContent: IAbstractContent): void {\n\n if (parentElement) {\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n this.notificationService = NotificationService.instance;\n this.parentElement = parentElement;\n this.selectCategoryButton = this.parentElement.querySelector('.select-category-button');\n this.navigationTabs = this.parentElement.querySelector('.navigation-tabs');\n this.navigationTabsArray = new Array();\n this.navigationTabKeyName = navigationTabKeyName;\n this.abstractContent = abstractContent;\n this.registerButtonEvent();\n }\n }\n\n private registerButtonEvent(): void {\n if (this.selectCategoryButton)\n this.selectCategoryButton.addEventListener('click', () => {\n this.notificationService.notifyEmptyList();\n });\n }\n\n private switchNavigationTab(newActiveNavigationTab: NavigationTabTs): void {\n if (this.activeNavigationTab) {\n this.activeNavigationTab.domNode.classList.remove('active-tab');\n\n const newActiveNavigationTabName: string = newActiveNavigationTab.name;\n const oldNavigationTabName: string = this.activeNavigationTab.name;\n\n if (this.deviceDetectionHelper.isMobileShop()) {\n // clear locked column info:\n this.productComparisonModelManager = ProductComparisonModelManager.instance;\n this.productComparisonModelManager.clearLockedColumnIndex();\n this.productComparisonModelManager.clearCarouselScrollIndex();\n }\n\n if (this.abstractContent) {\n this.abstractContent.updateContainerListVisibility(newActiveNavigationTabName, oldNavigationTabName);\n }\n }\n\n this.activeNavigationTab = newActiveNavigationTab;\n newActiveNavigationTab.domNode.classList.add('active-tab');\n }\n\n private scrollToNavigationTab(newActiveNavigationTab: NavigationTabTs): void {\n const buttonLeftEdgePosition = newActiveNavigationTab.domNode.getBoundingClientRect().left;\n const buttonRightEdgePosition = buttonLeftEdgePosition + newActiveNavigationTab.domNode.offsetWidth;\n const rightMargin = 10;\n\n if (buttonRightEdgePosition > window.innerWidth) {\n this.navigationTabs.scrollLeft = buttonRightEdgePosition + rightMargin - window.innerWidth;\n }\n }\n\n public createOrUpdateNavigationTab(categoryName: string, counterNumber: number, navigationOrder: number,\n salesArticleVariantKey: string, createEmptyNavTab: boolean = false): void {\n let isNew: boolean = true;\n \n // look for existing tab:\n for(const navigationTab of this.navigationTabsArray) {\n const currentNavigationTabName = navigationTab.domNode.getAttribute(this.navigationTabKeyName);\n if(currentNavigationTabName === categoryName) {\n if (navigationTab.savKeys.indexOf(salesArticleVariantKey) >= 0) {\n return; //sav already added (happens when ajax reloads)\n }\n if (counterNumber > 0) {\n navigationTab.savKeys.push(salesArticleVariantKey);\n if(!this.abstractContent)//that URL is only used from PCP\n this.appendSavKeyToNavTabUrl(navigationTab, salesArticleVariantKey);\n } else if (counterNumber < 0) {\n navigationTab.savKeys = navigationTab.savKeys.slice(navigationTab.savKeys.indexOf(salesArticleVariantKey), 1);\n //no removal from url nessesary because that URL is only used from PCP, where articles are only added \n //(when loading the page, remove triggers a page reload)\n }\n this.updateCounter(navigationTab, counterNumber);\n\n isNew = false;\n break;\n }\n }\n\n if (isNew) {\n const newNavigationTab: NavigationTabTs = this.createNavigationTab(categoryName, salesArticleVariantKey,\n navigationOrder, createEmptyNavTab);\n this.updateCounter(newNavigationTab, counterNumber);\n let indexToInsert = 0;\n for (let navigationTab of this.navigationTabsArray) {\n if (navigationOrder < navigationTab.navigationOrder) {\n break;\n }\n indexToInsert++;\n }\n\n this.navigationTabsArray.splice(indexToInsert, 0, newNavigationTab);\n \n // tab navigation:\n newNavigationTab.domNode.setAttribute('focusable', '');\n\n HtmlElementsHelper.appendChildAtIndex(newNavigationTab.domNode, indexToInsert, this.navigationTabs);\n newNavigationTab.domNode.addEventListener('click', () => {\n this.switchNavigationTab(newNavigationTab);\n });\n\n if (window.shell.tabNav !== undefined)\n window.shell.tabNav.onActivated('.navigation-tab .has-focus', \n () => { this.switchNavigationTab(newNavigationTab); });\n }\n }\n\n public updateSelectCategoryButtonVisibility(): void {\n if (!this.selectCategoryButton)\n return;\n\n if (!this.isAnyProductCounted())\n this.selectCategoryButton.classList.remove(\"hidden\");\n }\n\n private isAnyProductCounted(): boolean {\n let productFound = false;\n this.navigationTabsArray.forEach((tab: NavigationTabTs) => {\n if (this.getCounterNumber(tab)) {\n productFound = true;\n return;\n }\n });\n\n return productFound;\n }\n\n private updateCounter(navigationTab: NavigationTabTs, counterNumber: number): void {\n const productsCounter: HTMLElement = navigationTab.domNode.querySelector('.products-counter');\n let counter: number = Number(productsCounter.textContent.trim());\n \n counter += counterNumber;\n productsCounter.innerText = counter.toString();\n }\n\n private getCounterNumber(navigationTab: NavigationTabTs): number {\n const productsCounter: HTMLElement = navigationTab.domNode.querySelector('.products-counter');\n return Number(productsCounter.innerText);\n }\n \n private appendSavKeyToNavTabUrl(navigationTab: NavigationTabTs, salesArticleVariantKey: string): void {\n let comparisonPageUri: string = navigationTab.domNode.getAttribute('href');\n comparisonPageUri = comparisonPageUri + '&savKeys=' + salesArticleVariantKey;\n navigationTab.domNode.setAttribute('href', comparisonPageUri);\n }\n\n private createNavigationTab(categoryName: string, salesArticleVariantKey: string, order: number,\n createEmptyNavTab: boolean): NavigationTabTs {\n let newNavigationTab: NavigationTabTs = {} as NavigationTabTs;\n newNavigationTab.navigationOrder = order;\n newNavigationTab.name = categoryName;\n newNavigationTab.savKeys = [salesArticleVariantKey];\n let newNavigationTabHtml: HTMLElement;\n\n if (salesArticleVariantKey || createEmptyNavTab) {\n // create navigation ab from comparison page:\n newNavigationTabHtml = document.createElement('a');\n\n // comparisonPageUri is used in PCP page, flyout does not need it:\n let comparisonPageUri: string;\n if (!this.abstractContent) {\n comparisonPageUri = '?category=' + encodeURIComponent(categoryName);\n if (salesArticleVariantKey) {\n comparisonPageUri += '&savKeys=' + salesArticleVariantKey;\n }\n } else {\n comparisonPageUri = 'javascript:';\n }\n\n newNavigationTabHtml.setAttribute('href', comparisonPageUri);\n }\n else {\n // create navigation tab for flyout:\n newNavigationTabHtml = document.createElement('div');\n }\n \n const newCategoryName: HTMLElement = document.createElement('div');\n const newArticlesCounter: HTMLElement = document.createElement('div');\n\n newNavigationTabHtml.className = 'navigation-tab';\n newNavigationTabHtml.setAttribute(this.navigationTabKeyName, categoryName);\n newCategoryName.className = 'category-name';\n newCategoryName.innerText = categoryName;\n newArticlesCounter.className = 'products-counter';\n \n newNavigationTabHtml.appendChild(newCategoryName);\n newNavigationTabHtml.appendChild(newArticlesCounter);\n\n newNavigationTabHtml.addEventListener('keydown', (event: any) => {\n // prevent page jump down on Space btn., click\n if (event.code === 'Space')\n event.preventDefault();\n\n if(!window.shell.tabNav)\n return;\n \n if (event.code === 'ArrowRight' && event.target.nextElementSibling) {\n window.shell.tabNav.focus(event.target.nextElementSibling);\n }\n \n if (event.code === 'ArrowLeft' && event.target.previousElementSibling) {\n window.shell.tabNav.focus(event.target.previousElementSibling);\n }\n });\n\n newNavigationTab.domNode = newNavigationTabHtml;\n return newNavigationTab;\n }\n\n public removeEmptyNavigationTabs(): void {\n if(this.navigationTabsArray) {\n let removableNavigationTabs: Array = new Array();\n\n for (const navigationTab of this.navigationTabsArray) {\n const productsCounter: HTMLElement = navigationTab.domNode.querySelector('.products-counter');\n const counter: number = Number(productsCounter.innerText);\n\n if (counter == 0) {\n removableNavigationTabs.push(navigationTab);\n \n // remove highlight from last navigation tab:\n // temporary disabled by customer: ESPP-1523\n /* if (this.navigationTabsArray.length == 1) {\n this.navigationTabsArray[0].classList.remove('active-tab');\n } */\n }\n }\n\n for (const tmpTab of removableNavigationTabs) {\n this.navigationTabs.removeChild(tmpTab.domNode);\n this.navigationTabsArray.splice(this.navigationTabsArray.indexOf(tmpTab), 1);\n }\n }\n }\n\n public markActiveNavigationTab(categoryName: string): boolean {\n let newTabActivated: boolean;\n for (const navigationTab of this.navigationTabsArray) {\n let navigationTabName: string = navigationTab.domNode.getAttribute(this.navigationTabKeyName);\n\n if (navigationTabName === categoryName) {\n this.switchNavigationTab(navigationTab);\n this.scrollToNavigationTab(navigationTab);\n newTabActivated = true;\n break;\n }\n }\n\n return newTabActivated;\n }\n\n public markAnyNavigationTabActive(): string {\n // after category was cleared, active tab is not selected.\n // Need to define last one o first one navigation tab from navigation service container.\n let newActiveTabCatName: string;\n\n if (this.navigationTabsArray && this.navigationTabsArray.length > 0) {\n const newActiveTab: NavigationTabTs =\n this.navigationTabsArray[this.navigationTabsArray.length - 1];\n\n newActiveTabCatName = newActiveTab.name;\n this.switchNavigationTab(newActiveTab);\n this.scrollToNavigationTab(newActiveTab);\n }\n\n return newActiveTabCatName;\n }\n\n public getFirstNavigationTab(): HTMLElement {\n if (this.navigationTabsArray && this.navigationTabsArray.length > 0) {\n const firstTab: NavigationTabTs = this.navigationTabsArray[0];\n\n return firstTab.domNode;\n }\n\n return;\n }\n }\n}","//IE polyfills\nimport 'eligrey-classlist-js-polyfill';\nimport 'element-remove';\nif (typeof NodeList.prototype.forEach !== \"function\" && typeof Array.prototype.forEach === \"function\")\n NodeList.prototype.forEach = ((Array.prototype.forEach) as any);","export module MPCScrollLock {\n export class ScrollLock\n {\n private static _instance: ScrollLock;\n private bodyScrollPosition: number = 0;\n\n static get instance() {\n return this._instance || (this._instance = new this());\n }\n\n public lock(): void {\n const webContainer = document.querySelector('.container');\n const mobileContainer = document.querySelector('.page-container');\n this.bodyScrollPosition = window.pageYOffset;\n \n if (webContainer || mobileContainer)\n document.body.setAttribute(\n 'style',\n 'overflow: hidden !important; position: fixed !important; top: -' +\n this.bodyScrollPosition +\n 'px;'\n );\n }\n \n public unlock(): void {\n const webContainer = document.querySelector('.container');\n const mobileContainer = document.querySelector('.page-container');\n \n if (webContainer || mobileContainer) {\n document.body.removeAttribute('style');\n window.scrollTo(0, this.bodyScrollPosition);\n }\n }\n }\n}","export interface INlVanillajaxParams {\n query?: string;\n data?: any;\n url: string;\n contentType: ContentType;\n}\n\nexport enum ContentType {\n JSON,\n Plain\n}\n\nexport interface HtmlResult {\n Html: string;\n}\n\nexport class NlVanillajax {\n headers: any[];\n private params: INlVanillajaxParams;\n private req: XMLHttpRequest;\n\n constructor(params: INlVanillajaxParams) {\n this.headers = [\n { \"name\": \"Accept\", \"value\": \"text/html,application/json\" },\n { \"name\": \"Content-Type\", \"value\": \"application/json\" }\n ];\n this.params = params;\n this.params.query = params.query || \"\";\n this.params.data = params.data || null;\n this.params.contentType = params.contentType || ContentType.JSON;\n this.req = this.xhr(window);\n }\n\n post(callback: Function): NlVanillajax {\n this.open(this.req, \"POST\", this.params.url + (this.params.query.length ? \"?\" + this.params.query : \"\"));\n this.setHeaders(this.req, this.headers);\n this.onReadyStateChange(this.req, callback);\n this.send(this.req, this.params.data);\n\n return this;\n }\n\n postWithPromise(): Promise {\n let self = this;\n return new Promise(function (resolve, reject) {\n self.open(self.req, \"POST\", self.params.url + (self.params.query.length ? \"?\" + self.params.query : \"\"));\n self.setHeaders(self.req, self.headers);\n self.req.onload = function () {\n if (this.status >= 200 && this.status < 300) {\n let result = self.getResult(self.req);\n if (result)\n resolve(result);\n else\n reject({\n status: this.status,\n statusText: \"response not interpretable\"\n });\n } else {\n reject({\n status: this.status,\n statusText: self.req.statusText\n });\n }\n };\n self.req.onerror = function () {\n reject({\n status: this.status,\n statusText: self.req.statusText\n });\n };\n self.send(self.req, self.params.data);\n });\n }\n\n getWithPromise(): Promise {\n let self = this;\n return new Promise(function (resolve, reject) {\n self.open(self.req, \"GET\", self.params.url);\n self.setHeaders(self.req, self.headers);\n //self.req.withCredentials = true;\n self.req.onload = function () {\n if (this.status >= 200 && this.status < 300) {\n let result = self.getHtmlResult(self.req);\n if(result)\n resolve(result);\n else\n reject({\n status: this.status,\n statusText: \"response not interpretable\"\n });\n } else {\n reject({\n status: this.status,\n statusText: self.req.statusText\n });\n }\n };\n self.req.onerror = function () {\n reject({\n status: this.status,\n statusText: self.req.statusText\n });\n };\n self.sendGet(self.req);\n });\n }\n\n private xhr(win: any): XMLHttpRequest {\n return new win.XMLHttpRequest();\n }\n\n private open(req: XMLHttpRequest, method: string, url: string): any {\n req.open(method, url);\n\n return req;\n }\n\n private setHeaders(req: XMLHttpRequest, headers: any[]): XMLHttpRequest {\n headers.forEach(header => req.setRequestHeader(header.name, header.value));\n\n return req;\n }\n\n private onReadyStateChange(req: XMLHttpRequest, callback: Function): XMLHttpRequest {\n req.onreadystatechange = () => {\n\n if (req.readyState === XMLHttpRequest.DONE) {\n let result = this.getResult(req);\n\n callback(result, req.status);\n }\n }\n\n return req;\n }\n\n private getHtmlResult(req: XMLHttpRequest): HtmlResult {\n let json: HtmlResult;\n\n if (req.responseText) {\n json = { \"Html\": req.responseText };\n } else {\n json = null;\n }\n\n return json;\n }\n\n private getResult(req: XMLHttpRequest): T {\n let json: T;\n try {\n json = JSON.parse(req.responseText);\n } catch (e) {\n json = null;\n }\n\n return json;\n }\n\n private send(req: XMLHttpRequest, data: any): XMLHttpRequest {\n req.send(data);\n\n return req;\n }\n\n private sendGet(req: XMLHttpRequest): XMLHttpRequest {\n req.send();\n\n return req;\n }\n}","import { MPCNotificationService } from \"./PCF/notification-service\";\r\nimport { ProductComparisonModel, Product, NavigationTab } from \"../../Models/Product.generated\";\r\nimport { ErrorMessage } from \"../../Models/ErrorMessage.generated\";\r\nimport { NlVanillajax, INlVanillajaxParams } from \"./helpers/vanillajax\";\r\nimport { MPCComparePageButtonUrlUpdater } from \"./helpers/comparePageButtonUrlUpdater\";\r\nimport { MPCAddElementContext } from \"./typings/addElementContext\";\r\nimport { MPCErrorHandlerModule } from \"./errorhandler\";\r\nimport { MpcSettingsModule } from \"./helpers/MpcSettings\";\r\n\r\nexport module MPCLocalStorageService {\r\n import AddElementContext = MPCAddElementContext.AddElementContext;\r\n import NotificationService = MPCNotificationService.NotificationService;\r\n import ErrorHandlerManager = MPCErrorHandlerModule.ErrorHandlerManager;\r\n import ComparePageButtonUrlUpdater = MPCComparePageButtonUrlUpdater.ComparePageButtonUrlUpdater;\r\n import MpcSettings = MpcSettingsModule.MpcSettings;\r\n\r\n export enum AddResult {\r\n Added,\r\n Replaced,\r\n RejectedCapacity,\r\n RejectedDuplicate\r\n }\r\n\r\n export class ProductComparisonModelManager {\r\n private static _instance: ProductComparisonModelManager;\r\n private notificationService: NotificationService;\r\n private localStorageAbstraction: LocalStorageAbstraction;\r\n private localStorageCache: ProductComparisonModel;\r\n private runningServiceCall: Promise;\r\n private comparePageButtonUrlUpdater: ComparePageButtonUrlUpdater;\r\n private readonly DuplicateNotFound: number = -1;\r\n private readonly DuplicateExact: number = -2;\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n constructor() {\r\n this.init();\r\n }\r\n\r\n private init(): void {\r\n this.notificationService = NotificationService.instance;\r\n this.localStorageAbstraction = LocalStorageAbstraction.instance;\r\n this.localStorageCache = this.localStorageAbstraction.readLocalStorage();\r\n this.comparePageButtonUrlUpdater = ComparePageButtonUrlUpdater.instance;\r\n // here we load the model (from localStorage and with server-sync if deemed necessary) \r\n // for later usage by all the components\r\n this.getModel();\r\n }\r\n\r\n public getModel(): Promise {\r\n if (this.runningServiceCall) {\r\n // this service call is a singleton, avoid useless parallel calls \r\n return this.runningServiceCall;\r\n }\r\n this.runningServiceCall = new Promise((resolve, reject) => {\r\n try {\r\n this.localStorageCache = this.localStorageAbstraction.readLocalStorage();\r\n if (this.localStorageCache && this.localStorageCache.products.length > 0 \r\n && !this.localStorageCache.activeNavigationTab) {\r\n this.localStorageCache.activeNavigationTab = this.localStorageCache.products[0].categoryName;\r\n }\r\n if (this.localStorageCache && typeof this.localStorageCache.mobileEnabledCategories != \"object\") {\r\n this.localStorageCache.mobileEnabledCategories = [];\r\n }\r\n this.validateLocalStorage();\r\n } catch (err) {\r\n ErrorHandlerManager.instance.LogError({\r\n message: \"resetting mpc localStorage because: \" +\r\n err +\r\n \", localStorage: \" +\r\n JSON.stringify(this.localStorageCache)\r\n }); \r\n this.localStorageCache = undefined;\r\n }\r\n\r\n const isNewlyLoggedOut = !MpcSettings.instance.isLoggedIn && this.localStorageCache && !!this.localStorageCache.isLoggedIn;\r\n if (!this.localStorageCache || ProductComparisonModelManager.isTimedOut(this.localStorageCache) \r\n || isNewlyLoggedOut) {\r\n this.createNewLocalStorage();\r\n resolve(this.localStorageCache);\r\n return;\r\n }\r\n if (MpcSettings.instance.isLoggedIn && !this.localStorageCache.isLoggedIn) {\r\n this.localStorageCache.isLoggedInNewly = true;\r\n }\r\n this.localStorageCache.isLoggedIn = MpcSettings.instance.isLoggedIn;\r\n const needsValidation = this.needsValidation();\r\n if (!needsValidation) {\r\n if (this.localStorageCache.pageLanguage !== MpcSettings.instance.culture) { // if for logical readability :)\r\n this.localStorageCache.pageLanguage = MpcSettings.instance.culture;\r\n }\r\n \r\n this.onUpdatedModel(true);\r\n \r\n resolve(this.localStorageCache);\r\n return;\r\n }\r\n\r\n this.sync()\r\n .then((model)=>resolve(model))\r\n .catch((error)=>reject(error));\r\n });\r\n this.runningServiceCall.then((model) => {\r\n this.runningServiceCall = null;\r\n })\r\n return this.runningServiceCall;\r\n }\r\n\r\n private sync(): Promise {\r\n const printPageContent = this.localStorageCache.printPageContent;\r\n this.localStorageCache.printPageContent = null;\r\n\r\n let params: INlVanillajaxParams = {};\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\r\n 'Products/Sync';\r\n params.data = JSON.stringify(this.localStorageCache);\r\n\r\n const countBefore = this.localStorageCache.products.length;\r\n\r\n return new NlVanillajax(params).postWithPromise()\r\n .then((model) => {\r\n if (!model || !model.products) {\r\n this.localStorageCache.printPageContent = printPageContent;\r\n return Promise.reject(\"service returned no useful result\");\r\n //throw new Error(\"service returned no useful result\");\r\n }\r\n // false will not be send over the wire, but we don't want undefined values\r\n model.clearStoredEmptyNavigationTabs = !!model.clearStoredEmptyNavigationTabs;\r\n model.hasClientSideChange = false;\r\n this.localStorageCache = model;\r\n this.localStorageCache.printPageContent = printPageContent;\r\n this.onUpdatedModel(true); //skipSaving=true, because 'validate' saves internally\r\n const countAfter = model.products.length;\r\n if (countBefore === 0 && countAfter > 0) {\r\n this.setMobileHeaderMarkerOn();\r\n } else if (countBefore > 0 && countAfter === 0) {\r\n this.setMobileHeaderMarkerOff();\r\n }\r\n return this.localStorageCache;\r\n })\r\n .catch((err) => {\r\n this.localStorageCache.printPageContent = printPageContent;\r\n return Promise.reject(err);\r\n });\r\n }\r\n\r\n private validateLocalStorage(): void {\r\n //there were some problems with old/invalid localStorage contents, so we detect and reset them\r\n if (this.localStorageCache) {\r\n if (!Array.isArray(this.localStorageCache.products))\r\n throw \"localStorage is corrupted - products is no array\";\r\n if (!this.localStorageCache.lastUpdateTime)\r\n throw \"localStorage is corrupted - lastUpdateTime is not set\";\r\n if (typeof this.localStorageCache.lastUpdateTime !== \"number\")\r\n throw \"localStorage is corrupted - lastUpdateTime is no number\";\r\n if (this.localStorageCache.products.length > 0) {\r\n if (!this.localStorageCache.activeNavigationTab)\r\n throw \"localStorage is corrupted - activeNavigationTab is not set\";\r\n if (typeof this.localStorageCache.activeNavigationTab !== \"string\")\r\n throw \"localStorage is corrupted - activeNavigationTab is no string\";\r\n }\r\n if (!this.localStorageCache.pageLanguage)\r\n throw \"localStorage is corrupted - pageLanguage is not set\";\r\n if (typeof this.localStorageCache.pageLanguage !== \"string\")\r\n throw \"localStorage is corrupted - pageLanguage is no string\";\r\n if (typeof this.localStorageCache.clearStoredEmptyNavigationTabs !== \"boolean\")\r\n throw \"localStorage is corrupted - clearStoredEmptyNavigationTabs is no boolean\";\r\n if (!Array.isArray(this.localStorageCache.emptyNavigationTabs))\r\n throw \"localStorage is corrupted - emptyNavigationTabs is no array\";\r\n if (this.localStorageCache.products.length > 0) {\r\n if (!this.localStorageCache.products[0].articleId.masterArticleNo) {\r\n throw \"localStorage is corrupted - products[0].articleId.masterArticleNo is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].articleId.salesArticleVariantKey) {\r\n throw \"localStorage is corrupted - products[0].articleId.salesArticleVariantKey is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].articleId.seoDescription) {\r\n throw \"localStorage is corrupted - products[0].articleId.seoDescription is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].articleId.seoSlug) {\r\n throw \"localStorage is corrupted - products[0].articleId.seoSlug is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].categoryName) {\r\n throw \"localStorage is corrupted - products[0].categoryName is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].categoryUrl) {\r\n throw \"localStorage is corrupted - products[0].categoryUrl is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].detailsPageUrl) {\r\n throw \"localStorage is corrupted - products[0].detailsPageUrl is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].mainImage) {\r\n throw \"localStorage is corrupted - products[0].mainImage is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].originNavigationKeyPath) {\r\n throw \"localStorage is corrupted - products[0].originNavigationKeyPath is not set\";\r\n }\r\n if (typeof this.localStorageCache.products[0].navigationOrder !== \"number\") {\r\n throw \"localStorage is corrupted - products[0].mainImage is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].title) {\r\n throw \"localStorage is corrupted - products[0].mainImage is not set\";\r\n }\r\n }\r\n }\r\n }\r\n \r\n public setActiveNavigationTab(activeNavigationTab: string): void {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n if (this.localStorageCache.activeNavigationTab !== activeNavigationTab) {\r\n this.localStorageCache.activeNavigationTab = activeNavigationTab;\r\n this.onUpdatedModel(true); //don't save, who cares\r\n }\r\n }\r\n \r\n public activateOnMobileCategory(categoryNavKey: string): void {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n\r\n this.localStorageCache.mobileEnabledCategories.push(categoryNavKey);\r\n this.onUpdatedModel(true);//dont save, who cares\r\n }\r\n\r\n public isActivatedOnMobileCategory(categoryNavKey: string): boolean {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n\r\n return this.localStorageCache.mobileEnabledCategories &&\r\n this.localStorageCache.mobileEnabledCategories.indexOf(categoryNavKey) >= 0;\r\n }\r\n\r\n public deactivateOnMobileCategory(categoryNavKey: string): void {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n\r\n const idx = this.localStorageCache.mobileEnabledCategories.indexOf(categoryNavKey);\r\n this.localStorageCache.mobileEnabledCategories.splice(idx, idx >= 0 ? 1 : 0);\r\n this.onUpdatedModel(true);//dont save, who cares\r\n }\r\n\r\n public addProduct(product: Product): AddResult {\r\n if (this.localStorageCache) {\r\n this.setActiveNavigationTab(product.categoryName);\r\n\r\n const duplicateCheckResult = this.checkDuplicateProductPerCategory(\r\n product.articleId.salesArticleVariantKey,\r\n product.categoryName,\r\n product.articleId.masterArticleNo\r\n );\r\n if (duplicateCheckResult === this.DuplicateNotFound && this.isAlreadyAtLimit(product.categoryName)) {\r\n this.notificationService.notifyMaximumProductsCountReached();\r\n return AddResult.RejectedCapacity;\r\n }\r\n \r\n if (duplicateCheckResult === this.DuplicateNotFound) {\r\n this.appendProductToList(product, false);\r\n return AddResult.Added;\r\n }\r\n else {\r\n if (duplicateCheckResult !== this.DuplicateExact) {\r\n this.localStorageCache.products[duplicateCheckResult] = product;\r\n this.localStorageCache.hasClientSideChange = true;\r\n this.onUpdatedModel(false);\r\n }\r\n\r\n // just show new product notification, because product is already added:\r\n this.notificationService.notifyNewProductAdded(product.title, product.mainImage, product.altTag);\r\n\r\n if (duplicateCheckResult !== this.DuplicateExact) {\r\n return AddResult.Replaced;\r\n } else {\r\n return AddResult.RejectedDuplicate;\r\n }\r\n }\r\n }\r\n else {\r\n this.createNewLocalStorage();\r\n\r\n this.appendProductToList(product, false);\r\n\r\n return AddResult.Added;\r\n }\r\n }\r\n\r\n private onUpdatedModel(skipSaving: boolean): Promise {\r\n return new Promise((resolve, reject) => {\r\n const afterSave = (model: ProductComparisonModel) => {\r\n this.comparePageButtonUrlUpdater.onUpdatedModel(model);\r\n this.localStorageAbstraction.writeLocalStorage(model);\r\n }\r\n\r\n if (!skipSaving && this.localStorageCache.isLoggedIn) {\r\n this.sync()\r\n .then((syncedModel) => {\r\n afterSave(syncedModel);\r\n resolve(syncedModel);\r\n })\r\n .catch((error) => {\r\n reject(error);\r\n });\r\n } else {\r\n afterSave(this.localStorageCache);\r\n }\r\n });\r\n }\r\n\r\n public removeAllProductsOfCategory(categoryName: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n let articleRemoved: boolean = false;\r\n const productsAfter: Product[] = [];\r\n for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n const tmpProduct: Product = this.localStorageCache.products[i];\r\n if (tmpProduct.categoryName !== categoryName) {\r\n productsAfter.push(tmpProduct);\r\n } else {\r\n articleRemoved = true;\r\n }\r\n }\r\n if (productsAfter.length == 0) {\r\n //unmarks when removing the last\r\n this.setMobileHeaderMarkerOff();\r\n }\r\n\r\n this.localStorageCache.products = productsAfter;\r\n if (this.localStorageCache.products.length > 0) {\r\n this.setActiveNavigationTab(this.localStorageCache.products[0].categoryName);\r\n } else {\r\n this.setActiveNavigationTab(null);\r\n }\r\n\r\n if (articleRemoved) {\r\n this.localStorageCache.hasClientSideChange = true;\r\n this.onUpdatedModel(false);\r\n }\r\n });\r\n }\r\n \r\n private setMobileHeaderMarkerOn(): void {\r\n if (window.shell)\r\n window.shell.publishTo('ESMKT.MegaMenu.MarkItem', \"mpc\");\r\n }\r\n\r\n private setMobileHeaderMarkerOff(): void {\r\n if (window.shell)\r\n window.shell.publishTo('ESMKT.MegaMenu.UnmarkItem', \"mpc\");\r\n }\r\n\r\n public removeProduct(categoryName: string, salesArticleVariantKey: string): Product {\r\n let articleRemoved: Product = null;\r\n\r\n for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n const tmpProduct: Product = this.localStorageCache.products[i];\r\n\r\n if (tmpProduct.articleId.salesArticleVariantKey === salesArticleVariantKey\r\n && tmpProduct.categoryName === categoryName) {\r\n this.localStorageCache.products.splice(i, 1);\r\n //unmarks when removing the last\r\n if (this.localStorageCache.products.length === 0) {\r\n this.setMobileHeaderMarkerOff();\r\n }\r\n articleRemoved = tmpProduct;\r\n\r\n break;\r\n }\r\n }\r\n if (!this.localStorageCache.products.some(p => p.categoryName === categoryName)) {\r\n if (this.localStorageCache.products.length > 0) {\r\n this.setActiveNavigationTab(this.localStorageCache.products[0].categoryName);\r\n } else {\r\n this.setActiveNavigationTab(null);\r\n }\r\n }\r\n\r\n if (articleRemoved) {\r\n this.localStorageCache.hasClientSideChange = true;\r\n this.onUpdatedModel(false);\r\n }\r\n\r\n return articleRemoved;\r\n }\r\n \r\n public addProductBySavKey(salesArticleVariantKey: string, seoSlug: string, origin: string, originNavKeyPathOverride: string = undefined): Promise {\r\n const context: AddElementContext = new class implements AddElementContext {\r\n salesArticleVariantKey: string;\r\n originSeoSlug: string;\r\n origin: string;\r\n };\r\n\r\n context.salesArticleVariantKey = salesArticleVariantKey;\r\n context.originSeoSlug = seoSlug;\r\n context.origin = origin;\r\n\r\n // Call controller method, via ajax, and get image and text info from MPC\r\n let params: INlVanillajaxParams = {};\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\"Products/GetProductInfo\";\r\n params.data = JSON.stringify(context);\r\n\r\n let nlVanillajax = new NlVanillajax(params);\r\n let postWithPromise = nlVanillajax.postWithPromise();\r\n\r\n postWithPromise.then((productDataFromService: Product) => {\r\n if (productDataFromService) {\r\n if (originNavKeyPathOverride) {\r\n productDataFromService.originNavigationKeyPath = originNavKeyPathOverride;\r\n }\r\n this.appendProductToList(productDataFromService, true);\r\n }\r\n })\r\n .catch((err) => {\r\n ErrorHandlerManager.instance.LogError({\r\n message: \"error getting product info because: \" +\r\n err +\r\n \", salesArticleVariantKey: \" +\r\n salesArticleVariantKey\r\n }); \r\n });\r\n\r\n return postWithPromise;\r\n }\r\n\r\n private checkDuplicateProductPerCategory(salesArticleVariantKey: string, categoryName: string, masterArticleNo: number): number {\r\n for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n const product: Product = this.localStorageCache.products[i];\r\n\r\n // avoid duplicate products\r\n if (product.articleId.masterArticleNo === masterArticleNo\r\n && product.categoryName === categoryName) {\r\n if (product.articleId.salesArticleVariantKey === salesArticleVariantKey) {\r\n return this.DuplicateExact;\r\n } else {\r\n return i; //same MaNo but different SavKey -> this product will be replaced by the new variant\r\n }\r\n }\r\n }\r\n\r\n return this.DuplicateNotFound;\r\n }\r\n\r\n private isAlreadyAtLimit(categoryName: string): boolean {\r\n let productsAmount: number = 0;\r\n let result: boolean = false;\r\n\r\n for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n const product: Product = this.localStorageCache.products[i];\r\n\r\n // avoid more then 4 products per category\r\n if (product.categoryName === categoryName) {\r\n productsAmount++;\r\n\r\n if (productsAmount === MpcSettings.instance.maxProducts) {\r\n result = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n \r\n private createNewLocalStorage(): void {\r\n const localStorageModel = {} as ProductComparisonModel;\r\n localStorageModel.products = new Array();\r\n localStorageModel.emptyNavigationTabs = new Array();\r\n localStorageModel.clearStoredEmptyNavigationTabs = false;\r\n localStorageModel.activeNavigationTab = null;\r\n localStorageModel.pageLanguage = MpcSettings.instance.culture;\r\n localStorageModel.hasClientSideChange = false;\r\n localStorageModel.lastUpdateTime = new Date().getTime(); // we define an empty model to be synced\r\n localStorageModel.isLoggedIn = MpcSettings.instance.isLoggedIn;\r\n localStorageModel.mobileEnabledCategories = [];\r\n localStorageModel.mobileLockedColumnIndex = null;\r\n localStorageModel.mobileCarouselScrollIndex = null;\r\n localStorageModel.usedNavTabForCarouselOrLockedColumn = null;\r\n localStorageModel.printPageContent = null;\r\n this.localStorageCache = localStorageModel;\r\n this.onUpdatedModel(false);\r\n }\r\n\r\n private needsValidation(): boolean {\r\n if (this.localStorageCache.isLoggedIn || MpcSettings.instance.isLoggedIn) return true;\r\n const noProducts = this.localStorageCache.products.length === 0;\r\n if (noProducts) return false;\r\n const languageWasSwitched = this.localStorageCache.pageLanguage !== MpcSettings.instance.culture;\r\n if (languageWasSwitched) return true;\r\n const expiration5MinutesAfterLastUpdate = new Date(this.localStorageCache.lastUpdateTime+(1000*60*5));\r\n const olderThan5Minutes = new Date().getTime() > expiration5MinutesAfterLastUpdate.getTime();\r\n return olderThan5Minutes;\r\n }\r\n\r\n private static isTimedOut(model: ProductComparisonModel): boolean {\r\n const expirationDate = new Date(model.lastUpdateTime + (1000 * 60 * 60 * 24 * 30));\r\n return new Date().getTime() > expirationDate.getTime();\r\n }\r\n\r\n private appendProductToList(product: Product, avoidNotification: boolean): void {\r\n this.localStorageCache.products.push(product);\r\n this.localStorageCache.hasClientSideChange = true;\r\n this.onUpdatedModel(false);\r\n\r\n if(!avoidNotification)\r\n this.notificationService.notifyNewProductAdded(product.title, product.mainImage, product.altTag);\r\n\r\n // it should only mark when adding the first article\r\n if (this.localStorageCache.products.length === 1) {\r\n this.setMobileHeaderMarkerOn();\r\n }\r\n }\r\n \r\n public checkIsProductAlreadyAdded(salesArticleVariantKey: string): boolean {\r\n let productExists: boolean = false;\r\n\r\n if (window.localStorage) {\r\n\r\n if (this.localStorageCache) {\r\n for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n const tmpProduct: Product = this.localStorageCache.products[i];\r\n\r\n if (tmpProduct.articleId.salesArticleVariantKey == salesArticleVariantKey) {\r\n productExists = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return productExists;\r\n }\r\n\r\n public storeEmptyNavigationTab(categoryName: string, navigationOrder: number): void {\r\n if(!this.localStorageCache.emptyNavigationTabs) {\r\n this.localStorageCache.emptyNavigationTabs = new Array();\r\n }\r\n\r\n let emptyNavigationTab: NavigationTab = {} as NavigationTab;\r\n emptyNavigationTab.name = categoryName;\r\n emptyNavigationTab.navigationOrder = navigationOrder;\r\n\r\n this.localStorageCache.emptyNavigationTabs.push(emptyNavigationTab);\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public removeStoredEmptyNavigationTabs(): void {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n\r\n this.localStorageCache.emptyNavigationTabs = new Array();\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public setClearStoredEmptyNavigationTabs(clearStoredEmptyNavigationTabs: boolean): void {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n\r\n this.localStorageCache.clearStoredEmptyNavigationTabs = clearStoredEmptyNavigationTabs;\r\n this.onUpdatedModel(true); //don't save, who cares\r\n }\r\n\r\n public getCarouselScrollIndex(): number {\r\n if (!this.localStorageCache) {\r\n this.getModel();\r\n }\r\n\r\n const currentCatName: string = this.getCurrentCategoryName();\r\n if (!this.localStorageCache.usedNavTabForCarouselOrLockedColumn || currentCatName != this.localStorageCache.usedNavTabForCarouselOrLockedColumn) {\r\n this.clearLockedColumnIndex();\r\n this.clearCarouselScrollIndex();\r\n }\r\n\r\n return this.localStorageCache.mobileCarouselScrollIndex;\r\n }\r\n\r\n public clearCarouselScrollIndex(): void {\r\n this.localStorageCache.mobileCarouselScrollIndex = null;\r\n this.localStorageCache.usedNavTabForCarouselOrLockedColumn = null;\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public storeCarouselScrollIndex(value: number): void {\r\n this.localStorageCache.mobileCarouselScrollIndex = value;\r\n this.localStorageCache.usedNavTabForCarouselOrLockedColumn = this.getCurrentCategoryName();\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public getLockedColumnIndex(): number {\r\n if (!this.localStorageCache) {\r\n this.getModel();\r\n }\r\n\r\n return this.localStorageCache.mobileLockedColumnIndex;\r\n }\r\n\r\n public clearLockedColumnIndex(): void {\r\n this.localStorageCache.mobileLockedColumnIndex = null;\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public storeLockedColumnIndex(value: number): void {\r\n this.localStorageCache.mobileLockedColumnIndex = value;\r\n this.localStorageCache.usedNavTabForCarouselOrLockedColumn = this.getCurrentCategoryName();\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n private getCurrentCategoryName(): string {\r\n const urlParams: URLSearchParams = new URLSearchParams(location.search);\r\n return urlParams.get('category');\r\n }\r\n\r\n public storePrintPageContent(content: HTMLElement): void {\r\n this.localStorageCache.printPageContent = content.outerHTML;\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public getPrintPageContentCached(): string {\r\n //there was a race condition with a Sync call, but we dont need to wait for server sync really\r\n const modelDirectlyFromLocalStorage = this.localStorageAbstraction.readLocalStorage();\r\n if (!modelDirectlyFromLocalStorage) return null;\r\n return modelDirectlyFromLocalStorage.printPageContent;\r\n }\r\n }\r\n\r\n export class LocalStorageAbstraction {\r\n private static _instance: LocalStorageAbstraction;\r\n public unsupported: boolean = true;\r\n \r\n private static mpcLocalStorageKeyOld: string = 'productComparison';\r\n public static mpcLocalStorageKeyNew: string;\r\n\r\n static get instance() {\r\n //TODO after migration period is over (i suggest 01.01.2026)\r\n // clean this up and just:\r\n // return this._instance || (this._instance = new this());\r\n return this._instance || LocalStorageAbstraction.getNewInstanceAndMigrate();\r\n }\r\n\r\n private static getNewInstanceAndMigrate(): LocalStorageAbstraction {\r\n LocalStorageAbstraction.mpcLocalStorageKeyNew = LocalStorageAbstraction.mpcLocalStorageKeyOld+\"_\"+MpcSettings.instance.portal;\r\n LocalStorageAbstraction.migrate();\r\n this._instance = new this();\r\n return this._instance;\r\n }\r\n\r\n constructor() {\r\n if (!window.localStorage) {\r\n //ErrorHandlerManager.instance.LogError({ message: \"localStorage not supported\" });\r\n //TODO user notification\r\n } else {\r\n this.unsupported = false;\r\n }\r\n }\r\n\r\n public writeLocalStorage(localStorage: ProductComparisonModel): void {\r\n if (this.unsupported) return;\r\n const tmpLocalStorageObject: string = JSON.stringify(localStorage);\r\n window.localStorage.setItem(LocalStorageAbstraction.mpcLocalStorageKeyNew, tmpLocalStorageObject);\r\n }\r\n\r\n public readLocalStorage(): ProductComparisonModel {\r\n if (this.unsupported) return null;\r\n const mpcLocalStorageJson = window.localStorage.getItem(LocalStorageAbstraction.mpcLocalStorageKeyNew);\r\n if (mpcLocalStorageJson) {\r\n return JSON.parse(mpcLocalStorageJson);\r\n }\r\n return null;\r\n }\r\n\r\n private static migrate(){\r\n if(window.localStorage.getItem(LocalStorageAbstraction.mpcLocalStorageKeyOld)){\r\n const oldKeyData = window.localStorage.getItem(LocalStorageAbstraction.mpcLocalStorageKeyOld);\r\n window.localStorage.setItem(LocalStorageAbstraction.mpcLocalStorageKeyNew, oldKeyData);\r\n window.localStorage.removeItem(LocalStorageAbstraction.mpcLocalStorageKeyOld);\r\n }\r\n }\r\n }\r\n}","// Axios v1.7.7 Copyright (c) 2024 Matt Zabriskie and contributors\n'use strict';\n\nfunction bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n};\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n};\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n};\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n };\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n};\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n};\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n};\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n};\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n};\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n};\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n};\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n};\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n};\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n};\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n };\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n};\n\nconst noop = () => {};\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n};\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz';\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n};\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0];\n }\n\n return str;\n};\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n };\n\n return visit(obj, 0);\n};\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\nvar utils$1 = {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap\n};\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils$1.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils$1.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype$1 = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype$1, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype$1);\n\n utils$1.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\n// eslint-disable-next-line strict\nvar httpAdapter = null;\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils$1.isPlainObject(thing) || utils$1.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils$1.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils$1.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils$1.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils$1.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils$1.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils$1.isSpecCompliantForm(formData);\n\n if (!utils$1.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils$1.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils$1.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils$1.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils$1.isArray(value) && isFlatArray(value)) ||\n ((utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils$1.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils$1.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils$1.forEach(value, function each(el, key) {\n const result = !(utils$1.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils$1.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils$1.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode$1(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode$1);\n } : encode$1;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nfunction buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils$1.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils$1.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nvar InterceptorManager$1 = InterceptorManager;\n\nvar transitionalDefaults = {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n\nvar URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n\nvar FormData$1 = typeof FormData !== 'undefined' ? FormData : null;\n\nvar Blob$1 = typeof Blob !== 'undefined' ? Blob : null;\n\nvar platform$1 = {\n isBrowser: true,\n classes: {\n URLSearchParams: URLSearchParams$1,\n FormData: FormData$1,\n Blob: Blob$1\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n\nconst hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nvar utils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n hasBrowserEnv: hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv: hasStandardBrowserEnv,\n navigator: _navigator,\n origin: origin\n});\n\nvar platform = {\n ...utils,\n ...platform$1\n};\n\nfunction toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils$1.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils$1.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils$1.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils$1.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils$1.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils$1.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) {\n const obj = {};\n\n utils$1.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils$1.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils$1.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils$1.isObject(data);\n\n if (isObjectPayload && utils$1.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils$1.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils$1.isArrayBuffer(data) ||\n utils$1.isBuffer(data) ||\n utils$1.isStream(data) ||\n utils$1.isFile(data) ||\n utils$1.isBlob(data) ||\n utils$1.isReadableStream(data)\n ) {\n return data;\n }\n if (utils$1.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils$1.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils$1.isResponse(data) || utils$1.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils$1.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nvar defaults$1 = defaults;\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils$1.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nvar parseHeaders = rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils$1.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils$1.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils$1.isString(value)) return;\n\n if (utils$1.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils$1.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils$1.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils$1.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils$1.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite);\n } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils$1.isHeaders(header)) {\n for (const [key, value] of header.entries()) {\n setHeader(value, key, rewrite);\n }\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils$1.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils$1.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils$1.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils$1.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils$1.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils$1.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils$1.forEach(this, (value, header) => {\n const key = utils$1.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils$1.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils$1.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils$1.freezeMethods(AxiosHeaders);\n\nvar AxiosHeaders$1 = AxiosHeaders;\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nfunction transformData(fns, response) {\n const config = this || defaults$1;\n const context = response || config;\n const headers = AxiosHeaders$1.from(context.headers);\n let data = context.data;\n\n utils$1.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n\nfunction isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils$1.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nfunction settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n\nfunction parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\n/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn.apply(null, args);\n };\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs);\n }, threshold - passed);\n }\n }\n };\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nconst progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n};\n\nconst progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n};\n\nconst asyncDecorator = (fn) => (...args) => utils$1.asap(() => fn(...args));\n\nvar isURLSameOrigin = platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils$1.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n\nvar cookies = platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils$1.isString(path) && cookie.push('path=' + path);\n\n utils$1.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nfunction isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nfunction combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nfunction buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nfunction mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {\n return utils$1.merge.call({caseless}, target, source);\n } else if (utils$1.isPlainObject(source)) {\n return utils$1.merge({}, source);\n } else if (utils$1.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils$1.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils$1.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n\nvar resolveConfig = (config) => {\n const newConfig = mergeConfig({}, config);\n\n let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;\n\n newConfig.headers = headers = AxiosHeaders$1.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n let contentType;\n\n if (utils$1.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // Let the browser set it\n } else if ((contentType = headers.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n headers.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n};\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nvar xhrAdapter = isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders$1.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders$1.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils$1.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n};\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n };\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT));\n }, timeout);\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n };\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils$1.asap(unsubscribe);\n\n return signal;\n }\n};\n\nvar composeSignals$1 = composeSignals;\n\nconst streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n};\n\nconst readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n};\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n};\n\nconst trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n };\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n};\n\nconst isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function';\nconst isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function';\n\n// used only inside the fetch adapter\nconst encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Response(str).arrayBuffer())\n);\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n};\n\nconst supportsRequestStream = isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n});\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst supportsResponseStream = isReadableStreamSupported &&\n test(() => utils$1.isReadableStream(new Response('').body));\n\n\nconst resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n};\n\nisFetchSupported && (((res) => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = utils$1.isFunction(res[type]) ? (res) => res[type]() :\n (_, config) => {\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n });\n });\n})(new Response));\n\nconst getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if(utils$1.isBlob(body)) {\n return body.size;\n }\n\n if(utils$1.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if(utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if(utils$1.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if(utils$1.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n};\n\nconst resolveBodyLength = async (headers, body) => {\n const length = utils$1.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n};\n\nvar fetchAdapter = isFetchSupported && (async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals$1([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils$1.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader);\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils$1.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = \"credentials\" in Request.prototype;\n request = new Request(url, {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n });\n\n let response = await fetch(request);\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils$1.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders$1.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n });\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n});\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: fetchAdapter\n};\n\nutils$1.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils$1.isFunction(adapter) || adapter === null || adapter === false;\n\nvar adapters = {\n getAdapter: (adapters) => {\n adapters = utils$1.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n};\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nfunction dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders$1.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults$1.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders$1.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders$1.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n\nconst VERSION = \"1.7.7\";\n\nconst validators$1 = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators$1[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators$1.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nvar validator = {\n assertOptions,\n validators: validators$1\n};\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager$1(),\n response: new InterceptorManager$1()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy;\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack;\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils$1.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n };\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils$1.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils$1.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders$1.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils$1.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nvar Axios$1 = Axios;\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nvar CancelToken$1 = CancelToken;\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nfunction spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nfunction isAxiosError(payload) {\n return utils$1.isObject(payload) && (payload.isAxiosError === true);\n}\n\nconst HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nvar HttpStatusCode$1 = HttpStatusCode;\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios$1(defaultConfig);\n const instance = bind(Axios$1.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils$1.extend(instance, Axios$1.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils$1.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults$1);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios$1;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken$1;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders$1;\n\naxios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode$1;\n\naxios.default = axios;\n\nmodule.exports = axios;\n//# sourceMappingURL=axios.cjs.map\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","//product comparison flyout -\n// this bundle will be included on category and detail pages \n// to support the flyout and the 'add' buttons with the scale symbol\n\nimport './typescript/errorhandler';\nimport './typescript/helpers/polyfills';\n// PCF scss\nimport './styles/mpc-shared-basics.scss';\nimport './styles/flyout-icon.scss';\nimport './styles/flyout-icon.mobile.scss';\nimport './styles/flyout-content.scss';\nimport './styles/flyout-header.scss';\nimport './styles/flyout-footer.scss';\nimport './styles/containers-separation-line.scss';\nimport './styles/flyout-title.scss';\nimport './styles/flyout-title.mobile.scss';\nimport './styles/flyout-title.fragment.scss';\nimport './styles/flyout-notifications.scss';\nimport './styles/flyout-notifications.mobile.scss';\nimport './styles/flyout-new-product-notification.scss';\nimport './styles/flyout-new-product-notification.mobile.scss';\nimport './styles/flyout-empty-list-notification.scss';\nimport './styles/flyout-empty-list-notification.mobile.scss';\nimport './styles/flyout-max-products-count-notification.scss';\nimport './styles/flyout-max-products-count-notification.mobile.scss';\nimport './styles/flyout-compare-list-btn.scss';\nimport './styles/flyout-compare-list-btn.mobile.scss';\n\n//TP scss\nimport './styles/touch-point-toolbar.scss';\nimport './styles/touch-point-article-tile.scss';\nimport './styles/touch-point-article-tile.mobile.scss';\nimport './styles/touch-point-details-page.scss';\nimport './styles/touch-point-details-page.mobile.scss';\n\n// TP ts\nimport './typescript/TP/TouchPointFactory';\n\n// PCF ts\nimport './typescript/PCF/flyout-controller';\n"],"names":["Element","prototype","CharacterData","DocumentType","filter","Boolean","forEach","item","hasOwnProperty","Object","defineProperty","configurable","enumerable","writable","value","this","parentNode","removeChild","self","document","createElement","createElementNS","view","classListProp","protoProp","elemCtrProto","objCtr","strTrim","String","trim","replace","arrIndexOf","Array","indexOf","i","len","length","DOMEx","type","message","name","code","DOMException","checkTokenAndGetIndex","classList","token","test","call","ClassList","elem","trimmedClasses","getAttribute","classes","split","push","_updateClassName","setAttribute","toString","classListProto","classListGetter","Error","contains","add","tokens","arguments","l","updated","remove","index","splice","toggle","force","result","method","replacement_token","join","classListPropDesc","get","ex","undefined","number","__defineGetter__","testElement","createMethod","original","DOMTokenList","_toggle","slice","apply","exports","timeout_1","module","Timeout","__spreadArrays","s","il","r","k","a","j","jl","MetadataRecord","callback","key","ms","params","paused","startTime","Date","getTime","timeSpentWaiting","clear","erase","clearTimeout","keyId","keyCall","metadata","originalMs","set","args","_i","setTimeout","executedTime","executed","create","exists","elapsed","metaDataRecord","Math","max","lastExecuted","meta","pending","remaining","reset","restart","pause","resume","remainingTime","instantiate","linkToExisting","random","newCallback","newMs","newParams","MPCFlyoutContentController","ArrowUpIcon","ArrowRightIcon","NotificationService","MPCNotificationService","FlyoutContent","MPCFlyoutContent","NavigationService","MPCNavigationService","DeviceDetectionHelper","MPCDeviceDetectionHelper","ComparePageButtonUrlUpdater","MPCComparePageButtonUrlUpdater","ProductComparisonModelManager","MPCLocalStorageService","ScopeDetection","MPCScopeDetection","MpcSettings","MpcSettingsModule","flyoutContentScope","querySelector","init","handleFicClick","bind","_instance","disabledFromFocus","flyoutIconContainer","instance","loadFlyoutIcons","deviceDetectionHelper","notificationService","flyoutContentController","isMobileShop","comparePageButtonUrlUpdater","productComparisonModelManager","checkCurrentLocalStorage","flyoutContentContainer","flyoutHeader","flyoutContentObject","navigationService","closeFlyoutBtn","registerEventHandlers","closeArrow","compareButtonIcon","innerHTML","addEventListener","handleCloseClickFromFlyoutFragment","window","shell","subscribeTo","cleanUpEmptyContent","toggleAttribute","hideFlyoutContent","handleFlyoutIconClick","publishTo","refresh","model","activeNavigationTab","setActiveNavigationTab","updateContainerListVisibility","markAnyNavigationTabActive","addProduct","salesArticleVariantKey","seoSlug","origin","then","product","categoryName","addProductByCompareLink","maNo","colorCode","addProductByMasterArticleNo","removeProductTP","updateProductsCounter","counterNumber","productsCounter","counter","Number","textContent","innerText","removeEmptyContainerList","removeEmptyNavigationTabs","isFlyoutContentEmpty","announceNavigationTabCleanUpOutsidePcp","productComparisonModel","emptyNavigationTabs","hasScopes","setClearStoredEmptyNavigationTabs","getModel","products","checkIsProductAlreadyAdded","FlyoutContentController","ErrorHandlerManager","RecycleBinIcon","PlusIcon","MPCErrorHandlerModule","flyout","iFlyoutContentController","eventBus","MPCEventBus","EventBus","flyoutContent","emptyProductSlotTitle","clearFlyoutCategoryBtnTitle","listContainersArray","clearCategoryProducts","listContainer","listItems","querySelectorAll","listItem","removeProduct","getListContainerCategoryName","removeAllProductsOfCategory","newProduct","addProductToFlyoutContent","markActiveNavigationTab","savKey","context","originSeoSlug","url","apiUrl","data","JSON","stringify","postWithPromise","NlVanillajax","productDataFromService","handleProductInfoToAdd","catch","err","masterArticleNo","LogError","productAdded","AddResult","Added","publish","articleId","Replaced","changeProductVariantInFlyoutContent","RejectedCapacity","onlyDom","tabNav","focusNext","categoryUrl","itemsContainer","productRemoved","tabOrder","appendChild","createEmptyListItem","createOrUpdateNavigationTab","getContainerListItems","detailsPageUrl","mainImage","altTag","currentListContainer","listContainerNotExists","createListItem","newListContainer","createListContainer","oldListContainer","style","display","navigationOrder","newClearListBtn","newItemsContainer","btnId","className","id","maxProducts","onActivated","focus","newListItem","newProductImageHolder","newRemoveProductButton","newProductDescription","plusIcon","newProductImageSlot","itemOriginDetailsPageUrl","title","event","stopPropagation","preventDefault","emptyListItem","nextEmpty","nextElementSibling","insertBefore","removableContainers","selectFirstTab","tmpContainer","activeCategoryTabName","selectedCategoryName","newTabActivated","MPCFlyoutController","ScaleIcon2021","StickyFlyOutNotificationService","MPCStickyFlyOutNotificationService","scope","pcfScopeRendered","prepareMobile","stickyFlyOutNotificationService","getCurrentProductsAmount","body","showPcfScope","hidePcfScope","scaleIcon","compareButtonIcons","renderWithoutAnimation","FlyoutController","ScrollLock","SmartTimeout","MPCScrollLock","scrollLock","flyoutContainer","notification","closeBtns","openFlyoutBtns","navigationBtn","comparisonListButton","goToFlyoutComparisonList","closeNotification","maxProductsCountNotification","newProductNotification","emptyListNotification","closeAnyActiveNotification","notifyNewProductAdded","showNotification","replaceNotificationContent","notifyMaximumProductsCountReached","notifyEmptyList","initializeNavigationButtonOnEmptyNotificationOnce","eventFunction","showMobileHeaderMenu","removeEventListener","headrapi","toggleMenu","productInfoContainer","closeExistingNotification","existingNotification","renderFlyoutContainerOverlay","updateNotificationContent","triggerAppShellPublish","deferNotification","existingNotificationTimeout","showInner","renderOverlay","ontouchmove","lock","unlock","tabletHeaderHeightCalculated","isTabletHandHeldDevice","flyoutNewProductNotification","handleFlyOutNotificationOnScroll","pageYOffset","handleFlyOutOnScroll","MPCCompareButton","ScaleIcon","marker","slug","displayedInCategoryNavKey","parentContainer","markerElement","initializeNew","getTouchPoint","response","updateSaveKeyFromOutsideTheScope","orderModule","articleInfo","update","oldSavKey","newSavKey","SeoSlug","subPath","contentType","ContentType","Plain","getWithPromise","container","Html","touchPointElement","removePreviousButton","replaceChild","initialize","previousButton","parentElement","MPCCallLimiter","CallLimiter","debounce","CompareButton","MPCMobileToolbarButton","toolbarButtons","compareButtons","children","tbw_mlt","toolbarButton","closest","categoryNavKey","MobileCategoryNavKey","compareButton","deactivateOnMobileCategory","activateOnMobileCategory","isActivatedOnMobileCategory","getTBW_Mlt","MobileToolbarButton","MPCTileScaleButton","ScaleEmptyIcon","element","prerendered","selectedVariantElement","scopeClass","updateFlyout","subscribe","updateVisibility","TileScaleButton","MPCTileScaleButtonEx","forArticleTile","emptyIcon","icon","TileScaleButtonEx","MPCTouchPointFactory","TouchPointIdentifier","MPCTouchPointIdentifier","isMobileView","innerWidth","isNewDetailsPage","compareButtonSavKeySelector","touchPointIdentifier","touchPoints","initializeEvents","CreateTouchPointsForNewPDP","createByMarkersPayload","tile","createByMarkers","placeHoldersData","createByMarkersEx","form","savKeyElement","payload","initializePrerenderedMobileTouchPoints","initializeCompareLinkTouchPoints","newBtnLst","newBtn","getTileScaleTouchPoints","touchPointPlaceholders","getMobileTouchPointPlaceholders","savKeyToPlaceholder","touchPointPlaceholder","touchPoint","innerHtml","dataset","savkey","itemOrigin","placeholder","currentCategoryNavKey","compareLinks","getCompareLinks","compareLink","htmlIndex","href","splitted","substring","reverse","parseInt","isAxiosError","error","toJSON","articlesContext","post","headers","status","validSavKeys","getMarkersFromDomEx","createTouchPointEx","errorMsg","errorStack","stack","console","warn","markers","getMarkersFromDom","createTouchPoint","markerPayloadObject","parse","createTouchPointByPayloadObject","serviceCall","dataObject","TouchPointFactory","compareButtonMarker","tileScaleMarker","savKeys","allLinks","link","Init","_settings","onerror","msg","line","col","_errorCount","toLowerCase","errorEvent","lineno","colno","filename","errStr","isDevelopment","mpcLocalStorage","collectAllLocalStorageObjects","keys","reason","log","statusText","combinedData","localStorage","startsWith","itemStr","getItem","comparisonPage","comparisonFlyout","PcfScope","PcpScope","_culture","_portal","_portalMandantToken","_maxProducts","_isLoggedIn","_isDevelopment","_apiUrl","initDone","delay","immediate","timer","instantCall","throttle","interval","leadCall","trailCall","resetTimer","blockExecution","_comparePageUrl","comparisonPageBaseUri","onUpdatedModel","comparisonPageUri","encodeURIComponent","storageProduct","isTabletHandHeldDeviceEnvironment","documentElement","isMobileShopEnvironment","isMicrosoftBrowserEnvironment","sniffJson","getElementById","sniffJsonResult","resultingClasses","isTablet","cap","isPhone","isHandheld","isAndroid","isIOS","htmlClasses","isMsie","isEdge","isMicrosoftBrowser","callbackLists","eventName","isArray","subscriptionsIds","createSubscription","subscribeMultiple","subscriptions","subscriptionIds","subscription","subscriptionId","addSubscription","unsubscribe","unSubscribeMultiple","removeSubscription","MPCElementsHelper","appendChildAtIndex","child","parent","HtmlElementsHelper","navigationTabKeyName","abstractContent","selectCategoryButton","navigationTabs","navigationTabsArray","registerButtonEvent","switchNavigationTab","newActiveNavigationTab","domNode","newActiveNavigationTabName","oldNavigationTabName","clearLockedColumnIndex","clearCarouselScrollIndex","scrollToNavigationTab","buttonRightEdgePosition","getBoundingClientRect","left","offsetWidth","scrollLeft","createEmptyNavTab","isNew","navigationTab","appendSavKeyToNavTabUrl","updateCounter","createNavigationTab","indexToInsert","updateSelectCategoryButtonVisibility","isAnyProductCounted","productFound","tab","getCounterNumber","order","newNavigationTabHtml","newNavigationTab","newCategoryName","newArticlesCounter","target","previousElementSibling","removableNavigationTabs","tmpTab","newActiveTabCatName","newActiveTab","getFirstNavigationTab","NodeList","bodyScrollPosition","webContainer","mobileContainer","removeAttribute","scrollTo","query","req","xhr","open","setHeaders","onReadyStateChange","send","Promise","resolve","reject","onload","getResult","getHtmlResult","sendGet","win","XMLHttpRequest","header","setRequestHeader","onreadystatechange","readyState","DONE","responseText","json","e","DuplicateNotFound","DuplicateExact","localStorageAbstraction","LocalStorageAbstraction","localStorageCache","readLocalStorage","runningServiceCall","mobileEnabledCategories","validateLocalStorage","isNewlyLoggedOut","isLoggedIn","isTimedOut","createNewLocalStorage","isLoggedInNewly","needsValidation","sync","pageLanguage","culture","printPageContent","countBefore","clearStoredEmptyNavigationTabs","hasClientSideChange","countAfter","setMobileHeaderMarkerOn","setMobileHeaderMarkerOff","lastUpdateTime","seoDescription","originNavigationKeyPath","idx","duplicateCheckResult","checkDuplicateProductPerCategory","isAlreadyAtLimit","appendProductToList","RejectedDuplicate","skipSaving","afterSave","writeLocalStorage","syncedModel","articleRemoved","productsAfter","tmpProduct","some","p","addProductBySavKey","originNavKeyPathOverride","productsAmount","localStorageModel","mobileLockedColumnIndex","mobileCarouselScrollIndex","usedNavTabForCarouselOrLockedColumn","expiration5MinutesAfterLastUpdate","expirationDate","avoidNotification","productExists","storeEmptyNavigationTab","emptyNavigationTab","removeStoredEmptyNavigationTabs","getCarouselScrollIndex","currentCatName","getCurrentCategoryName","storeCarouselScrollIndex","getLockedColumnIndex","storeLockedColumnIndex","URLSearchParams","location","search","storePrintPageContent","content","outerHTML","getPrintPageContentCached","modelDirectlyFromLocalStorage","unsupported","getNewInstanceAndMigrate","mpcLocalStorageKeyNew","mpcLocalStorageKeyOld","portal","migrate","tmpLocalStorageObject","setItem","mpcLocalStorageJson","oldKeyData","removeItem","fn","thisArg","getPrototypeOf","kindOf","cache","thing","str","kindOfTest","typeOfTest","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","val","Symbol","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","map","obj","allOwnKeys","getOwnPropertyNames","findKey","_key","_global","globalThis","g","isContextDefined","isTypedArray","TypedArray","Uint8Array","isHTMLForm","prop","isRegExp","reduceDescriptors","reducer","descriptors","getOwnPropertyDescriptors","reducedDescriptors","descriptor","ret","defineProperties","ALPHA","DIGIT","ALPHABET","ALPHA_DIGIT","toUpperCase","isAsyncFn","_setImmediate","setImmediateSupported","setImmediate","postMessageSupported","postMessage","callbacks","source","shift","cb","asap","queueMicrotask","process","nextTick","utils$1","isBuffer","constructor","isFormData","kind","FormData","append","isArrayBufferView","ArrayBuffer","isView","buffer","isBoolean","isStream","pipe","merge","caseless","assignValue","targetKey","extend","b","stripBOM","charCodeAt","inherits","superConstructor","props","assign","toFlatObject","sourceObj","destObj","propFilter","merged","endsWith","searchString","position","lastIndex","toArray","arr","forEachEntry","next","done","pair","matchAll","regExp","matches","exec","hasOwnProp","freezeMethods","toObjectSet","arrayOrString","delimiter","define","toCamelCase","m","p1","p2","noop","toFiniteNumber","defaultValue","isFinite","global","generateString","size","alphabet","isSpecCompliantForm","toJSONObject","visit","reducedValue","isThenable","AxiosError","config","request","captureStackTrace","description","fileName","lineNumber","columnNumber","prototype$1","isVisitable","removeBrackets","renderKey","path","dots","concat","from","customProps","axiosError","cause","predicates","toFormData","formData","options","TypeError","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","Blob","convertValue","toISOString","Buffer","isFlatArray","el","exposedHelpers","build","pop","encode$1","charMap","match","AxiosURLSearchParams","_pairs","encode","buildURL","_encode","serializeFn","serialize","serializedParams","hashmarkIndex","encoder","InterceptorManager$1","handlers","use","fulfilled","rejected","synchronous","runWhen","eject","h","transitionalDefaults","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","platform$1","isBrowser","protocols","hasBrowserEnv","_navigator","navigator","hasStandardBrowserEnv","hasStandardBrowserWebWorkerEnv","WorkerGlobalScope","importScripts","platform","freeze","__proto__","formDataToJSON","buildPath","isNumericKey","isLast","arrayToObject","entries","parsePropPath","defaults","transitional","adapter","transformRequest","getContentType","hasJSONContentType","isObjectPayload","setContentType","helpers","isNode","toURLEncodedForm","formSerializer","_FormData","env","rawValue","parser","stringifySafely","transformResponse","JSONRequested","responseType","strictJSONParsing","ERR_BAD_RESPONSE","timeout","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","defaults$1","ignoreDuplicateOf","$internals","normalizeHeader","normalizeValue","matchHeaderValue","isHeaderNameFilter","AxiosHeaders","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","rawHeaders","parsed","parseHeaders","tokensRE","parseTokens","has","matcher","deleted","deleteHeader","normalize","format","normalized","w","char","formatHeader","targets","asStrings","first","computed","accessor","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","buildAccessors","mapped","headerValue","AxiosHeaders$1","transformData","fns","isCancel","__CANCEL__","CanceledError","ERR_CANCELED","settle","ERR_BAD_REQUEST","floor","progressEventReducer","listener","isDownloadStream","freq","bytesNotified","_speedometer","samplesCount","min","bytes","timestamps","firstSampleTS","head","tail","chunkLength","now","startedAt","bytesCount","passed","round","speedometer","lastArgs","timestamp","threshold","invoke","loaded","total","lengthComputable","progressBytes","rate","progress","estimated","progressEventDecorator","throttled","asyncDecorator","isURLSameOrigin","msie","userAgent","urlParsingNode","originURL","resolveURL","protocol","host","hash","hostname","port","pathname","charAt","requestURL","cookies","write","expires","domain","secure","cookie","toGMTString","read","RegExp","decodeURIComponent","buildFullPath","baseURL","requestedURL","relativeURL","combineURLs","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","paramsSerializer","timeoutMessage","withCredentials","withXSRFToken","onUploadProgress","onDownloadProgress","decompress","beforeRedirect","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding","configValue","resolveConfig","newConfig","auth","btoa","username","password","unescape","xsrfValue","xhrAdapter","_config","requestData","requestHeaders","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","signal","onloadend","responseHeaders","getAllResponseHeaders","responseURL","onabort","ECONNABORTED","ERR_NETWORK","ontimeout","timeoutErrorMessage","ETIMEDOUT","upload","cancel","abort","aborted","parseProtocol","composeSignals$1","signals","controller","AbortController","streamChunk","chunk","chunkSize","byteLength","end","pos","trackStream","stream","onProgress","onFinish","async","iterable","asyncIterator","reader","getReader","readStream","readBytes","_onFinish","ReadableStream","pull","close","loadedBytes","enqueue","return","highWaterMark","isFetchSupported","fetch","Request","Response","isReadableStreamSupported","encodeText","TextEncoder","arrayBuffer","supportsRequestStream","duplexAccessed","hasContentType","duplex","supportsResponseStream","resolvers","res","_","ERR_NOT_SUPPORT","knownAdapters","http","fetchOptions","composedSignal","toAbortSignal","requestContentLength","getContentLength","_request","getBodyLength","resolveBodyLength","contentTypeHeader","flush","isCredentialsSupported","credentials","isStreamResponse","responseContentLength","responseData","renderReason","isResolvedHandle","adapters","nameOrAdapter","rejectedReasons","reasons","state","throwIfCancellationRequested","throwIfRequested","dispatchRequest","validators$1","deprecatedWarnings","validator","version","formatMessage","opt","desc","opts","ERR_DEPRECATED","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","validators","Axios","instanceConfig","interceptors","configOrUrl","dummy","boolean","function","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","responseInterceptorChain","promise","chain","onFulfilled","onRejected","getUri","generateHTTPMethod","isForm","Axios$1","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","c","CancelToken$1","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Ok","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","HttpStatusCode$1","axios","createInstance","defaultConfig","VERSION","Cancel","all","promises","spread","formToJSON","getAdapter","default","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","Function"],"sourceRoot":""}