PageSourceSearch

https://www.paulaschoice.it/on/demandware.static/Sites-paulaschoic…/-/it_IT/v1790550385904/minified/app.js

js paulaschoice.it collected 2026-09-28 14:23:59 UTC 1,801,956 bytes, 2,403 lines download raw bytes

vendor: 655 bytes, lines 1-12
1/*
2 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
3 * This devtool is neither made for production nor for readable output files.
4 * It uses "eval()" calls to create a separate source file in the browser devtools.
5 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
6 * or disable the default devtool with "devtool: false".
7 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
8 */
9/******/ (function() { // webpackBootstrap
10/******/ 	var __webpack_modules__ = ({
11
12/***/ "./
12cartridges/app_paulaschoice/cartridge/js/IBMWatsonChat.js":
13/*!*******************************************************************!*\
14  !*** ./cartridges/app_paulaschoice/cartridge/js/IBMWatsonChat.js ***!
15  \*******************************************************************/
16/***/ (function(__unused_webpack_module, __webpack_exports__) {
17
18"use strict";
19eval("{const IBMWatsonChat = {\n    init: function() {\n        /**\n         * Handler for the color box template. Writes a <div> to the element provided by web chat and creates\n         * thumbs up and down buttons.\n         *\n         * @param event The event passed from Watson Assistant.\n         * @param event.type The type of event, in this case \"customResponse\".\n         * @param event.data.message The original message.\n         * @param event.data.message.response_type \"user_defined\"\n         * @param event.data.message.user_defined A free object for you to pass whatever you want into.\n         * @param event.data.element An HTML element that is rendered in web chat for you to add your content to.\n        */\n        function handleSalesforceFeedback(event) {\n            var negativeUrl = event.data.fullMessage.context.skills[\"main skill\"].user_defined.negative_url;\n            var positiveUrl = event.data.fullMessage.context.skills[\"main skill\"].user_defined.positive_url;\n\n            if (document.querySelector('.chatbot-feedback')) {\n                document.querySelector('.chatbot-feedback').parentNode.innerHTML = '';\n            }\n\n            const element = document.createElement('div');\n            element.classList.add('chatbot-feedback');\n            element.innerHTML = `\n                    <h2 class=\"chatbot-feedback-heading\">${window.Resources.IBM_WATSON_RATE}</h2>\n                    <a class=\"thumbs-icon\" href=${positiveUrl} target=\"_blank\"></a><a class=\"thumbs-icon thumbs-icon--reversed\" href=${negativeUrl} target=\"_blank\"></a>\n                `;\n\n            // Append your element to the provided element.\n            event.data.element.appendChild(element);\n        }\n\n        /**\n         * Watch for the customResponse event and forward incoming data to the correct handler.\n         *\n         * @param event The event passed from Watson Assistant\n         * @param event.type The type of event, in this case \"customResponse\".\n         * @param event.data.message The individual message from output.generic[].\n         * @param event.data.element An HTML element that is rendered in web chat for you to manipulate.\n         */\n         window.customResponseHandler = function(event) {\n            const {\n                message\n            } = event.data;\n\n            // Add a switch so you can watch for different custom responses.\n            // By convention, have a \"template_name\" property inside your user_defined object.\n            switch (message.user_defined.template_name) {\n                case 'feedback_icons':\n                    handleSalesforceFeedback(event);\n                    break;\n                default:\n                    console.error('Unhandled response type.');\n            }\n        }\n\n        window.preSendhandler = function(event) {\n            var localeDomElements = document.getElementsByClassName(\"js-country-detector\");\n\n            if (localeDomElements.length>0) {\n                var localeDom = localeDomElements[0];\n                var localeString = localeDom.getAttribute(\"data-currentlocale\");\n                var localeArray = localeString.split(\"_\");\n                event.data.context.skills['main skill'] = event.data.context.skills['main skill'] || {user_defined: {} };\n\n                if (localeArray.length > 1) {\n                    event.data.context.skills['main skill'].user_defined.language = localeArray[0];\n                    event.data.context.skills['main skill'].user_defined.country = localeArray[1];\n                } else {\n                    event.data.context.skills['main skill'].user_defined.language = localeArray[0];
19\n                    event.data.context.skills['main skill'].user_defined.country = \"EU\";\n                    event.data.context.skills['main skill'].user_defined.EU_site = true;  \n                }\n            }\n        }\n        \n    }\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (IBMWatsonChat);\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/IBMWatsonChat.js?\n}");
20
21/***/ }),
22
23/***/ "./cartridges/app_paulaschoice/cartridge/js/accordeon.js":
24/*!***************************************************************!*\
25  !*** ./cartridges/app_paulaschoice/cartridge/js/accordeon.js ***!
26  \***************************************************************/
27/***/ (function(module) {
28
29eval("{/**\n* @description Initialize Accordion toggle\n*/\n\nfunction openAccordeon(trigger) {\n    var accordeonSection = trigger.closest('.js-accordeon-section');\n    var accordeonBody = accordeonSection.find('.js-accordeon-body');\n    var toggle = accordeonSection.find('.js-toggle');\n    accordeonBody.slideToggle();\n    return toggle.hasClass('open') ? toggle.removeClass('open') : toggle.addClass('open');\n}\n\nfunction activateAccordeon() {\n  var trigger = $('.js-accordeon-trigger');\n\n  trigger.on('click', function() {\n    openAccordeon($(this));\n  });\n}\n\nfunction init() {\n    activateAccordeon();\n}\n\nmodule.exports = {\n    openAccordeon,\n    activateAccordeon,\n    init\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/accordeon.js?\n}");
30
31/***/ }),
32
33/***/ "./cartridges/app_paulaschoice/cartridge/js/ajax.js":
34/*!**********************************************************!*\
35  !*** ./cartridges/app_paulaschoice/cartridge/js/ajax.js ***!
36  \**********************************************************/
37/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
38
39"use strict";
40eval("{\n\nvar progress = __webpack_require__(/*! ./progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\"),\n    util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar currentRequests = [];\n\n/**\n * @function\n * @description Ajax request to get json response\n * @param {Boolean} async  Asynchronous or not\n * @param {String} url URI for the request\n * @param {Object} data Name/Value pair data request\n * @param {Function} callback  Callback function to be called\n */\nvar getJson = function (options) {\n    options.url = util.toAbsoluteUrl(options.url);\n    // return if no url exists or url matches a current request\n    if (!options.url || currentRequests[options.url]) {\n        return;\n    }\n\n    currentRequests[options.url] = true;\n\n    // make the server call\n    $.ajax({\n        dataType: 'json',\n        url: options.url,\n        async: (typeof options.async === 'undefined' || options.async === null) ? true : options.async,\n        data: options.data || {}\n    })\n    // success\n    .done(function (response) {\n        if (options.callback) {\n            options.callback(response);\n        }\n    })\n    // failed\n    .fail(function (xhr, textStatus) {\n        if (textStatus === 'parsererror') {\n            window.alert(Resources.BAD_RESPONSE);\n        }\n        if (options.callback) {\n            options.callback(null);\n        }\n    })\n    // executed on success or fail\n    .always(function () {\n        // remove current request from hash\n        if (currentRequests[options.url]) {\n            delete currentRequests[options.url];\n        }\n    });\n};\n/**\n * @function\n * @description ajax request to load html response in a given container\n * @param {String} url URI for the request\n * @param {Object} data Name/Value pair data request\n * @param {Function} callback  Callback function to be called\n * @param {Object} target Selector or element that will receive content\n */\nvar load = function (options) {\n    options.url = util.toAbsoluteUrl(options.url);\n    // return if no url exists or url matches a current request\n    if (!options.url || currentRequests[options.url]) {\n        return;\n    }\n\n    currentRequests[options.url] = true;\n\n    // make the server call\n    $.ajax({\n        dataType: 'html',\n        url: util.appendParamToURL(options.url, 'format', 'ajax'),\n        data: options.data,\n        xhrFields: {\n            withCredentials: true\n        }\n    })\n    .done(function (response) {\n        // success\n        if (options.target) {\n            $(options.target).empty().html(response);\n        }\n        if (options.callback) {\n            options.callback(response);\n        }\n    })\n    .fail(function (xhr, textStatus) {\n        // failed\n        if (textStatus === 'parsererror') {\n            window.alert(Resources.BAD_RESPONSE);\n        }\n        options.callback(null, textStatus);\n    })\n    .always(function () {\n        progress.hide();\n        // remove current request from hash\n        if (currentRequests[options.url]) {\n            delete currentRequests[options.url];\n        }\n    });\n};\n\nexports.getJson = getJson;\nexports.load = load;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/ajax.js?\n}");
41
42/***/ }),
43
44/***/ "./cartridges/app_paulaschoice/cartridge/js/alhenaCart.js":
45/*!****************************************************************!*\
46  !*** ./cartridges/app_paulaschoice/cartridge/js/alhenaCart.js ***!
47  \****************************************************************/
48/***/ (function(module) {
49
50"use strict";
51eval("{\n\nvar CART_FORM = '#cart-items-form';\n\nvar handlersBound = false;\nvar pendingRow = null;\nvar pendingIsRemoval = false;\n\n/**\n * @returns {Array} Cart lines exposed through [data-cartdata]\n */\nfunction readCartData() {\n    var element = document.querySelector('[data-cartdata]');\n    if (!element) {\n        return [];\n    }\n\n    try {\n        var data = JSON.parse(element.getAttribute('data-cartdata') || '[]');\n        return Array.isArray(data) ? data : [];\n    } catch (e) {\n        return [];\n    }\n}\n\n/**\n * @returns {string}\n */\nfunction getCurrency() {\n    return (window.SitePreferences && SitePreferences.CURRENCY_CODE)\n        ? SitePreferences.CURRENCY_CODE\n        : 'EUR';\n}\n\n/**\n * @param {Object} item Cart line from [data-cartdata]\n * @returns {number} Price of a single unit, after promotions\n */\nfunction getUnitPrice(item) {\n    var quantity = Number(item.quantity) || 1;\n    return parseFloat((Number(item.price) / quantity).toFixed(2));\n}\n\n/**\n * Uses the BM/VWO trackAlhenaEvent queue helper only.\n * @param {string} type ITEM_REMOVED, QUANTITY_INCREASED or QUANTITY_DECREASED\n * @param {Object} item Cart line from [data-cartdata]\n * @param {number} quantity\n */\nfunction sendCartEvent(type, item, quantity) {\n    if (!type || !item || !item.sku || typeof window.trackAlhenaEvent !== 'function') {\n        return;\n    }\n\n    window.trackAlhenaEvent('sendCartEvent', {\n        type: type,\n        productId: String(item.sku),\n        productName: String(item.ProductName || ''),\n        value: getUnitPrice(item),\n        currency: getCurrency(),\n        quantity: Number(quantity) || 0\n    });\n}\n\n/**\n * @param {jQuery} $row\n * @param {Array} cartData\n * @returns {Object|null} Matching line, only when it originated from the chat widget\n */\nfunction getAlhenaLine($row, cartData) {\n    var sku = $row.find('.product-detail-id').attr('data-id');\n    if (!sku) {\n        return null;\n    }\n\n    return cartData.find(function (item) {\n        return String(item.sku) === String(sku) && item.isAlhenaProduct;\n    }) || null;\n}\n\n/**\n * [data-cartdata] holds the server-side quantity. The input's value attribute is\n * the fallback: .js-quantity-button only changes the property through .val().\n * @param {jQuery} $input\n * @param {Object} line\n * @returns {number}\n */\nfunction getPreviousQuantity($input, line) {\n    var quantity = Number(line.quantity);\n    if (quantity > 0) {\n        return quantity;\n    }\n\n    quantity = Number($input.attr('value'));\n    return isNaN(quantity) ? 0 : quantity;\n}\n\n/**\n * @param {jQuery} $row\n * @param {number} requestedQuantity Quantity in the cart after the action, 0 for a removal\n * @param {Array} cartData\n */\nfunction trackRowChange($row, requestedQuantity, cartData) {\n    var $input = $row.find('.js-quantity');\n    var line = getAlhenaLine($row, cartData);\n    if (!line || !$input.length) {\n        return;\n    }\n\n    var previousQuantity = getPreviousQuantity($input, line);\n\n    // A negative quantity is rejected server side, so the basket does not change.\n    if (isNaN(requestedQuantity)\n        || requestedQuantity < 0\n        || previousQuantity <= 0\n        || requestedQuantity === previousQuantity) {\n        return;\n    }\n\n    if (requestedQuantity === 0) {\n        sendCartEvent('ITEM_REMOVED', line, 0);\n        return;\n    }\n\n    var type = requestedQuantity > previousQuantity ? 'QUANTITY_INCREASED' : 'QUANTITY_DECREASED';\n    sendCartEvent(type, line, requestedQuantity);\n}\n\n/**\n * The submitted form does not identify which line was changed, so keep the\n * clicked or edited row until submit.\n * @param {jQuery.Event} e\n * @param {boolean} isRemoval\n */\nfunction rememberChangedRow(e, isRemoval) {\n    if (e.isDefaultPrevented()) {\n        return;\n    }\n\n    pendingRow = $(e.currentTarget).closest('.cart-row');\n    pendingIsRemoval = !!isRemoval;\n}\n\n/**\n * Qty +/- and remove POST the cart form and reload, so the change is read from\n * the DOM at submit time instead of being carried across the request.\n * @param {jQuery.Event} e\n */\nfunction handleCartFormSubmit(e) {\n    if (e.isDefaultPrevented()) {\n        return;\n    }\n\n    var $row = pendingRow;\n    var isRemoval = pendingIsRemoval;\n    var cartData = readCartData();\n    var requestedQuantity;\n\n    pendingRow = null;\n    pendingIsRemoval = false;\n\n    if (!$row || !$row.length) {\n        return;\n    }\n\n    requestedQuantity = isRemoval ? 0 : parseInt($row.find('.js-quantity').val(), 10);
51\n    trackRowChange($row, requestedQuantity, cartData);\n}\n\nfunction bindAlhenaCartEvents() {\n    $(document).on('click', CART_FORM + ' button[name$=\"deleteProduct\"]', function (e) {\n        rememberChangedRow(e, true);\n    });\n    $(document).on('click', CART_FORM + ' .js-quantity-button', function (e) {\n        rememberChangedRow(e, false);\n    });\n    $(document).on('change', CART_FORM + ' .js-quantity', function (e) {\n        rememberChangedRow(e, false);\n    });\n    $(document).on('submit', CART_FORM, handleCartFormSubmit);\n}\n\nmodule.exports = {\n    init: function () {\n        if (handlersBound) {\n            return;\n        }\n\n        var hasAlhenaProduct = readCartData().some(function (item) {\n            return item.isAlhenaProduct;\n        });\n\n        if (!hasAlhenaProduct) {\n            return;\n        }\n\n        bindAlhenaCartEvents();\n        handlersBound = true;\n    }\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/alhenaCart.js?\n}");
52
53/***/ }),
54
55/***/ "./cartridges/app_paulaschoice/cartridge/js/alhenaCheckout.js":
56/*!********************************************************************!*\
57  !*** ./cartridges/app_paulaschoice/cartridge/js/alhenaCheckout.js ***!
58  \********************************************************************/
59/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
60
61"use strict";
62eval("{\n\nvar util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar TRACKED_ORDERS_COOKIE = 'alhenaCompletedOrders';\n\n/**\n * @returns {Object|null} Alhena checkout payload built server side, exposed\n * through [data-alhena-order]\n */\nfunction readOrderData() {\n    var element = document.querySelector('[data-alhena-order]');\n    if (!element) {\n        return null;\n    }\n\n    try {\n        var data = JSON.parse(element.getAttribute('data-alhena-order'));\n        return (data && data.orderId) ? data : null;\n    } catch (e) {\n        return null;\n    }\n}\n\n/**\n * Refreshing or navigating back to the confirmation page renders it again, so\n * the order number is kept to avoid inflating the revenue Alhena attributes.\n * Mirrors the completedOrders cookie of gtmtracking.checkout.purchase.\n * @param {string} orderId\n * @returns {boolean}\n */\nfunction isAlreadyTracked(orderId) {\n    var trackedOrders = util.getCookie(TRACKED_ORDERS_COOKIE);\n    return trackedOrders !== null && trackedOrders.indexOf('|' + orderId + '|') !== -1;\n}\n\n/**\n * @param {string} orderId\n */\nfunction markAsTracked(orderId) {\n    var trackedOrders = util.getCookie(TRACKED_ORDERS_COOKIE) || '';\n    document.cookie = TRACKED_ORDERS_COOKIE + '=' + trackedOrders + '|' + orderId + '|; Secure; path=/';\n}\n\n/**\n * Uses the BM/VWO trackAlhenaEvent queue helper only.\n * @param {Object} order\n */\nfunction sendCheckoutEvent(order) {\n    if (typeof window.trackAlhenaEvent !== 'function') {\n        return;\n    }\n\n    window.trackAlhenaEvent('sendCheckoutEvent', order);\n    markAsTracked(order.orderId);\n}\n\nmodule.exports = {\n    init: function () {\n        var order = readOrderData();\n\n        if (!order || isAlreadyTracked(order.orderId)) {\n            return;\n        }\n\n        sendCheckoutEvent(order);\n    }\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/alhenaCheckout.js?\n}");
63
64/***/ }),
65
66/***/ "./cartridges/app_paulaschoice/cartridge/js/app.js":
67/*!*********************************************************!*\
68  !*** ./cartridges/app_paulaschoice/cartridge/js/app.js ***!
69  \*********************************************************/
70/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
71
72"use strict";
73eval("{/* harmony import */ var _components_header__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/header */ \"./cartridges/app_paulaschoice/cartridge/js/components/header.js\");\n/* harmony import */ var _lazyload__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lazyload */ \"./cartridges/app_paulaschoice/cartridge/js/lazyload.js\");\n/* harmony import */ var _slider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./slider */ \"./cartridges/app_paulaschoice/cartridge/js/slider.js\");\n/* harmony import */ var _pages_checkout_showAddressTwo__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pages/checkout/showAddressTwo */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/showAddressTwo.js\");\n/* harmony import */ var _IBMWatsonChat__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./IBMWatsonChat */ \"./cartridges/app_paulaschoice/cartridge/js/IBMWatsonChat.js\");\n/* harmony import */ var _routine_slider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./routine-slider */ \"./cartridges/app_paulaschoice/cartridge/js/routine-slider.js\");\n/**\n *    (c) 2009-2014 Demandware Inc.\n *    Subject to standard usage terms and conditions\n *    For all details and documentation:\n *    https://bitbucket.com/demandware/sitegenesis\n */\n\n\n\n\n\n\n\n\nvar countries = __webpack_require__(/*! ./countries */ \"./cartridges/app_paulaschoice/cartridge/js/countries.js\"),\n    countrydetection = __webpack_require__(/*! ./countrydetection */ \"./cartridges/app_paulaschoice/cartridge/js/countrydetection.js\"),\n    expertAdvice = __webpack_require__(/*! ./expertadvice */ \"./cartridges/app_paulaschoice/cartridge/js/expertadvice.js\"),\n    videoplayer = __webpack_require__(/*! ./videoplayer */ \"./cartridges/app_paulaschoice/cartridge/js/videoplayer.js\"),\n    productaddedpopup = __webpack_require__(/*! ./productaddedpopup */ \"./cartridges/app_paulaschoice/cartridge/js/productaddedpopup.js\"),\n    page = __webpack_require__(/*! ./page */ \"./cartridges/app_paulaschoice/cartridge/js/page.js\"),\n    tooltip = __webpack_require__(/*! ./tooltip */ \"./cartridges/app_paulaschoice/cartridge/js/tooltip.js\"),\n    util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n    validator = __webpack_require__(/*! ./validator */ \"./cartridges/app_paulaschoice/cartridge/js/validator.js\"),\n    topheader = __webpack_require__(/*! ./topheader */ \"./cartridges/app_paulaschoice/cartridge/js/topheader.js\"),\n    footer = __webpack_require__(/*! ./footer */ \"./cartridges/app_paulaschoice/cartridge/js/footer.js\"),\n    cookiebar = __webpack_require__(/*! ./cookieprivacy */ \"./cartridges/app_paulaschoice/cartridge/js/cookieprivacy.js\"),\n    gtmtracking = __webpack_require__(/*! ./gtmtracking */ \"./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js\"),\n    addToCart = __webpack_require__(/*! ./pages/product/addToCart */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js\"),\n    notifyme = __webpack_require__(/*! ./pages/product/notifyme */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/notifyme.js\"),\n    powerReviewMutation= __webpack_require__(/*! ./pages/product/powerReviewMutation */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/powerReviewMutation.js\"),\n    newsletter = __webpack_require__(/*! ./newsletter.js */ \"./cartridges/app_paulaschoice/cartridge/js/newsletter.js\"),\n    nav = __webpack_require__(/*! ./nav */ \"./cartridges/app_paulaschoice/cartridge/js/nav.js\"),\n    giftcertpurchase = __webpack_require__(/*! ./pages/giftcertpurchase */ \"./cartridges/app_paulaschoice/cartridge/js/pages/giftcertpurchase.js\"),\n    personalisation = __webpack_require__(/*! ./personalisation */ \"./cartridges/app_paulaschoice/cartridge/js/personalisation.js\"),\n    searchfilterv2 = __webpack_require__(/*! ./searchfilterv2 */ \"./cartridges/app_paulaschoice/cartridge/js/searchfilterv2.js\"),\n    servicecloudChat = __webpack_require__(/*! ./servicecloudchat */ \"./cartridges/app_paulaschoice/cartridge/js/servicecloudchat.js\"),\n    passwordShow = __webpack_require__(/*! ./password-show */ \"./cartridges/app_paulaschoice/cartridge/js/password-show.js\"),\n    navaccountlayover = __webpack_require__(/*! ./navaccountlayover */ \"./cartridges/app_paulaschoice/cartridge/js/navaccountlayover.js\"),\n    fitsmyskin = __webpack_require__(/*! ./fitsmyskin */ \"./cartridges/app_paulaschoice/cartridge/js/fitsmyskin.js\"),\n    productTileVariationChange = __webpack_require__(/*! ./pages/producttilevariationchange */ \"./cartridges/app_paulaschoice/cartridge/js/pages/producttilevariationchange.js\"),\n    routineFinder = __webpack_require__(/*! ./components/routinefinder */ \"./cartridges/app_paulaschoice/cartridge/js/components/routinefinder.js\"),\n    brontoNewsletterCookie = __webpack_require__(/*! ./components/brontoNewsletterCookie */ \"./cartridges/app_paulaschoice/cartridge/js/components/brontoNewsletterCookie.js\"),\n    sitegenesisEvents = __webpack_require__(/*! ./components/sitegenesisEvents */ \"./cartridges/app_paulaschoice/cartridge/js/components/sitegenesisEvents.js\"),\n    tileContentAlignment = __webpack_require__(/*! ./components/tileContentAlignment */ \"./cartridges/app_paulaschoice/cartridge/js/components/tileContentAlignment.js\"),\n    hamstracking = __webpack_require__(/*! ./hamstracking */ \"./cartridges/app_paulaschoice/cartridge/js/hamstracking.js\"),\n    reviewPopup = __webpack_require__(/*! ./pages/product/reviewPopup */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/reviewPopup.js\"),\n    emarsysScarab = __webpack_require__(/*! ./emarsys-scarab.js */ \"./cartridges/app_paulaschoice/cartridge/js/emarsys-scarab.js\"),\n    klaviyoOnsite = __webpack_require__(/*! ./klaviyoOnsite */ \"./cartridges/app_paulaschoice/cartridge/js/klaviyoOnsite.js\");\n\n__webpack_require__(/*! ./captcha */ \"./cartridges/app_paulaschoice/cartridge/js/captcha.js\")();\n\nvar pages = {\n    account: __webpack_require__(/*! ./pages/account */ \"./cartridges/app_paulaschoice/cartridge/js/pages/account.js\"),\n    cart: __webpack_require__(/*! ./pages/cart */ \"./cartridges/app_paulaschoice/cartridge/js/pages/cart.js\"),\n    checkout: __webpack_require__(/*! ./pages/c
73heckout */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/index.js\"),\n    compare: __webpack_require__(/*! ./pages/compare */ \"./cartridges/app_paulaschoice/cartridge/js/pages/compare.js\"),\n    product: __webpack_require__(/*! ./pages/product */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/index.js\"),\n    registry: __webpack_require__(/*! ./pages/registry */ \"./cartridges/app_paulaschoice/cartridge/js/pages/registry.js\"),\n    search: __webpack_require__(/*! ./pages/search */ \"./cartridges/app_paulaschoice/cartridge/js/pages/search.js\"),\n    storefront: __webpack_require__(/*! ./pages/storefront */ \"./cartridges/app_paulaschoice/cartridge/js/pages/storefront.js\"),\n    wishlist: __webpack_require__(/*! ./pages/wishlist */ \"./cartridges/app_paulaschoice/cartridge/js/pages/wishlist.js\"),\n    orderconfirmation: __webpack_require__(/*! ./pages/orderconfirmation */ \"./cartridges/app_paulaschoice/cartridge/js/pages/orderconfirmation.js\")\n};\n\n_IBMWatsonChat__WEBPACK_IMPORTED_MODULE_4__[\"default\"].init();\nproductTileVariationChange.init();\n\nvar app = {\n    init: function () {\n\n        if (typeof ga !== \"undefined\") {\n            ga(util.extendCookie);\n        } else {\n            util.extendCookie();\n        }\n\n        // add class to html for css targeting\n        $('html').addClass('js');\n\n        tileContentAlignment.alignTileText();\n        // load js specific styles\n        util.limitCharacters();\n        sitegenesisEvents();\n        // init specific global components\n        _components_header__WEBPACK_IMPORTED_MODULE_0__[\"default\"].init();\n        _slider__WEBPACK_IMPORTED_MODULE_2__[\"default\"].init();\n        countries.init();\n        tooltip.init();\n        productaddedpopup.init();\n        validator.init();\n        topheader.init();\n        footer.init();\n        nav.init();\n        expertAdvice.init();\n        newsletter.init();\n        videoplayer.init();\n        _routine_slider__WEBPACK_IMPORTED_MODULE_5__[\"default\"].init();\n        cookiebar.init();\n        window.cookiebar = cookiebar;\n        giftcertpurchase.init();\n        searchfilterv2.init();\n        personalisation.init();\n        servicecloudChat.init();\n        notifyme.init();\n        passwordShow();\n        window.cookiebar = cookiebar;\n        navaccountlayover.init();\n        (0,_pages_checkout_showAddressTwo__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n        reviewPopup.init();\n        powerReviewMutation.init();\n\n        // execute page specific initializations\n        $.extend(page, window.pageContext);\n        var ns = page.ns;\n        if (ns && pages[ns] && pages[ns].init) {\n            pages[ns].init();\n        }\n\n        if (ns == \"cart\") {\n            // Cart predictive recommendation slider is not in DOM on document ready, observe the element for mutations\n            var emptyWrapper = $('#cart-recommendations-empty-wrapper');\n            util.subscribeMutationObserver(emptyWrapper, function () {\n                // Initiate the single slider in cart page\n                _slider__WEBPACK_IMPORTED_MODULE_2__[\"default\"].init();\n                tileContentAlignment.alignSliderText();\n                // throw event to disconnect observer\n                emptyWrapper.trigger('disconnectObserver');\n            });\n        } else {\n            tileContentAlignment.alignSliderText();\n        }\n\n        emarsysScarab.init(page);\n        routineFinder();\n        brontoNewsletterCookie();\n        fitsmyskin.init();\n        addToCart();\n        gtmtracking.init();\n        hamstracking.init();\n        klaviyoOnsite.init(page);\n    }\n};\n\n// initialize app\n$(document).ready(function () {\n    app.init();\n});\n\ndocument.onreadystatechange = function () {\n    if (document.readyState == 'complete') {\n        // Lazy load init\n        (0,_lazyload__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n    }\n}\n\nif (window.SessionAttributes.SHOW_COUNTRYPOPUP && util.getCookie('prefferedLocale') === null) {\n    $(window).load(function () {\n        countrydetection.init();\n    });\n}\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/app.js?\n}");
74
75/***/ }),
76
77/***/ "./cartridges/app_paulaschoice/cartridge/js/bonus-products-view.js":
78/*!*************************************************************************!*\
79  !*** ./cartridges/app_paulaschoice/cartridge/js/bonus-products-view.js ***!
80  \*************************************************************************/
81/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
82
83"use strict";
84eval("{\n\nvar dialog = __webpack_require__(/*! ./dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\"),\n    page = __webpack_require__(/*! ./page */ \"./cartridges/app_paulaschoice/cartridge/js/page.js\"),\n    util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar selectedList = [];\nvar maxItems = 1;\nvar bliUUID = '';\n\n/**\n * @private\n * @function\n * description Gets a list of bonus products related to a promoted product\n */\nfunction getBonusProducts() {\n    var bonusproducts = [];\n\n    var i, len;\n    for (i = 0, len = selectedList.length; i < len; i++) {\n        var p = {\n            pid: selectedList[i].pid,\n            qty: selectedList[i].qty,\n            options: {}\n        };\n        var a, alen, bp = selectedList[i];\n        if (bp.options) {\n            for (a = 0, alen = bp.options.length; a < alen; a++) {\n                var opt = bp.options[a];\n                p.options = {optionName:opt.name, optionValue:opt.value};\n            }\n        }\n        bonusproducts.push({product:p});\n    }\n    return {bonusproducts: bonusproducts};\n}\n\n// hide swatches that are not selected or not part of a Product Variation Group\nvar hideSwatches = function () {\n    $('.bonus-product-item:not([data-producttype=\"master\"]) .swatches li').not('.selected').not('.variation-group-value').hide();\n    // prevent unselecting the selected variant\n    $('.bonus-product-item .swatches .selected').on('click', function () {\n        return false;\n    });\n};\n\nfunction initializeGrid () {\n    var $bonusProductList = $('#bonus-product-list'),\n        bliData = $bonusProductList.data('line-item-detail');\n        maxItems = bliData.maxItems;\n        bliUUID = bliData.uuid;\n\n    $('.bonus-product-list-footer').hide();\n\n    $bonusProductList.on('click', '.bonus-product-item a[href].swatchanchor', function (e) {\n        e.preventDefault();\n        var url = this.href,\n            $this = $(this);\n        url = util.appendParamsToUrl(url, {\n            'source': 'bonus',\n            'format': 'ajax'\n        });\n        $.ajax({\n            url: url,\n            success: function (response) {\n                $this.closest('.bonus-product-item').empty().html(response);\n                hideSwatches();\n            }\n        });\n    })\n    .on('change', '.input-text', function () {\n        $bonusProductList.find('.select-bonus-item').removeAttr('disabled');\n        $(this).closest('.bonus-product-form').find('.quantity-error').text('');\n    })\n    .on('click', '.bonus-product-item', function(e){\n        e.preventDefault();\n\n        var $bonusProductItem = $(this);\n\n        var detail = $bonusProductItem.closest('.product-detail'),\n            uuid = $bonusProductItem.find('input[name=\"productUUID\"]').val(),\n            pid = $bonusProductItem.find('input[name=\"pid\"]').val(),\n            qtyVal = $bonusProductItem.find('input[name=\"Quantity\"]').val(),\n            qty = (isNaN(qtyVal)) ? 1 : (+qtyVal),\n            numberOfSelectedItems = $bonusProductList.find('.js-bonus-product-count b').first();\n\n        var product = {\n            uuid: uuid,\n            pid: pid,\n            qty: qty,\n            name: detail.find('.product-name').text(),\n            attributes: detail.find('.product-variations').data('attributes')\n        };\n\n        if ( !$bonusProductItem.hasClass('selected') ) {\n            if ( selectedList.length < maxItems ) {\n                selectedList.push(product);\n                $bonusProductItem.addClass('selected');\n                numberOfSelectedItems.html((parseInt(numberOfSelectedItems.html()) + 1).toString());\n\n                if (selectedList.length == maxItems) { // if we reached the maximimum number of bonus products, fade the others out.\n                    $('.bonus-product-item:not(.selected)').addClass('faded');\n                }\n\n                if (selectedList.length > 0) {\n                    $('.js-select-bonus-item').removeAttr('disabled');\n                }\n            }\n        } else {\n            var item = selectedList.find(element => element.pid == pid);\n            selectedList.splice(selectedList.indexOf(item), 1);\n        \t$bonusProductItem.removeClass('selected');\n            numberOfSelectedItems.html((parseInt(numberOfSelectedItems.html()) - 1).toString());\n            $('.bonus-product-item').removeClass('faded'); // unfade any faded items, since we're unselecting bonus product.\n            if (selectedList.length == 0) {\n                $('.js-select-bonus-item').attr('disabled', true);\n            }\n        }\n    })\n    .on('click', '.select-bonus-item', function (e) {\n        e.preventDefault();\n\n        var url = util.appendParamsToUrl(Urls.addBonusProduct, {bonusDiscountLineItemUUID: bliUUID});\n        var bonusProducts = getBonusProducts();\n        if (bonusProducts.bonusproducts.length > 0 && bonusProducts.bonusproducts[0].product.qty > maxItems) {\n            bonusProducts.bonusproducts[0].product.qty = maxItems;\n        }\n        // make the server call\n        $.ajax({\n            type: 'POST',\n            dataType: 'json',\n            cache: false,\n            contentType: 'application/json',\n            url: url,\n            data: JSON.stringify(bonusProducts)\n        })\n        .done(function () {\n            // success\n            // (can't use Promises because of IE11)\n            // Refresh page after animation is over\n            // checkmark animation is 0.75s\n            setTimeout(page.refresh(1250), 1250);\n        })\n        .fail(function (xhr, textStatus) {\n            // failed\n            if (textStatus === 'parsererror') {\n                window.alert(Resources.BAD_RESPONSE);\n            } else {\n                window.alert(Resources.SERVER_CONNECTION_ERROR);\n            }\n        });\n\n    })\n\n    .on('click', '.remove-link', function (e) {\n        e.preventDefault();\n        var container = $(this).closest('.selected-bonus-item');\n        if (!container.data('uuid')) { return; }\n\n        var uuid = container.data('uuid');\n        var i, len = selectedList.length;\n        for (i = 0; i < len;
84 i++) {\n            if (selectedList[i].uuid === uuid) {\n                selectedList.splice(i, 1);\n                break;\n            }\n        }\n\n        $('#item-'+uuid).removeClass('selected');\n        $('#item-'+uuid).find('.select-bonus-item').html(Resources.BONUS_PRODUCT_SELECT_BUTTON).removeClass('selected');\n    });\n}\n\nvar bonusProductsView = {\n    /**\n     * @function\n     * @description Open the list of bonus products selection dialog\n     */\n    show: function (url) {\n        var $bonusProduct = $('#bonus-product-dialog');\n        selectedList = [];\n        // create the dialog\n        dialog.open({\n            target: $bonusProduct,\n            url: url,\n            closeText : '',\n            options: {\n                dialogClass: \"bonus-items-popup\",\n                width: \"100%\",\n                title: Resources.BONUS_PRODUCTS\n            },\n            callback: function () {\n                initializeGrid();\n                hideSwatches();\n            \t// Remove all items when popup is opened each time\n                $('.remove-link').each(function(){\n                \t$(this).trigger('click');\n                });\n                if (document.querySelector('.js-bonus-product-wrapper')) { // scroll products wrapper to the top after modal is opened.\n                    document.querySelector('.js-bonus-product-wrapper').scrollTop = 0;\n                }\n            }\n        });\n    },\n    /**\n     * @function\n     * @description Open bonus product promo prompt dialog\n     */\n    loadBonusOption: function () {\n        var    self = this,\n            bonusDiscountContainer = document.querySelector('.bonus-discount-container');\n        if (!bonusDiscountContainer) { return; }\n\n        // get the html from minicart, then trash it\n        var bonusDiscountContainerHtml = bonusDiscountContainer.outerHTML;\n        bonusDiscountContainer.parentNode.removeChild(bonusDiscountContainer);\n\n        dialog.open({\n            html: bonusDiscountContainerHtml,\n            closeText : '',\n            options: {\n                width: 400,\n                title: Resources.BONUS_PRODUCT,\n                buttons: [{\n                    text: Resources.SELECT_BONUS_PRODUCTS,\n                    click: function () {\n                        var uuid = $('.bonus-product-promo').data('lineitemid'),\n                            url = util.appendParamsToUrl(Urls.getBonusProducts, {\n                                bonusDiscountLineItemUUID: uuid,\n                                source: 'bonus',\n                                format: 'ajax',\n                                lazyLoad: 'false',\n                                pageStart: 0,\n                                pageSize: 10,\n                                bonusProductsTotal: -1\n                            });\n                        $(this).dialog('close');\n                        self.show(url);\n                    }\n                }, {\n                    text: Resources.NO_THANKS,\n                    click: function () {\n                        $(this).dialog('close');\n                    }\n                }]\n            }\n        });\n    }\n};\n\nmodule.exports = bonusProductsView;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/bonus-products-view.js?\n}");
85
86/***/ }),
87
88/***/ "./cartridges/app_paulaschoice/cartridge/js/captcha.js":
89/*!*************************************************************!*\
90  !*** ./cartridges/app_paulaschoice/cartridge/js/captcha.js ***!
91  \*************************************************************/
92/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
93
94"use strict";
95eval("{\n\nvar dialog = __webpack_require__(/*! ./dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\");\nvar util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nvar SessionAttributes = window.SessionAttributes;\n\n/**\n * @function captcha    Used to display/control the scrim containing the simulated captcha code\n **/\nmodule.exports = function () {\n    /**\n     * if the session.privacy.ratelimited element is present then show the notification\n     * NOTE: You will probably want to replace this with a call to an actual CAPTCHA system to replace the simple one here\n     */\n    if (SessionAttributes.SHOW_CAPTCHA) {\n        dialog.open({\n            html: '<h1>' + Resources.ARE_YOU_HUMAN + '</h1>',\n            options: {\n                closeOnEscape: false,\n                dialogClass: 'no-close',\n                closeText : '',\n                buttons: [{\n                    text: Resources.OK,\n                    click: function () {\n                        var url = util.appendParamsToUrl(Urls.rateLimiterReset, {format: 'ajax'});\n                        $.ajax({\n                            url: url\n                        });\n                        $(this).dialog('close');\n                    }\n                }]\n            }\n        });\n    }\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/captcha.js?\n}");
96
97/***/ }),
98
99/***/ "./cartridges/app_paulaschoice/cartridge/js/compare-widget.js":
100/*!********************************************************************!*\
101  !*** ./cartridges/app_paulaschoice/cartridge/js/compare-widget.js ***!
102  \********************************************************************/
103/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
104
105"use strict";
106eval("{\n\nvar page = __webpack_require__(/*! ./page */ \"./cartridges/app_paulaschoice/cartridge/js/page.js\"),\n    util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n    TPromise = __webpack_require__(/*! promise */ \"./node_modules/promise/index.js\");\n\nvar _currentCategory = '',\n    MAX_ACTIVE = 6;\n\n/**\n * @private\n * @function\n * @description Verifies the number of elements in the compare container and updates it with sequential classes for ui targeting\n */\nfunction refreshContainer() {\n    var $compareContainer = $('.compare-items');\n    var $compareItems = $compareContainer.find('.compare-item');\n    var numActive = $compareItems.filter('.active').length;\n\n    if (numActive < 2) {\n        $('#compare-items-button').attr('disabled', 'disabled');\n    } else {\n        $('#compare-items-button').removeAttr('disabled');\n    }\n\n    $compareContainer.toggle(numActive > 0);\n}\n/**\n * @private\n * @function\n * @description Adds an item to the compare container and refreshes it\n */\nfunction addToList(data) {\n    // get the first compare-item not currently active\n    var $item = $('.compare-items .compare-item').not('.active').first(),\n        $productTile = $('#' + data.uuid);\n\n    if ($item.length === 0) {\n        if ($productTile.length > 0) {\n            $productTile.find('.compare-check')[0].checked = false;\n        }\n        window.alert(Resources.COMPARE_ADD_FAIL);\n        return;\n    }\n\n    // if already added somehow, return\n    if ($('[data-uuid=\"' + data.uuid + '\"]').length > 0) {\n        return;\n    }\n    // set as active item\n    $item.addClass('active')\n        .attr('data-uuid', data.uuid)\n        .attr('data-itemid', data.itemid)\n        .data('uuid', data.uuid)\n        .data('itemid', data.itemid)\n        .append($(data.img).clone().addClass('compare-item-image'));\n}\n/**\n * @private\n * @function\n * description Removes an item from the compare container and refreshes it\n */\nfunction removeFromList($item) {\n    if ($item.length === 0) { return; }\n    // remove class, data and id from item\n    $item.removeClass('active')\n        .removeAttr('data-uuid')\n        .removeAttr('data-itemid')\n        .data('uuid', '')\n        .data('itemid', '')\n        // remove the image\n        .find('.compare-item-image').remove();\n}\n\nfunction addProductAjax(args) {\n    var promise = new TPromise(function (resolve, reject) {\n        $.ajax({\n            url: Urls.compareAdd,\n            data: {\n                pid: args.itemid,\n                category: _currentCategory\n            },\n            dataType: 'json'\n        }).done(function (response) {\n            if (!response || !response.success) {\n                reject(new Error(Resources.COMPARE_ADD_FAIL));\n            } else {\n                resolve(response);\n            }\n        }).fail(function (jqxhr, status, err) {\n            reject(new Error(err));\n        });\n    });\n    return promise;\n}\n\nfunction removeProductAjax(args) {\n    var promise = new TPromise(function (resolve, reject) {\n        $.ajax({\n            url: Urls.compareRemove,\n            data: {\n                pid: args.itemid,\n                category: _currentCategory\n            },\n            dataType: 'json'\n        }).done(function (response) {\n            if (!response || !response.success) {\n                reject(new Error(Resources.COMPARE_REMOVE_FAIL));\n            } else {\n                resolve(response);\n            }\n        }).fail(function (jqxhr, status, err) {\n            reject(new Error(err));\n        });\n    });\n    return promise;\n}\n\nfunction shiftImages() {\n    return new TPromise(function (resolve) {\n        var $items = $('.compare-items .compare-item');\n        $items.each(function (i, item) {\n            var $item = $(item);\n            // last item\n            if (i === $items.length - 1) {\n                return removeFromList($item);\n            }\n            var $next = $items.eq(i + 1);\n            if ($next.hasClass('active')) {\n                // remove its own image\n                $next.find('.compare-item-image').detach().appendTo($item);\n                $item.addClass('active')\n                    .attr('data-uuid', $next.data('uuid'))\n                    .attr('data-itemid', $next.data('itemid'))\n                    .data('uuid', $next.data('uuid'))\n                    .data('itemid', $next.data('itemid'));\n            }\n        });\n        resolve();\n    });\n}\n\n/**\n * @function\n * @description Adds product to the compare table\n */\nfunction addProduct(args) {\n    var promise;\n    var $items = $('.compare-items .compare-item');\n    var $cb = $(args.cb);\n    var numActive = $items.filter('.active').length;\n    if (numActive === MAX_ACTIVE) {\n        if (!window.confirm(Resources.COMPARE_CONFIRMATION)) {\n            $cb[0].checked = false;\n            return;\n        }\n\n        // remove product using id\n        var $firstItem = $items.first();\n        promise = removeItem($firstItem).then(function () {\n            return shiftImages();\n        });\n    } else {\n        promise = TPromise.resolve(0);\n    }\n    return promise.then(function () {\n        return addProductAjax(args).then(function () {\n            addToList(args);\n            if ($cb && $cb.length > 0) { $cb[0].checked = true; }\n            refreshContainer();\n        });\n    }).then(null, function () {\n        if ($cb && $cb.length > 0) { $cb[0].checked = false; }\n    });\n}\n\n/**\n * @function\n * @description Removes product from the compare table\n * @param {object} args - the arguments object should have the following properties: itemid, uuid and cb (checkbox)\n */\nfunction removeProduct(args) {\n    var $cb = args.cb ? $(args.cb) : null;\n    return removeProductAjax(args).then(function () {\n        var $item = $('[data-uuid=\"' + args.uuid + '\"]');\n        removeFromList($item);\n        if ($cb && $cb.length > 0) { $cb[0].checked = false; }\n        refreshContainer();\n    }, function () {\n        if ($cb && $cb.length > 0) { $cb[0].checked = true; }\n    });\n}\n\nfunction removeItem($item) {\n    var uuid = $item.data('uuid'),\n        $productTile = $('#' + uuid);\n    return removeProduct({\n        itemid: $item.data('itemid'),\n        uuid: uuid,\n        cb: ($productTile.length === 0) ? null : $productTile.find('.compare-check')\n    });\n}\n\n/**\n * @private\n * @function\n * @description Initializes the DOM-Object of the compare container\n */\nfunction initializeDom() {\n    var $compareContainer = $('.compare-items');\n    _currentCategory = $compareContainer.data('category') || '';\n    var $active = $compareContainer.find('.compare-item').filter('.active');\n    $active.each(function () {\n        var $productTile = $('#' +  $(this).data('uuid'));\n        if ($productTile.length === 0) {return;}\n        $productTile.find('.compare-check')[0].checked = true;\n    });\n    // set container state\n    refreshContainer();\n}\n\n/**\n * @private\n * @function\n * @description Initializes the events on the compare container\n */\nfunction initializeEvents() {\n    // add event to buttons to remove products\n    $('.compare-item').on('click', '.compare-item-remove', function () {\n        removeItem($(this).closest('.compare-item'));\n    });\n\n    // Button to go to compare page\n    $('#compare-items-button').on('click', function () {\n        page.redirect(util.appendParamToURL(Urls.compareShow, 'category', _currentCategory));\n    });
106\n\n    // Button to clear all compared items\n    // rely on refreshContainer to take care of hiding the container\n    $('#clear-compared-items').on('click', function () {\n        $('.compare-items .active').each(function () {\n            removeItem($(this));\n        });\n    });\n}\n\nexports.init = function () {\n    initializeDom();\n    initializeEvents();\n};\n\nexports.addProduct = addProduct;\nexports.removeProduct = removeProduct;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/compare-widget.js?\n}");
107
108/***/ }),
109
110/***/ "./cartridges/app_paulaschoice/cartridge/js/components/brontoNewsletterCookie.js":
111/*!***************************************************************************************!*\
112  !*** ./cartridges/app_paulaschoice/cartridge/js/components/brontoNewsletterCookie.js ***!
113  \***************************************************************************************/
114/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
115
116eval("{const util = __webpack_require__(/*! ../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nmodule.exports = function() {\n    function hasOldBrontoNewsletterCookie() {\n        var isCookieSet = false;\n        var cookies = document.cookie.split(';');\n        for (var i = 0; i < cookies.length; i++) {\n            var tokens = cookies[i].split('=');\n            var cookieKey = tokens[0].trim();\n            var regex = new RegExp('^vib_[0-9]\\\\w+');\n            if (regex.test(cookieKey)) {\n                isCookieSet = true;\n            }\n        }\n        return isCookieSet;\n    }\n\n    if (!hasOldBrontoNewsletterCookie()) {\n        util.subscribeMutationObserver($('body'), function () {\n            if ($('.popup-dialog').length) {\n                $('.popup-dialog').find('input').blur();\n                $('body').trigger('disconnectObserver');\n            }\n        });\n    }\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/components/brontoNewsletterCookie.js?\n}");
117
118/***/ }),
119
120/***/ "./cartridges/app_paulaschoice/cartridge/js/components/header.js":
121/*!***********************************************************************!*\
122  !*** ./cartridges/app_paulaschoice/cartridge/js/components/header.js ***!
123  \***********************************************************************/
124/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
125
126"use strict";
127eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   cache: function() { return /* binding */ cache; },\n/* harmony export */   classes: function() { return /* binding */ classes; }\n/* harmony export */ });\n/* harmony import */ var _redesign_utils_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../redesign/utils/helpers */ \"./cartridges/app_paulaschoice/cartridge/js/redesign/utils/helpers.js\");\n\n\nconst cache = {\n    HEADER: document.querySelector('.js-header'),\n    MENU_TOGGLE_BTN: document.querySelector('.js-menu-toggle-btn'),\n    SUBMENU_TOGGLE_BTN: document.querySelectorAll('.js-toggle-sub-menu'),\n    LEVEL_3_TOGGLE: document.querySelectorAll('.js-level-3-toggle'),\n    LEVEL_4_TOGGLE: document.querySelectorAll('.js-level-4-toggle'),\n    OVERLAY: document.querySelector('.js-overlay')\n}\n\nconst classes = {\n    MENU_OPEN: 'header--menu-open',\n    SUBMENU_OPEN: 'header--submenu-open',\n    MENU_ITEM_OPEN: 'main-nav__item--open',\n    LEVEL_3_OPEN: 'sub-menu__item--open',\n    LEVEL_4_OPEN: 'level-3__item--open',\n    SCROLLED: 'header--scrolled'\n}\n\nconst selectors = {\n    MENU_ITEM: '.js-menu-item',\n    MENU_ITEM_OPEN: '.main-nav__item--open',\n    LEVEL_3_ITEM: '.js-level-3'\n}\n\nconst header = {\n    init: function() {\n        if (cache.MENU_TOGGLE_BTN) {\n            cache.MENU_TOGGLE_BTN.addEventListener('click', this.toggleOpenMenu);\n        }\n\n        if (cache.SUBMENU_TOGGLE_BTN) {\n            cache.SUBMENU_TOGGLE_BTN.forEach((subMenuItem) => {\n                subMenuItem.addEventListener('click', () => {\n                    this.toggleSubmenu(subMenuItem);\n                });\n            });\n        }\n\n        if (cache.LEVEL_3_TOGGLE) {\n            cache.LEVEL_3_TOGGLE.forEach((level3Item) => {\n                level3Item.addEventListener('click', (e) => {\n                    this.toggleLevel3Submenu(level3Item, e);\n                });\n            });\n        }\n\n        if (cache.LEVEL_4_TOGGLE && _redesign_utils_helpers__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isMobile()) {\n            cache.LEVEL_4_TOGGLE.forEach((level4Item) => {\n                level4Item.addEventListener('click', () => {\n                    this.toggleLevel4Submenu(level4Item);\n                });\n            });\n        }\n\n        if (cache.OVERLAY) {\n            cache.OVERLAY.addEventListener('click', () => {\n                this.closeSubmenu();\n            });\n        }\n\n        this.scrollToggleFunc();\n    },\n\n    toggleOpenMenu: function() {\n        if (cache.HEADER.classList.contains(classes.MENU_OPEN)) {\n            cache.HEADER.classList.remove(classes.MENU_OPEN);\n            _redesign_utils_helpers__WEBPACK_IMPORTED_MODULE_0__[\"default\"].enableScroll();\n            return;\n        }\n        cache.HEADER.classList.add(classes.MENU_OPEN);\n        _redesign_utils_helpers__WEBPACK_IMPORTED_MODULE_0__[\"default\"].disableScroll();\n    },\n\n    toggleSubmenu: function(el) {\n        if (!el.closest(selectors.MENU_ITEM_OPEN)) {\n            this.closeSubmenu(el);\n            this.openSubmenu(el);\n            return;\n        }\n        this.closeSubmenu(el);\n    },\n\n    openSubmenu: function(el) {\n        el.closest(selectors.MENU_ITEM).classList.add(classes.MENU_ITEM_OPEN);\n        if (!_redesign_utils_helpers__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isMobile()) {\n            el.closest(selectors.MENU_ITEM).querySelector(selectors.LEVEL_3_ITEM).classList.add(classes.LEVEL_3_OPEN);\n        }\n        cache.HEADER.classList.add(classes.SUBMENU_OPEN);
127\n        if (cache.HEADER.classList.contains(classes.MENU_OPEN)) return;\n        _redesign_utils_helpers__WEBPACK_IMPORTED_MODULE_0__[\"default\"].disableScroll();\n    },\n\n    closeSubmenu: function() {\n        if (!document.querySelector(selectors.MENU_ITEM_OPEN)) return;\n        document.querySelector(selectors.MENU_ITEM_OPEN).classList.remove(classes.MENU_ITEM_OPEN);\n        cache.HEADER.classList.remove(classes.SUBMENU_OPEN);\n        if (!_redesign_utils_helpers__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isMobile()) {\n            document.querySelector('.' + classes.LEVEL_3_OPEN).classList.remove(classes.LEVEL_3_OPEN);\n        }\n        if (cache.HEADER.classList.contains(classes.MENU_OPEN)) return;\n        _redesign_utils_helpers__WEBPACK_IMPORTED_MODULE_0__[\"default\"].enableScroll();\n    },\n\n    toggleLevel3Submenu: function(el, event) {\n        if (!el.closest(selectors.LEVEL_3_ITEM)) return;\n        event.preventDefault();\n\n        if (!_redesign_utils_helpers__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isMobile()) {\n            document.querySelector('.' + classes.LEVEL_3_OPEN).classList.remove(classes.LEVEL_3_OPEN);\n        }\n        el.closest(selectors.LEVEL_3_ITEM).classList.toggle(classes.LEVEL_3_OPEN);\n    },\n\n    toggleLevel4Submenu: function(el) {\n        el.classList.toggle(classes.LEVEL_4_OPEN);\n\n        // toggle fake-level-4--open class to all next elemenst siblings that have class fake-level-4\n        let nextSiblingToOpen = el.nextElementSibling;\n        while (nextSiblingToOpen) {\n            if (!nextSiblingToOpen.classList.contains('fake-level-4')) {\n                break;\n            }\n            nextSiblingToOpen.classList.toggle('fake-level-4--open');\n            nextSiblingToOpen = nextSiblingToOpen.nextElementSibling;\n        }\n    },\n\n    toggleScrolledClass: function(header, scrollTop) {\n        if (!scrollTop || !header) return;\n\n        if (scrollTop > 100) {\n            return header.classList.add(classes.SCROLLED);\n        }\n\n        return header.classList.remove(classes.SCROLLED);\n    },\n\n    debounce: function(method, delay) {\n        clearTimeout(method._tId);\n        method._tId= setTimeout(function(){\n            method();\n        }, delay || 100);\n    },\n\n    scrollToggleFunc: function() {\n        if (!cache.HEADER) return;\n        let scrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;\n\n        window.onscroll = function () {\n            header.debounce(function() {\n                scrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;\n                header.toggleScrolledClass(cache.HEADER, scrollTop);\n            });\n        }\n    }\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (header);\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/components/header.js?\n}");
128
129/***/ }),
130
131/***/ "./cartridges/app_paulaschoice/cartridge/js/components/passwordStrengthChecker.js":
132/*!****************************************************************************************!*\
133  !*** ./cartridges/app_paulaschoice/cartridge/js/components/passwordStrengthChecker.js ***!
134  \****************************************************************************************/
135/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
136
137"use strict";
138eval("{/* harmony import */ var check_password_strength__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! check-password-strength */ \"./node_modules/check-password-strength/dist/index.mjs\");\n\n\nconst passwordRequirements = [\n    {\n      id: 0,\n      value: \"Too weak\",\n      minDiversity: 0,\n      minLength: 0\n    },\n    {\n      id: 1,\n      value: \"Weak\",\n      minDiversity: 1,\n      minLength: 8\n    },\n    {\n      id: 2,\n      value: \"Medium\",\n      minDiversity: 2,\n      minLength: 8\n    },\n    {\n      id: 3,\n      value: \"Strong\",\n      minDiversity: 4,\n      minLength: 8\n    }\n]\n\nconst passwordStrengthChecker = {\n    init: function() {\n        const passwordFields = document.querySelectorAll('input[type=password]');\n\n        if (!passwordFields || !document.querySelector('.js-password-strength-meter')) return;\n\n        passwordFields.forEach(field => {\n            field.addEventListener('focus', () => {\n                // On all forms except shipping and change password forms, immediately trigger the password meter logic as user focuses the password field\n                if (field.closest('.checkout-shipping') || field.closest('#ChangePasswordForm') || field.closest('#NewPasswordForm')) return;\n                field.dispatchEvent(new Event('input', { bubbles: true }));\n            });\n            field.addEventListener('input', () => {\n                const isCheckoutShippingForm = field.closest('.checkout-shipping');\n                const passwordStrengthMeter = field.closest('form').querySelector('.js-password-strength-meter');\n                const formSubmitButton = field.closest('form').querySelector('button[type=\"submit\"], .js-create-account');\n                // on account change password form or reset password form, it should only work with first new password field.\n                const isChangePasswordForm = field.closest('#ChangePasswordForm') || field.closest('#NewPasswordForm');\n                if (!passwordStrengthMeter || (isChangePasswordForm && !field.closest('.js-new-password'))) return;\n                passwordStrengthMeter.classList.remove('hide');\n                const passwordStrengthResult = (0,check_password_strength__WEBPACK_IMPORTED_MODULE_0__.passwordStrength)(field.value, passwordRequirements);\n                const passwordHasLetter = passwordStrengthResult.contains.includes('lowercase');\n                const passwordHasUppercaseLetter = passwordStrengthResult.contains.includes('uppercase');\n                const passwordHasNumber = passwordStrengthResult.contains.includes('number');\n                const passwordHasSymbol = passwordStrengthResult.contains.includes('symbol');\n\n                passwordStrengthMeter.classList.toggle('has-letter', passwordHasLetter);\n                passwordStrengthMeter.classList.toggle('has-length', passwordStrengthResult.length > 7);\n                passwordStrengthMeter.classList.toggle('has-number', passwordHasNumber);\n                passwordStrengthMeter.classList.toggle('has-symbol', passwordHasSymbol);\n                passwordStrengthMeter.classList.toggle('has-uppercase', passwordHasUppercaseLetter);\n\n                switch (passwordStrengthResult.id) {\n                    case 0:\n                        passwordStrengthMeter.classList.remove('good');\n                        passwordStrengthMeter.classList.remove('better');\n                        passwordStrengthMeter.classList.remove('strong');\n                        passwordStrengthMeter.classList.add('weak');\n                        formSubmitButton.setAttribute('disabled', 'disabled');\n\n                        break;\n                    case 1:\n                        passwordStrengthMeter.classList.remove('weak');\n                        passwordStrengthMeter.classList.remove('better');\n                        passwordStrengthMeter.classList.remove('strong');\n                        passwordStrengthMeter.classList.add('good');\n                        formSubmitButton.removeAttribute('disabled');\n                        break;\n                    case 2:\n                        passwordStrengthMeter.classList.remove('weak');\n                        passwordStrengthMeter.classList.remove('good');\n                        passwordStrengthMeter.classList.remove('strong');\n                        passwordStrengthMeter.classList.add('better');\n                        formSubmitButton.removeAttribute('disabled');\n                        break;\n                    case 3:\n                        passwordStrengthMeter.classList.remove('weak');\n                        passwordStrengthMeter.classList.remove('good');\n                        passwordStrengthMeter.classList.remove('better');\n                        passwordStrengthMeter.classList.add('strong');\n                        formSubmitButton.removeAttribute('disabled');\n                        break;\n                }\n                /*\n                // On the shipping form or edit profile form, password field is not mandatory\n                // When user types a weak password, submit button will be disabled\n                // But when user deletes the input of the password, button has to be enabled again\n                */\n                if (field.value.length === 0 && (isCheckoutShippingForm || isChangePasswordForm)) {\n                    passwordStrengthMeter.classList.add('hide');\n                    formSubmitButton.removeAttribute('disabled');\n                }\n            });\n        });\n    }\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (passwordStrengthChecker);\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/components/passwordStrengthChecker.js?\n}");
139
140/***/ }),
141
142/***/ "./cartridges/app_paulaschoice/cartridge/js/components/routinefinder.js":
143/*!******************************************************************************!*\
144  !*** ./cartridges/app_paulaschoice/cartridge/js/components/routinefinder.js ***!
145  \******************************************************************************/
146/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
147
148eval("{const util = __webpack_require__(/*! ../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nmodule.exports = function() {\n    //routine finder pages\n    if ($('.routine-finder-wrap').length) {\n\n        //change text color if concern is selected on step 2\n        $('.routine-step-2 .form-row input[type=checkbox]').each(function () {\n            if ($(this).is(':checked')) {\n                $(this).siblings('label').addClass('active');\n                if ($('[type=checkbox][name^=\"dwfrm_routinefinder_\"]:checked').length >= 2) {\n                    $('.btn-next-2').removeClass('disabled').addClass('btn-selected');\n                }\n            }\n        });\n\n        //move to step 2 from step 1\n        $('.routine-step-1 .field-wrapper label').on('click', function () {\n            if (!$(this).hasClass('selected')) {\n                $('.routine-step-1 .field-wrapper label').removeClass('selected').addClass('not-selected');\n                $(this).removeClass('not-selected').addClass('selected');\n                $('.routine-step-1').find('.btn-next').removeClass('disabled').addClass('btn-selected');\n            } else {\n                $(this).removeClass('selected');\n                $('.routine-step-1 .field-wrapper label').removeClass('not-selected');\n                $('.routine-step-1').find('.btn-next').removeClass('btn-selected').addClass('disabled');\n            }\n        });\n\n        $('.routine-step-1 .btn-next').on('click', function () {\n            if ($(this).hasClass('btn-selected')) {\n                $('.routine-step-1').removeClass('show-step').addClass('hide-step');\n                $('.routine-step-2').removeClass('hide-step').addClass('show-step');\n                $('.routine-progress-bar .routine-progress-bar-inner').css('width', '100%');\n                $('.routine-progress-label .current-step').text('2');\n                $('.routine-step .btn-back').addClass('btn-visible');\n                $('.routine-finder-header').addClass('step-2');\n            }\n        });\n\n        //go back to step 1 from step 2\n        $('.routine-step .btn-back').on('click', function () {\n            if ($('.routine-step-1').hasClass('hide-step')) {\n                $('.routine-step-1').removeClass('hide-step').addClass('show-step');\n                $('.routine-step-2').removeClass('show-step').addClass('hide-step');\n                $('.routine-progress-bar .routine-progress-bar-inner').css('width', '50%');\n                $('.routine-progress-label .current-step').text('1');\n                $('.routine-step .btn-back').removeClass('btn-visible');\n                $('.routine-finder-header').removeClass('step-2');\n            }\n        });\n\n        if ($('.routine-finder-header').hasClass('step-2')) {\n            $('.routine-progress-bar .routine-progress-bar-inner').css('width', '100%');\n            $('.routine-progress-label .current-step').text('2')\n        }\n\n        var blur = function (input) {\n            $(input).prop('checked', false).attr('disabled', true).parent().parent().addClass('is-selected');\n        };\n\n        var highlight = function (input) {\n            $(input).attr('disabled', false).parent().parent().addClass('is-available');\n        };\n\n        var showMeaningfulConcerns = function () {\n            $('.routine-step-2 .routine-items-content .form-row').show();\n            if (localStorage.skin == '2') {\n                $('[name=\"dwfrm_routinefinder_enlargedpores\"]').closest('.form-row').hide();\n                $('[name=\"dwfrm_routinefinder_verydryskin\"]').on('change', function () {\n                    if (this.checked) {\n                        blur($
148('[name=\"dwfrm_routinefinder_blackheads\"]'));\n                    } else {\n                        highlight($('input[name^=\"dwfrm_routinefinder_\"]').not('[name=\"dwfrm_routinefinder_enlargedpores\"]').not('[name$=\"concern\"]'));\n                    }\n                });\n                $('input[name=\"dwfrm_routinefinder_blackheads\"]').on('change', function () {\n                    if (this.checked) {\n                        blur($('[name=\"dwfrm_routinefinder_verydryskin\"]'));\n                    } else {\n                        highlight($('input[name^=\"dwfrm_routinefinder_\"]').not('[name=\"dwfrm_routinefinder_enlargedpores\"]'));\n                    }\n                });\n            } else if (localStorage.skin == '1' || localStorage.skin == '4') {\n                $('[name=\"dwfrm_routinefinder_blackheads\"],[name=\"dwfrm_routinefinder_verydryskin\"]').unbind('change');\n                $('[name=\"dwfrm_routinefinder_verydryskin\"]').closest('.form-row').hide();\n            } else {\n                $('[name=\"dwfrm_routinefinder_blackheads\"],[name=\"dwfrm_routinefinder_verydryskin\"]').unbind('change');\n                highlight($('[name^=\"dwfrm_routinefinder_\"]').not('[name=\"dwfrm_routinefinder_nosecondconcern\"]'));\n            }\n        };\n\n        $('input[name=\"dwfrm_routinefinder_skintype\"]').on('change', function () {\n            highlight($('input[name^=\"dwfrm_routinefinder_\"]').not('[name=\"dwfrm_routinefinder_nosecondconcern\"]'));\n            var skin = $(this).val();\n            localStorage.setItem('skin', skin);\n            showMeaningfulConcerns();\n        });\n\n        $('[type=checkbox][name^=\"dwfrm_routinefinder_\"]').on('click', function (event) {\n            var selectedConcerns = $('[type=checkbox][name^=\"dwfrm_routinefinder_\"]:checked').not('[name$=\"concern\"]');\n            if (selectedConcerns.length > 2) {\n                setTimeout(function () {\n                    $(this).removeAttr('checked');\n                    $(this).siblings('label').removeClass('active');\n                }, 0);\n                event.preventDefault();\n                event.stopPropagation();\n            }\n            if ($(this).is(':checked') && $('[type=checkbox][name^=\"dwfrm_routinefinder_\"]:checked').length < 3) {\n                $(this).siblings('label').addClass('active');\n            } else {\n                $(this).siblings('label').removeClass('active');\n            }\n            if (util.isMobile()) {\n                if ($(this).is(':checked') && (selectedConcerns.length == 2)) {\n                    $('button[name=dwfrm_routinefinder_findroutine]').trigger('click');\n                }\n            }\n        });\n    }\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/components/routinefinder.js?\n}");
149
150/***/ }),
151
152/***/ "./cartridges/app_paulaschoice/cartridge/js/components/sitegenesisEvents.js":
153/*!**********************************************************************************!*\
154  !*** ./cartridges/app_paulaschoice/cartridge/js/components/sitegenesisEvents.js ***!
155  \**********************************************************************************/
156/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
157
158eval("{const dialog = __webpack_require__(/*! ../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\");\nconst util = __webpack_require__(/*! ../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nconst searchsuggest = __webpack_require__(/*! ../searchsuggest */ \"./cartridges/app_paulaschoice/cartridge/js/searchsuggest.js\");\nconst Promise = __webpack_require__(/*! promise */ \"./node_modules/promise/index.js\");\nconst productaddedpopup = __webpack_require__(/*! ../productaddedpopup */ \"./cartridges/app_paulaschoice/cartridge/js/productaddedpopup.js\");\n\nmodule.exports = function() {\n    var controlKeys = ['8', '13', '46', '45', '36', '35', '38', '37', '40', '39'];\n\n    $('body')\n        .on('keydown', 'textarea[data-character-limit]', function (e) {\n            var text = $.trim($(this).val()),\n                charsLimit = $(this).data('character-limit'),\n                charsUsed = text.length;\n\n            if ((charsUsed >= charsLimit) && (controlKeys.indexOf(e.which.toString()) < 0)) {\n                e.preventDefault();\n            }\n        })\n        .on('change keyup mouseup', 'textarea[data-character-limit]', function () {\n            var text = $.trim($(this).val()),\n                charsLimit = $(this).data('character-limit'),\n                charsUsed = text.length,\n                charsRemain = charsLimit - charsUsed;\n\n            if (charsRemain < 0) {\n                $(this).val(text.slice(0, charsRemain));\n                charsRemain = 0;\n            }\n\n            $(this).next('div.char-count').find('.char-remain-count').html(charsRemain);\n        });\n\n    /**\n     * initialize search suggestions, pending the value of the site preference(enhancedSearchSuggestions)\n     * this will either init the legacy(false) or the beta versions(true) of the the search suggest feature.\n     * */\n    var $searchContainer = $('.header-search');\n    searchsuggest.init($searchContainer, Resources.SIMPLE_SEARCH);\n\n    // add generic toggle functionality\n    $('.toggle').next('.toggle-content').hide();\n    $('.toggle').on('click', function () {\n        $(this).toggleClass('expanded').next('.toggle-content').toggle();\n    });\n\n    // subscribe email box\n    var $subscribeEmail = $('.subscribe-email');\n    if ($subscribeEmail.length > 0) {\n        $subscribeEmail.focus(function () {\n            var val = $(this.val());\n            if (val.length > 0 && val !== Resources.SUBSCRIBE_EMAIL_DEFAULT) {\n                return; // do not animate when contains non-default value\n            }\n\n            $(this).animate({ color: '#999999' }, 500, 'linear', function () {\n                $(this).val('').css('color', '#333333');\n            });\n        }).blur(function () {\n            var val = $.trim($(this.val()));\n            if (val.length > 0) {\n                return; // do not animate when contains value\n            }\n            $(this).val(Resources.SUBSCRIBE_EMAIL_DEFAULT)\n                .css('color', '#999999')\n                .animate({ color: '#333333' }, 500, 'linear');\n        });\n    }\n\n    $('.privacy-policy').on('click', function (e) {\n        e.preventDefault();\n        dialog.open({\n            url: $(e.target).attr('href'),\n            closeText: '',\n            options: {\n                height: 600\n            }\n        });\n    });\n\n    $('.js-back-button').on('click', function (e) {\n        e.preventDefault();\n        var backUrl = $(this).attr('backUrl');\n\n        if (window.location.hash) {\n            var remove_hash = window.location.hash.replace('#', '').split('&');\n            remove_hash = remove_hash.pop('start').toString();\n            backUrl = backUrl.concat(window.location.hash.replace('#', '?'));\n            if (backUrl.indexOf('.html') > -1) {\n                backUrl = backUrl.replace(remove_hash, '');\n            }\n        }\n\n        window.location = backUrl;\n    });\n\n    $('.add-to-cart-and-stay').on('click', function (e) {\n        e.preventDefault();\n        var $btn = jQuery(this);\n        var productId = $btn.data('productid');\n        var recomProdId = $btn.data('recomprodid');\n        var url = util.appendParamToURL(util.appendParamToURL(Urls.addProductViaGET, 'pid', productId), 'format', 'ajax');\n        if (recomProdId) {\n            url = util.appendParamToURL(url, 'recomprodid', recomProdId);\n        }\n        Promise.resolve($.ajax({\n            type: 'GET',\n            url: url\n        })).then(function (response) {\n            // handle error in the response\n            if (response.error) {\n                throw new Error(response.error);\n            } else {\n                productaddedpopup.show(response);\n            }\n        });\n    });
158\n\n    $('.product-carousel').on('click', '.product-tile', function () {\n        localStorage.categoryName = \"Content Page Slider\";\n    });\n\n    $('.product-tiles .js-scroll-to-reviews , .js-product-slide-reviews').on('click', function (e) {\n        e.stopImmediatePropagation();\n    });\n\n    // To trigger a video, use http://www.urltopage.com/page.html#videoid\n    if (window.location.hash && $('.js-video-button').length > 0) {\n        var button = $('.js-video-button[data-video-id=\"' + window.location.hash.substr(1) + '\"]');\n        setTimeout(function () { button.trigger('click'); }, 2000);\n    }\n\n    if (window.location.hash && ($('.page-designer').length > 0 || $('.page-designer-reference').length)) {\n        var y = $(window).scrollTop();  //your current y position on the page\n        $(window).scrollTop(y - 70);\n    }\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/components/sitegenesisEvents.js?\n}");
159
160/***/ }),
161
162/***/ "./cartridges/app_paulaschoice/cartridge/js/components/tileContentAlignment.js":
163/*!*************************************************************************************!*\
164  !*** ./cartridges/app_paulaschoice/cartridge/js/components/tileContentAlignment.js ***!
165  \*************************************************************************************/
166/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
167
168eval("{const util = __webpack_require__(/*! ../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar tileContentAlignment = {\n    alignTileText: function() {\n        if ($('.product-tile > .product-name').length) {\n            if (util.isDesktop()) {\n                util.setEqualHeights($('.product-tile > .product-name'), 4);\n            } else if (util.isTablet()) {\n                util.setEqualHeights($('.product-tile > .product-name'), 3);\n            } else if (util.isMobile()) {\n                util.setEqualHeights($('.product-tile > .product-name'), 2);\n            }\n        }\n\n        if ($('.product-tile .product-skin').length) {\n            if (util.isDesktop()) {\n                util.setEqualHeights($('.product-tile .product-skin'), 4);\n            } else if (util.isTablet()) {\n                util.setEqualHeights($('.product-tile .product-skin'), 3);\n            } else if (util.isMobile()) {\n                util.setEqualHeights($('.product-tile .product-skin'), 2);\n            }\n        }\n    },\n\n    alignSliderText: function() {\n        if ($('.product-slide-content .product-name').length) {\n            util.setEqualHeights($('.product-slide-content .product-name'), $('.product-slide-content .product-name').length);\n        }\n\n        if ($('.product-slide-content .product-skin').length) {\n            util.setEqualHeights($('.product-slide-content .product-skin'), $('.product-slide-content .product-skin').length);\n        }\n    }\n}\n\nmodule.exports = tileContentAlignment;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/components/tileContentAlignment.js?\n}");
169
170/***/ }),
171
172/***/ "./cartridges/app_paulaschoice/cartridge/js/cookieprivacy.js":
173/*!*******************************************************************!*\
174  !*** ./cartridges/app_paulaschoice/cartridge/js/cookieprivacy.js ***!
175  \*******************************************************************/
176/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
177
178"use strict";
179eval("{/* global SitePreferences */\n\n\n/*\n    All 'allow' functions support reading and writing\n\n    There are 3 flavors of scripts that can be blocked and executed with this script:\n    1) script tags with a src attribute\n    For scripts to be blocked on the site, the src will need to become a data-src element.\n    The script tag needs to have a class 'js-<subject>-script'\n\n    2) inline scripts that are loaded before or after cookie is read or accepted\n    Surround the script with:\n     $(window).load(function () {\n         window.cookiebar.executeScript('advertising', // other values: social_networks, other\n          (function () {\n            // code to execute goes here\n          }));\n      });\n\n    3) inline scripts that depend on a blocked script-tag\n    Add code in a function as data-callback attribute to script tag\n    <script class=\"js-advertising-script\" data-src=\"example.com/example.js\" data-callback=\"function() { alert('hello world'); }\"></script>\n\n    The following feature is not created:\n    - inline scripts that are loaded before jQuery and cookiebar (from footer) are loaded\n    This would require adding a function to a variable in the window object to be executed later by the cookiebar.\n    Should be extremely simple to create.\n\n    Not supported:\n    - multiple blocked scripts that need to be executed in a certain sequence\n    Adding this feature would require quite a rewrite to execute all blocked code to be executed in a certain order.\n*/\n\nvar util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nvar consents = {};\nconst analyticalScripts = ['adcell', 'mentionme', 'doubleclick'];\nconst socialScripts = ['facebookconnect'];\nconst otherScripts = ['trustedshop'];\nconst advertisingScripts = [];\n\nconst COOKIE_NAME = 'dw_cookies_accepted';\n\n\n// https://gist.github.com/steveosoule/628430dacde21fd766fe8c4e796dad94\n(function($){\n    $.getScriptCached = function(url,callback){\n        return $.ajax({url:url,dataType:\"script\",cache:true}).done(callback)\n    }\n})(jQuery)\n\nvar cookieprivacy = {\n    init: function () {\n        var $cookieBar = $('.js-cookie-bar');\n        var cookieValue = util.getCookie('dw_cookies_accepted');\n\n        if (SitePreferences.COOKIE_HINT !== true) {\n        \treturn;\n        }\n        \n        if (cookieValue === null) {\n            $cookieBar.addClass('show');\n        } else {\n            readExistingCookie(cookieValue);\n        }\n\n        $cookieBar.find('.js-cookie-accept').on('click', function () {\n            $cookieBar.addClass('consent');\n            cookieprivacy.allowAll(true);\n            dataLayer.push({ 'event': 'cookieconsent_all_cookies' });\n        });\n\n        $cookieBar.find('.js-cookie-reject').on('click', function () {\n            $cookieBar.addClass('consent');\n            cookieprivacy.allowAll(false);\n            dataLayer.push({ 'event': 'cookieconsent_reject_cookies' });\n        });\n\n        $cookieBar.find('.js-cookie-change').on('click', function () {\n            util.deleteCookie(COOKIE_NAME);\n\n            var pageURL = window.location.href;\n            dataLayer.push({ 'eventCategory': getPageCategory(), 'eventAction': 'Cookie Bar - Cookie Settings Clicked', 'eventLabel': pageURL, 'event': 'GA Tracking'});\n\n            window.location.href = Urls.cookieEditPage;\n        });\n    },\n\n    executeScript: function (category, func) {\n        if (cookieprivacy.allowGeneric(category)) {\n            func();\n        }\n        else {\n            // subscribe to \"allowX\" event with func\n            window.addEventListener(\"cookiePermissionChange\", function (e) {\n                if (e.detail.changedCategory == category) {\n                    console.log('Executing stored function');\n                    func();\n                }\n            });\n        }\n    },\n\n    isScriptAllowed: function (key) {\n        key = key.toLower().replace(' ', '');\n\n        if (analyticalScripts.includes(key)) {\n            return cookieprivacy.allowAnalytical();\n        }\n\n        if (socialScripts.includes(key)) {\n            return cookieprivacy.allowSocial();\n        }\n\n        if (otherScripts.includes(key)) {\n            return cookieprivacy.allowOther();\n        }\n\n        if (advertisingScripts.includes(key)) {\n            return cookieprivacy.allowAdvertising();\n        }\n\n        return false;\n    },\n\n    allowSocial: function (value) {\n        return cookieprivacy.allowGeneric('social_networks', value);\n    },\n\n    allowAdvertising: function (value) {\n        return cookieprivacy.allowGeneric('advertising', value);\n    },\n\n    allowAnalytical: function (value) {\n        return cookieprivacy.allowGeneric('analytical', value);\n    },\n\n    allowOther: function (value) {\n        return cookieprivacy.allowGeneric('other', value);\n    },\n\n    allowAll: function (value) {\n        cookieprivacy.allowOther(value);\n        cookieprivacy.allowAnalytical(value);\n        cookieprivacy.allowAdvertising(value);\n        cookieprivacy.allowSocial(value);\n    },\n\n    allowGeneric: function (key, value) {\n        if (typeof value == 'undefined') {\n            return readConsent(key);\n        } else {\n            updateConsents(key, value);\n\n            if (value) {\n                activateScripts(key);\n                fireScriptActivationEvent(key);\n            }\n        }\n    },\n\n    saveCookieSettings: function(pushToDatalayer) {\n\n        var $cookieBar = $('.js-cookie-bar');\n\n        var cookieValue = util.getCookie('dw_cookies_accepted');\n\n        if (!pushToDatalayer && cookieValue == null) {\n            $cookieBar.addClass('show');\n            return;\n        }\n\n        var allowAdvertisingValue = $('#chk-cookiepreference-advertising').prop('checked'); \n        var allowAnalyticalValue = $('#chk-cookiepreference-analytical').prop('checked');\n        var allowSocialNetworksValue = $('#chk-cookiepreference-social_networks').prop('checked');\n        var allowOtherValue = $('#chk-cookiepreference-other').prop('checked'); \n        \n        cookieprivacy.allowAdvertising(allowAdvertisingValue);\n        cookieprivacy.allowAnalytical(allowAnalyticalValue);\n        cookieprivacy.allowSocial(allowSocialNetworksValue);\n        cookieprivacy.allowOther(allowOtherValue);\n\n        $cookieBar.addClass('consent');\n\n        if (allowAdvertisingValue && allowOtherValue && allowSocialNetworksValue && allowAnalyticalValue) {\n            dataLayer.push( {'event': 'cookieconsent_all_cookies'} );\n        } else if (!allowAdvertisingValue && !allowOtherValue && !allowSocialNetworksValue && !allowAnalyticalValue) {\n            dataLayer.push( {'event': 'cookieconsent_reject_cookies'} );\n        } else {\n            if (allowAdvertisingValue) {\n                dataLayer.push( {'event': 'cookieconsent_advertising'} );\n            }\n            if (allowOtherValue) {\n                dataLayer.push( {'event': 'cookieconsent_other_cookies'} );\n            }\n            if (allowSocialNetworksValue) {\n                dataLayer.push( {'event': 'cookieconsent_social_networks'} );\n            }\n            if (allowAnalyticalValue) {\n                dataLayer.push( {'event': 'cookieconsent_analytics'} );\n            }\n        }\n    }\n\n};\n\nmodule.exports = cookieprivacy;\n\nfunction fireScriptActivationEvent(key) {\n    // fire event to execute scripts from early executeScript() calls\n    var event = new CustomEvent(\"cookiePermissionChange\", {\n        detail: {\n            changedCategory: key,\n            time: new Date(),\n        }\n    });\n\n    window.dispatchEvent(event);\n}\n\n\nfunction updateConsents(subject, value) {\n    consents[subject] = value;\n    writeConsentsCookie();\n};\n\nfunction writeConsentsCookie() {\n    var cookieContent = JSON.stringify(consents);
179\n    util.setCookie(COOKIE_NAME, cookieContent, 60 * 24 * 365);\n}\n\nfunction readConsent(subject) {\n    if (!consents.hasOwnProperty(subject)) return false;\n    return consents[subject];\n}\n\nfunction activateScripts(key) {\n    var jsscriptags = $('.js-' + key + '-script');\n    $.each(jsscriptags, function (key, value) {\n        // built with callback for any pieces of code that really rely \n        // on the getscript call to be finished before executing\n        $.getScriptCached($(value).data('src'), $(value).data('callback'));\n    });\n}\n\nfunction readExistingCookie(cookieValue) {\n    if (cookieValue == '1') {\n        dataLayer.push({ 'event': 'cookieconsent_all_cookies' });\n        cookieprivacy.allowAll(true);\n        return;\n    }\n\n    // activate all scripts that are mentioned in the cookie\n    consents = JSON.parse(cookieValue);\n    Object.keys(consents).forEach(function (key) {\n        if (consents[key]) {\n            activateScripts(key);\n        }\n    });\n}\n\n\nfunction getPageCategory() {\n    var dataLayerElement = dataLayer.filter(function(elem){ return elem.hasOwnProperty('pageCategory')});\n    return dataLayerElement[0].pageCategory;\n}\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/cookieprivacy.js?\n}");
180
181/***/ }),
182
183/***/ "./cartridges/app_paulaschoice/cartridge/js/countries.js":
184/*!***************************************************************!*\
185  !*** ./cartridges/app_paulaschoice/cartridge/js/countries.js ***!
186  \***************************************************************/
187/***/ (function(__unused_webpack_module, exports) {
188
189"use strict";
190eval("{\n\nexports.init = function init () {\n    $('.country-selector .current-country').on('click', function () {\n        $('.country-selector .selector').toggleClass('active');\n        $(this).toggleClass('selector-active');\n    });\n    // set currency first before reload\n    $('.country-selector .selector .locale').on('click', function (e) {\n        e.preventDefault();\n        var url = this.href;\n        var currency = this.getAttribute('data-currency');\n        $.ajax({\n            dataType: 'json',\n            url: Urls.setSessionCurrency,\n            data: {\n                format: 'ajax',\n                currencyMnemonic: currency\n            }\n        })\n        .done(function (response) {\n            if (!response.success) {\n                throw new Error('Unable to set currency');\n            }\n            window.location.href = url;\n        });\n    });\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/countries.js?\n}");
191
192/***/ }),
193
194/***/ "./cartridges/app_paulaschoice/cartridge/js/countrydetection.js":
195/*!**********************************************************************!*\
196  !*** ./cartridges/app_paulaschoice/cartridge/js/countrydetection.js ***!
197  \**********************************************************************/
198/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
199
200"use strict";
201eval("{\n\nvar util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar countrydetection = {\n    init: function () {\n        var element = $('.js-country-detector');\n        $(document).on('click', function(event) {\n            if (!$(event.target).closest(\".ui-front\").length) {\n                if(util.isDesktop() && $('.account-popup').css('display') === 'none') {\n                    $(\"body\").find(\".ui-front\").hide();\n                }\n            }\n        });\n\n        var countryDialogEl = document.createElement(\"div\");\n        countryDialogEl.className = \"country-dialog-wrap\";\n\n        $(\"#wrapper\").prepend(countryDialogEl);      // Append the new elements\n\n        var countryDialogEl = document.createElement(\"div\");\n        countryDialogEl.className = \"country-dialog-wrap\";\n\n        $(\"body\").prepend(countryDialogEl);      // Append the new elements\n\n        var countryDialogCustomClass = 'country-detection-dialog';\n        if (window.SessionAttributes.PREFLOCALE == 'it') {\n            countryDialogCustomClass = 'country-detection-dialog--it';\n        }\n\n        var dialog = $(element).dialog({\n            appendTo: '.country-dialog-wrap',\n            dialogClass: countryDialogCustomClass,\n            autoOpen: true,\n            closeText : '',\n            open: function () {\n                $(element).find('.js-redirect').on('click', function () {\n                    setPreferredLocale(window.SessionAttributes.PREFLOCALE);\n                    if (window.SessionAttributes.PREFLOCALE == 'en' && !window.SessionAttributes.ISEU) {\n                        window.location = Urls.international;\n                    } else {\n                        window.location = window.SessionAttributes.REDIRECTURL;\n                    }\n                });\n\n                $('.js-continue-country-detector').on('click', function () {\n                    dialog.dialog('close');\n                });\n\n                $('.ui-widget-overlay').on('click', function (e) {\n                    dialog.dialog('close');\n                });\n            },\n            close: function () {\n                setPreferredLocale($(element).attr('data-currentLocale'));\n                $('.country-dialog-wrap').hide();\n            }\n        });\n    },\n     /**\n   * @function\n   * @description Closes the redirect pop-up\n   */\n    close: function () {\n        $('.country-dialog-wrap').hide();\n    }\n};\n\nfunction setPreferredLocale(locale) {\n\tutil.setCookie('prefferedLocale', locale, 60 * 24 * 365);\n}\n\nmodule.exports = countrydetection;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/countrydetection.js?\n}");
202
203/***/ }),
204
205/***/ "./cartridges/app_paulaschoice/cartridge/js/dialog.js":
206/*!************************************************************!*\
207  !*** ./cartridges/app_paulaschoice/cartridge/js/dialog.js ***!
208  \************************************************************/
209/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
210
211"use strict";
212eval("{\n\nvar ajax = __webpack_require__(/*! ./ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\"),\n    util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n    _ = __webpack_require__(/*! lodash */ \"./node_modules/lodash/lodash.js\");\n\nvar dialog = {\n    /**\n     * @function\n     * @description Appends a dialog to a given container (target)\n     * @param {Object} params  params.target can be an id selector or an jquery object\n     */\n    create: function (params) {\n        var $target, id;\n\n        if (_.isString(params.target)) {\n            if (params.target.charAt(0) === '#') {\n                $target = $(params.target);\n            } else {\n                $target = $('#' + params.target);\n            }\n        } else if (params.target instanceof jQuery) {\n            $target = params.target;\n        } else {\n            $target = $('#dialog-container');\n        }\n\n        // if no element found, create one\n        if ($target.length === 0) {\n            if ($target.selector && $target.selector.charAt(0) === '#') {\n                id = $target.selector.substr(1);\n                $target = $('<div>').attr('id', id).addClass('dialog-content').appendTo('body');\n            }\n        }\n\n        // create the dialog\n        this.$container = $target;\n        this.$container.dialog(_.merge({}, this.settings, params.options || {}));\n    },\n    /**\n     * @function\n     * @description Opens a dialog using the given url (params.url) or html (params.html)\n     * @param {Object} params\n     * @param {Object} params.url should contain the url\n     * @param {String} params.html contains the html of the dialog content\n     */\n    open: function (params) {\n        // close any open dialog\n        this.close();\n        this.create(params);\n        this.replace(params);\n    },\n    /**\n     * @description populate the dialog with html content, then open it\n     **/\n    openWithContent: function (params) {\n        var content, callback;\n\n        if (!this.$container) { return; }\n        content = params.content || params.html;\n        if (!content) { return; }\n        this.$container.empty().html(content);\n        if (!this.$container.dialog('isOpen')) {\n            this.$container.dialog('open');\n        }\n\n        callback = (typeof params.callback === 'function') ? params.callback : function () {};\n        callback();\n    },\n    /**\n     * @description Replace the content of current dialog\n     * @param {object} params\n     * @param {string} params.url - If the url property is provided, an ajax call is performed to get the content to replace\n     * @param {string} params.html - If no url property is provided, use html provided to replace\n     */\n    replace: function (params) {\n        if (!this.$container) {\n            return;\n        }\n        if (params.url) {\n            params.url = util.appendParamToURL(params.url, 'format', 'ajax');\n            ajax.load({\n                url: params.url,\n                data: params.data,\n                callback: function (response) {\n                    params.content = response;\n                    this.openWithContent(params);\n                }.bind(this)\n            });\n        } else if (params.html) {\n            this.openWithContent(params);\n        }\n    },\n    /**\n     * @function\n     * @description Closes the dialog\n     */\n    close: function () {\n        if (!this.$container) {\n            return;\n        }\n        this.$container.dialog('close');\n    },\n    exists: function () {\n        return this.$container && (this.$container.length > 0);\n    },\n    isActive: function () {\n        return this.exists() && (this.$container.children.length > 0);\n    },\n    settings: {\n        autoOpen: false,\n        height: 'auto',\n        modal: true,\n        overlay: {\n            opacity: 0.5,\n            background: 'black'\n        },\n        resizable: false,\n        title: '',\n        width: '800',\n        closeText : '',\n        close: function () {\n            $(this).dialog('close');\n        },\n        position: {\n            my: 'center',\n            at: 'center',\n            of: window,\n            collision: 'flipfit'\n        }\n    }\n};\n\nmodule.exports = dialog;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/dialog.js?\n}");
213
214/***/ }),
215
216/***/ "./cartridges/app_paulaschoice/cartridge/js/emarsys-scarab.js":
217/*!********************************************************************!*\
218  !*** ./cartridges/app_paulaschoice/cartridge/js/emarsys-scarab.js ***!
219  \********************************************************************/
220/***/ (function(__unused_webpack_module, exports) {
221
222"use strict";
223eval("{\n\n// skintype and skinconcer Mappers because we always need to return english version\n// currently this solution is reused from gtm, since there is not easy way to access on client side\nconst skinTypeMap = {\n    'normal': 'normal-skin',\n    'normal skin': 'normal-skin',\n    'normale haut': 'normal-skin',\n    'normale huid': 'normal-skin',\n    'peau normale': 'normal-skin',\n\n    'dry': 'dry-skin',\n    'dry skin': 'dry-skin',\n    'trockene haut': 'dry-skin',\n    'droge huid': 'dry-skin',\n    'peau sèche': 'dry-skin',\n\n    'combination': 'combination-skin',\n    'combination skin': 'combination-skin',\n    'mischhaut': 'combination-skin',\n    'gecombineerde huid': 'combination-skin',\n    'peau mixte': 'combination-skin',\n\n    'oily': 'oily-skin',\n    'oily skin': 'oily-skin',\n    'fettige haut': 'oily-skin',\n    'vette huid': 'oily-skin',\n    'peau grasse': 'oily-skin',\n\n    'all skin types': 'All skin types',\n    'alle huidtypen': 'All skin types',\n    'für alle hauttypen': 'All skin types',\n    'pour tous types de peaux': 'All skin types',\n    'alle hudtyper': 'All skin types',\n    'tutti i tipi di pelle': 'All skin types'\n};\n\nvar skinConcernMap = {\n    'anti-aging': 'anti-aging',\n    'anti-ageing': 'anti-aging',\n    'anti-aging': 'anti-aging',\n    'huidveroudering': 'anti-aging',\n    'anti-âge': 'anti-aging',\n\n    'breakouts': 'breakouts',\n    'unreine haut': 'breakouts',\n    'puistjes': 'breakouts',\n    'imperfections': 'breakouts',\n\n    'sensitive skin': 'sensitive-skin',\n    'empfindliche haut': 'sensitive-skin',\n    'gevoelige huid': 'sensitive-skin',\n    'peau sensible': 'sensitive-skin',\n\n    'very dry skin': 'very-dry-skin',\n    'sehr trockene haut': 'very-dry-skin',\n    'zeer droge huid': 'very-dry-skin',\n    'peau très sèche': 'very-dry-skin',\n\n    'brown spots': 'brown-spots',\n    'pigmentflecken': 'brown-spots',\n    'pigmentvlekken': 'brown-spots',\n    'taches brunes': 'brown-spots',\n\n    'redness': 'redness',\n    'rötungen': 'redness',\n    'roodheid': 'redness',\n    'rougeurs': 'redness',\n    'peau sujette aux rougeurs': 'redness',\n\n    'blackheads': 'blackheads',\n    'mitesser': 'blackheads',\n    'mee-eters': 'blackheads',\n    'points noirs': 'blackheads',\n\n    'dull skin': 'dull-skin',\n    'matter teint': 'dull-skin',\n    'doffe huid': 'dull-skin',\n    'peau terne': 'dull-skin',\n\n    'enlarged pores': 'enlarged-
223pores',\n    'vergrößerte poren': 'enlarged-pores',\n    'grove poriën': 'enlarged-pores',\n    'pores dilatés': 'enlarged-pores',\n\n    'rosacea-prone skin': 'rosacea-prone-skin',\n    'rosazea-empfindlich': 'rosacea-prone-skin',\n    'rosacea-gevoelig': 'rosacea-prone-skin',\n    'peau sujette à rougeurs': 'rosacea-prone-skin',\n\n    'keratosis-pilaris': 'keratosis-pilaris',\n    'keratosis pilaris': 'keratosis-pilaris',\n    'kératose pilaire': 'keratosis-pilaris'\n};\n\nexports.init = function init (page) {\n    window.ScarabQueue = window.ScarabQueue || [];\n\n    $.ajax({\n        type: 'GET',\n        url: Urls.getMerchantId,\n        success: function (data) {\n            if (!data.success) {\n                return\n            }\n            (function(id) {\n                if (document.getElementById(id)) return;\n                var js = document.createElement('script'); js.id = id;\n                js.src = '//cdn.scarabresearch.com/js/'+ data.merchantId +'/scarab-v2.js';\n                var fs = document.getElementsByTagName('script')[0];\n                fs.parentNode.insertBefore(js, fs);\n            })('scarab-js-api');\n\n            sendEmail();\n            sendEventsLister(page);\n            sendEventsPDP(page);\n            sendEventsCart();\n            sendEventsConfirmation(page);\n            sendEventsSearch();\n            window.ScarabQueue.push(['go']);\n        }\n    });\n};\n\nfunction sendEmail() {\n    var personalClusterElement = document.getElementById('js-personalcluster');\n    if (personalClusterElement) {\n        var userEmail = personalClusterElement.getAttribute('data-email');\n        if (userEmail) {\n            ScarabQueue.push(['setEmail', userEmail]);\n        }\n    }\n\n    var thanksEmailElement = document.getElementById('dwfrm_profile_customer_email');\n    if (thanksEmailElement) {\n        var thanksEmail = document.getElementById('dwfrm_profile_customer_email').getAttribute('value');\n        if (window.location.href.indexOf(\"checkout/success\") > -1 || window.location.href.indexOf(\"checkout/thankyou\") > -1) {\n        if (thanksEmail) {\n            ScarabQueue.push( ['setEmail', thanksEmail ] );\n        }\n        }\n    } else {\n        var guestThanksEmailElement = document.querySelector('input[type=\"hidden\"][name=\"dwfrm_profile_customer_email\"]');\n        if (guestThanksEmailElement) {\n            var thanksEmail = guestThanksEmailElement.getAttribute('value');\n            if (window.location.href.indexOf(\"checkout/success\") > -1 || window.location.href.indexOf(\"checkout/thankyou\") > -1) {\n                if (thanksEmail) {\n                    ScarabQueue.push( ['setEmail', thanksEmail ] );\n                }\n            }\n        }\n    }\n}\n\nfunction sendEventsCart() {\n    var cartcontent = JSON.parse(document.querySelectorAll('[data-cartdata]')[0].getAttribute('data-cartdata'));\n    if (!jQuery.isEmptyObject(cartcontent)) {\n\n        // update with converted price\n        Object.keys(cartcontent).forEach(function(key) {\n            cartcontent[key].price = currencyConvertAndTwoDecimals(cartcontent[key].price);\n        });\n\n        var i;\n        for(i = 0; i < cartcontent.length; i++){\n            cartcontent[i].item = cartcontent[i]['sku'];\n            delete cartcontent[i].sku;\n        }\n    }\n\n    if (\"object\" == typeof cartcontent) {\n        ScarabQueue.push( ['cart', cartcontent ] );\n    }\n}\n\nfunction sendEventsPDP(page) {\n    if (page.gtmPageType === \"PDP\") {\n        ScarabQueue.push( ['view', $('.product-variations ul.size li.selected-size a').data('variant').toString() ] );\n        var emarsysSkintype = document.querySelector('.product-detail-list ul li:nth-of-type(3) span:nth-of-type(2)').textContent.trim().split(',');\n            if (emarsysSkintype[1]) {\n            var translatedEmarssSkintype = emarsysSkintypeConverter(emarsysSkintype[0].trim()) + ',' + emarsysSkintypeConverter(emarsysSkintype[1].trim());\n        } else {\n            var translatedEmarssSkintype = emarsysSkintypeConverter( emarsysSkintype[0].trim() );\n        }\n\n        var emarsysSkinConcern = document.querySelector('.product-detail-list ul li:nth-of-type(5) span:nth-of-type(2)').textContent.trim().split(',');\n        var translatedEmarssSkinConcern = '';
223\n        emarsysSkinConcern.forEach(function (item, index) {\n            translatedEmarssSkinConcern += emarsysSkinConcernConverter(emarsysSkinConcern[index].trim()) + ','\n        });\n\n        ScarabQueue.push(['tag', 'content_pageview', {\n            content_url: location.protocol + '//' + location.host + location.pathname,\n            content_category: $('.product-detail-categorypdp').attr('data-categorypdp').trim(),\n            content_skintype: translatedEmarssSkintype,\n            content_concerns: translatedEmarssSkinConcern,\n        }]);\n    }\n}\n\nfunction sendEventsLister(page) {\n    if (page.gtmPageType === \"Listerpage\") {\n        if (window.dataLayer && window.dataLayer[0] && window.dataLayer[0].pageSubCategory) {\n            ScarabQueue.push( ['category', window.dataLayer[0].pageSubCategory ] );\n        }\n    }\n}\n\nfunction sendEventsConfirmation(page) {\n    if (page.ns === \"orderconfirmation\") {\n        if (window.dataLayer[1] && window.dataLayer[1].ecommerce && window.dataLayer[1].ecommerce.purchase) {\n            var ecom_purchase = window.dataLayer[1].ecommerce.purchase;\n            var emarsys_purchase_command = {\n                \"orderId\": ecom_purchase.actionField.id,\n                \"items\": []\n            }\n\n            var emarsysTotalTax = $('.js-totaltax').attr('data-totaltax');\n            var emarsysOrderTotal = $('.js-ordertotal').attr('data-ordertotal');\n\n            for (var i=0; i<ecom_purchase.products.length; i++) {\n\n                // check if card with purchase is present and don't send it\n                if (ecom_purchase.products[ i ].id.indexOf(\"VAS\") == 0 ) {\n                } else if (ecom_purchase.products[ i ].id.indexOf(\"CRD\") == 0 ) {\n                } else if (ecom_purchase.products[ i ].id.indexOf(\"bundleclearreg3trial\") == 0 ) {\n                } else{\n                emarsys_purchase_command.items.push({\n                    \"item\": ecom_purchase.products[i].id,\n                    \"quantity\": ecom_purchase.products[i].quantity,\n                    \"price\": currencyConvertAndTwoDecimals( (emarsysTotalTax / emarsysOrderTotal + 1) * ecom_purchase.products[ i ].price, 1),\n                });\n                }\n            }\n\n            ScarabQueue.push( ['purchase', emarsys_purchase_command ] );\n        }\n    }\n}\n\nfunction sendEventsSearch() {\n    if (window.location.href.indexOf(\"/search?q\") > -1) {\n        if (window.dataLayer && window.dataLayer[0] && window.dataLayer[0].pageSubCategory) {\n            ScarabQueue.push( ['searchTerm', window.dataLayer[0].pageSubCategory ] );\n        }\n    }\n}\n\nfunction emarsysSkintypeConverter(skintype) {\n    if (!skintype) return 'Error';\n\n    var key = skintype.toLowerCase().replace(/^\\s+|\\s+$/g, '');\n    var result = skinTypeMap[key];\n\n    if (!result) {\n        return 'Error';\n    }\n\n    return result;\n}\n\nfunction emarsysSkinConcernConverter(skinConcern) {\n    if (!skinConcern) return 'Error';\n\n    var key = skinConcern.toLowerCase().replace(/^\\s+|\\s+$/g, '');\n    var result = skinConcernMap[key];\n\n    if (!result) {\n        return 'Error';\n    }\n\n    return result;\n}\n\nfunction currencyConvertAndTwoDecimals(price){\n    return Number( (Math.round( Number( price ) * 1 * 100) / 100).toFixed(2));\n}\n\n\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/emarsys-scarab.js?\n}");
224
225/***/ }),
226
227/***/ "./cartridges/app_paulaschoice/cartridge/js/expertadvice.js":
228/*!******************************************************************!*\
229  !*** ./cartridges/app_paulaschoice/cartridge/js/expertadvice.js ***!
230  \******************************************************************/
231/***/ (function(__unused_webpack_module, exports) {
232
233"use strict";
234eval("{\n\nexports.init = function init () {\n    $('.js-expertadvicesummary-arrow').on('click', function() {\n        var summaryContent = $('.js-column-banner-summary');\n        var summaryArrow = $('.js-summary-arrow');\n        var summaryTitle = $('.js-column-banner-title');\n        var summaryContents = summaryTitle.next();\n\n        summaryContent.toggleClass('active');\n\n        if(summaryArrow.hasClass('fa-chevron-right')) {\n            summaryArrow.removeClass('fa-chevron-right');\n            summaryArrow.addClass('fa-close');\n        } else if(summaryArrow.hasClass('fa-close')) {\n            summaryArrow.removeClass('fa-close');\n            summaryArrow.addClass('fa-chevron-right');\n        }\n\n        summaryTitle.each(function() {\n            $(this).on('click', function() {\n                if(!$(this).next().hasClass('active')) {\n                    summaryContents.removeClass('active');\n                    $(this).next().addClass('active');\n                } else {\n                    $(this).next().removeClass('active');\n                }\n            });\n        });\n    });\n\n    var multiImageTextContainer = $('.js-multi-column-container-banner');\n    var multiImageComponent =  $('.js-column-image-multi');\n    var imageTextChildren = multiImageTextContainer.children().length;\n\n    if($(window).width() >= 768) {\n        if(imageTextChildren <= 2) {\n            multiImageComponent.css('height', 'initial');\n        } else {\n            multiImageComponent.css('height', '225px');\n        }\n    }\n\n    var $expertAdviceMain = $('.js-expert-advice-main');\n    var $expertAdviceFooter = $('.experience-assets-expertadvicefooter');\n\n    $expertAdviceMain.append($expertAdviceFooter);\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/expertadvice.js?\n}");
235
236/***/ }),
237
238/***/ "./cartridges/app_paulaschoice/cartridge/js/fitsmyskin.js":
239/*!****************************************************************!*\
240  !*** ./cartridges/app_paulaschoice/cartridge/js/fitsmyskin.js ***!
241  \****************************************************************/
242/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
243
244"use strict";
245eval("{\n\nvar progress = __webpack_require__(/*! ./progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\");\nvar util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar fitsmyskin = {\n    init: function () {\n\n        if ($('.pdp-section').length === 0) return;\n\n        var skinType;\n\n        retakeTest();\n\n        scrollToTestSkin();\n\n        $('input[name=\"dwfrm_routinefinder_skintype\"]').on('click', function () {\n            $('.routine-step-2').removeClass('hide-step').addClass('show-step');\n            $('.routine-step-1').removeClass('show-step').addClass('hide-step');\n\n            var url = $('.js-pdp-routine-finder-wrap').data('url');\n\n            skinType = $(this).val();\n            if ($('.routine-step-2').length === 0) {\n                url += `&skintype=${skinType}`;\n                renderResults(url);\n                if (!util.isMobile()) return;\n                scrollTo();\n            }\n        });\n\n        $('[type=checkbox][name^=\"dwfrm_routinefinder_\"]').on('click', function (event) {\n            $('.routine-step-2').removeClass('show-step').addClass('hide-step');\n\n            var pdpSelectedConcerns = $('.pdp-section [type=checkbox][name^=\"dwfrm_routinefinder_\"]:checked').not('[name$=\"concern\"]');\n            if (pdpSelectedConcerns.length > 1) {\n                setTimeout(function () {\n                    $(this).removeAttr('checked');\n                    $(this).siblings('label').removeClass('active');\n                }, 0);\n                event.preventDefault();\n                event.stopPropagation();\n            }\n            var url = $('.js-pdp-routine-finder-wrap').data('url');\n            var concern = event.target.id.split(\"_\")[2];\n            url += `&skintype=${skinType}&concern=${concern}`;\n            renderResults(url);\n            if (!util.isMobile()) return;\n            scrollTo();\n        });\n    }\n};\n\nfunction renderResults(url) {\n    progress.show($('.js-pdp-routine-finder-wrap'));\n    setTimeout(() => {\n        $.ajax({\n            type: 'GET',\n            url: url,\n            success: function (data) {\
245n                $('.js-pdp-fits-my-skin-wrapper').remove();\n                $('.js-pdp-routine-finder-wrap').append(data);\n                $('.js-fitsmyskin').append(data);\n                $('.js-skin__labels__title').hide();\n                progress.hide();\n                retakeTest();\n                if ($('.js-take-test-again-top').length && $(data).find('.js-take-test-again')) { // update top take the test button\n                    $('.js-take-test-again-top').text($(data).find('.js-take-test-again').text());\n                    $('.fits-my-skin-result__default').addClass('fits-my-skin-result__default--test-taken');\n                }\n            }\n        });\n    }, 2000);\n}\n\nfunction retakeTest() {\n    $('.product-detail-list .js-take-test-again').on('click', scrollTo);\n    $('.js-take-test-again').on('click', function () {\n        $('.js-pdp-fits-my-skin-wrapper').remove();\n        $('.routine-step-1').removeClass('hide-step').addClass('show-step');\n        $('.routine-step-2').removeClass('show-step').addClass('hide-step');\n        $('.field-wrapper label').css('opacity', 1).removeClass('selected');\n        $('.js-skin__labels__title').show();\n    });\n}\n\nfunction scrollToTestSkin() {\n    if (!$('.js-fits-my-skin').length) return;\n    const targetOffset = $('.js-fits-my-skin').parent().offset().top - 130;\n    const buttonTestAgain = $('.fits-my-skin-result__default .js-take-test-again-top');\n        buttonTestAgain.on('click', function (e) {\n            $('html,body').animate({ scrollTop: targetOffset},'slow');\n            e.preventDefault;\n    });\n}\n\nfunction scrollTo() {\n    const topOffset = $('.top-banner').outerHeight() * 2;\n    const targetOffset = $('#js-accordeon-fits-my-skin').offset().top;\n    var targetPos = targetOffset - topOffset;\n    $('#js-accordeon-fits-my-skin .js-accordeon-body').css({ display: \"block\" });\n    util.scrollBrowser(targetPos);\n}\nmodule.exports = fitsmyskin;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/fitsmyskin.js?\n}");
246
247/***/ }),
248
249/***/ "./cartridges/app_paulaschoice/cartridge/js/footer.js":
250/*!************************************************************!*\
251  !*** ./cartridges/app_paulaschoice/cartridge/js/footer.js ***!
252  \************************************************************/
253/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
254
255eval("{var util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar footer =  {\n    init: function(){\n        var footerElement = $('#wrapper>footer');\n        var targetElement = $('body');\n        var classToToggle = 'footer-fixed';\n\n        $('.footer-item-toggle').on('click', function(){\n           $(this).parent().toggleClass('active');\n        });\n\n        if(footerElement.length){\n        \t$(document).on('scroll resize load', function () {\n                targetElement.toggleClass(classToToggle, util.jQueryElementInViewport(footerElement));\n\t        });\n        }\n\n        $('.js-language-selector').on('change', function(){\n            window.location = $('.js-language-selector option:selected').attr('data-redirect-url');\n        });\n    }\n};\n\nmodule.exports = footer;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/footer.js?\n}");
256
257/***/ }),
258
259/***/ "./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js":
260/*!*****************************************************************!*\
261  !*** ./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js ***!
262  \*****************************************************************/
263/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
264
265"use strict";
266eval("{\nvar dataLayer = window.dataLayer || [];\nvar\tbrand,\n\tcartObj,\n\tproductName,\n\tproductId,\n\tprice,\n\tdiscount,\n\tpromotionID,\n\tpromotionName,\n\tcategory,\n\tcollection,\n\tingredient,\n\tvariant,\n\tposition,\n\tquantity,\n\tdiscountBackend,\n\tdiscountPercentageBackend;\n\n\nvar util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar gtmtracking = {\n\tinit : function() {\n\n\t\ttry {\n\t\t\tthis.observationBind(0);\n\n\t\t\tif($('.js-successconfirmation').length === 0) {\n\t\t\t\tvar userId = $('.js-loggedin').data('userid');\n\t\t\t\tif(userId) {\n\t\t\t\t\tdataLayer.push({\n\t\t\t\t\t\t'userid':userId,\n\t\t\t\t\t\t'event' : 'authentication'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbrand = 'Paula\\'s Choice';\n\t\t\tif($('.product-tile').length || $('.product-container').length) {\n\t\t\t\tproduct.init();\n\t\t\t}\n\t\t\tcart.init();\n\t\t\tcheckout.init();\n\t\t\tpromotion.init();\n\t\t\tif($('.footer-socialicons').length > 0) {\n\t\t\t\tsocialMedia.init();\n\t\t\t}\n\n\t\t\tif($('#js-cart-table').length > 0){\n\t\t\t\t$('.js-submit-cart').on('click', function(){\n\t\t\t\t\tcheckout.checkoutProducts($('.cart-row'));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( $('.js-product-slider').length > 0 ) {\n\t\t\t\tif (pageContext.ns !== 'Homepage' && pageContext.ns !== 'product') {\n\t\t\t\t\tproduct.sliderProductImpressions();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $('.content-page-product-tile').length > 0 ) {\n\t\t\t\tproduct.productImpressionsAll();\n\t\t\t}\n\n\t\t\tthis.highlightedProductImpressions();\n\n\t\t} catch (err) {\n\t\t\tif (typeof console !== \"undefined\") {\n\t\t\t\tconsole.log('Error in tracking script: ' + err.message + ', ' + err.stack);\n\t\t\t}\n\t\t}\n\t},\n\n\thighlightedProductImpressions : function(){\n\t\tif (typeof gtmObj === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tvar highlights = $('.js-highlight-block').find('.js-highlight-products');\n\t\tfor (var i = 0; i < highlights.size(); i++){\n\t\t\tgtmObj.ecommerce.impressions.push(JSON.parse(highlights[i].dataset.json));\n\t\t}\n\n\t\tdataLayer.push(gtmObj);\n\t},\n\n\tnewsletterSubscription : function(eventAction, eventCategory) {\n\t\tdataLayer.push({\n\t\t\t'event':'GA Tracking',\n\t\t\t'eventAction' : eventAction,\n\t\t\t'eventCategory' : eventCategory,\n\t\t\t'eventValue ': 0,\n\t\t\t'eventNonInteraction': false\n\t\t});\n\t},\n\n\t//Updates product impressions when pagination is used\n\tincrementProductImpressions : function() {\n\t\tcart.init();\n\t\tvar impressions = [];\n\t\tvar productTiles = $('.search-result-tiles-wrap').find('.product-tile');\n\t\tvar isPriceLowToHigh = $('.js-filter-box option:selected').data('sorting') == 'price-low-to-high';\n\t\tvar isPriceHighToLow = $('.js-filter-box option:selected').data('sorting') == 'price-high-to-low';\n\t\timpressions = product.catpageproducts(productTiles);\n\n\t\tif (isPriceLowToHigh && impressions){\n\t\t\timpressions = impressions.sort(function(a, b) {\n\t\t\t\treturn a.price - b.price;\n\t\t\t});\n\n\t\t\tfor (var i = 0; i < impressions.length; i++){\n\t\t\t\timpressions[i].position = (i+1).toString();\n\t\t\t}\n\t\t}\n\n\t\tif (isPriceHighToLow && impressions){\n\t\t\timpressions = impressions.sort(function(a, b) {\n\t\t\t\treturn b.price - a.price;\n\t\t\t});\n\n\t\t\tfor (var i = 0; i < impressions.length; i++){\n\t\t\t\timpressions[i].position = (i+1).toString();\n\t\t\t}\n\t\t}\n\n\t\tdataLayer.push({\n\t\t\t'event': 'productImpressionAll',\n\t\t\t'ecommerce': {\n\t\t\t\t'currencyCode': window.SitePreferences.CURRENCY_CODE,\n\t\t\t\t'impressions': [impressions]\n\t\t\t}\n\t\t});\n\t},\n\n\t//Updates promotion impressions when pagination is used\n\tincrementPromotionImpressions : function() {\
266n\t\tvar productTiles = $('.search-result-items .js-grid-tile:visible').find('.product-tile');\n\t\tcartObj = dataLayer.filter(function (obj) {\n\t\t\treturn obj.event== \"productImpressionAll\";\n\t\t});\n\t\tif(cartObj.length>0){\n\t\t\tproductTiles.each(function(){\n\t\t\t\tcart.getProductInfo($(this).find('.gtm-details'));\n\t\t\t\tif(promotionID!==null || promotionName!==null){\n\t\t\t\t\tcartObj[0].ecommerce.promoview.promotions.push({\n\t\t\t\t\t\t'id': promotionID,\n\t\t\t\t\t\t'name': promotionName,\n\t\t\t\t\t\t'creative': '',\n\t\t\t\t\t\t'position': 'ProductImpression'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tproductInit : function(){\n\t\tproduct.init();\n\t},\n\n\t// variant change in product detail page\n\tproductDetail: function(){\n\t\tcart.getProductInfo($('.js-product-content').find('.gtm-details'));\n\t\tdataLayer.push({\n\t\t\t'event': 'detail',\n\t\t\t'ecommerce': {\n\t\t\t\t'currencyCode': window.SitePreferences.CURRENCY_CODE,\n\t\t\t\t'detail': {\n\t\t\t\t\t'actionField': {'list': localStorage.categoryName},\n\t\t\t\t\t'products': [{\n\t\t\t\t\t\t'name': productName,\n\t\t\t\t\t\t'id':  productId,\n\t\t\t\t\t\t'price' : price,\n\t\t\t\t\t\t'discount_amount': discountBackend ? discountBackend.toString() : '',\n\t\t\t\t\t\t'discount_percentage': discountPercentageBackend ? discountPercentageBackend.toString() : '',\n\t\t\t\t\t\t'brand' : brand,\n\t\t\t\t\t\t'category' : category,\n\t\t\t\t\t\t'collection' : collection,\n\t\t\t\t\t\t'ingredient' : ingredient,\n\t\t\t\t\t\t'variant' : variant\n\t\t\t\t\t}]\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tobservationBind: function(timeout) {\n\n\t\tsetTimeout(function () {\n\t\t\tproduct.intersectionObserverAndProductImpressionInit();\n        }, timeout);\n\n\t},\n\n\tgetProductInfoAJAX: function(productid, isFromChat) {\n\t\tif (productid != null){\n\t\t\t$.ajax({\n\t\t\t\turl: Urls.getProductInfo + '?pid=' + productid\n\t\t\t})\n\t\t\t.done(function (response) {\n\t\t\t\tif (isFromChat) {\n\t\t\t\t\tcart.addToCartFromChat(response)\n\t\t\t\t} else {\n\t\t\t\t\tthis.createGTMDetailsHTML(response)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t},\n\n\tcreateGTMDetailsHTML: function(response) {\n\t\tvar element = $($.parseHTML('<div class=\"gtm-details\">'+\n\t\t\t'<input type=\"hidden\" class=\"product-detail-id\" data-id=\"'+response.id+'\">'+\n\t\t\t'<input type=\"hidden\" class=\"product-detail-name\" data-name=\"'+response.name+'\">'+\n\t\t\t'<input type=\"hidden\" class=\"product-detail-price\" data-price=\"'+response.price+'\">'+\n\t\t\t'<input type=\"hidden\" class=\"product-detail-discount-price\" data-price=\"'+response.discount+'\">'+\n\t\t\t'<input type=\"hidden\" class=\"product-detail-category\" data-category=\"'+response.category+'\">'+\n\t\t\t'<input type=\"hidden\" class=\"product-detail-collection\" data-collection=\"'+response.collection+'\">'+\n\t\t\t'<input type=\"hidden\" class=\"product-detail-ingredient\" data-ingredient=\"'+response.ingredient+'\">'+\n\t\t\t'<input type=\"hidden\" class=\"product-detail-variant\" data-variant=\"'+response.variant+'\">'+\n\t\t\t'<input type=\"hidden\" class=\"product-detail-quantity\" data-quantity=\"'+response.quantity+'\">'));\n\t\tcart.addToCart(element);\n\t}\n};\n\nvar product = {\n\tinit : function() {\n\t\tproduct.bindEvents();\n\t},\n\n\tbindEvents : function() {\n\t\tif($('.product-tile').length){\n\t\t\t$('.product-tile').on('click', function(e){\n\t\t\t\tvar addToCartClick = $(e.target).hasClass('add-to-cart-link') || $(e.target).parent().hasClass('add-to-cart-link') || $(e.target).hasClass('js-add-to-cart');\n\t\t\t\tvar notifyMeClick = $(e.target).hasClass('js-toggle-notify-me') || $(e.target).parent().hasClass('js-toggle-notify-me');\n\t\t\t\tvar preOrderClick = $(e.target).hasClass('js-toggle-pre-order') || $(e.target).parent().hasClass('js-toggle-pre-order');\n\t\t\t\tvar wishlistClick = $(e.target).hasClass('js-wishlist') || $(e.target).parent().hasClass('js-wishlist');\n\t\t\t\tvar preventRedirect = notifyMeClick || preOrderClick || wishlistClick;\n\n                var isProductName = $(e.target).hasClass('name-link') || $(e.target).parent().hasClass('product-name');\n                var isProductImage = $(e.target).hasClass('thumb-link') || $(e.target).parent().hasClass('thumb-link');\n\n                var isNameOrImageClick = isProductName || isProductImage;\n                var isInteractionClick = addToCartClick || preventRedirect;\n\n                if (!isNameOrImageClick && !isInteractionClick) {\
266n                    return; // Prevent further action if it's not a valid click\n                }\n\n\t\t\t\tif (addToCartClick) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t    } else {\n\t\t\t    \tproduct.productClicks($(this).find('.gtm-details'), preventRedirect);\n\t\t\t    }\n\t\t\t});\n\n\t\t\tvar skinType = $('.skinType option:selected').index() > 0 ? $('.skinType option:selected').text().trim() : 'undefined';\n\t\t\tvar skinConcern = $('.concern option:selected').index() > 0 ? $('.concern option:selected').text().trim() : 'undefined';\n\t\t\tvar loggedIn = $('.js-loggedin').data('loggedin');\n\t\t\tproduct.customDimesions(skinType, skinConcern, loggedIn);\n\t\t}\n\t\tif($('#wrapper').hasClass('pt_product-details')) {\n\t\t\tvar p = $('.js-product-detail').find('.gtm-details');\n\t\t\t$('#wrapper').on('click','.product-review,.reviews-tab',function(){\n\t\t\t\tproduct.productInteractions(p, null, 'Review');\n\t\t\t});\n\t\t\t$('#wrapper').on('click','.js-gtm-reviews',function(){\n\t\t\t\tproduct.productInteractions(p, 'Write a Review', 'Review Overlay');\n\t\t\t});\n\t\t\t$('#wrapper').on('click','.send-button',function(){\n\t\t\t\tproduct.productInteractions(p, 'Submit Review', 'Review Overlay');\n\t\t\t});\n\t\t\t$('#wrapper').on('click','.js-product-ingredients-tab',function(){\n\t\t\t\tproduct.productInteractions(p, null, 'Ingredients');\n\t\t\t});\n\t\t\t$('#wrapper').on('click','.js-expert-advice-tab',function(){\n\t\t\t\tproduct.productInteractions(p, null, 'Expert Advice');\n\t\t\t});\n\t\t\t$('#wrapper').on('click','.js-faq',function(){\n\t\t\t\tproduct.productInteractions(p, null, 'FAQ');\n\t\t\t});\n\t\t}\n\t},\n\n\tintersectionObserverAndProductImpressionInit: function() {\n\t\tif(window.SitePreferences.REAL_TIME_PRODUCT_IMPRESSION_ENABLED) {\n\t\t\tvar options = {\n\t\t\t\troot: null,\n\t\t\t\trootMargin: '0px',\n\t\t\t\tthreshold: 0.95\n\t\t\t}\n\t\t\tvar callBackObserver = function(productImpressionFunction, entries) {\n\n\t\t\t\tentries.forEach(entry => {\n\t\t\t\t\tif (entry.isIntersecting || entry.intersectionRatio > 0.95) {\n\t\t\t\t\t\tvar elem = entry.target;\n\t\t\t\t\t\tproductImpressionFunction(elem);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar intersectionObserver = new IntersectionObserver(callBackObserver.bind(this,this.productImpression), options);\n\n\t\t\tvar targetsPLP = document.querySelectorAll(\".search-result-tiles-wrap .product-tile div.product-image img\");\n\t\t\tvar targetsHighlighted = document.querySelectorAll(\".js-highlight-slider div.product-image img\");\n\t\t\tvar targetsContent = document.querySelectorAll(\".content-page-product-tile img\");\n\t\t\tvar targetsSlider = document.querySelectorAll(\".js-product-slider div.product-image img\");\n\t\t\tvar targetHomepageSlider = document.querySelectorAll(\".js-homepage-products-slider div.product-image img\");\n\t\t\t//PLP products observer\n\t\t\tfor (var i = 0; i < targetsPLP.length; i++) {\n\t\t\t\tintersectionObserver.observe(targetsPLP[i]);\n\t\t\t}\n\n\t\t\t//Highligted Products observer\n\t\t\tfor (var i = 0; i < targetsHighlighted.length; i++) {\n\t\t\t\tintersectionObserver.observe(targetsHighlighted[i]);\n\t\t\t}\n\n\t\t\t//content page product impressions observer\n\t\t\tfor (var i = 0; i < targetsContent.length; i++) {\n\t\t\t\tintersectionObserver.observe(targetsContent[i]);\n\t\t\t}\n\n\t\t\t//slider product impressions observer\n\t\t\tfor (var i = 0; i < targetsSlider.length; i++) {\n\t\t\t\tintersectionObserver.observe(targetsSlider[i]);\n\t\t\t}\n\t\t\t//home page slider product impressions observer\n\t\t\tfor (var i = 0; i < targetHomepageSlider.length; i++) {\n\t\t\t\tintersectionObserver.observe(targetHomepageSlider[i]);\n\t\t\t}\n\t\t}\n\n\t},\n\n\tproductImpression: function (elem) {\n\t\tvar productList = localStorage.categoryName != 'null' ? localStorage.categoryName : 'All Products';\n\n\t\tvar gtmDetails = $(elem).closest('.product-tile').find('.gtm-details');\n\t\tif (gtmDetails.length  == 0) {\n\t\t\tgtmDetails = $(elem).closest('.content-page-product-tile').find('.gtm-details');\n\t\t\tproductList = \"Content Page Product\";\n\t\t}\n\n\t\tif ( ($(elem).parents('.js-homepage-products-slider').length > 0 || $(elem).parents('.js-product-slider').length) && document.querySelectorAll(\".search-result-tiles-wrap\").length == 0) {\n\t\t\tproductList  = 'Product Slider';\n\t\t\tif ( $('.homepage-layout').length > 0 ) {\n\t\t\t\tproductList = 'Home Page Slider';\n\t\t\t} else if ( $('#wrapper').hasClass('pt_content') ) {\n\t\t\t\tproductList = 'Content Page Slider';\n\t\t\t}\n\t\t}\n\n\n\t\tcart.getProductInfo(gtmDetails);\n\t\tvar impressionObject = {\n\t\t\t'brand': brand,\n\t\t\t'category': category,\n\t\t\t'collection': collection,\n\t\t\t'discount_amount': discountBackend ? discountBackend.toString() : '',\n\t\t\t'discount_percentage': discountPercentageBackend ? discountPercentageBackend.toString() : '',\n\t\t\t'id': productId,\n\t\t\t'ingredient': ingredient,\n\t\t\t'list': productList,\n\t\t\t'name': productName,\n\t\t\t'position': position,\n\t\t\t'price': price,\n\t\t\t'variant': variant\n\t\t};\n\n\t\tif(!$(elem).hasClass('impressionpushed')) {\n\t\t\tdataLayer.push({\n\t\t\t\t'event': 'productImpression',\n\t\t\t\t'ecommerce': {\n\t\t\t\t\t'currencyCode': window.SitePreferences.CURRENCY_CODE,\n\t\t\t\t\t'impressions': [impressionObject]\n\t\t\t\t}\n\t\t\t});\n\t\t\t$(elem).addClass('impressionpushed');\n\t\t}\n\n\t}
266,\n\n\t//Tracks the product information on lister pages.\n\tproductImpressionsAll : function() {\n\t\tvar impressions = [];\n\t\tvar productList = \"\";\n\n\t\tvar productTiles = $('.search-result-items .js-grid-tile:visible').find('.product-tile');\n\t\tif(productTiles.length===0){\n\t\t\tproductTiles = $('.content-page-product-tile');\n\t\t\tproductList = \"Content Page Product\";\n\t\t}\n\n\t\tif(productTiles.length){\n\t\t\timpressions = product.catpageproducts(productTiles, productList);\n\n\t\t\tif(impressions.length > 0){\n\t\t\t\tdataLayer.push({\n\t\t\t\t\t'event': 'productImpressionAll',\n\t\t\t\t\t'ecommerce': {\n\t\t\t\t\t\t'currencyCode': window.SitePreferences.CURRENCY_CODE,\n\t\t\t\t\t\t'impressions': impressions\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\n\t//Tracks the product information on sliders.\n\tsliderProductImpressions : function() {\n\t\tvar impressions = [];\n\t\tvar promotions = [];\n\t\tvar productTiles = $('.js-product-slider').find('.product-tile');\n\t\tif(productTiles.length){\n\t\t\timpressions = product.sliderproducts(productTiles);\n\t\t\tpromotions = product.sliderpromotions(productTiles);\n\t\t\tif(impressions.length > 0){\n\t\t\t\tif(promotions.length>0){\n\t\t\t\t\tdataLayer.push({\n\t\t\t\t\t\t'event': 'productImpressionAll',\n\t\t\t\t\t\t'ecommerce': {\n\t\t\t\t\t\t\t'currencyCode': window.SitePreferences.CURRENCY_CODE,\n\t\t\t\t\t\t\t'impressions': impressions,\n\t\t\t\t\t\t\t'promoView': {'promotions':promotions}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}else{\n\t\t\t\t\tdataLayer.push({\n\t\t\t\t\t\t'event': 'productImpressionAll',\n\t\t\t\t\t\t'ecommerce': {\n\t\t\t\t\t\t\t'currencyCode': window.SitePreferences.CURRENCY_CODE,\n\t\t\t\t\t\t\t'impressions': impressions\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t//Tracks the lister page filters based on skin type and skin concern. Also tracks if the client is logged in or not.\n\tcustomDimesions : function(skintype, skinconcern, loggedin) {\n\t\tcartObj = dataLayer.filter(function (obj) {\n\t\t\treturn obj.skinType==skintype && obj.skinConcern==skinconcern && obj.loggedIn==loggedin;\n\t\t});\n\t\tif(cartObj.length === 0){\n\t\t\tdataLayer.push({\n\t\t\t\t'skinType': skintype,\n\t\t\t\t'skinConcern': skinconcern,\n\t\t\t\t'loggedIn': loggedin\n\t\t\t});\n\t\t}\n\t},\n\n\tcatpageproducts : function(productTiles, productList) {\n\t\tvar pList = [];\n\t\tvar list = \"\";\n\t\tif(productList != \"\") {\n\t\t\tlist = productList;\n\t\t} else {\n\t\t\tlist = localStorage.categoryName != 'null' ? localStorage.categoryName : 'All Products';\n\t\t}\n\n\t\tproductTiles.each(function(index){\n\t\t\tcart.getProductInfo($(this).find('.gtm-details'));\n\t\t\tpList.push({\n\t\t\t\t'name': productName,\n\t\t\t\t'id': productId,\n\t\t\t\t'price': price,\n\t\t\t\t'discount_amount': discount ? discount.toString() : '',\n\t\t\t\t'discount_percentage': Math.round((discount/(discount+price))*100)/100 ? (Math.round((discount/(discount+price))*100)/100).toString() : '',\n\t\t\t\t'brand': brand,\n\t\t\t\t'category': category,\n\t\t\t\t'variant': variant,\n\t\t\t\t'list': list,\n\t\t\t\t'position': position\n\t\t\t});\n\t\t});\n\n\t\treturn pList;\n\t},\n\n\tsliderproducts : function(productTiles) {\n\t\tvar pList = [];\n\t\tvar listName = 'Product Slider';\n\t\tif ( $('#wrapper').hasClass('pt_storefront') ) {\n\t\t\tlistName = 'Home Page Slider';\n\t\t} else if ( $('#wrapper').hasClass('pt_content') ) {\n\t\t\tlistName = 'Content Page Slider';\n\t\t}\n\t\tproductTiles.each(function(index){\n\t\t\tcart.getProductInfo($(this).find('.gtm-details'));\n\t\t\tpList.push({\n\t\t\t\t'name': productName,\n\t\t\t\t'id': productId,\n\t\t\t\t'price': price,\n\t\t\t\t'discount_amount': discount ? discount.toString() : '',\n\t\t\t\t'discount_percentage': Math.round((discount/(discount+price))*100)/100 ? (Math.round((discount/(discount+price))*100)/100).toString() : '',\n\t\t\t\t'brand': brand,\n\t\t\t\t'category': category,\n\t\t\t\t'collection': collection,\n\t\t\t\t'ingredient': ingredient,\n\t\t\t\t'variant': variant,\n\t\t\t\t'list': listName,\n\t\t\t\t'position': (index+1)\n\t\t\t});\n\t\t});\n\n\t\treturn pList;\n\t},\n\n\tsliderpromotions : function(productTiles) {\n\t\tvar promotions = [];\n\t\tproductTiles.each(function(){\n\t\t\tcart.getProductInfo($(this).find('.gtm-details'));\n\t\t\tif(promotionID!==null || promotionName!==null){\n\t\t\t\tpromotions.push({\n\t\t\t\t\t'id': promotionID,\n\t\t\t\t\t'name': promotionName,\n\t\t\t\t\t'creative': '',\n\t\t\t\t\t'position': 'ProductImpression'\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn promotions;\n\t},\n\n\t//Tracks every product clicks on lister pages and suggestion etc.\n\tproductClicks : function(element, preventRedirect) {\n\t\tcart.getProductInfo($(element));\n\t\tvar tiles = $(element).closest('.product-tiles').find('.product-tile');\n\t\tvar tile = $(element).closest('li').find('.product-tile');\n\t\tvar position = tiles.index(tile) + 1;\n\t\tcartObj = dataLayer.filter(function (obj) {\n\t\t\treturn obj.event==\"productClick\";\n\t\t});\n\n\t\tvar object = {\n\t\t\t'event' : 'productClick',\n\t\t\t'ecommerce': {\n\t\t\t\t'click': {\n\t\t\t\t\t'products' :[{\n\t\t\t\t\t\t'name': productName,\n\t\t\t\t\t\t'id': productId,\n\t\t\t\t\t\t'price': price,\n\t\t\t\t\t\t'discount_amount': discount ? discount.toString() : '',\n\t\t\t\t\t\t'discount_percentage': Math.round((discount/(discount+price))*100)/100 ? (Math.round((discount/(discount+price))*100)/100).toString() : '',\n\t\t\t\t\t\t'brand': brand,\n\t\t\t\t\t\t'category': category,\n\t\t\t\t\t\t'variant': variant,\n\t\t\t\t\t\t'position': position\n\t\t\t\t\t}]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//check product click from lister page or homepage otherwise don't add the action field, and remove it if it already exists\n\t\tif ( $('#wrapper').hasClass('pt_product-search-result') || $('#wrapper').hasClass('pt_collectionlanding') || $('#wrapper').hasClass('pt_storefront') || $('#wrapper').hasClass('pt_content') || $('#wrapper').hasClass('pt_product-details')) {\
266n\t\t\tobject.ecommerce.click.actionField = {\n\t\t\t\t'list': localStorage.categoryName\n\t\t\t};\n\t\t} else {\n\t\t\tlocalStorage.removeItem('categoryName');\n\t\t\tdataLayer = dataLayer.filter(function (event) {\n\t\t\t\tif(event.ecommerce && event.ecommerce.detail && event.ecommerce.detail.actionField) {\n\t\t\t\t\tdelete event.ecommerce.detail.actionField;\n\t\t\t\t}\n\t\t\t\treturn event;\n\t\t\t});\n\t\t}\n\n\t\tdataLayer.push(object);\n\n\t\tif (promotionID !== null && promotionID.length > 0 || promotionName !== null && promotionName.length > 0) {\n\t\t\tdataLayer.push({\n\t\t\t\t'event': 'promotionClick',\n\t\t\t\t'ecommerce': {\n\t\t\t\t\t'promoClick': {\n\t\t\t\t\t\t'promotions': [{\n\t\t\t\t\t\t\t'id': promotionID,\n\t\t\t\t\t\t\t'name': promotionName,\n\t\t\t\t\t\t\t'creative': '',\n\t\t\t\t\t\t\t'position': 'ProductImpression'\n\t\t\t\t\t\t}]\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'eventTimeout': 1000\n\t\t\t});\n\t\t}\n\n\t},\n\n\t// used in user interaction with buttons in PDP\n\tproductInteractions : function(element,action,label) {\n\t\tcart.getProductInfo($(element));\n\t\tcartObj = dataLayer.filter(function (obj) {\n\t\t\treturn (obj.eventLabel===label && obj.eventAction===action);\n\t\t});\n\t\tif(action === null){\n\t\t\taction = productName;\n\t\t}\n\t}\n};\n\nvar cart = {\n\tinit : function() {\n\t\tcart.bindEvents();\n\t},\n\n\tbindEvents : function() {\n\t\tif($('.add-to-cart-link').length > 0 || !!$('.js-add-to-cart').length || $('.js-add-to-cart-review-popup').length > 0) {\n\t\t\t$('.add-to-cart-link, .js-add-to-cart, .js-add-to-cart-review-popup').on('click', function(e) {\n                e.preventDefault();\n                var gtmDetails = '';\n                var infoElement = $(this).closest('.sub-section,.product-tile');\n                if (!!infoElement && !!infoElement.length) {\n                    gtmDetails = infoElement.find('.gtm-details');\n                    cart.addToCart(gtmDetails);\n                    return;\n                }\n\n\t\t\t\tgtmDetails = !!$(this).parent().find('.gtm-details') && !!$(this).parent().find('.gtm-details').length ? $(this).parent().find('.gtm-details') : $(this).parent().parent().parent().find('.gtm-details');\n\n\t\t\t\tcart.addToCart(gtmDetails);\n\t\t\t});\n\t\t}\n\n\t\tif($('.js-plus').length > 0) {\n\t\t\t$('.js-plus').on('click', function(){\n\t\t\t\tcart.addToCart($(this).parent().find('.gtm-details'));\n\t\t\t});\n\n\t\t\t$('.js-minus').on('click', function(){\n\t\t\t\tcart.removeFromCart($(this).parent().find('.gtm-details'));\n\t\t\t});\n\n\t\t\t$('.js-remove-button').on('click', function(){\n\t\t\t\tcart.removeFromCart($(this).parents('.cart-row').find('.gtm-details'),true);\n\t\t\t});\n\t\t}\n\n\t\t$('.add-to-cart-and-stay').on('click', function(){\n\t\t\tvar element = $(this).parents('.content').find('.content-page-product-tile').find('.gtm-details');\n\n\t\t\tif(element.length > 0){\n\t\t\t\tcart.addToCart(element);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar productid = $(element).context.dataset.productid;\n\n\t\t\tgtmtracking.getProductInfoAJAX(productid, false)\n\n\t\t});\n\n        var $couponErrors = $('.js-coupon-errors');\n        var $singleError = $couponErrors.find('.error');\n        if ($singleError.length) {\n            dataLayer.push({\n                'event': 'GA Tracking',\n                'eventCategory': 'Cart',\n\t\t\t\t'eventAction': $singleError.text(),\n\t\t\t\t'eventLabel': 'Promo error code: ' + $couponErrors.data('coupon-error-code'),\n            });\n        }\n\t},\n\n\taddToCartFromChat: function(product) {\n\t\tvar object = {\n\t\t\t'eventCategory': dataLayer[0].pageType,\n\t\t\t'eventAction': 'Chat: Add-to-cart',\n\t\t\t'eventLabel': 'Sku:' + product.id,\n\t\t\t'event': 'GA Tracking',\n\t\t};\n\t\tdataLayer.push(object);\n\t},\n\n\t// Tracks product adding.\n\taddToCart : function(element) {\n\t\tcart.getProductInfo($(element));\n\t\tvar object = {\n\t\t\t'event': 'addToCart',\n\t\t\t'ecommerce': {\n\t\t\t\t'currencyCode': window.SitePreferences.CURRENCY_CODE,\n\t\t\t\t'add': {\n\t\t\t\t\t'products': [{\n\t\t\t\t\t\t'name': productName,\n\t\t\t\t\t\t'id': productId,\n\t\t\t\t\t\t'price': price,\n\t\t\t\t\t\t'discount_amount': discountBackend ? discountBackend.toString() : '',\n\t\t\t\t\t\t'discount_percentage': discountPercentageBackend ? discountPercentageBackend.toString() : '',\n\t\t\t\t\t\t'brand': brand,\n\t\t\t\t\t\t'category': category,\n\t\t\t\t\t\t'collection': collection,\n\t\t\t\t\t\t'ingredient': ingredient,\n\t\t\t\t\t\t'variant': variant,\n\t\t\t\t\t\t'quantity': quantity\n\t\t\t\t\t}]\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tif ( $('#wrapper').hasClass('pt_product-search-result') || $('#wrapper').hasClass('pt_collectionlanding') || $('#wrapper').hasClass('pt_product-details')) {\
266n\t\t\tobject.ecommerce.add.actionField = {\n\t\t\t\t'list': localStorage.categoryName\n\t\t\t};\n\t\t}\n\t\tif ( $('#wrapper').hasClass('pt_cart') ) {\n\t\t\tobject.ecommerce.add.actionField = {\n\t\t\t\t'list': $(element).find('.product-detail-cart-list').data('list')\n\t\t\t};\n\t\t}\n\t\tdataLayer.push(object);\n\t},\n\n\t// Tracks product removing.\n\tremoveFromCart : function(element,removeAll) {\n\t\tcartObj = dataLayer.filter(function (obj) {\n\t\t\treturn obj.event== \"removeFromCart\";\n\t\t});\n\t\tcart.getProductInfo($(element));\n\t\tif(cartObj.length === 0){\n\t\t\tdataLayer.push({\n\t\t\t\t'event': 'removeFromCart',\n\t\t\t\t'ecommerce': {\n\t\t\t\t\t'currencyCode': window.SitePreferences.CURRENCY_CODE,\n\t\t\t\t\t'remove': {\n\t\t\t\t\t\t'actionField': {'list': $(element).find('.product-detail-cart-list').data('list')},\n\t\t\t\t\t\t'products': [{\n\t\t\t\t\t\t\t'name': productName,\n\t\t\t\t\t\t\t'id': productId,\n\t\t\t\t\t\t\t'price': price,\n\t\t\t\t\t\t\t'discount_amount': discount ? discount.toString() : '',\n\t\t\t\t\t\t\t'discount_percentage': Math.round((discount/(discount+price))*100)/100 ? (Math.round((discount/(discount+price))*100)/100).toString() : '',\n\t\t\t\t\t\t\t'brand': brand,\n\t\t\t\t\t\t\t'category': category,\n\t\t\t\t\t\t\t'collection': collection,\n\t\t\t\t\t\t\t'ingredient': ingredient,\n\t\t\t\t\t\t\t'variant': variant,\n\t\t\t\t\t\t\t'quantity': removeAll ? $(element).find('.product-detail-quantity').data('quantity') : quantity\n\t\t\t\t\t\t}]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tvar product = {\n\t\t\t\t\t'name': productName,\n\t\t\t\t\t'id': productId,\n\t\t\t\t\t'price': price,\n\t\t\t\t\t'discount_amount': discount ? discount.toString() : '',\n\t\t\t\t\t'discount_percentage': Math.round((discount/(discount+price))*100)/100 ? (Math.round((discount/(discount+price))*100)/100).toString() : '',\n\t\t\t\t\t'brand': brand,\n\t\t\t\t\t'category': category,\n\t\t\t\t\t'collection': collection,\n\t\t\t\t\t'ingredient': ingredient,\n\t\t\t\t\t'variant': variant,\n\t\t\t\t\t'quantity': removeAll ? $(element).find('.product-detail-quantity').data('quantity') : quantity\n\t\t\t\t};\n\t\t\tvar action = {'list': $(element).find('.product-detail-cart-list').data('list')};\n\t\t\tcartObj[0].ecommerce.remove.products.push(product);\n\t\t\tcartObj[0].ecommerce.remove.actionField = action;\n\t\t}\n\t},\n\n\t// Getting product info from gtm-details.\n\tgetProductInfo : function(element) {\n\t\tproductName = $(element).find('.product-detail-name').attr('data-name');\n\t\tproductId = $(element).find('.product-detail-id').attr('data-id');\n\n\t\tif(!productId) {\n\t\t\t//skip promo product block\n\t\t\treturn;\n\t\t}\n\n\t\tproductId = productId.toString();\n\n\t\tif($(element).find('.product-detail-prorated').length < 1) {\n\t\t\tprice = $(element).find('.product-detail-net').length < 1 ? $(element).find('.product-detail-price').attr('data-price') : $(element).find('.product-detail-net').attr('data-price');\n\t\t} else {\n\t\t\tprice = $(element).find('.product-detail-prorated').attr('data-price');\n\t\t}\n\t\tprice = parseFloat(price);\n\n\n\t\tvar productdiscount;\n\t\tvar netprice = $(element).find('.product-detail-net').length < 1 ? $(element).find('.product-detail-price').attr('data-price') : $(element).find('.product-detail-net').attr('data-price');\n\t\tnetprice = parseFloat(netprice).toFixed(2);\n\t\tif ( $(element).find('.product-detail-prorated').length ) {\n\t\t\tvar proratedprice = $(element).find('.product-detail-prorated').attr('data-price');\n\t\t\tproratedprice = parseFloat(proratedprice).toFixed(2);\n\t\t\tvar discountprice = $(element).find('.product-detail-discount-price').attr('data-price');\n\t\t\tdiscountprice = parseFloat(discountprice).toFixed(2);\n\n\t\t\tif((proratedprice > 0 && (proratedprice !== netprice)) || discountprice > 0) {\n\t\t\t\tif(discountprice === 0){\n\t\t\t\t\tproductdiscount = netprice - proratedprice;\n\t\t\t\t} else if (proratedprice > 0) {\n\t\t\t\t\tproductdiscount = (netprice - proratedprice) + discountprice;\n\t\t\t\t} else {\n\t\t\t\t\tproductdiscount = discountprice;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tproductdiscount = netprice;\n\t\t\t}\n\t\t}\n\n\t\tdiscountBackend = $(element).find('.product-detail-discount-price').attr('data-price');\n\t\tdiscountPercentageBackend = $(element).find('.product-detail-discount-percantage').attr('data-price');\n\t\tdiscount = Math.round((productdiscount)*100)/100;\n\t\tpromotionID = $(element).find('.promotion-id').attr('data-id');\n\t\tpromotionName = $(element).find('.promotion-name').attr('data-name');\n\n\t\tcategory =  $(element).find('.product-detail-category').data('category');\n\t\tcollection = $(element).find('.product-detail-collection').data('collection');\n\t\tingredient = $(element).find('.product-detail-ingredient').data('ingredient') || '';\n\t\tvariant = $(element).find('.product-detail-variant').attr('data-variant');\n\t\tquantity = $(element).find('.product-detail-quantity').attr('data-quantity');\n\t\tposition = $(element).find('.product-index').data('index');\n\t}\n};\n\nvar checkout = {\n\tcompletedOrdersCookieName: 'completedOrders',\n\n\tinit : function () {\n\t\tcheckout.bindEvents();\n\t}
266,\n\n\tbindEvents : function() {\n\n        $('.js-checkout-login-back-to-cart').on('click', function(){\n            dataLayer.push({\n                'eventCategory': 'Checkout Login',\n                'eventAction': 'Back to shopping bag',\n                'eventLabel': 'None',\n                'event': 'GA Tracking',\n            });\n        });\n\n        $('.pt_checkout .header__logo').on('click', function () {\n            dataLayer.push({\n                'eventCategory': 'Shipping page',\n                'eventAction': 'Back to home',\n                'eventLabel': 'None',\n                'event': 'GA Tracking',\n            });\n        });\n\n        var shippingNotice = $('#js-shipping-notice');\n        if (shippingNotice.length && shippingNotice.attr('data-show') == 'true') {\n            dataLayer.push({\n                'eventCategory': 'Shipping page',\n                'eventAction': 'Another country notification shown',\n                'eventLabel': 'None',\n                'event': 'GA Tracking',\n            });\n            shippingNotice.find('a').on('click', function () {\n                var link = $(this).attr('href');\n                dataLayer.push({\n                    'eventCategory': 'Shipping page',\n                    'eventAction': 'Another country notification - link',\n                    'eventLabel': link,\n                    'event': 'GA Tracking',\n                });\n            });\n        }\n\n        $('.section-header-note').on('click', function () {\n            if (!$(this).closest('.mini-shipment').length) {\n                var checkoutStep = window.location.href.indexOf('shipping') > -1 ? 'Shipping page' : 'Billing page';\n                dataLayer.push({\n                    'eventCategory': checkoutStep,\n                    'eventAction': 'Edit bag',\n                    'eventLabel': 'none',\n                    'event': 'GA Tracking',\n                });\n            }\n        });\n\n        $('.order-promotions a').on('click', function () {\n            if ($(this).attr('href').indexOf('faq-shipping.html') > -1) {\n                dataLayer.push({\n                    'eventCategory': 'Shipping page',\n                    'eventAction': 'More shipping info',\n                    'eventLabel': 'none',\n                    'event': 'GA Tracking',\n                });\n            }\n        });\n\n        $('#dwfrm_singleshipping_shippingAddress_differentBillingAddress').on('click', function () {\n            if (document.getElementById('dwfrm_singleshipping_shippingAddress_differentBillingAddress').checked) {\n                dataLayer.push({\n                    'eventCategory': 'Shipping page',\n                    'eventAction': 'Separate billing address checkbox',\n                    'eventLabel': 'none',\n                    'event': 'GA Tracking',\n                });\n            }\n        });\n\n        $('.mini-shipment a').on('click', function () {\n            var checkoutStep = window.location.href.indexOf('shipping') > -1 ? 'Shipping page' : 'Billing page';\n            dataLayer.push({\n                'eventCategory': checkoutStep,\n                'eventAction': 'Edit shipping details',\n                'eventLabel': 'none',\n                'event': 'GA Tracking',\n            });\n        });\n\n        $('#billing-submit').on('click', function () {\n            var selectedPaymentMethod = $('[name=dwfrm_billing_paymentMethods_brandCode]').filter(function(index, paymentMethodCheckbox){\n                if (paymentMethodCheckbox.checked) {\n                    return true;\n                }\n            });\n            if (selectedPaymentMethod.closest('li').attr('id')) {\n                var paymentMethodLabel = selectedPaymentMethod.siblings('.payment_method_label').html().trim();\n                dataLayer.push({\n                    'eventCategory': 'Billing page',\n                    'eventAction': 'Continue to billing',\n                    'eventLabel': paymentMethodLabel,\n                    'event': 'GA Tracking',\n                });\n            }\n            setTimeout(function(){\n                var errorIcons = $('.adyen-checkout-input__inline-validation--invalid:visible');\n                for (var i = 0; i < errorIcons.length;
266 i++) {\n                    var erorMessage;\n                    var errorIcon = errorIcons[i];\n                    if ($(errorIcon).closest('.form-row').hasClass('row-ideal')) {\n                        erorMessage = $('.adyen-checkout__dropdown__button__text').html().trim();\n                    } else {\n                        erorMessage = $($('.adyen-checkout__error-text:visible')[i]).html().trim();\n                    }\n                    dataLayer.push({\n                        'eventCategory': 'Billing page',\n                        'eventAction': 'Billing page error',\n                        'eventLabel': erorMessage,\n                        'event': 'GA Tracking',\n                    });\n                }\n            }, 100);\n        });\n\n\t\tif($('.js-place-order').length>0){\n\t\t\t$('.js-place-order').on('click', function(){\n\t\t\t\tvar paymentMethod = $('.js-paymentmethod').text().trim();\n\t\t\t\t//checkout.pushCheckoutStep(paymentMethod);\n\t\t\t\tcheckout.onCheckoutOption(paymentMethod);\n\t\t\t});\n\t\t}\n\n\t\tif($('.js-checkout-button').length>0){\n\t\t\t$('.js-checkout-button').on('click', function(e){\n\t\t\t\tvar continueAction = '';\n\t\t\t\tvar buttonType = $(this).attr('name');\n\n\t\t\t\tif(buttonType.includes('login_login')){\n\t\t\t\t\tcontinueAction = 'login';\n\t\t\t\t} else if(buttonType.includes('login_unregistered')){\n\t\t\t\t\t continueAction = 'guest';\n\t\t\t\t} else{\n\t\t\t\t\tcontinueAction = 'register';\n\t\t\t\t}\n\t\t\t\t//checkout.pushCheckoutStep(continueAction);\n\t\t\t\tcheckout.onCheckoutOption(continueAction);\n\t\t\t});\n\t\t}\n\n\t\tif($('.js-shipping-submit').length > 0) {\n\t\t\t$('.js-shipping-submit').on('click', function() {\n\t\t\t\t//checkout.pushCheckoutStep($('.js-shipping-method-name').data('id'));\n\t\t\t\tcheckout.onCheckoutOption($('.js-shipping-method-name').data('id'));\n\t\t\t});\n\t\t}\n\n\t\tif($('.js-btn-billing-save').length > 0) {\n\t\t\t$('.js-btn-billing-save').on('click', function() {\n\t\t\t\t//checkout.pushCheckoutStep($('.payment-method').find('input:checked').attr('id'));\n\t\t\t\tvar paymentMethod = $('.payment-method').find('input:checked').attr('id');\n\t\t\t\t// If no payment method is selected and PayPal Express header exists, this must be a PayPal Express payment.\n\t\t\t\tif ( !paymentMethod && $('.paypalexpress-header').length > 0 ) {\n\t\t\t\t\tpaymentMethod = 'paypal_ecs';\n\t\t\t\t}\n\t\t\t\tcheckout.onCheckoutOption(paymentMethod);\n\t\t\t});\n\t\t\t//this should be triggered from billing page not cart page\n\t\t\t$('.apple-pay').on('click', function() {\n\t\t\t\tvar paymentMethod = $('.row-applepay').find('input').attr('id');\n\t\t\t\tcheckout.onCheckoutOption(paymentMethod);\n\t\t\t});\n\t\t}\n\n\t\t// When address taken from PayPal does not fit allowed countries\n\t\tif($('.js-paypal-shippingcountry-mismatch').length>0){\n\t\t\tdataLayer.push({\n\t\t\t\t'eventCategory': 'Shipping Page',\n\t\t\t\t'eventAction': 'PayPal Express - Shipping country error',\n\t\t\t\t'eventLabel': 'none',\n\t\t\t\t'event': 'GA Tracking'\n\t\t\t});\n\t\t}else if($('.js-paypal-billingcountry-mismatch').length>0){\n\t\t\tdataLayer.push({\n\t\t\t\t'eventCategory': 'Shipping Page',\n\t\t\t\t'eventAction': 'PayPal Express - Billing country error',\n\t\t\t\t'eventLabel': 'none',\n\t\t\t\t'event': 'GA Tracking'\n\t\t\t});\n\t\t}\n\t},\n\n\t// Push the checkout step on order placement.\n\tpushCheckoutStep : function(checkoutOption){\n\t\tdataLayer.push({\n\t\t\t'event': 'checkout',\n\t\t\t'ecommerce': {\n\t\t\t\t'checkout': {\n\t\t\t\t\t'actionField': {\n\t\t\t\t\t\t'step': checkout.stepIndication(),\n\t\t\t\t\t\t'option': checkoutOption\n\t\t\t\t\t},\n\t\t\t\t\t'products': JSON.parse(localStorage.getItem('products'))\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tonCheckoutOption : function(checkoutOption) {\n        if (checkoutOption == 'guest') {\n            dataLayer.push({\n                'eventCategory': 'Checkout Login',\n                'eventAction': 'Checkout as guest',\n                'eventLabel': 'None',\n                'event': 'GA Tracking',\n            });\n        } else if (checkoutOption == 'login') {\n            dataLayer.push({\n                'eventCategory': 'Checkout Login',\n                'eventAction': 'Sign in and checkout',\n                'eventLabel': 'None',\n                'event': 'GA Tracking',\n            });\n        }\n\t\tdataLayer.push({\n\t\t\t'event': 'checkoutOption',\n\t\t\t'ecommerce': {\n\t\t\t\t'checkout_option': {\n\t\t\t\t\t'actionField': {\n\t\t\t\t\t\t'step': checkout.stepIndication(),\n\t\t\t\t\t\t'option': checkoutOption\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}
266,\n\n\tstepIndication : function() {\n\t\tif($('.frmlogin').length){\n\t\t\treturn 1;\n\t\t}else if ($('.frmshipping').length){\n\t\t\treturn 2;\n\t\t}else if($('.frmbilling').length){\n\t\t\treturn 3;\n\t\t}\n\t},\n\n\t// Push the checkout products to the localStorage. It's because products are being lost after Adyen redirection.\n\tcheckoutProducts : function(element) {\n\t\tvar products = [];\n\t\tvar products_list = [];\n\t\t$(element).each(function() {\n\t\t\tvar productElement = $(this);\n\t\t\t// ignore header of gifts\n\t\t\tif(productElement.hasClass(\"js-gifts\")) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcart.getProductInfo(productElement);\n\n\t\t\tvar product = {\n\t\t\t\t'name' : productName,\n\t\t\t\t'id' : productId,\n\t\t\t\t'price' : price,\n\t\t\t\t'discount_amount': discount ? discount.toString() : '',\n\t\t\t\t'discount_percentage': Math.round((discount/(discount+price))*100)/100 ? (Math.round((discount/(discount+price))*100)/100).toString() : '',\n\t\t\t\t'brand' : brand,\n\t\t\t\t'category' : category,\n\t\t\t\t'collection' : collection,\n\t\t\t\t'ingredient': ingredient,\n\t\t\t\t'variant' : variant,\n\t\t\t\t'quantity' : parseInt(quantity)\n\t\t\t};\n\n\t\t\tproducts_list.push({\n\t\t\t\tid:$(this).find('.product-detail-id').data('id'),\n\t\t\t\tprice:$(this).find('.product-detail-price').data('price'),\n\t\t\t\tdiscount_price:$(this).find('.product-detail-prorated').length < 1 ? $(this).find('.product-detail-discount-price').data('price') : $(this).find('.product-detail-prorated').data('price'),\n\t\t\t\tquantity: $(this).find('.product-detail-quantity').data('quantity')\n\t\t\t});\n\n\t\t\tproducts.push(product);\n\t\t});\n\n\t\tlocalStorage.setItem('products',JSON.stringify(products));\n\t},\n\n\t// Tracking purchases\n\tpurchase : function() {\n\t\tvar completedOrders = util.getCookie(checkout.completedOrdersCookieName);\n\t\tvar orderNo = $('.js-orderno').data('orderno');\n\n\t\tif(completedOrders !== null && completedOrders.indexOf('|' + orderNo + '|') !== -1){\n\t\t\t// this order is already tracked\n\t\t\treturn;\n\t\t}\n\n\t\tcompletedOrders = completedOrders === null ? '' : completedOrders;\n\n\t\tdataLayer.push({\n\t\t\t'ecommerce': {\n\t\t\t\t'purchase': {\n\t\t\t\t\t'actionField': {\n\t\t\t\t\t\t'id': $('.js-orderno').data('orderno'),\n\t\t\t\t\t\t'affiliation': 'Online Store',\n\t\t\t\t\t\t'revenue': parseFloat($('.js-ordertotal').data('ordertotal')),\n\t\t\t\t\t\t'tax':$('.js-totaltax').data('totaltax'),\n\t\t\t\t\t\t'shipping': $('.js-shippingcost').data('shippingcost'),\n\t\t\t\t\t\t'coupon': $('.js-coupon').data('coupon') !== null ? $('.js-coupon').data('coupon') : '',\n\t\t\t\t\t\t'discountAmount' : $('.js-couponAmount') !== null ? $('.js-couponAmount').data('amount') : ''\n\t\t\t\t\t},\n\t\t\t\t\t'products': JSON.parse(localStorage.getItem('products'))\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tdocument.cookie = checkout.completedOrdersCookieName+'='+completedOrders + '|'+orderNo+'|; Secure;';\n\t}\n};\n\nvar promotion = {\n\tinit : function() {\n\t\tpromotion.bindEvents();\n\t},\n\n\tbindEvents : function() {\n\t\tif($('.js-promotion-banner').length > 0) {\n\n\t\t\tpromotion.promotionImpressions();\n\n\t\t\t$('.js-promotion-banner').on('click', function() {\n\t\t\t\tpromotion.clickTracking($(this));\n\t\t\t});\n\t\t}\n\t},\n\n\tclickTracking : function(element) {\n\t\tvar promos = $('.js-promotion-banner');\n\t\tvar index = promos.index(element);\n\t\tvar promo = promotion.setPromotion(index, element);\n\t\tdataLayer.push({\n\t\t\t'event': 'promotionClick',\n\t\t\t'ecommerce': {\n\t\t\t\t'promoClick': {\n\t\t\t\t\t'promotions': [promo]\n\t\t\t\t}\n\t\t\t},\n\t\t\t'eventCallback': function() {\n\t\t\t\tdocument.location = $(element).attr('href');\n\t\t\t}\n\t\t});\n\t},\n\n\tpromotionImpressions : function() {\n\t\tdataLayer.push({\n\t\t\t'ecommerce': {\n\t\t\t\t'promoView': {\n\t\t\t\t\t'promotions' : promotion.getPromotions()\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tgetPromotions : function() {\n\t\tvar promotions = [];\n\n\t\t$('.js-promotion-banner').each(function(index) {\n\t\t\tvar promo = promotion.setPromotion(index, $(this));\n\t\t\tpromotions.push(promo);\n\t\t});\n\n\t\treturn promotions;\n\t},\n\n\tsetPromotion : function(index, element) {\n\t\tvar promotion = {\n\t\t\t'id' : $(element).data('promoid'),\n\t\t\t'name' : $(element).data('promoname'),\n\t\t\t'creative' : $(element).data('promocreative'),\n\t\t\t'position' : (index+1)\n\t\t};\n\n\t\treturn promotion;\n\t}\n};\n\n\n// Tracking social media icon clicks.\nvar socialMedia = {\n\tinit : function() {\
266n\t\tsocialMedia.bindEvents();\n\t},\n\n\tbindEvents : function() {\n\t\t$('.footer-socialicons').find('li').each(function() {\n\t\t\t$(this).on('click', function() {\n\t\t\t\tsocialMedia.push($(this).data('site'));\n\t\t\t});\n\t\t});\n\t},\n\n\tpush : function(site) {\n\t\tdataLayer.push({\n\t\t\t'event' : 'GA Tracking',\n\t\t\t'eventCategory' : 'Social Media Tracking',\n\t\t\t'eventAction' : 'Share Button Click',\n\t\t\t'eventLabel': site,\n\t\t\t'eventValue': 0,\n\t\t\t'eventNonInteraction': false\n\t\t});\n\t}\n};\n\n\n\nmodule.exports = gtmtracking;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js?\n}");
267
268/***/ }),
269
270/***/ "./cartridges/app_paulaschoice/cartridge/js/hamstracking.js":
271/*!******************************************************************!*\
272  !*** ./cartridges/app_paulaschoice/cartridge/js/hamstracking.js ***!
273  \******************************************************************/
274/***/ (function(module) {
275
276"use strict";
277eval("{\nvar hamstracking = {\n\tinit : function() {\n\t\tif ( $('#missingcookie').length ) {\n\t\t\tsetTimeout(function(){\n\t\t\t\t$.ajax({\n\t\t\t\t\turl: Urls.hamsTracking\n\t\t\t\t});\n\t\t\t},750);\n\t\t}\n\t}\n};\n\nmodule.exports = hamstracking;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/hamstracking.js?\n}");
278
279/***/ }),
280
281/***/ "./cartridges/app_paulaschoice/cartridge/js/klaviyoOnsite.js":
282/*!*******************************************************************!*\
283  !*** ./cartridges/app_paulaschoice/cartridge/js/klaviyoOnsite.js ***!
284  \*******************************************************************/
285/***/ (function(module) {
286
287"use strict";
288eval("{\n\nvar SESSION_KEY = 'klaviyo_identified_email';\nvar PURCHASE_SESSION_KEY_PREFIX = 'klaviyo_purchase_';\nvar CART_UPDATED_PENDING_KEY = 'klaviyo_pending_cart_updated';\n\n/**\n * @returns {boolean}\n */\nfunction isEnabled() {\n    return !!(window.KlaviyoConfig\n        && window.KlaviyoConfig.enabled\n        && window.KlaviyoConfig.publicApiKey);\n}\n\n/**\n * @param {string} email\n * @returns {string}\n */\nfunction normalizeEmail(email) {\n    return email ? String(email).trim().toLowerCase() : '';\n}\n\n/**\n * @param {string} email\n * @returns {boolean}\n */\nfunction identifyWithDedup(email) {\n    if (!isEnabled()) {\n        return false;\n    }\n\n    var normalized = normalizeEmail(email);\n    if (!normalized || typeof window.klaviyo === 'undefined') {\n        return false;\n    }\n\n    try {\n        if (sessionStorage.getItem(SESSION_KEY) === normalized) {\n            return false;\n        }\n        sessionStorage.setItem(SESSION_KEY, normalized);\n    } catch (e) {\n        if (typeof console !== 'undefined') {\n            console.log('Error in Klaviyo identify sessionStorage: ' + e.message + ', ' + e.stack);\n        }\n    }\n\n    window.klaviyo.identify({ email: normalized });\n    return true;\n}\n\nfunction initCustomerIdentify() {\n    var email = window.KlaviyoConfig && window.KlaviyoConfig.customerEmail;\n    identifyWithDedup(email);\n}\n\n/**\n * @param {HTMLElement|jQuery} form\n */\nfunction identifyOnLoginSuccess(form) {\n    var $form = $(form);\n    var email = $form.find('.js-email-field-to-copy').val() || $form.find('[name*=\"username\"]').val();\n\n    identifyWithDedup(email);\n}\n\nfunction customerIdentify() {\n    window.addEventListener('klaviyo:ready', initCustomerIdentify);\n    if (typeof window.klaviyo !== 'undefined') {\n        initCustomerIdentify();\n    }\n}\n\nfunction clearIdentifiedSession() {\n    try {\n        sessionStorage.removeItem(SESSION_KEY);\n    } catch (e) {\n        if (typeof console !== 'undefined') {\n            console.log('Error in Klaviyo clearIdentifiedSession: ' + e.message + ', ' + e.stack);\n        }\n    }\n}\n\n/**\n * @param {string} metricName\n * @param {Object} payload\n */\nfunction trackSafe(metricName, payload) {\n    if (!isEnabled() || typeof window.klaviyo === 'undefined') {\n        return;\n    }\n\n    try {\n        window.klaviyo.track(metricName, payload);\n    } catch (err) {\n        if (typeof console !== 'undefined') {\n            console.log('Error in Klaviyo trackSafe (' + metricName + '): ' + err.message + ', ' + err.stack);\n        }\n    }\n}\n\n/**\n * Runs callback once after Klaviyo SDK is ready (handles missed klaviyo:ready on late app.js load).\n * @param {Function} callback\n */\nfunction onceOnKlaviyoReady(callback) {\n    var called = false;\n\n    function run() {\n        if (called) {\n            return;\n        }\n        called = true;\n        callback();\n    }\n\n    window.addEventListener('klaviyo:ready', run);\n    if (window.__klaviyoReady) {\n        run();\n    }\n}\n\n/**\n * @returns {Object|null}\n */\nfunction getPageDataLayerEntry() {\n    if (!window.dataLayer || !window.dataLayer.length) {\n        return null;\n    }\n\n    for (var i = 0; i < window.dataLayer.length; i++) {\n        if (window.dataLayer[i] && window.dataLayer[i].pageType) {\n            return window.dataLayer[i];\n        }\n    }\n\n    return window.dataLayer[0] || null;\n}\n\n/**\n * @returns {boolean}\n */\nfunction isSearchPage() {\n    if (window.location.href.indexOf('/search?q') > -1) {\n        return true;\n    }\n\n    var entry = getPageDataLayerEntry();\n    return !!(entry && entry.pageType === 'Search results');\n}\n\n/**\n * @returns {Array}
288\n */\nfunction getCartData() {\n    var el = document.querySelector('[data-cartdata]');\n    if (!el) {\n        return [];\n    }\n\n    try {\n        var raw = el.getAttribute('data-cartdata');\n        if (!raw) {\n            return [];\n        }\n\n        var parsed = JSON.parse(raw);\n        return Array.isArray(parsed) ? parsed : [];\n    } catch (e) {\n        return [];\n    }\n}\n\n/**\n * @returns {Object|null}\n */\nfunction getDataLayerDetailProduct(productId) {\n    if (!window.dataLayer || !window.dataLayer.length) {\n        return null;\n    }\n\n    var fallbackProduct = null;\n\n    for (var i = window.dataLayer.length - 1; i >= 0; i--) {\n        var entry = window.dataLayer[i];\n        if (!entry || entry.event !== 'detail' || !entry.ecommerce || !entry.ecommerce.detail || !entry.ecommerce.detail.products) {\n            continue;\n        }\n\n        var products = entry.ecommerce.detail.products;\n        if (!products.length) {\n            continue;\n        }\n\n        if (productId) {\n            for (var j = products.length - 1; j >= 0; j--) {\n                if (String(products[j].id) === String(productId)) {\n                    return products[j];\n                }\n            }\n        }\n\n        if (!fallbackProduct) {\n            fallbackProduct = products[products.length - 1];\n        }\n    }\n\n    return fallbackProduct;\n}\n\n/**\n * @param {*} price\n * @returns {number|null}\n */\nfunction normalizePrice(price) {\n    if (price === null || price === undefined || price === '' || price === 'NaN') {\n        return null;\n    }\n\n    var num = Number(price);\n    return isNaN(num) ? null : num;\n}\n\n/**\n * @param {number} price\n * @returns {number}\n */\nfunction roundPrice(price) {\n    return Number((Math.round(Number(price) * 100) / 100).toFixed(2));\n}\n\n/**\n * Tax multiplier from confirmation hidden fields (matches Emarsys).\n * @returns {number}\n */\nfunction getPurchaseTaxMultiplier() {\n    var $orderTotal = $('.js-ordertotal');\n    var $totalTax = $('.js-totaltax');\n\n    if (!$orderTotal.length || !$totalTax.length) {\n        return 1;\n    }\n\n    var orderTotal = parseFloat($orderTotal.attr('data-ordertotal'));\n    var totalTax = parseFloat($totalTax.attr('data-totaltax'));\n\n    if (isNaN(orderTotal) || orderTotal <= 0 || isNaN(totalTax)) {\n        return 1;\n    }\n\n    return totalTax / orderTotal + 1;\n}\n\n/**\n * Gross order total from confirmation hidden fields.\n * @returns {number|null}\n */\nfunction getPurchaseGrossTotal() {\n    var orderTotal = normalizePrice($('.js-ordertotal').attr('data-ordertotal'));\n    var totalTax = normalizePrice($('.js-totaltax').attr('data-totaltax'));\n\n    if (orderTotal === null || totalTax === null) {\n        return null;\n    }\n\n    return roundPrice(orderTotal + totalTax);\n}\n\n/**\n * @returns {boolean}\n */\nfunction canCalculateGrossPricesFromDom() {\n    var $orderTotal = $('.js-ordertotal');\n    var $totalTax = $('.js-totaltax');\n\n    if (!$orderTotal.length || !$totalTax.length) {\n        return false;\n    }\n\n    var orderTotal = parseFloat($orderTotal.attr('data-ordertotal'));\n    var totalTax = parseFloat($totalTax.attr('data-totaltax'));\n\n    return !isNaN(orderTotal) && orderTotal > 0 && !isNaN(totalTax);\n}\n\n/**\n * @param {Object} purchase\n * @param {Object} actionField\n * @returns {boolean}\n */\nfunction hasGrossPurchasePricing(purchase, actionField) {\n    if (normalizePrice(actionField.grossRevenue) !== null) {\n        return true;\n    }\n\n    if (canCalculateGrossPricesFromDom()) {\n        return true;\n    }\n\n    var products = (purchase && purchase.products) || [];\n    for (var i = 0; i < products.length; i++) {\n        if (products[i] && normalizePrice(products[i].grossPrice) !== null) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\n/**\n * @returns {string}\n */\nfunction getPdpImageUrl() {\n    var ogImage = document.querySelector('meta[property=\"og:image\"]');\n    if (ogImage && ogImage.content) {\n        return ogImage.content;\n    }\n\n    var $img = $('.js-primary-image, .js-product-redesign-image').first();
288\n    if ($img.length && $img.attr('src')) {\n        return $img.attr('src');\n    }\n\n    return '';\n}\n\n/**\n * @param {string} categoryValue\n * @returns {string|null}\n */\nfunction getCategoryName(categoryValue) {\n    if (!categoryValue) {\n        return null;\n    }\n\n    var category = String(categoryValue).trim();\n    if (!category) {\n        return null;\n    }\n\n    var segments = category.split('/');\n    return segments[segments.length - 1].trim() || null;\n}\n\n/**\n * @returns {string|null}\n */\nfunction getCurrencyCode() {\n    var pageEntry = getPageDataLayerEntry();\n    if (pageEntry && pageEntry.pageCurrency) {\n        return pageEntry.pageCurrency;\n    }\n\n    if (window.SitePreferences && window.SitePreferences.CURRENCY_CODE) {\n        return window.SitePreferences.CURRENCY_CODE;\n    }\n\n    return null;\n}\n\n/**\n * Formats a raw price into a locale/currency string, e.g. \"€26.40\".\n *\n * @param {number|null} price\n * @returns {string|null}\n */\nfunction formatPriceWithCurrency(price) {\n    var currencyCode = getCurrencyCode();\n    if (price === null || !currencyCode) {\n        return null;\n    }\n\n    var locale = document.documentElement.lang || undefined;\n\n    try {\n        return new Intl.NumberFormat(locale, {\n            style: 'currency',\n            currency: currencyCode\n        }).format(price);\n    } catch (e) {\n        return currencyCode + ' ' + price.toFixed(2);\n    }\n}\n\n/**\n * Reads the gross (tax-inclusive) price shown on the PDP.\n * Prefers the sales price span over the strike-through standard price.\n * Scoped to the main product block so recommendation tiles are ignored.\n *\n * @returns {number|null}\n */\nfunction getPdpDisplayedGrossPrice() {\n    var container = document.querySelector('.product-basic-actions .product-pricing');\n    if (!container) {\n        return null;\n    }\n\n    var el = container.querySelector('.product-sales-price[data-gross-price]')\n        || container.querySelector('[data-gross-price]');\n\n    if (!el) {\n        return null;\n    }\n\n    return normalizePrice(el.getAttribute('data-gross-price'));\n}\n\n/**\n * @param {string} productId\n * @returns {Object}\n */\nfunction buildViewedProductPayload(productId) {\n    var detail = getDataLayerDetailProduct(productId);\n    var payload = {\n        ProductID: productId,\n        URL: window.location.href\n    };\n\n    if (detail && detail.name) {\n        payload.ProductName = detail.name;\n    }\n\n    var grossPrice = getPdpDisplayedGrossPrice();\n    if (grossPrice === null && detail) {\n        grossPrice = normalizePrice(detail.price);\n    }\n    var formattedPrice = formatPriceWithCurrency(grossPrice);\n    if (formattedPrice) {\n        payload.Price = formattedPrice;\n    }\n\n    var categoryName = null;\n    if (detail && detail.category) {\n        categoryName = getCategoryName(detail.category);\n    } else {\n        var pageEntry = getPageDataLayerEntry();\n        if (pageEntry && pageEntry.pageCategory) {\n            categoryName = getCategoryName(pageEntry.pageCategory);\n        }\n    }\n\n    if (categoryName) {\n        payload.CategoryName = categoryName;\n    }\n\n    var imageUrl = getPdpImageUrl();\n    if (imageUrl) {\n        payload.ImageURL = imageUrl;\n    }\n\n    return payload;\n}\n\n/**\n * @returns {string|null}\n */\nfunction getPdpProductId() {\n    var $selectedVariant = $('.product-variations ul.size li.selected-size a');\n    if ($selectedVariant.length && $selectedVariant.data('variant')) {\n        return String($selectedVariant.data('variant'));\n    }\n\n    var $selectedSize = $('.js-product-size.selected-size');\n    if ($selectedSize.length && $selectedSize.data('variant')) {\n        return String($selectedSize.data('variant'));\n    }\n\n    var pidInput = $('input[name=\"pid\"]').first().val();\n    if (pidInput) {\n        return String(pidInput);\n    }\n\n    var detailProduct = getDataLayerDetailProduct(null);\n    if (detailProduct && detailProduct.id) {\n        return String(detailProduct.id);\n    }\n\n    return null;\n}\n\n/**\n * @param {Object} page\n */\nfunction trackViewedProduct(page) {\n    if (!page || page.gtmPageType !== 'PDP') {\n        return;\n    }\n\n    var productId = getPdpProductId();\n    if (!productId) {\n        return;\n    }\n\n    var payload = buildViewedProductPayload(productId);\n    trackSafe('Viewed Product', payload);\n}\n\n/**\n * @param {Object} page\n */\nfunction trackViewedCategory(page) {\n    if (!page || page.gtmPageType !== 'Listerpage' || isSearchPage()) {\n        return;\n    }\n\n    var entry = getPageDataLayerEntry();\n    if (!entry || !entry.pageSubCategory) {\n        return;\n    }\n\n    trackSafe('Viewed Category', {\n        CategoryName: entry.pageSubCategory,\n        URL: window.location.href\n    });\n}\n\nfunction trackSearchTerm() {\n    if (!isSearchPage()) {\n        return;\n    }\n\n    var entry = getPageDataLayerEntry();\n    if (!entry || !entry.pageSubCategory) {\n        return;\n    }\n\n    var searchTerm = entry.pageSubCategory;\n    try {\n        searchTerm = decodeURIComponent(searchTerm);\n    }
288 catch (e) {\n        // keep encoded value\n    }\n\n    trackSafe('Search Term', {\n        SearchTerm: searchTerm,\n        URL: window.location.href\n    });\n}\n\n/**\n * @returns {string}\n */\nfunction getTrackPageUrl() {\n    return window.location.origin + window.location.pathname + window.location.search;\n}\n\n/**\n * @param {Object} page\n */\nfunction trackCartView(page) {\n    if (!page || page.ns !== 'cart') {\n        return;\n    }\n\n    var items = getCartData().map(function (item) {\n        return {\n            ProductID: String(item.sku),\n            Quantity: item.quantity,\n            Price: item.price\n        };\n    });\n\n    trackSafe('Cart View', {\n        Items: items,\n        URL: getTrackPageUrl()\n    });\n}\n\n/**\n * @returns {Object|null}\n */\nfunction getPurchaseEntry() {\n    if (window.KlaviyoConfig && window.KlaviyoConfig.purchase) {\n        return window.KlaviyoConfig.purchase;\n    }\n\n    return getDataLayerPurchaseEntry();\n}\n\nfunction getDataLayerPurchaseEntry() {\n    if (!window.dataLayer || !window.dataLayer.length) {\n        return null;\n    }\n\n    for (var i = window.dataLayer.length - 1; i >= 0; i--) {\n        var entry = window.dataLayer[i];\n        if (entry && entry.ecommerce && entry.ecommerce.purchase) {\n            return entry.ecommerce.purchase;\n        }\n    }\n\n    return null;\n}\n\n/**\n * @param {string} productId\n * @returns {boolean}\n */\nfunction isExcludedPurchaseProductId(productId) {\n    var id = String(productId);\n\n    return id.indexOf('VAS') === 0\n        || id.indexOf('CRD') === 0\n        || id.indexOf('bundleclearreg3trial') === 0;\n}\n\n/**\n * @param {string} orderId\n * @returns {boolean}\n */\nfunction hasTrackedPurchase(orderId) {\n    try {\n        return sessionStorage.getItem(PURCHASE_SESSION_KEY_PREFIX + orderId) === '1';\n    } catch (e) {\n        return false;\n    }\n}\n\n/**\n * @param {string} orderId\n */\nfunction markPurchaseTracked(orderId) {\n    try {\n        sessionStorage.setItem(PURCHASE_SESSION_KEY_PREFIX + orderId, '1');\n    } catch (e) {\n        if (typeof console !== 'undefined') {\n            console.log('Error in Klaviyo markPurchaseTracked: ' + e.message + ', ' + e.stack);\n        }\n    }\n}\n\n/**\n * @param {Object} purchase\n * @returns {Object|null}\n */\nfunction buildPurchasedPayload(purchase) {\n    var actionField = purchase.actionField || {};\n    var orderId = actionField.id;\n\n    if (!orderId) {\n        return null;\n    }\n\n    if (!hasGrossPurchasePricing(purchase, actionField)) {\n        return null;\n    }\n\n    var taxMultiplier = getPurchaseTaxMultiplier();\n\n    var products = (purchase.products || []).filter(function (product) {\n        return product && product.id && !isExcludedPurchaseProductId(product.id);\n    });\n\n    var productIDs = [];\n    var itemNames = [];\n    var items = products.map(function (product) {\n        var productId = String(product.id);\n        productIDs.push(productId);\n        itemNames.push(product.name ? String(product.name) : '');\n\n        var item = {\n            ProductID: productId,\n            Quantity: product.quantity || 1\n        };\n\n        var price = normalizePrice(product.grossPrice);\n        if (price === null) {\n            var netPrice = normalizePrice(product.price);\n            if (netPrice !== null) {\n                price = roundPrice(taxMultiplier * netPrice);\n            }\n        } else {\n            price = roundPrice(price);\n        }\n\n        if (price !== null) {\n            item.Price = price;\n        }\n\n        return item;\n    });\n\n    var payload = {\n        OrderID: String(orderId),\n        URL: window.location.href,\n        ProductIDs: productIDs,\n        ItemNames: itemNames,\n        Items: items\n    };\n\n    var grossRevenue = normalizePrice(actionField.grossRevenue);\n    if (grossRevenue !== null) {\n        payload.$value = grossRevenue;\n    } else {\n        var grossTotal = getPurchaseGrossTotal();\n        if (grossTotal !== null) {\n            payload.$value = grossTotal;\n        }
288 else {\n            var revenue = normalizePrice(actionField.revenue);\n            if (revenue !== null) {\n                payload.$value = roundPrice(taxMultiplier * revenue);\n            }\n        }\n    }\n\n    return payload;\n}\n\n/**\n * @param {Object} [page]\n * @returns {boolean}\n */\nfunction isOrderConfirmationPage(page) {\n    var ns = page && page.ns;\n\n    if (!ns && window.pageContext) {\n        ns = window.pageContext.ns;\n    }\n\n    return ns === 'orderconfirmation';\n}\n\n/**\n * @param {Object} [page]\n * @returns {Object}\n */\nfunction resolvePageContext(page) {\n    if (page && page.ns) {\n        return page;\n    }\n\n    if (window.pageContext && window.pageContext.ns) {\n        return window.pageContext;\n    }\n\n    return page || {};\n}\n\n/**\n * Purchase payload is embedded in head only on order confirmation.\n *\n * @param {Object} [page]\n * @returns {boolean}\n */\nfunction shouldAttemptPurchaseTracking(page) {\n    if (window.KlaviyoConfig && window.KlaviyoConfig.purchase) {\n        return true;\n    }\n\n    return isOrderConfirmationPage(page) || isOrderConfirmationPage(window.pageContext || {});\n}\n\n/**\n * @param {Object} page\n */\nfunction trackPurchased(page) {\n    page = resolvePageContext(page);\n\n    var hasEmbeddedPurchase = !!(window.KlaviyoConfig && window.KlaviyoConfig.purchase);\n    if (!hasEmbeddedPurchase && !isOrderConfirmationPage(page)) {\n        return false;\n    }\n\n    var purchase = getPurchaseEntry();\n    if (!purchase) {\n        return false;\n    }\n\n    var payload = buildPurchasedPayload(purchase);\n    if (!payload) {\n        return false;\n    }\n\n    if (hasTrackedPurchase(payload.OrderID)) {\n        return true;\n    }\n\n    if (!isEnabled() || typeof window.klaviyo === 'undefined') {\n        return false;\n    }\n\n    trackSafe('Purchased', payload);\n    markPurchaseTracked(payload.OrderID);\n    return true;\n}\n\nvar purchaseTrackingScheduled = false;\n\n/**\n * @param {Object} page\n */\nfunction schedulePurchaseTracking(page) {\n    if (purchaseTrackingScheduled) {\n        return;\n    }\n    purchaseTrackingScheduled = true;\n\n    var attempts = 0;\n    var maxAttempts = 20;\n\n    function runPurchaseTrack() {\n        var purchase = getPurchaseEntry();\n        var orderId = purchase && purchase.actionField && purchase.actionField.id;\n\n        if (orderId && hasTrackedPurchase(orderId)) {\n            return;\n        }\n\n        if (trackPurchased(resolvePageContext(page))) {\n            return;\n        }\n\n        attempts += 1;\n        if (attempts < maxAttempts) {\n            setTimeout(runPurchaseTrack, 250);\n        }\n    }\n\n    window.addEventListener('klaviyo:ready', runPurchaseTrack);\n\n    if (typeof window.klaviyo !== 'undefined') {\n        runPurchaseTrack();\n    }\n\n    if (document.readyState === 'complete') {\n        runPurchaseTrack();\n    } else {\n        window.addEventListener('load', runPurchaseTrack);\n    }\n\n    setTimeout(runPurchaseTrack, 0);\n}\n\n/**\n * @param {Object} page\n */\nfunction initPageViewTracking(page) {\n    var pageTracksRun = false;\n\n    function runPageTracks() {\n        if (pageTracksRun) {\n            return;\n        }\n        pageTracksRun = true;\n        trackViewedProduct(page);\n        trackViewedCategory(page);\n        trackSearchTerm();\n        trackCartView(page);\n    }\n\n    onceOnKlaviyoReady(function () {\n        runPageTracks();\n        if (shouldAttemptPurchaseTracking(page)) {\n            schedulePurchaseTracking(page);\n        }\n    });\n\n    if (shouldAttemptPurchaseTracking(page)) {\n        schedulePurchaseTracking(page);\n    }\n}\n\nfunction initAddToCartTracking() {\n    $(document).on('klaviyo:addToCart', function (e, payload) {\n        trackAddToCart(payload);\n    });\n}\n\n/**\n * @returns {string}\n */\nfunction getCheckoutUrl() {\n    var checkoutUrl = (typeof Urls !== 'undefined' && Urls.cartShow)\n        ? Urls.cartShow\n        : window.location.origin + '/cart';\n\n    if (checkoutUrl.indexOf('http') !== 0) {\n        checkoutUrl = window.location.origin + checkoutUrl;\n    }\n\n    return checkoutUrl;\n}\n\n/**\n * Builds a Cart Updated payload from [data-cartdata] (same shape as addToCart.js).\n * @param {boolean} [allowEmpty] Include an empty-cart payload (last item removed).\n * @returns {Object|null}\n */\nfunction buildUpdatedCartPayload(allowEmpty) {\n    var items = getCartData();\n    if (!items.length && !allowEmpty) {\n        return null;\n    }\n\n    var value = 0;\n    var itemCount = 0;\n    var mappedItems = items.map(function (item) {\n        var quantity = Number(item.quantity) || 1;\n        var unitPrice;\n        if (item.price != null && !isNaN(Number(item.price))) {\n            unitPrice = quantity > 0 ? Number((Number(item.price) / quantity).toFixed(2)) : Number(item.price);\n        } else {\n            unitPrice = 0;\n        }\n\n        value += unitPrice * quantity;\n        itemCount += quantity;\n\n        return {\n            ProductID: String(item.sku || ''),\n            ProductName: item.ProductName || '',\n            Category: item.Category || '',\n            ImageURL: item.ImageURL || '',\n            ProductURL: item.ProductURL || '',\n            Price: parseFloat(Number(unitPrice).toFixed(2)),\n            Quantity: quantity,\n            InStock: item.InStock !== false && item.InStock !== 'false'\n        };\n    }).filter(function (finalItem) {\n        return !!finalItem.ProductID;\n    });\n\n    if (!mappedItems.length && !allowEmpty) {\n        return null;\n    }\n\n    return {\n        allowEmpty: !!allowEmpty,\n        properties: {\n            Value: parseFloat(Number(value).toFixed(2)),\n            Currency: getCurrencyCode() || '',\n            ItemCount: itemCount,\n            CheckoutURL: getCheckoutUrl(),\n            Items: mappedItems\n        },\n        time: new Date().toISOString()\n    };\n}\n\nfunction markPendingCartUpdated() {\n    try {\n        sessionStorage.setItem(CART_UPDATED_PENDING_KEY, '1');\n    } catch (e) {\n        // ignore\n    }\n}\n\n/**\n * Qty +/- and remove POST the cart form and reload. Flag the action, then\n * track Cart Updated on the next cart load with the server-updated basket.\n * @param {Object} page\n */\nfunction initCartPageUpdateTracking(page) {\n    page = resolvePageContext(page);\n    if (page.ns !== 'cart') {\n        return;\n    }\n\n    $(document).on('submit', '#cart-items-form', markPendingCartUpdated);\n    $(document).on('click', '#cart-items-form button[name$=\"deleteProduct\"], #cart-items-form .js-quantity-button', markPendingCartUpdated);\n    $(document).on('change', '#cart-items-form .js-quantity', markPendingCartUpdated);\n\n    var pending = false;\n    try {\n        pending = sessionStorage.getItem(CART_UPDATED_PENDING_KEY) === '1';\n        if (pending) {\n            sessionStorage.removeItem(CART_UPDATED_PENDING_KEY);\n        }\n    } catch (e) {\n        pending = false;\n    }\n\n    if (!pending) {\n        return;\n    }\n\n    onceOnKlaviyoReady(function () {\n        trackUpdatedCart(buildUpdatedCartPayload(true));\n    });\n}\n\nfunction initUpdatedCartTracking(page) {\n    $(document).on('klaviyo:cartUpdated', function (e, payload) {\n        trackUpdatedCart(payload);\n    });
288\n    initCartPageUpdateTracking(page);\n}\n\nvar ROUTINE_SENT_KEY = 'klaviyo_routine_sent';\n\n/**\n * @param {string} raw\n * @returns {{ ids: string[], items: Object[], url: string|null }|null}\n */\nfunction parseRoutineHandoff(raw) {\n    if (!raw) {\n        return null;\n    }\n\n    var trimmed = String(raw).trim();\n    if (!trimmed) {\n        return null;\n    }\n\n    if (trimmed.charAt(0) === '{') {\n        try {\n            var parsed = JSON.parse(trimmed);\n            if (parsed && parsed.ids && parsed.ids.length) {\n                return {\n                    ids: parsed.ids.map(String),\n                    items: parsed.items || parsed.ids.map(function (id) {\n                        return {\n                            ProductID: String(id),\n                            Quantity: 1,\n                            ProductName: '',\n                            ImageUrl: ''\n                        };\n                    }),\n                    url: parsed.url || null\n                };\n            }\n        } catch (e) {\n            // ignore\n        }\n    }\n\n    var ids = trimmed.split(',').filter(Boolean);\n    if (!ids.length) {\n        return null;\n    }\n\n    return {\n        ids: ids,\n        items: ids.map(function (id) {\n            return {\n                ProductID: String(id),\n                Quantity: 1,\n                ProductName: '',\n                ImageUrl: ''\n            };\n        }),\n        url: null\n    };\n}\n\n/**\n * Routine finder bulk ATC: read PIDs from sessionStorage on cart, track once.\n * @param {Object} page\n */\nfunction initRoutineAddToCart(page) {\n    page = resolvePageContext(page);\n    if (page.ns !== 'cart' || !isEnabled()) {\n        return;\n    }\n\n    var raw;\n    try {\n        raw = sessionStorage.getItem('klaviyo_routine');\n    } catch (e) {\n        raw = null;\n    }\n\n    if (!raw && window.location.hash) {\n        var hashMatch = window.location.hash.match(/klaviyo_routine=([^&]*)/);\n        if (hashMatch) {\n            raw = decodeURIComponent(hashMatch[1]);\n        }\n    }\n\n    var handoff = parseRoutineHandoff(raw);\n    if (!handoff) {\n        return;\n    }\n\n    try {\n        sessionStorage.setItem('klaviyo_routine', JSON.stringify(handoff));\n    } catch (e) {\n        // ignore\n    }\n\n    var productIds = handoff.ids;\n    var trackItems = handoff.items;\n    var sentKey = productIds.join(',');\n    var sourceUrl = handoff.url || document.referrer || getTrackPageUrl();\n    var tracked = false;\n    var tracking = false;\n    var attempts = 0;\n    var maxAttempts = 3;\n\n    try {\n        if (window.location.hash && window.history && window.history.replaceState) {\n            window.history.replaceState({}, '', window.location.pathname + window.location.search);\n        }\n    } catch (e) {\n        // ignore\n    }\n\n    try {\n        if (sessionStorage.getItem(ROUTINE_SENT_KEY) === sentKey) {\n            clearRoutineHandoffOnly();\n            return;\n        }\n    } catch (e) {\n        // ignore\n    }\n\n    function clearRoutineHandoffOnly() {\n        try {\n            sessionStorage.removeItem('klaviyo_routine');\n        } catch (e) {\n            // ignore\n        }\n        try {\n            if (window.location.hash && window.history && window.history.replaceState) {\n                window.history.replaceState({}, '', window.location.pathname + window.location.search);\n            }\n        } catch (e) {\n            // ignore\n        }\n    }\n\n    function markRoutineSent() {\n        try {\n            sessionStorage.setItem(ROUTINE_SENT_KEY, sentKey);\n        } catch (e) {\n            // ignore\n        }\n        clearRoutineHandoffOnly();\n    }\n\n    function scheduleRetry() {\n        if (tracked || attempts >= maxAttempts) {\n            return;\n        }\n        attempts += 1;\n        setTimeout(track, 500);\n    }\n\n    function track() {\n        if (tracked || tracking || !productIds.length || typeof window.klaviyo === 'undefined') {\n            return;\n        }\n        tracking = true;\n        try {\n            var result = window.klaviyo.track('Added to Cart', {\n                Items: trackItems,\n                Source: 'routine',\n                URL: sourceUrl\n            });\n            if (result && typeof result.then === 'function') {\n                result.then(function () {\n                    tracked = true;\n                    tracking = false;\n                    markRoutineSent();\n                }).catch(function (err) {\n                    tracking = false;\n                    if (typeof console !== 'undefined') {\n                        console.log('Error in Klaviyo routine ATC: ' + err.message);\n                    }\n                    scheduleRetry();\n                });\n            } else {\n                tracked = true;\n                tracking = false;\n                markRoutineSent();\n            }\n        } catch (err) {\n            tracking = false;\n            if (typeof console !== 'undefined') {\n                console.log('Error in Klaviyo routine ATC: ' + err.message);\n            }\n            scheduleRetry();\n        }\n    }\n\n    onceOnKlaviyoReady(track);\n}\n\n/**\n * @param {Object} payload\n * @returns {Object}\n */\nfunction buildAddToCartTrackPayload(payload) {\n    if (payload.Items && payload.Items.length) {\n        return {\n            URL: payload.URL || window.location.href,\n            Source: payload.Source || '',\n            Items: payload.Items\n        };\n    }\n\n    return {\n        URL: payload.URL || window.location.href,\n        Source: payload.Source || '',\n        Items: [{\n            ProductID: String(payload.ProductID),\n            Quantity: payload.Quantity || 1,\n            ProductName: payload.ProductName || '',\n            ImageUrl: payload.ImageUrl || ''\n        }]\n    };\n}\n\n/**\n * @param {Object} payload\n * @returns {Promise}\n */\nfunction trackAddToCart(payload) {\n    var hasItems = payload && payload.Items && payload.Items.length && payload.Items[0].ProductID;\n    var hasLegacy = payload && payload.ProductID;\n    if (!hasItems && !hasLegacy) {\n        return Promise.resolve();\n    }\n\n    if (!isEnabled() || typeof window.klaviyo === 'undefined') {\n        return Promise.resolve();\n    }\n\n    var trackPayload = buildAddToCartTrackPayload(payload);\n\n    try {\n        var result = window.klaviyo.track('Added to Cart', trackPayload);\n        if (result && typeof result.then === 'function') {\n            return result.catch(function (err) {\n                if (typeof console !== 'undefined') {\n                    console.log('Error in Klaviyo trackAddToCart: ' + err.message + ', ' + err.stack);\n                }\n            });\n        }\n    } catch (err) {\n        if (typeof console !== 'undefined') {\n            console.log('Error in Klaviyo trackAddToCart: ' + err.message + ', ' + err.stack);\n        }\n    }\n\n    return Promise.resolve();\n}\n\n/**\n * Accepts classic Track API shape from buildKlaviyoUpdatedPayload\n * ({ event, customer_properties, properties, time }) or a flat properties object.\n * @param {Object} payload\n * @returns {Promise}\n */\nfunction trackUpdatedCart(payload) {\n    if (!payload) {\n        return Promise.resolve();\n    }\n\n    var allowEmpty = payload.allowEmpty === true;\n    var trackPayload = payload.properties && payload.properties.Items\n        ? payload.properties\n        : payload;\n\n    if (!Array.isArray(trackPayload.Items)) {\n        return Promise.resolve();\n    }\n\n    if (!trackPayload.Items.length && !allowEmpty) {\n        return Promise.resolve();\n    }\n\n    if (!isEnabled() || typeof window.klaviyo === 'undefined') {\n        return Promise.resolve();\n    }\n\n    try {\n        var result = window.klaviyo.track('Cart Updated', trackPayload);\n        if (result && typeof result.then === 'function') {\n            return result.catch(function (err) {\n                if (typeof console !== 'undefined') {\n                    console.log('Error in Klaviyo trackUpdatedCart: ' + err.message + ', ' + err.stack);\n                }\n            });\n        }\n    } catch (err) {\n        if (typeof console !== 'undefined') {\n            console.log('Error in Klaviyo trackUpdatedCart: ' + err.message + ', ' + err.stack);\n        }\n    }\n\n    return Promise.resolve();\n}\n\nmodule.exports = {\n    init: function (page) {\n        if (!isEnabled()) {\n            return;\n        }\n\n        customerIdentify();\n        initAddToCartTracking();\n        initUpdatedCartTracking(page || {});\n        initRoutineAddToCart(page || {});\n        initPageViewTracking(page || {});\n\n        if (window.KlaviyoConfig && window.KlaviyoConfig.purchase) {\n            schedulePurchaseTracking(page || {});\n        }\n\n        $(document).on('click', 'a[href*=\"Login-Logout\"]', clearIdentifiedSession);\n    },\n    identifyOnLoginSuccess: identifyOnLoginSuccess\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/klaviyoOnsite.js?\n}");
289
290/***/ }),
291
292/***/ "./cartridges/app_paulaschoice/cartridge/js/lazyload.js":
293/*!**************************************************************!*\
294  !*** ./cartridges/app_paulaschoice/cartridge/js/lazyload.js ***!
295  \**************************************************************/
296/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
297
298"use strict";
299eval("{/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vanilla-lazyload */ \"./node_modules/vanilla-lazyload/dist/lazyload.min.js\");\n/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vanilla_lazyload__WEBPACK_IMPORTED_MODULE_0__);\n\n\nconst createLazyLoadInstance = () => {\n    window.lazyLoadInstance = new (vanilla_lazyload__WEBPACK_IMPORTED_MODULE_0___default())();\n\treturn;\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (createLazyLoadInstance);\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/lazyload.js?\n}");
300
301/***/ }),
302
303/***/ "./cartridges/app_paulaschoice/cartridge/js/login.js":
304/*!***********************************************************!*\
305  !*** ./cartridges/app_paulaschoice/cartridge/js/login.js ***!
306  \***********************************************************/
307/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
308
309"use strict";
310eval("{\n\nvar dialog = __webpack_require__(/*! ./dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\"),\n    page = __webpack_require__(/*! ./page */ \"./cartridges/app_paulaschoice/cartridge/js/page.js\"),\n    validator = __webpack_require__(/*! ./validator */ \"./cartridges/app_paulaschoice/cartridge/js/validator.js\"),\n    progress = __webpack_require__(/*! ./progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\"),\n    scriptsInjection = __webpack_require__(/*! ./scriptsInjection.js */ \"./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js\"),\n    klaviyoOnsite = __webpack_require__(/*! ./klaviyoOnsite */ \"./cartridges/app_paulaschoice/cartridge/js/klaviyoOnsite.js\"),\n    passwordStrengthChecker = (__webpack_require__(/*! ./components/passwordStrengthChecker.js */ \"./cartridges/app_paulaschoice/cartridge/js/components/passwordStrengthChecker.js\")[\"default\"]),\n    recaptchaUtils = __webpack_require__(/*! ./recaptchaUtils */ \"./cartridges/app_paulaschoice/cartridge/js/recaptchaUtils.js\"),\n    captchaContainer = null,\n    captchaContainerRegister = null;\n\nvar LOGIN_CAPTCHA_CONTAINER = 'captcha_container_dialog';\nvar REGISTER_CAPTCHA_CONTAINER = 'captcha_container_dialog_register';\n\nfunction initRecaptcha() {\n    return recaptchaUtils.renderWidget(\n        LOGIN_CAPTCHA_CONTAINER,\n        recaptchaCallback,\n        function () { return captchaContainer; },\n        function (widgetId) { captchaContainer = widgetId; }\n    );\n}\n\nfunction initRecaptchaRegister() {\n    return recaptchaUtils.renderWidget(\n        REGISTER_CAPTCHA_CONTAINER,\n        recaptchaCallbackRegister,\n        function () { return captchaContainerRegister; },\n        function (widgetId) { captchaContainerRegister = widgetId; }\n    );\n}\n\nfunction ensureLoginRecaptcha() {\n    return recaptchaUtils.ensureWidget(\n        LOGIN_CAPTCHA_CONTAINER,\n        recaptchaCallback,\n        function () { return captchaContainer; },\n        function (widgetId) { captchaContainer = widgetId; },\n        initRecaptcha\n    );\n}\n\nfunction ensureRegisterRecaptcha() {\n    return recaptchaUtils.ensureWidget(\n        REGISTER_CAPTCHA_CONTAINER,\n        recaptchaCallbackRegister,\n        function () { return captchaContainerRegister; },\n        function (widgetId) { captchaContainerRegister = widgetId; },\n        initRecaptchaRegister\n    );\n}\n\nfunction runRecaptchaSubmit(executeFn, initFn) {\n    if (recaptchaUtils.isRecaptchaScriptMissing()) {\n        scriptsInjection.loadRecaptcha(executeFn, initFn);\n    } else {\n        executeFn();\n    }\n}\n\nfunction recaptchaCallback(response) {\n    return new Promise(function (resolve, reject) {\n\n        if (grecaptcha === undefined) {\n            reject();\n        }\n\n        $('#recaptchaLoginForm-input').val(response);\n        handleSignIn();\n    });\n}\n\nfunction recaptchaCallbackRegister(response) {\n    return new Promise(function (resolve, reject) {\n\n        if (grecaptcha === undefined) {\n            reject();\n        }\n\n        var form = $('#captcha_container_dialog_register').parents('form');\n        $(form).find('input[name=\"dwfrm_createaccount_customer_recaptcha\"]').val(response);\n        login.handlecreateaccount();\n    });\n}\n\nfunction handleSignIn() {\n    var signInBtn = $('.js-login-recaptcha')\n    var form = signInBtn.closest('form');\n\n    if (!form.valid()) {\n        return false;\n    }\n\n    progress.show();\n    $(\"<input/>\").attr({\n        type: \"hidden\",\n        name: signInBtn.attr(\"name\"),\n        value: signInBtn.attr(\"value\")\n    }).appendTo(form);\n    var formData = form.serialize();\n    var url = form.attr('action');\n    $.ajax({\n        type: \"POST\",\n        url: url,\n        data: formData\n    }).done(function (response) {\n        var accountUrl = signInBtn.attr('data-account-link');\n        progress.hide();
310\n        if (response.success) {\n            klaviyoOnsite.identifyOnLoginSuccess(form);\n            window.location.assign(accountUrl);\n        } else {\n            if (response.reason == 'passwordexpired') {\n                $('.js-login-error-message').html(response.message);\n            }\n            $('.js-login-error-message').show();\n            var errorMessage = $('.js-login-error-message').html();\n            window.dataLayer.push({\n                'eventCategory': 'Checkout Login',\n                'eventAction': 'Sign in and checkout error',\n                'eventLabel': errorMessage,\n                'event': 'GA Tracking',\n            });\n        }\n    });\n}\n\nvar login = {\n    /**\n     * @private\n     * @function\n     * @description init events for the loginPage\n     */\n    init: function () {\n        //o-auth binding for which icon is clicked\n        $('.oAuthIcon').bind('click', function () {\n            $('#OAuthProvider').val(this.id);\n        });\n\n\n        //toggle the value of the rememberme checkbox\n        $('#dwfrm_login_rememberme').bind('change', function () {\n            if ($('#dwfrm_login_rememberme').attr('checked')) {\n                $('#rememberme').val('true');\n            } else {\n                $('#rememberme').val('false');\n            }\n        });\n\n        $(document).on('click', '.js-password-reset-link', function (e) {\n            const currentEmailValue = ($('.js-email-field-to-copy').length && $('.js-email-field-to-copy').last().val().length) ? $('.js-email-field-to-copy').last().val() : null;\n            e.preventDefault();\n            window.dataLayer.push({\n                'eventCategory': 'Checkout Login',\n                'eventAction': 'Forgot password',\n                'eventLabel': 'None',\n                'event': 'GA Tracking',\n            });\n            dialog.open({\n                url: $(e.target).attr('href'),\n                closeText : '',\n                options: {\n                    open: function () {\n                        login.handleClick();\n                        login.copyEmail(currentEmailValue || window.currentEmailValue);\n                    },\n                    close: function() {\n                        dialog.$container.removeClass('reset-password-response');\n                    }\n                }\n            });\n        });\n\n        $(document).on('click', '[name=dwfrm_requestpassword_send]', function () {\n            window.dataLayer.push({\n                'eventCategory': 'Checkout Login',\n                'eventAction': 'Send new password',\n                'eventLabel': 'None',\n                'event': 'GA Tracking',\n            });\n        });\n\n        $('.field-password__button-show').on('click', function () {\n            var eventLabel = $(this).closest('form').hasClass('js-creat-account') ? 'Create account' : 'Sign in';\n            window.dataLayer.push({\n                'eventCategory': 'Checkout Login',\n                'eventAction': 'Show password',\n                'eventLabel': eventLabel,\n                'event': 'GA Tracking',\n            });\n        });\n\n        passwordStrengthChecker.init();\n\n        // close dialog and trigger .js show creating from after password reset\n        $(document).on('click', '.js-resource-passwordreset', function () {\n            dialog.close();\n            $('.js-show-creating-form').trigger('click');\n        });\n\n        // trigger to call popup registration after password reset from popup\n        $(document).on('click', '.js-resource-passwordresetpopup', function () {\n            if ($('.js-account-login') && $('.js-account-login').length) { // If we are on accont login and use header login popup, we should still expand the signup form, not load it in the popup.\n                dialog.close();\n                $('.js-show-creating-form').trigger('click');\n                return;\n            }\n            $('.js-resetpassword-popup').trigger('click');\n        });\n\n        $(document).on('click', '.js-create-account', function (e) {\n            e.preventDefault();\n            var $createaccountform = $('[name$=\"_createaccount\"]');\n\n            if (!$createaccountform.valid()) {\n                return;\n            }\n\n            if (!e.target.classList.contains('recaptcha')) {\
310n                login.handlecreateaccount();\n                return;\n            }\n\n            runRecaptchaSubmit(function () {\n                e.stopImmediatePropagation();\n                $('.js-createaccout-error-message').html('').hide();\n                ensureRegisterRecaptcha().then(recaptchaUtils.executeWidget);\n                ensureLoginRecaptcha();\n            }, initRecaptchaRegister);\n        });\n\n        $(document).on('click', '.js-show-creating-form', function () {\n            $(this).hide().siblings('p').hide();\n            $('.js-creat-account').addClass('open');\n            var recaptchaContainer = $('#captcha_container_register');\n            if (recaptchaContainer != null) {\n                recaptchaContainer.attr('id', REGISTER_CAPTCHA_CONTAINER);\n            }\n\n            recaptchaUtils.setupOnReady(initRecaptchaRegister);\n        });\n\n        $(document).on('click', '.js-trigger-creating-form', function () {\n            $('.js-show-creating-form').trigger('click');\n        });\n\n        $('body').on('click', '.js-login-recaptcha', function (e) {\n            e.preventDefault();\n            var form = $('.returning-customers');\n\n            if (!form.valid()) {\n                return false;\n            }\n\n            runRecaptchaSubmit(function () {\n                $('.js-login-error-message').hide();\n                ensureLoginRecaptcha().then(recaptchaUtils.executeWidget);\n            }, initRecaptcha);\n        });\n\n        $('.js-login-error-message').hide();\n        var recaptchaContainer = $('#captcha_container_login');\n        if (recaptchaContainer != null) {\n            recaptchaContainer.attr('id', LOGIN_CAPTCHA_CONTAINER);\n        }\n        recaptchaUtils.setupOnReady(initRecaptcha);\n    },\n\n    handlecreateaccount: function () {\n        var $createaccountform = $('[name$=\"_createaccount\"]');\n        var $submit = $createaccountform.find('[name$=\"_createaccount_send\"]');\n        validator.init();\n        if (!$createaccountform.valid()) {\n            return;\n        }\n        var data = $createaccountform.serialize();\n        var url = $createaccountform.attr('action');\n        // add form action to data\n        data += '&' + $submit.attr('name') + '=';\n        // make sure the server knows this is an ajax request\n        if (data.indexOf('ajax') === -1) {\n            data += '&format=ajax';\n        }\n        $.ajax({\n            type: 'POST',\n            url: url,\n            data: data,\n            success: function (response) {\n                if (!response.success) {\n                    $('.js-createaccout-error-message').html(response.result).show();\n                    window.dataLayer.push({\n                        'eventCategory': 'Checkout Login',\n                        'eventAction': 'Create account & check out error',\n                        'eventLabel': response.result,\n                        'event': 'GA Tracking',\n                      });\n                } else {\n                    var newsletter = document.getElementById('dwfrm_createaccount_subscribeToNewsletter').checked ? 'Newsletter optin' : 'No newsletter optin';\n                    window.dataLayer.push({\n                        'eventCategory': 'Checkout Login',\n                        'eventAction': 'Create account & check out',\n                        'eventLabel': newsletter,\n                        'event': 'GA Tracking',\n                    });\n                    window.location.href = response.target;\n                }\n            }\n        });\n        return false;\n    },\n\n    copyEmail: function(currentEmailValue) {\n        if ($('.js-email-field-to-paste')) {\n            $('.js-email-field-to-paste').val(currentEmailValue);\n        }\n    },\n\n    handleClick: function () {\n        var $requestPasswordForm = $('[name$=\"_requestpassword\"]');\n        var $submit = $requestPasswordForm.find('[name$=\"_requestpassword_send\"]');\n        $($submit).off('click').on('click', function (e) {\n            e.preventDefault();\n            validator.init();\n            if (!$requestPasswordForm.valid()) {\n                return;\n            }\n            var data = $requestPasswordForm.serialize();\n            // add form action to data\n            data += '&' + $submit.attr('name') + '=';\n            // make sure the server knows this is an ajax request\n            if (data.indexOf('ajax') === -1) {\n                data += '&format=ajax';\n            }\n            $.ajax({\n                type: 'POST',\n                url: $requestPasswordForm.attr('action'),\n                data: data,\n                success: function (response) {\n                    if (typeof response === 'object' &&\n                        !response.success &&\n                        response.error === 'CSRF Token Mismatch') {\n                        page.redirect(Urls.csrffailed);\n                    } else if (typeof response === 'string') {\n                        dialog.$container.append(response);\n                        dialog.$container.addClass('reset-password-response');\n                        $('.js-password-reset').on('click', function (e) {\n                            e.preventDefault();\n                            if ($('.js-account-login') && $('.js-account-login').length) {\n                                dialog.close();\n                                return;\n                            }\n                            dialog.$container.removeClass('reset-password-response');\n                        });\n                        login.handleClick();\n                    }\n                },\n                failure: function () {\n                    dialog.$container.html('<h1>' + Resources.SERVER_ERROR + '</h1>');\n                }\n            });\n        });\n    }\n};\n\nmodule.exports = login;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/login.js?\n}");
311
312/***/ }),
313
314/***/ "./cartridges/app_paulaschoice/cartridge/js/nav.js":
315/*!*********************************************************!*\
316  !*** ./cartridges/app_paulaschoice/cartridge/js/nav.js ***!
317  \*********************************************************/
318/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
319
320eval("{/**\n* @description Navigation interaction elements as defined in the PC-2653 A/B workshop\n*/\n\nvar util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nvar searchsuggest = __webpack_require__(/*! ./searchsuggest */ \"./cartridges/app_paulaschoice/cartridge/js/searchsuggest.js\");\nvar topHeader = __webpack_require__(/*! ./topheader */ \"./cartridges/app_paulaschoice/cartridge/js/topheader.js\");\nvar bodyScrollLock = __webpack_require__(/*! body-scroll-lock */ \"./node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js\");\nvar disableBodyScroll = bodyScrollLock.disableBodyScroll;\nvar enableBodyScroll = bodyScrollLock.enableBodyScroll;\n\nvar nav = ( function ($) {\n    var elem = {\n        menuTabs : null,\n        menuTab : null,\n        menuCategory : null,\n        menuToggle : null,\n        productsTabTrigger: null,\n        productsTab: null,\n        adviceTabTrigger: null,\n        adviceTab: null,\n        searchToggle: null\n    };\n\n\n    var priv =  {\n        displayMobileTabs: function () {\n            $(\"#wrapper\").addClass(\"sub-menu-active\");\n            $('.js-toggle-sub-menu').on('click', function (e) {\n                e.preventDefault();\n                topHeader.closeSearch();\n                var $parentLi = $(this).closest('li');\n                $parentLi.siblings('li').removeClass('active');\n                $parentLi.toggleClass('active');\n            });\n        },\n\n        selectTab: function(el) {\n            elem.menuTab.removeClass(\"active\");\n            elem.tabContent.removeClass(\"active\");\n            if( elem.menuTab.hasClass(\"hide\") ) {\n                elem.menuTab.removeClass(\"hide\");\n            }\n            el.addClass(\"active\");\n            var subj =  $(el).attr(\"id\").split(\"js-menu-tab-\")[1];\n            $(\"#js-tab-content-\" + subj).addClass(\"active\");\n            elem.navigation.removeClass(\"skin-care-active expert-advice-active\").addClass(subj + \"-active\");\n            priv.closeCategory();\n            topHeader.closeSearch();\n        },\n\n        selectCategory: function(el) {\n            elem.menuCategory.removeClass(\"active\");\n            var subj =  $(el).attr(\"class\").split(\"js-menu-category-\")[1];\n            $(\".js-menu-details\").removeClass(\"active\");\n            $(\"#js-menu-details-\" + subj).addClass(\"active\");\n            el.addClass(\"active\");\n            // util.isMobile() for some reason returns true in IE\n            if(  $(window).width() < 768) {\n                elem.tabContent.removeClass(\"active\");\n                elem.menuTabs.addClass(\"hide\");\n            } else {\n                topHeader.closeSearch();\n                if(!$(\"body\").hasClass(\"main-menu-open\")) {\n                    priv.openMenu();\n                }\n            }\n        },\n\n        closeCategory: function() {\n            var activeTab = $('.active[id^=\"js-menu-tab-\"]');\n            var subj = activeTab.attr(\"id\").split(\"js-menu-tab-\")[1];\n            elem.menuDetails.removeClass(\"active\");\n            elem.menuTabs.removeClass(\"hide\");\n            $(\"#js-tab-content-\" + subj).addClass(\"active\");\n            if( !util.isMobile() ||  $(window).width() >= 768 ) {\n                priv.closeMenu();\n            }\n        },\n\n        openMenu: function() {\n            disableBodyScroll($(\"#js-navigation\").get(0), {\n                allowTouchMove: el => {\n                    while (el && el !== document.body) {\n                        if (el.getAttribute(\"body-scroll-lock-ignore\") !== null) {\n                            return true;\n                        }\n                        el = el.parentNode;\n                    }\n                }\n            });\n            topHeader.closeSearch();\n            searchsuggest.clearResults();\n            function setClasses() {\n                elem.navigation.addClass(\"active\");\n                $(\"body\").addClass(\"main-menu-open\");\n                $('#wrapper').addClass('menu-visible');\n            }\n            setTimeout(setClasses, 100);\n        }
320,\n\n        closeMenu: function() {\n            if (elem.menuDetails.hasClass(\"active\")) {\n                priv.closeCategory();\n            }\n            elem.navigation.removeClass(\"active\");\n            $(\"body\").removeClass(\"main-menu-open\");\n            $('#wrapper').removeClass('menu-visible');\n            enableBodyScroll($(\"#js-navigation\").get(0));\n        },\n    };\n\n    return {\n        init: function() {\n            if(!$(\"body\").hasClass(\"PC-2653-B\")) {\n                return;\n            }\n\n            elem.navigation = $(\"#js-navigation\");\n            elem.menuTabs = $(\"#js-menu-tabs\");\n            elem.menuTab =  $(\"a[id^='js-menu-tab-']\");\n            elem.tabContent =  $(\"ul[id^='js-tab-content-']\");\n            elem.menuCategory =  $(\"a[class^='js-menu-category-']\");\n            elem.menuDetails =  $(\".js-menu-details\");\n\n            elem.productsTab = $(\"#js-menu-tab-skin-care\");\n            elem.productsCategories = $(\"#js-tab-content-skin-care\");\n            elem.adviceTab = $(\"#js-menu-tab-expert-advice\");\n\n            elem.menuToggle = $('.js-menu-toggle');\n            elem.menuBack = $('.js-menu-back');\n\n\n\n            // Display opened up\n            if( util.isMobile() ||  $(window).width() <= 768 ) {\n                priv.displayMobileTabs();\n            }\n\n            // Menu tab\n            elem.menuTab.on(\"click\", function(e) {\n                e.preventDefault();\n                priv.selectTab($(this));\n            });\n\n            // Subcategory menu\n            elem.menuCategory.on(\"click\", function(e) {\n                if ( !$(this).hasClass(\"js-menu-category-routinefinder\") && !$(this).hasClass(\"js-menu-category-contact\") ) {\n                    e.stopPropagation();\n                    e.preventDefault();\n                    priv.selectCategory($(this));\n                }\n            });\n\n            // Back button in subcategory menu\n            elem.menuBack.on(\"click\", function(e) {\n                e.preventDefault();\n                priv.closeCategory();\n            });\n\n            // Hamburger & close icon\n            elem.menuToggle.on(\"click\", function(e) {\n                e.preventDefault();\n                if ( $(\"body\").hasClass(\"main-menu-open\") && $(\"#js-navigation\").length > 0) {\n                    priv.closeMenu();\n                } else {\n                    priv.openMenu();\n                }\n            });\n\n            // Close menu when clicking on dark overlay\n            $(document).off(\"click\").on(\"click\", function(e) {\n                var navigationArea = ( util.isMobile() ||  $(window).width() <= 768 ) ?  elem.navigation.find(\"> div\") : elem.navigation;\n                var clickOutsideMenu = (!$(e.target).is(navigationArea) &&\n                                        !$(e.target).hasClass(\"js-tab-content\") &&\n                                        $(e.target).closest(navigationArea).length === 0 &&\n                                        $(e.target).closest('.js-tab-content').length === 0);\n                if ( clickOutsideMenu && !util.isMobile()) {\n                    navigationArea.on(\"click\", function(e) {\n                        e.stopPropagation();\n                    });\n                    priv.closeMenu();\n                }\n            });\n        }\n    };\n\n}( jQuery) );\n\nmodule.exports = nav;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/nav.js?\n}");
321
322/***/ }),
323
324/***/ "./cartridges/app_paulaschoice/cartridge/js/navaccountlayover.js":
325/*!***********************************************************************!*\
326  !*** ./cartridges/app_paulaschoice/cartridge/js/navaccountlayover.js ***!
327  \***********************************************************************/
328/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
329
330eval("{var dialog = __webpack_require__(/*! ./dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\");\nvar progress = __webpack_require__(/*! ./progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\");\nvar login = __webpack_require__(/*! ./login */ \"./cartridges/app_paulaschoice/cartridge/js/login.js\");\nvar scriptsInjection = __webpack_require__(/*! ./scriptsInjection */ \"./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js\");\nvar klaviyoOnsite = __webpack_require__(/*! ./klaviyoOnsite */ \"./cartridges/app_paulaschoice/cartridge/js/klaviyoOnsite.js\");\nvar recaptchaUtils = __webpack_require__(/*! ./recaptchaUtils */ \"./cartridges/app_paulaschoice/cartridge/js/recaptchaUtils.js\");\nvar captchaContainer = null;\nvar captchaContainerRegister = null;\n\nvar LOGIN_CAPTCHA_CONTAINER = 'captcha_container_dialog_login_popup';\nvar REGISTER_CAPTCHA_CONTAINER = 'captcha_container_dialog_register_popup';\n\nfunction initRecaptcha() {\n    if ($('.account-popup').css('display') !== 'none') {\n        captchaContainer = null;\n    }\n\n    return recaptchaUtils.renderWidget(\n        LOGIN_CAPTCHA_CONTAINER,\n        recaptchaCallback,\n        function () { return captchaContainer; },\n        function (widgetId) { captchaContainer = widgetId; }\n    );\n}\n\nfunction initRecaptchaRegister() {\n    if ($('.account-popup').css('display') !== 'none') {\n        captchaContainerRegister = null;\n    }\n\n    return recaptchaUtils.renderWidget(\n        REGISTER_CAPTCHA_CONTAINER,\n        recaptchaCallbackRegister,\n        function () { return captchaContainerRegister; },\n        function (widgetId) { captchaContainerRegister = widgetId; }\n    );\n}\n\nfunction ensureLoginRecaptcha() {\n    return recaptchaUtils.ensureWidget(\n        LOGIN_CAPTCHA_CONTAINER,\n        recaptchaCallback,\n        function () { return captchaContainer; },\n        function (widgetId) { captchaContainer = widgetId; },\n        initRecaptcha\n    );\n}\n\nfunction ensureRegisterRecaptcha() {\n    return recaptchaUtils.ensureWidget(\n        REGISTER_CAPTCHA_CONTAINER,\n        recaptchaCallbackRegister,\n        function () { return captchaContainerRegister; },\n        function (widgetId) { captchaContainerRegister = widgetId; },\n        initRecaptchaRegister\n    );\n}\n\nfunction runRecaptchaSubmit(executeFn, initFn) {\n    if (recaptchaUtils.isRecaptchaScriptMissing()) {\n        scriptsInjection.loadRecaptcha(executeFn, initFn);\n    } else {\n        executeFn();\n    }\n}\n\nfunction recaptchaCallbackRegister (response) {\n    return new Promise(function(resolve, reject) {\n\n           if (grecaptcha === undefined) {\n               reject();\n           }\n           $('#recaptchaHeaderRegister-input').val(response);\n           handleSignUp()\n    });\n}\n\n\nfunction recaptchaCallback (response) {\n    return new Promise(function(resolve, reject) {\n\n           if (grecaptcha === undefined) {\n               reject();\n           }\n           $('#recaptchaHeaderLogin-input').val(response);\n           handleSignIn()\n    });\n}\n\nfunction handleSignUp(){\n    var signInBtn = $('.js-layover-popup-create-account')\n    var form = signInBtn.closest('form');\n    if ( !form.valid() ) {\n        return false;\n    }\n    progress.show();\n    $(\"<input/>\").attr({type:\"hidden\", name: signInBtn.attr(\"name\"), value: signInBtn.attr(\"value\")}).appendTo(form);\n    var formData = form.serialize();\n    var url = form.attr('action');\n    $.ajax({\n        type: \"POST\",\n        url: url,\n        data: formData\n    }).done(function(response){\n        if ( response.success ) {\n            dialog.close();\n            window.location.assign(response.target);\n        } else {\n            progress.hide();\n            var popupHeader = $('.wishlist-popup__heading');\n            if ( popupHeader.siblings('.js-createaccout-error-message').length ) {\n                popupHeader.siblings('.js-createaccout-error-message').html(response.result);\n            } else {\n                popupHeader.after('<div class=\"js-createaccout-error-message error-form\">' + response.result + '</div>');\n            }\n        }\n    });\n}\n\nfunction handleSignIn(){\n    var signInBtn = $('.js-layover-popup-login')\n    var form = signInBtn.closest('form');\n\n    if ( !form.valid() ) {\n        return false;\n    }\n\n    progress.show();\n    $(\"<input/>\").attr({type:\"hidden\", name: signInBtn.attr(\"name\"), value: signInBtn.attr(\"value\")}).appendTo(form);\n    var formData = form.serialize();\n    var url = form.attr('action');\n    $.ajax({\n        type: \"POST\",\n        url: url,\n        data: formData\n    }).done(function(response) {\n        var accountUrl = $('.js-layover-popup-login').attr('data-account-link');\n        if ( response.success ) {\n            klaviyoOnsite.identifyOnLoginSuccess(form);\n            dialog.close();\n            window.location.assign(accountUrl);\n        } else {\n            progress.hide();\n            if (response.reason == 'passwordexpired') {\n                window.currentEmailValue = ($('.js-email-field-to-copy').length && $('.js-email-field-to-copy').last().val().length) ? $('.
330js-email-field-to-copy').last().val() : null;\n                $('.js-login-box').html(response.message);\n            } else {\n                $('.js-login-box').html(response);\n                var recaptchaContainer = $('#captcha_container_header_login');\n                if (recaptchaContainer != null) {\n                    recaptchaContainer.attr('id', 'captcha_container_dialog_login_popup');\n                }\n                captchaContainer = null;\n                recaptchaUtils.setupOnReady(initRecaptcha);\n            }\n        }\n    });\n}\n\nexports.init = function () {\n    login.init();\n    $(document).on('click', '.js-login-show-popup', function (e) {\n        e.stopImmediatePropagation();\n        progress.show();\n        var url = $(this).attr('data-href-open-popup');\n        $.ajax({\n            url: url\n        }).done(function(response){\n            progress.hide();\n            dialog.open({\n                autoOpen: true,\n                html: response,\n                draggable: false,\n                closeText : '',\n                options: {\n                    dialogClass: \"account-popup\",\n                    closeText : '',\n                    open: function() {\n                        $('.ui-widget-overlay').on('click', function () {\n                            dialog.close();\n                            login.init();\n                        });\n                    }\n                }\n            });\n            var recaptchaContainer = $('#captcha_container_header_login');\n            if (recaptchaContainer != null) {\n                recaptchaContainer.attr('id', LOGIN_CAPTCHA_CONTAINER);\n            }\n            recaptchaUtils.setupOnReady(initRecaptcha);\n        });\n    });\n\n    $(document).on('click', '.js-layover-popup-register', function (e) {\n        e.preventDefault();\n        progress.show();\n        var form = $(this).closest('form');\n        $(\"<input/>\").attr({type:\"hidden\", name:$(this).attr(\"name\"), value:$(this).attr(\"value\")}).appendTo(form);\n        var formData = form.serialize();\n        var url = form.attr('action');\n        $.ajax({\n            type: \"POST\",\n            url: url,\n            data: formData\n        }).done(function(response){\n            progress.hide();\n            dialog.open({\n                autoOpen: true,\n                html: response,\n                draggable: false,\n                closeText : '',\n                options: {\n                    dialogClass: \"account-popup account-popup--register\",\n                    closeText : '',\n                    open: function() {\n                        $('.ui-widget-overlay').on('click', function () {\n                            dialog.close();\n                            login.init();\n                        });\n                        const passwordStrengthChecker = (__webpack_require__(/*! ./components/passwordStrengthChecker.js */ \"./cartridges/app_paulaschoice/cartridge/js/components/passwordStrengthChecker.js\")[\"default\"]);\n                        passwordStrengthChecker.init();\n                    }\n                }\n            });\n            var recaptchaContainer = $('#captcha_container_header_register');\n            if (recaptchaContainer != null) {\n                recaptchaContainer.attr('id', REGISTER_CAPTCHA_CONTAINER);\n            }\n\n            recaptchaUtils.setupOnReady(initRecaptchaRegister);\n        });\n    });\n\n    $(document).on('click', '.js-layover-popup-login', function (e) {\n        e.preventDefault();\n        var form = $('.frmlogin');\n\n        if (!form.valid()) {\n            return false;\n        }\n\n        if (!e.target.classList.contains('recaptcha')) {\n            handleSignIn();\n            return;\n        }\n\n        runRecaptchaSubmit(function () {\n            ensureLoginRecaptcha().then(recaptchaUtils.executeWidget);\n        }, initRecaptcha);\n    });\n\n    $(document).on('click', '.js-layover-popup-create-account', function (e) {\n        e.preventDefault();\n        var form = $('#HeaderRegistrationForm');\n\n        if (!form.valid()) {\n            return false;\n        }
330\n\n        if (!e.target.classList.contains('recaptcha')) {\n            handleSignUp();\n            return;\n        }\n\n        runRecaptchaSubmit(function () {\n            ensureRegisterRecaptcha().then(recaptchaUtils.executeWidget);\n        }, initRecaptchaRegister);\n    });\n\n}\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/navaccountlayover.js?\n}");
331
332/***/ }),
333
334/***/ "./cartridges/app_paulaschoice/cartridge/js/newsletter.js":
335/*!****************************************************************!*\
336  !*** ./cartridges/app_paulaschoice/cartridge/js/newsletter.js ***!
337  \****************************************************************/
338/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
339
340"use strict";
341eval("{\n\nvar captchaContainers = {} ;\nvar gtmtracking = __webpack_require__(/*! ./gtmtracking */ \"./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js\");\nvar scriptsInjection = __webpack_require__(/*! ./scriptsInjection */ \"./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js\");\nvar recaptchaUtils = __webpack_require__(/*! ./recaptchaUtils */ \"./cartridges/app_paulaschoice/cartridge/js/recaptchaUtils.js\");\n\nfunction recaptchaCreate(containerid, callback) {\n\treturn recaptchaUtils.renderWidget(\n\t\tcontainerid,\n\t\tcallback.bind(null, containerid),\n\t\tfunction () { return captchaContainers[containerid]; },\n\t\tfunction (widgetId) { captchaContainers[containerid] = widgetId; }\n\t);\n}\n\nfunction initRecaptcha() {\n\tvar promises = [\n\t\trecaptchaCreate('captcha_container_newsletter', recaptchaCallback),\n\t\trecaptchaCreate('captcha_container_newsletter_customerservice', recaptchaCallback),\n\t\trecaptchaCreate('captcha_container_newsletter_page', recaptchaCallback),\n\t\trecaptchaCreate('captcha_container_newsletter_content_page', recaptchaCallback)\n\t];\n\n\tvar captchaIDElements = $('.js-captcha-id');\n\tvar i;\n\tfor (i = 0; i < captchaIDElements.length; i++) {\n\t\tpromises.push(recaptchaCreate(captchaIDElements[i].id, recaptchaCallbackForPageDesigner));\n\t}\n\n\treturn Promise.all(promises);\n}\n\nfunction ensureRecaptchaWidget(containerId) {\n\tif (captchaContainers[containerId]) {\n\t\treturn Promise.resolve(captchaContainers[containerId]);\n\t}\n\treturn initRecaptcha().then(function () {\n\t\treturn captchaContainers[containerId];\n\t});\n}\n\nfunction executeRecaptchaForButton(button) {\n\tvar containerId = $(button).attr('data-captchaId');\n\treturn ensureRecaptchaWidget(containerId).then(recaptchaUtils.executeWidget);\n}\n\nfunction recaptchaCallback (containerid,response) {\n\treturn new Promise(function(resolve, reject) {  \n\t    var form = $('#'+containerid).parents('form');\n\t    $(form).find('input[name=\"dwfrm_newsletter_recaptcha\"]').val(response);\n\t    formAjaxCall(form);\n\t});\n}\n\nfunction recaptchaCallbackForPageDesigner (containerid,response) {\n\treturn new Promise(function(resolve, reject) {  \n\t    var form = $('#'+containerid).parents('form');\n\t    $(form).find('input[name=\"dwfrm_newsletter_recaptcha\"]').val(response);\n\t    formAjaxCall(form);\n\t});\n}\n\nfunction handleSpecialEmarsysSubscriptionResponse(response, form){\n\tif(response.responseText.includes('accountexists')){\n\t\tshowError(form,response);\n\t}else if (response.responseText.includes('accountcreated')){\n\t\twindow.location.href = response.thankYouPage || EmarsysUrls.thankYouPage;\n\t}else if (response.responseText.includes('submitted')){\n\t\twindow.location.href = response.thankYouPage || EmarsysUrls.dataSubmittedPage;\n\t}else if (response.responseText.includes('error')){\n\t\twindow.location.href = EmarsysUrls.errorPage;\n\t}else if (response.responseText.includes('disabled')){\n\t\twindow.location.href = EmarsysUrls.emarsysDisabledPage;\n\t}else if (response.responseText.includes('signup')){\n\t\twindow.location.href = EmarsysUrls.emarsysSignup;\n\t}else if (response.responseText.includes('recaptcha Failed')){\n\t\twindow.location.reload();\n\t} else {\n\t\tshowError(form,response);\n\t}\n}\n\nvar KLAVIYO_FORM_NAME_BY_PAGE = {\n\tfooter: 'Footer',\n\tnewsletterpage: 'Newsletter',\n\tcustomerservice: 'Customer Service',\n\tcontentpage: 'Content Page',\n\tpagedesigner: 'Page Designer'\n};\n\nfunction isKlaviyoEnabledForNewsletter() {\n\treturn typeof KlaviyoPreferences !== 'undefined'\n\t\t&& KlaviyoPreferences.enabled\n\t\t&& typeof KlaviyoUrls !== 'undefined'\n\t\t&& !!KlaviyoUrls.subscribers;\n}\n\nfunction getNewsletterInputValue(form, namePart) {\n\tvar value = '';\n\t$(form).find('input[name]').each(function (index, node) {\n\t\tif (node.name.indexOf(namePart) !== -1 && node.value) {\n\t\t\tvalue = node.value;\n\t\t}\n\t});\n\treturn value;\n}\n\nfunction buildKlaviyoPayload(form) {\n\tvar $form = $(form);\n\tvar emarsysPage = $form.data('emarsysPage');\n\tvar formName = $form.find('input[name=\"emarsysFormName\"]').val();\n\n\tif (!formName && emarsysPage && KLAVIYO_FORM_NAME_BY_PAGE[emarsysPage]) {\n\t\tformName = KLAVIYO_FORM_NAME_BY_PAGE[emarsysPage];\n\t}\n\tif (emarsysPage === 'footer') {\n\t\tformName = 'Footer';\n\t}\n\tif (emarsysPage === 'contentpage' || formName === 'Content Page') {\n\t\tvar contentPageFormName = $form.data('formNameContentPages');\n\t\tif (contentPageFormName) {\n\t\t\tformName = contentPageFormName;\n\t\t}\n\t}\n\n\tvar email = $form.find('input[type=\"email\"]').val()\n\t\t|| $form.find('input[name=\"email\"]').val()\n\t\t|| getNewsletterInputValue(form, 'emailAddress');\n\tvar firstName = getNewsletterInputValue(form, 'firstName') || getNewsletterInputValue(form, 'firstname');\n\tvar lastName = getNewsletterInputValue(form, 'lastName') || getNewsletterInputValue(form, 'lastname');\n\tvar birthday = getNewsletterInputValue(form, 'birthDate') || getNewsletterInputValue(form, 'birthday');\n\tvar checkboxState = true;\n\tvar subscribeField = $form.find('input[name*=\"subscribe\"], input[name*=\"Subscribe\"]');\n\n\tif (subscribeField.filter(':checkbox').length) {\n\t\tcheckboxState = subscribeField.filter(':checkbox').is(':checked');\n\t}\n\n\treturn {\n\t\temail: email,\n\t\tfirstName: firstName || undefined,\n\t\tlastName: lastName || undefined,\n\t\tbirthday: birthday || undefined,\n\t\tlanguageTag: (typeof KlaviyoResources !== 'undefined' && KlaviyoResources.locale) || undefined,\n\t\tcheckboxState: checkboxState,\n\t\tformName: formName || undefined,\n\t\tisEcourse: $form.data('klaviyoIsEcourse') === true || $form.data('klaviyoIsEcourse') === 'true'\n\t};\n}\n\nfunction postKlaviyoSubscriber(form) {\n\tif (!isKlaviyoEnabledForNewsletter()) {\n\t\treturn $.when();\n\t}\n\n\tvar payload = buildKlaviyoPayload(form);\n\tif (!payload.email) {\n\t\treturn $.when();\n\t}\n\n\treturn $.ajax({\n\t\turl: KlaviyoUrls.subscribers,\n\t\tmethod: 'POST',\n\t\tcontentType: 'application/json',\n\t\tdata: JSON.stringify(payload)\n\t});\n}\n\nfunction getKlaviyoErrorMessage(response) {\n\tif (!response) {\n\t\treturn '';\n\t}\n\tif (response.result) {\n\t\treturn response.result;\n\t}\n\tif (response.error) {\n\t\treturn response.error;\n\t}\n\tif (response.message) {\n\t\treturn response.message;\n\t}\n\treturn '';\n}\n\nfunction getKlaviyoThankYouUrl(form) {\n\tvar $form = $(form);\n\tvar isEcourse = $form.data('klaviyoIsEcourse') === true || $form.data('klaviyoIsEcourse') === 'true';\n\tif (isEcourse && KlaviyoUrls.thankYouPageEcourse) {\n\t\treturn KlaviyoUrls.thankYouPageEcourse;\n\t}\n\treturn KlaviyoUrls.thankYouPage || '/';\n}\n\n/**\n * Emarsys pref off: subscribe via Klaviyo only (no Emarsys HTTP).\n */\nfunction handleKlaviyoOnlySubscribe(formElement, trackGtm) {\n\tpostKlaviyoSubscriber(formElement)\n\t\t.done(function (response) {\n\t\t\tif (response && response.success === false) {\n\t\t\t\tshowError(formElement, { result: getKlaviyoErrorMessage(response) });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twindow.location.href = getKlaviyoThankYouUrl(formElement);\n\t\t})\n\t\t.fail(function (xhr) {\n\t\t\tvar body = xhr && xhr.responseJSON;\n\t\t\tif (!body && xhr && xhr.responseText) {\n\t\t\t\ttry {\n\t\t\t\t\tbody = JSON.parse(xhr.responseText);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tbody = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshowError(formElement, { result: getKlaviyoErrorMessage(body) });\n\t\t})\n\t\t.always(trackGtm);\n}\n\nfunction handleEmarsysSubscriptionResponse(response, form) {\n\tif (response && response.success) {\
341n\t\tswitch (response.accountStatus) {\n\t\t\tcase 'accountexists':\n\t\t\t\tshowError(form,response);\n\t\t\t\tbreak;\n\t\t\tcase 'accountcreated':\n\t\t\t\twindow.location.href = response.thankYouPage || EmarsysUrls.thankYouPage;\n\t\t\t\tbreak;\n\t\t\tcase 'submitted':\n\t\t\t\twindow.location.href = response.thankYouPage || EmarsysUrls.dataSubmittedPage;\n\t\t\t\tbreak;\n\t\t\tcase 'error':\n\t\t\t\twindow.location.href = EmarsysUrls.errorPage;\n\t\t\t\tbreak;\n\t\t\tcase 'disabled':\n\t\t\t\twindow.location.href = EmarsysUrls.emarsysDisabledPage;\n\t\t\t\tbreak;\n\t\t\tcase 'signup':\n\t\t\t\twindow.location.href = EmarsysUrls.emarsysSignup;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\tif (response.result === 'recaptcha Failed') {\n\t\t\twindow.location.reload();\n\t\t} else {\n\t\t\tshowError(form,response);\n\t\t}\n\t}\n}\n\n\n\nfunction formAjaxCall (form) {\n    \n\tif(!$(form).valid()){\n        return;\n    }\n    \n    var url = $(form).attr('action');\n\n\tvar formElement = $(form);\n\tvar emarsysEnabled = !!$(form).data('isEmarsysEnabledForLocale');\n\tvar klaviyoEnabled = isKlaviyoEnabledForNewsletter();\n\n\tfunction trackGtm() {\n\t\tvar eventAction = formElement.data('eventaction');\n\n\t\tif (!!eventAction) {\n\t\t\tif (!pageContext || !pageContext.ns) {\n\t\t\t\tgtmtracking.newsletterSubscription(eventAction, window.location.href);\n\t\t\t} else {\n\t\t\t\tgtmtracking.newsletterSubscription(eventAction, pageContext.gtmPageType);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!emarsysEnabled && klaviyoEnabled) {\n\t\thandleKlaviyoOnlySubscribe(formElement, trackGtm);\n\t\treturn;\n\t}\n\n\tif ($(form).data('isEmarsysEnabledForLocale') && $(form).data('emarsysPage') === 'footer'){\n\t\tvar emarsysUrl = EmarsysUrls.footerSubscription;\n\t\turl = emarsysUrl;\n\t} else if ($(form).data('isEmarsysEnabledForLocale') && $(form).data('emarsysPage') === 'newsletterpage'){\n\t\tvar emarsysUrl = EmarsysUrls.emarsysSubscriptionPage;\n\t\turl = emarsysUrl;\n\t} else if ($(form).data('isEmarsysEnabledForLocale') && $(form).data('emarsysPage') === 'pagedesigner'){\n\t\tvar emarsysUrl = EmarsysUrls.emarsysSubscriptionPagePD;\n\t\turl = emarsysUrl;\n\t} else if ($(form).data('isEmarsysEnabledForLocale') && $(form).data('emarsysPage') === 'customerservice'){\n\t\tvar emarsysUrl = EmarsysUrls.customerServiceSubscription;\n\t\turl = emarsysUrl;\n\t}\n\n\n\t\n    var formData = {};\n    $(form).find(\"input[name]\").each(function (index, node) {\n        formData[node.name] = node.value;\n    });\n    formData['dwfrm_newsletter_submit'] = '';\n\n\tformData.formatajax = true;\n\tformData.subscribeType = $(form).data('emarsysPage');\n\tvar strategy = $(form).find('input[name=\"emarsysStrategy\"]').val();\n\tif (strategy) {\n\t\tformData.strategy = strategy === 'single' ? '1' : '2';\n\t}\n\tformData.formName = $(form).find('input[name=\"emarsysFormName\"]').val();\n\n\t$.post(url,formData).done(function(response){\n\t\tif (formElement.data('isEmarsysEnabledForLocale')){\n\t\t\tpostKlaviyoSubscriber(formElement).always(function () {\n\t\t\t\thandleEmarsysSubscriptionResponse(response, formElement);\n\t\t\t});\n\t\t} else if ( response.success ) {\n\t\t\tpostKlaviyoSubscriber(formElement).always(function () {\n\t\t\t\twindow.location.href = response.result;\n\t\t\t});\n        } else {\n        \tshowError(form,response);\n        }\n    }).fail(function (response) {\n\t\tif(response.status === 201 && typeof response.responseText){\n\t\t\tpostKlaviyoSubscriber(formElement).always(function () {\n\t\t\t\thandleSpecialEmarsysSubscriptionResponse(response, formElement);\n\t\t\t});\n\t\t}else {\n\t\t\tshowError(form,response);\n\t\t}\n    }).always(function() {\n\t\tvar eventAction = $(form).data('eventaction');\n\t\t\n\t\tif (!!eventAction) {\n\t\t\tif (!pageContext || !pageContext.ns) {\n\t\t\t\tgtmtracking.newsletterSubscription(eventAction, window.location.href); \n\t\t\t} else {\n\t\t\t\tgtmtracking.newsletterSubscription(eventAction, pageContext.gtmPageType);\n\t\t\t}\n\t\t}\n\t});\n}\n/**\n * @description Show Error Of Newsletter subscription response\n */\nfunction showError(form,response) {\n\tif( !!$(form).find('#dwfrm_newsletter_emailAddress-error').length) {\n\t\t$(form).find('#dwfrm_newsletter_emailAddress-error').text(response.result);\n\t\t$(form).find('#dwfrm_newsletter_emailAddress-error').css('display','block');\n\t} else if (!!$(form).find(\"input[name='dwfrm_newsletter_emailAddress'] ~ label.error\").length) {\n        $(form).find(\"input[name='dwfrm_newsletter_emailAddress'] ~ label.error\").text(response.result);\n\t} else {\n    \t$(form).find(\"input[name='dwfrm_newsletter_emailAddress']\" ).after('<label id=\"dwfrm_newsletter_emailAddress-error\" class=\"error\" for=\"dwfrm_newsletter_emailAddress\" style=\"display: block;\"></label>');\n    \t$(form).find('#dwfrm_newsletter_emailAddress-error').text(response.result);\n        $(form).find('#dwfrm_newsletter_emailAddress-error').css('display','block');\n\t}\n\n\tif($(form).find('.field_error').length == 1) {\n\t\t$(form).find('.field_error').html(response.result);\n\t}\n}\n/**\n * @description Initialize event handlers \n */\nfunction initEvents() {\n \n    $(document).on('click', '.js-newsletter-submit', function(e){\n        e.preventDefault();\n        var button = e.target || e.srcElement;\n        var form = $(button).parents('form');\n        formAjaxCall(form);\n    });\n    \n\tfunction handleRecaptchaSubmit(e) {\n\t\te.preventDefault();\n\n\t\tif (!isFormValid(e)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar button = this;\n\t\tvar runRecaptcha = function () {\n\t\t\texecuteRecaptchaForButton(button);\n\t\t};\n\n\t\tif (recaptchaUtils.isRecaptchaScriptMissing()) {\n\t\t\tscriptsInjection.loadRecaptcha(runRecaptcha, initRecaptcha);\n\t\t} else {\n\t\t\trunRecaptcha();\n\t\t}\n\t}\n\n    $(document).on('click', '.js-newsletter-submit-recaptcha', handleRecaptchaSubmit);\n\t$('.js-newsletter-footer-submit-recaptcha').on('click', handleRecaptchaSubmit);\n\t$('.js-newsletter-signup-submit-recaptcha').on('click', handleRecaptchaSubmit);\n}\n\nfunction isFormValid(e) {\n\tvar button = e.target || e.srcElement;\n    var form = $(button).parents('form');\n\tif(!$(form).valid()){\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nvar newsletter = {\n    init: function () {\n    \trecaptchaUtils.setupOnReady(initRecaptcha);\n    \tinitEvents();\n    }\n};\n\nmodule.exports = newsletter;\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/newsletter.js?\n}");
342
343/***/ }),
344
345/***/ "./cartridges/app_paulaschoice/cartridge/js/page.js":
346/*!**********************************************************!*\
347  !*** ./cartridges/app_paulaschoice/cartridge/js/page.js ***!
348  \**********************************************************/
349/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
350
351"use strict";
352eval("{\n\nvar util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar page = {\n    title: '',\n    type: '',\n    params: util.getQueryStringParams(window.location.search.substr(1)),\n    redirect: function (newURL) {\n        setTimeout(function () {\n            window.location.href = newURL;\n        }, 0);\n    },\n    refresh: function (customTimeout) {\n        var timeout = customTimeout || 500;\n        setTimeout(function () {\n            window.location.assign(window.location.href);\n        }, timeout);\n    }\n};\n\nmodule.exports = page;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/page.js?\n}");
353
354/***/ }),
355
356/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/account.js":
357/*!*******************************************************************!*\
358  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/account.js ***!
359  \*******************************************************************/
360/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
361
362"use strict";
363eval("{\n\nvar tooltip = __webpack_require__(/*! ../tooltip */ \"./cartridges/app_paulaschoice/cartridge/js/tooltip.js\"),\n    util = __webpack_require__(/*! ../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n    dialog = __webpack_require__(/*! ../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\"),\n    page = __webpack_require__(/*! ../page */ \"./cartridges/app_paulaschoice/cartridge/js/page.js\"),\n    login = __webpack_require__(/*! ../login */ \"./cartridges/app_paulaschoice/cartridge/js/login.js\"),\n    validator = __webpack_require__(/*! ../validator */ \"./cartridges/app_paulaschoice/cartridge/js/validator.js\"),\n    adyenCheckout = __webpack_require__(/*! ./checkout/adyen-checkout */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/adyen-checkout.js\"),\n    progress = __webpack_require__(/*! ../progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\"),\n    wishlist = __webpack_require__(/*! ./wishlist */ \"./cartridges/app_paulaschoice/cartridge/js/pages/wishlist.js\"),\n    passwordStrengthChecker = (__webpack_require__(/*! ../components/passwordStrengthChecker.js */ \"./cartridges/app_paulaschoice/cartridge/js/components/passwordStrengthChecker.js\")[\"default\"]),\n    showAddressTwo = (__webpack_require__(/*! ../pages/checkout/showAddressTwo */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/showAddressTwo.js\")[\"default\"]);\n\n/**\n * @function\n * @description Initializes the events on the address form (apply, cancel, delete)\n * @param {Element} form The form which will be initialized\n */\nfunction initializeAddressForm() {\n    var $form = $('#edit-address-form');\n\n    $form.find('input[name=\"format\"]').remove();\n\n    tooltip.init();\n\n    showAddressTwo();\n\n    $form.on('click', '.apply-button', function (e) {\n        e.preventDefault();\n        if (!$form.valid()) {\n            return false;\n        }\n        var url = util.appendParamToURL($form.attr('action'), 'format', 'ajax');\n        var applyName = $form.find('.apply-button').attr('name');\n        var options = {\n            url: url,\n            data: $form.serialize() + '&' + applyName + '=x',\n            type: 'POST'\n        };
363\n        $.ajax(options).done(function (data) {\n            if (typeof(data) !== 'string') {\n                if (!data.error) {\n                    $('#addresses').load($('#js-addressoverviewurl').val(), function () {\n                        $('.form-error').html(\"<span>\" + data.message + \"</span>\");\n                        window.setTimeout(function() {\n                            $('#addresses').find('.form-error').remove();\n                        }, 5000);\n                    });\n                } else {\n                    page.redirect(Urls.csrffailed);\n                }\n                $(\"html, body\").animate({ scrollTop: 0 }, \"slow\");\n            } else {\n                $('#dialog-container').html(data);\n                account.init();\n                tooltip.init();\n            }\n        });\n    })\n    .on('click', '.delete-button', function (e) {\n        e.preventDefault();\n        if (window.confirm(String.format(Resources.CONFIRM_DELETE, Resources.TITLE_ADDRESS))) {\n            var url = util.appendParamsToUrl(Urls.deleteAddress, {\n                AddressID: $form.find('#addressid').val(),\n                format: 'ajax'\n            });\n            $.ajax({\n                url: url,\n                method: 'POST',\n                dataType: 'json'\n            }
363).done(function (data) {\n                if (data.status.toLowerCase() === 'ok') {\n                    dialog.close();\n                    page.refresh();\n                } else if (data.message.length > 0) {\n                    window.alert(data.message);\n                    return false;\n                } else {\n                    dialog.close();\n                    page.refresh();\n                }\n            });\n        }\n    });\n\n    validator.init();\n\n    var countrySelect = $('.country');\n    $('.packstation-info').toggle(countrySelect.val() === 'DE');\n    countrySelect.on('change', function () {\n        $('.packstation-info').toggle(countrySelect.val() === 'DE');\n    });\n\n    $('[id$=\"_houseNumber\"],[id$=\"_postal\"]').on('change',function(){\n    \tvar country = $('[id$=\"_country\"]').val();\n    \tif ( country=='NL'||country=='GB' ) {\n    \t\tvar houseNumber = $('[id$=\"_houseNumber\"]').val();\n        \tvar postalCode = $('[id$=\"_postal\"]').val();\n        \tvar street = $('[id$=\"_address1\"]');\n        \tvar city = $('[id$=\"_city\"]');\n    \t\tif ( postalCode.length >= 4 && houseNumber.length >= 1 && street.val().length === 0 && city.val().length === 0 ) {\n    \t\t\t$.ajax({\n            \t\turl: Urls.autofillAddress,\n            \t\tdata: {'country':country,'postalCode':postalCode,'houseNumber':houseNumber},\n            \t\tdataType: 'text',\n            \t\tsuccess: function(response){\n            \t\t\tvar r = JSON.parse(response);\n            \t\t\tstreet.val(r.street);\n            \t\t\tcity.val(r.city);\n            \t\t}\n        \t\t});\n        \t}\n    \t}\n    });\n}\n/**\n * @private\n * @function\n * @description Toggles the list of Orders\n */\nfunction toggleFullOrder () {\n    $('.order-items')\n        .find('li.hidden:first')\n        .prev('li')\n        .append('<a class=\"toggle\">View All</a>')\n        .children('.toggle')\n        .click(function () {\n            $(this).parent().siblings('li.hidden').show();\n            $(this).remove();\n        });\n}\n\n/**\n * @function\n * @description Initializes the events on the orders form\n * @param {Element} form The form which will be initialized\n */\nfunction initOrderEvents() {\n    var $form = $('.js-order-form');\n    $form.find('input[name=\"format\"]').remove();\n    remainingProducts();\n\n    $(\".js-order-history\").each(function() {\n        $(this).on(\"click\", \".js-order-details\", function(e){\n            e.preventDefault();\n            var url = util.appendParamToURL($form.attr('action'), 'format', 'ajax');\n            var applyName = $(this).attr('name') ? $(this).attr('name') : $(this).data('name') ;\n            var options = {\n                url: url,\n                data: $form.serialize() + '&' + applyName + '=x',\n                type: 'POST'\n            };\n\n            progress.show();
363\n            $.ajax(options).done(function (data) {\n                $('#orders').html(data);\n                $(\"html, body\").animate({ scrollTop: 0 }, \"slow\");\n                progress.hide();\n            });\n        });\n    });\n}\n\n/**\n * @private\n * @function\n * @description Binds the events on the address form (edit, create, delete)\n */\nfunction initAddressEvents() {\n    var addresses = $('#addresses');\n    if (addresses.length === 0) { return; }\n\n    addresses.on('click', '.address-edit, .address-create', function (e) {\n        e.preventDefault();\n        var url = util.appendParamToURL($(this).attr('href'), 'format', 'ajax');\n        var options = {\n            url: url,\n            type: 'GET'\n        };\n        $.ajax(options).done(function (data) {\n            $('.js-addresses__form').show();\n            $('.js-addresses__form').html(data);\n            $('.address-create-button-container').hide();\n            appendHeader();\n            initializeAddressForm();\n            initAddressEvents;\n            var offset = $('.js-addresses__form').offset().top - 90;\n            window.scrollTo({\n                top: offset,\n                behavior: 'smooth'\n            });\n        });\n    })\n    .on('click', '.cancel-button, .close-button', function (e) {\n        e.preventDefault();\n        $('.js-addresses__form').hide();\n        $('.address-create-button-container').show();\n        initAddressEvents;\n    })\n    .on('click', '.delete', function (e) {\n        e.preventDefault();\n        $(this).parent().find('.js-address-hover').show();\n    })\n    .on('click', '.js-address-hover__btns-keep', function (e) {\n        e.preventDefault();\n        $('.js-address-hover').hide();\n    })\n    .on('click', '.address-hover__btns-delete', function (e) {\n        e.preventDefault();\n        var csrfToken = $(\".address-hover__btns-delete\").data(\"csrf\");\n        $.ajax({\n            url: util.appendParamToURL($(this).attr('href'), 'format', 'ajax'),\n            dataType: 'json',\n            data: { csrf_token : csrfToken }\n        }
363).done(function (data) {\n            if (data.status.toLowerCase() === 'ok') {\n                $('#addresses').load($('#js-addressoverviewurl').val(), function () {\n                    $('.form-error').html(data.message);\n                    window.setTimeout(function() {\n                        $('#addresses').find('.form-error').remove();\n                    }, 5000);\n                });\n            } else if (data.error) {\n                page.redirect(Urls.csrffailed);\n            } else {\n                $('#addresses').load($('#js-addressoverviewurl').val(), function () {\n                    $('.form-error').html(data.message);\n                    window.setTimeout(function() {\n                        $('#addresses').find('.form-error').remove();\n                    }, 5000);\n                });\n            }\n        });\n    })\n    .on('click', '.address-make-default', function (e) {\n        e.preventDefault();\n        $.ajax({\n            url: util.appendParamToURL($(this).attr('href'), 'format', 'ajax'),\n            dataType: 'json'\n        }
363).done(function (data) {\n            if (data.status.toLowerCase() === 'ok') {\n                $('#addresses').load($('#js-addressoverviewurl').val(), function () {\n                    $('.form-error').html(data.message);\n                    window.setTimeout(function() {\n                        $('#addresses').find('.form-error').remove();\n                    }, 5000);\n                });\n            } else if (data.error) {\n                page.redirect(Urls.csrffailed);\n            } else {\n                $('#addresses').load($('#js-addressoverviewurl').val(), function () {\n                    $('.form-error').html(data.message);\n                    window.setTimeout(function() {\n                        $('#addresses').find('.form-error').remove();\n                    }, 5000);\n                });\n            }\n        });\n    });\n}\n/**\n * @private\n * @function\n * @description Binds the events of the payment methods list (delete card)\n */\nfunction initPaymentEvents() {\n    $('.add-card').on('click', function (e) {\n        e.preventDefault();\n        dialog.open({\n            url: $(e.target).attr('href'),\n            closeText : '',\n            options: {\n                open: initializePaymentForm\n            }\n        });\n    });\n\n    var paymentList = $('.payment-list');\n    if (paymentList.length === 0) { return; }\n\n    util.setDeleteConfirmation(paymentList, String.format(Resources.CONFIRM_DELETE, Resources.TITLE_CREDITCARD));\n\n    $('form[name=\"payment-remove\"]').on('submit', function (e) {\n        e.preventDefault();\n        // override form submission in order to prevent refresh issues\n        var button = $(this).find('.delete');\n        $('<input/>').attr({\n            type: 'hidden',\n            name: button.attr('name'),\n            value: button.attr('value') || 'delete card'\n        }).appendTo($(this));\n        var data = $(this).serialize();\n        $.ajax({\n            type: 'POST',\n            url: $(this).attr('action'),\n            data: data\n        })\n        .done(function () {\n            page.redirect(Urls.paymentsList);\n        });\n    });\n}\n\nfunction initializePaymentForm() {\n    $('#CreditCardForm').on('click', '.cancel-button', function (e) {\n        e.preventDefault();\n        dialog.close();\n    });\n    if (SitePreferences.ADYEN_SF_ENABLED) {\n        adyenCheckout.initAccount();\n    }\n}\n\n\n/**\n * @private\n * @function\n * @description edit my details on my account pages.\n */\nfunction editProfileForm() {\n    var form = $('#EditUserForm');\n    form.on('click', '.js-fire-button', function (e) {\n        e.preventDefault();\n        if (!form.valid()) {\n            return false;\n        }\n        var url = $(form).attr('action');\n        var formData = {};\n        $(form).find(\"input[name]\").each(function (index, node) {\n            formData[node.name] = node.value;\n        });\n        formData['dwfrm_newsletter_submit'] = '';\n        $.post(url,formData).done(function(response){\n            showResultMessage(form,response);\n        }).fail(function (response) {\n            showResultMessage(form,response);\n        });\n    });\n}\n\n/**\n * @private\n * @function\n * @description change my password on my account pages.\n */\nfunction changePasswordForm() {\n    var form = $('#ChangePasswordForm');\n    passwordStrengthChecker.init();\n    form.on('click', '.js-fire-button', function (e) {\n        e.preventDefault();\n        if (!form.valid()) {\n            return false;\n        }\n        var url = $(form).attr('action');\n        var formData = {};\n        $(form).find(\"input[name]\").each(function (index, node) {\n            formData[node.name] = node.value;\n        });\n        formData['dwfrm_newsletter_submit'] = '';\n        $.post(url,formData).done(function(response){\n            showResultMessage(form,response);\n        }).fail(function (response) {\n            showResultMessage(form,response);\n        });\n    });\n}\n\n/**\n * @description Show results Of account form response\n */\nfunction showResultMessage(form,response) {\n\tif( $(form).find('.js-result-messages').length == 1) {\n        $(form).find('.js-result-messages').remove();\n\t\t$(form).find('legend').after(\"<p class='js-result-messages'>\"+response.result+\"</p>\");\n\t} else {\n    \t$(form).find('legend').after(\"<p class='js-result-messages'>\"+response.result+\"</p>\");\n    }
363\n    window.setTimeout(function() {\n        $(form).find('.js-result-messages').remove();\n    }, 5000);\n}\n\n//appending header in my address tab section\nfunction appendHeader() {\n    var formHeader = document.createElement('h1');\n    var formHeaderContent = document.createTextNode('Address');\n    formHeader.appendChild(formHeaderContent);\n    formHeader.classList.add('addresses__form-header');\n    var formFieldSet = document.querySelector('.js-addresses__form-fieldset').children[4];\n    formFieldSet.parentNode.insertBefore(formHeader, formFieldSet.nextSibling);\n}\n\n//calculation of remaining products in my orders tab section\nfunction remainingProducts() {\n    var productList = document.querySelectorAll('.order-items__list');\n\n    productList.forEach((e)=> {\n        var newArray = e;\n        var newArrayElements = newArray.children;\n\n        var arrayLimit = [].slice.call(newArrayElements);\n        var hiddenArrayPart = arrayLimit.slice(4);\n        var visibleArrayPart = arrayLimit.slice(0, 4);\n\n        for(var i=0; i < hiddenArrayPart.length; i++) {\n            hiddenArrayPart[i].style.display = 'none';\n        }\n\n        var div = document.createElement('div');\n        var span = document.createElement('span');\n        span.innerHTML = '+' + hiddenArrayPart.length;\n        div.className = 'order-items__remaining-value js-order-details';\n        div.dataset.name = newArray.parentElement.closest('li').querySelector('button.js-order-details').getAttribute(\"name\");\n        div.appendChild(span);\n\n        if(hiddenArrayPart.length > 0){\n            var lastElementOfVisibleArray = visibleArrayPart.pop();\n            lastElementOfVisibleArray.appendChild(div);\n        }\n    });\n}\n\n$(document).ready(function () {\n    $('#orders').on('click', '.js-order-back-button', function() {\n        progress.show();\n        $('#orders').load($('#js-orderreturnback').val(), function() {\n            initOrderEvents();\n            progress.hide();\n        });\n    });\n    $('.account__orders').on('click', '.account__content-page-header', function() {\n        var orderreturnback = $('#js-orderreturnback').val();\n        if(orderreturnback){\n            progress.show();\n            $('#orders').load(orderreturnback, function() {\n                initOrderEvents();\n                progress.hide();\n            });\n        }\n    });\n    $('#orders').on('click', '.fa-chevron-right', function() {\n        if (!$(this).hasClass(\"js-order-back-button\")) {\n            document.querySelector('.account__tabs').classList.remove('account__tabs--display');\n            document.querySelector('.account__content-page').style.display = 'none';\n        }\n    });\n    $(\".content-service-block-container .content-service-block\").each(function() {\n        $(this).on(\"click\", \".tablinks\", function(e){\n            e.preventDefault();\n            var selectedclass = $(this).attr('class').split(' ')[0];\n            $(\".account__tabs-list .tablinks\").each(function() {\n                if ($(this).hasClass(selectedclass)) {\n                    if ($(this).find('a').length) {\n                        window.location.href = window.location.origin + $(this).find('a').attr('href');\n                      } else {\n                        $(this).addClass('active');\n                      }\n                }\n            });\n        });\n    });\n\n    if (window.location.href.indexOf('#') > -1) {\n        var currentPage = window.location.href.split('#')[1];\n        $(\".account__tabs-list .tablinks\").each(function() {\n            if($(this).hasClass(currentPage)){\n                $(\".account__tabs-list .tablinks.active\").removeClass('active');\n                $('.tabcontent').hide('active');\n                $('.tabcontent' + '.' + currentPage).show();\n                $(this).addClass('active');\n            }\n        })\n    }\n\n    $('.wishlist-info').on('click', function() {\n        $('.account__tabs-list .wishlist').trigger('click');\n        document.getElementById('wrapper').classList.remove('menu-active');\n\n        if ( window.location.href.indexOf('#wishlist') > -1 ) {\n            document.querySelector('body').style.overflow = '';\n            document.getElementById('wrapper').classList.remove('menu-active');\n        }\n    });\n\n    if ($(\".js-account-username\").length && $(\".js-header-username\").length) {\n        $(\".js-account-username\").prependTo(\".js-header-username\").show();\n    }\n});\n\n/**\n * @private\n * @function\n * @description Binds the events of the order, address and payment pages\n */\nfunction initializeEvents() {\n    toggleFullOrder();\n    initAddressEvents();\n    initOrderEvents();\n    initPaymentEvents();\n    login.init();\n    editProfileForm();\n    changePasswordForm();
363\n    wishlist.init();\n}\n\nvar account = {\n    init: function () {\n        initializeEvents();\n    },\n    initCartLogin: function () {\n        login.init();\n    }\n};\n\nmodule.exports = account;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/account.js?\n}");
364
365/***/ }),
366
367/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/cart.js":
368/*!****************************************************************!*\
369  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/cart.js ***!
370  \****************************************************************/
371/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
372
373"use strict";
374eval("{\n\nvar bonusProductsView = __webpack_require__(/*! ../bonus-products-view */ \"./cartridges/app_paulaschoice/cartridge/js/bonus-products-view.js\"),\n    cartStoreInventory = __webpack_require__(/*! ../storeinventory/cart */ \"./cartridges/app_paulaschoice/cartridge/js/storeinventory/cart.js\"),\n    progress = __webpack_require__(/*! ../progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\"),\n    applepay = __webpack_require__(/*! ./checkout/applepay */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/applepay.js\"),\n    accordeon = __webpack_require__(/*! ../accordeon */ \"./cartridges/app_paulaschoice/cartridge/js/accordeon.js\"),\n    alhenaCart = __webpack_require__(/*! ../alhenaCart */ \"./cartridges/app_paulaschoice/cartridge/js/alhenaCart.js\");\n\n/**\n * @private\n * @function\n * @description Binds events to the cart page (edit item's details, bonus item's actions, coupon code entry)\n */\nfunction initializeEvents() {\n    accordeon.init();\n\n    $(document).on('click', '.js-show-bonus, .js-bonus-priduct-link', function (e) {\n        e.preventDefault();\n        bonusProductsView.show(this.href);\n    });\n\n    // override enter key for coupon code entry\n\t$('.js-cart-cupon-input').keypress(function(event){\n\t\tif ( event.keyCode == 13 ) {\n            event.preventDefault();\n            $('.js-cart-cupon-button').click();\n        }\n    });\n\n    //disable apply coupon button if the input is empty\n    if ($('.js-cart-cupon-input').length && (!!$('.js-cart-cupon-input').val().length || !!$('.js-cart-cupon-input').hasClass('error'))) {\n        $('.js-cart-cupon-button').prop('disabled', $('.js-cart-cupon-input').val().length === 0 || !!$('.js-cart-cupon-input').hasClass('error'));\n        accordeon.openAccordeon($('.js-accordeon-trigger'));\n    }\n\n    $('.js-cart-cupon-input').on('keyup input', function (e) {\n        $('.js-cart-cupon-button').prop('disabled', $(this).val().length === 0);\n    });\n\n    //to prevent multiple submissions of the form when removing a product from the cart\n    var removeItemEvent = false;\n    $('button[name$=\"deleteProduct\"]').on('click', function (e) {\n        if (removeItemEvent) {\n            e.preventDefault();\n        } else {\n            removeItemEvent = true;\n        }\n    });\n\n    $('.js-quantity').on('change', function(){\n        $('[name=dwfrm_cart_updateCart]').trigger('click');\n    });\n\n    $('.js-quantity-button').on('click', function(){\n\n        var $quantityInput = $(this).parent('td').find('.js-quantity');\n\n        $quantityInput.val($(this).hasClass('js-plus') ? $quantityInput.val() * 1 + 1 : $quantityInput.val() * 1 - 1);\n    });\n\n    $('.js-submit-cart,.paypal-button').on('click', function(e) {\n        if (($('#cart-items-form').length && !$('#cart-items-form').valid()) || ($('#js-cart-country-top-form').length && !$('#js-cart-country-top-form').valid())) {\n            e.preventDefault();\n        }\n    });\n\n    $(document).on('change', '[name=dwfrm_cartaddress_country]', function(){\n        var country = $(this).val();\n        if (country) {\n            progress.show();\n            const url = $('#cart-country').val();\n            $.ajax({\n                type: 'GET',\n                url: url,\n                data: {\n                    country: country\n                },\n                success: function (response) {\n                    $('.cart-order-totals').html(response);\n                    progress.hide();\n                }\n            });\n        }\n    });\n}\n\nexports.init = function () {\n    alhenaCart.init();\n    initializeEvents();\n    if (SitePreferences.STORE_PICKUP) {\n        cartStoreInventory.init();\n    }\n    applepay.init();\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/cart.js?\n}");
375
376/***/ }),
377
378/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/category.js":
379/*!********************************************************************!*\
380  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/category.js ***!
381  \********************************************************************/
382/***/ (function(module) {
383
384eval("{\nvar categoryPage = {\n    init: function () {\n        var categoryName;\n        \n        $('.scroll-down').on('click', function () {\n            var $this = $(this);\n            $('html, body').animate({\n                scrollTop: $this.offset().top + $this.height() - 28\n            }, 700, 'easeInOutQuad');\n        });\n\n        if ( pageContext.ns === 'search' ) {\n        \tcategoryName = $('.lister-top-info-header > h1').data('categoryid')\n        \t\t|| $('.slot-grid-header h1').data('categoryid')\n        \t\t|| $('.category-slot > .cat-banner > h1').data('categoryid')\n                || $('.category-slot > .cat-banner > h1').html()\n                || $('.category-scrolling-blocks > .category-scrolling-block > .block-wrapper > .block > h2').html();\n        }\n        \n        if (categoryName) {\n            categoryName = categoryName.replace(/\\n
384/g, '');\n            localStorage.setItem('categoryName',categoryName);\n        }\n    }\n};\n\nmodule.exports = categoryPage;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/category.js?\n}");
385
386/***/ }),
387
388/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/checkout/address.js":
389/*!****************************************************************************!*\
390  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/checkout/address.js ***!
391  \****************************************************************************/
392/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
393
394"use strict";
395eval("{\n\nvar util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nvar shipping = __webpack_require__(/*! ./shipping */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/shipping.js\");\nvar formPrepare = __webpack_require__(/*! ./formPrepare */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/formPrepare.js\");\nvar ajax = __webpack_require__(/*! ../../ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\");\n\n/**\n * @function\n * @description Selects the first address from the list of addresses\n */\nexports.init = function () {\n\t$(document).on('click','#paazl-checkout *',function(e){\n\t\te.preventDefault();\n\t});\n\t$('.method-select__tab--delivery').on('click',function(){\n\t\tlocalStorage.paazlTab = 'DELIVERY';\n\t});\n\t$('.method-select__tab--pickup').on('click',function(){\n\t\tlocalStorage.paazlTab = 'PICKUP';\n\t});\n    var $form = $('.address').find('fieldset#shipping-form, fieldset#billing-form');\n    // re-validate the form function\n    var reValidateForm = function() {\n    \tif ( $form.attr('id') == 'shipping-form' ) {\n\t        formPrepare.init({\n\t            continueSelector: '[name$=\"shippingAddress_save\"]',\n\t            formSelector: '[id=\"shipping-form\"]'\n\t        });\n        } else if ( $form.attr('id') == 'billing-form' ) {\n\t        formPrepare.init({\n\t            continueSelector: '[name$=\"shippingAddress_save\"]',\n\t            formSelector: '[id=\"billing-form\"]'\n\t        });\n        }\n    };\n    // select address from saved address list and fill shipping address fields automatically\n    $('#shipping-form select[name$=\"_addressList\"]').on('change', function () {\n        var selected = $(this).children(':selected').first();\n        var selectedAddress = $(selected).data('address');\n        if (!selectedAddress) { return; }\n        util.fillAddressFields(selectedAddress, $('.address').find('fieldset#shipping-form'));\n        shipping.updateShippingMethodList();\n        reValidateForm();\n    }); \n    // select address from saved address list and fill billing address fields automatically\n    $('#billing-form select[name$=\"_addressList\"]').on('change', function () {\n        var selected = $(this).children(':selected').first();\n        var selectedAddress = $(selected).data('address');\n        if (!selectedAddress) { return; }\n        util.fillAddressFields(selectedAddress,$('.address').find('fieldset#billing-form'));\n        shipping.updateShippingMethodList();\n        reValidateForm();\n    });\n    \n    var formInput = {};\n    $form.find('input,select').on('change', function () {\n\t\tvar changeInput = $(this).attr('name');\n    \t// validation\n    \tvar differentBilling = document.getElementById('dwfrm_singleshipping_shippingAddress_differentBillingAddress');\n    \tif ( differentBilling && differentBilling.checked ) {\n\t        formPrepare.init({\n\t            continueSelector: '[name$=\"shippingAddress_save\"]',\n\t            formSelector: '[id=\"shipping-form\"],[id=\"billing-form\"]'\n\t        });\n        } else {\n\t        formPrepare.init({\n\t            continueSelector: '[name$=\"shippingAddress_save\"]',\n\t            formSelector: '[id=\"shipping-form\"]'\n\t        });\n        }\n    \t// save user input in session\n    \t$(this).closest('fieldset').find('input,select').each(function(){\n    \t\tvar name = $(this).attr('name');\n    \t\tif ( typeof name !== typeof undefined && name !== false ) {\n    \t\t\tname = name.split('_');\n    \t\t\tname = name[name.length-1];\n    \t\t}\n        \tif ( name == 'differentBillingAddress' || name == 'subscribeToNewsletter' || name == 'addToAddressBook' || name == 'ingredientListAsHardCopy' ) {\n        \t\tformInput[name] = $(this).prop('checked');\n        \t} else if (name == 'brandCode' ) {\n        \t\tif ( $(this).is(':checked') ) {\n        \t\t\tformInput[name] = $(this).val();\n        \t\t}\n    \t\t} else {\n    \t\t\tformInput[name] = $(this).val();\n    \t\t}\n        \t// Re-initiate Paazl widget to set new consignee postal code\n        \tif ( name == 'postal' && $(this).closest('fieldset').attr('id') == 'shipping-form' && (typeof PaazlCheckout != 'undefined') && $('#paazl-checkout').length ) {\n        \t\tvar newPostal = formInput['postal'];
395\n        \t\tif ( newPostal.length ) {\n        \t\t\tPaazlCheckout.setConsigneePostalCode(newPostal);\n        \t\t}\n        \t}\n    \t});\n    \tif ( $(this).closest('fieldset').attr('id') == 'shipping-form' ) {\n\t\t\tPromise.resolve($.ajax({\n\t\t\t\turl: Urls.saveShippingAddress,\n\t    \t\tdata: formInput\n\t\t\t})).then(function (response) {\n\t\t\t\tif (response.error) {\n\t\t\t\t\tthrow new Error(response.error);\n\t\t\t\t} else {\n\t\t\t\t\t//check paazl on country change\n\t\t\t\t\tif(changeInput == \"dwfrm_singleshipping_shippingAddress_addressFields_country\" || changeInput == \"dwfrm_singleshipping_addressList\") {\n\t\t\t\t\t\tvar $shippingMethodList = $('#js-paazl-wrapper');\n\t\t\t\t\t\tif (!$shippingMethodList || $shippingMethodList.length === 0) { return; }\n\t\t\t\t\t\tvar url = Urls.shippingMethodsListPaazl;\n\t\t\t\t\t\tajax.load({\n\t\t\t\t\t\t\turl: url,\n\t\t\t\t\t\t\tcallback: function (response) {\n\t\t\t\t\t\t\t\t$shippingMethodList.html(response);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n    \t} else if ( $(this).closest('fieldset').attr('id') == 'billing-form' ) {\n    \t\t$.ajax({\n\t    \t\turl: Urls.saveBillingAddress,\n\t    \t\tdata: formInput\n\t    \t});\n    \t}\n    });\n    \n    $('[id$=\"_addressFields_houseNumber\"],[id$=\"_addressFields_postal\"]').on('change',function(){\n    \tvar country = $('[id$=\"_addressFields_country\"]').val();\n    \tif ( country=='NL'||country=='GB' ) {\n    \t\tvar houseNumber = $('[id$=\"_addressFields_houseNumber\"]').val();\n        \tvar postalCode = $('[id$=\"_addressFields_postal\"]').val();\n        \tvar street = $('[id$=\"_addressFields_address1\"]');\n        \tvar city = $('[id$=\"_addressFields_city\"]');\n    \t\tif ( postalCode.length >= 4 && houseNumber.length >= 1 && street.val().length === 0 && city.val().length === 0 ) {\n    \t\t\t$.ajax({\n            \t\turl: Urls.autofillAddress,\n            \t\tdata: {'country':country,'postalCode':postalCode,'houseNumber':houseNumber},\n            \t\tdataType: 'text',\n            \t\tsuccess: function(response){\n            \t\t\tif(response){\n            \t\t\t\tvar r = JSON.parse(response);\n                \t\t\tstreet.val(r.street);\n\t\t\t\t\t\t\tstreet.valid();\n                \t\t\tcity.val(r.city);\n\t\t\t\t\t\t\tcity.valid();\n            \t\t\t}\n            \t\t}\n        \t\t});\n        \t}\n    \t}\n    });\n\n\t$(document).on('click','#paazl-checkout .options__item',function() {\n\t\tsetTimeout(function () {\n\t\t\t$.ajax({\n\t\t\t\turl: Urls.updatePaazlShippingPrice,\n\t\t\t\tdataType: 'text',\n\t\t\t\tsuccess: function(response) {\n\t\t\t\t\tif(response){\n\t\t\t\t\t\tvar res = JSON.parse(response);\n\t\t\t\t\t\tif (res && res.shippingPrice && res.totalPrice) {\n\t\t\t\t\t\t\t$('.js-order-shipping-value').html(res.shippingPrice);\n\t\t\t\t\t\t\t$('.order-totals-table .order-value').html(res.totalPrice);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 1000);\n\t});\n\n\t$('#shipping-form .field-wrapper .required').on('blur', function () {\n\t\tconst emailField = $('#dwfrm_singleshipping_shippingAddress_email_emailAddress'); \n\t\tlet formValid = true;\n\n\t\t$('#shipping-form .field-wrapper .required').each(function(){\n\t\t\tif(!$(this).val()){\n\t\t\t\tformValid = false;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t\tif (formValid && !emailField.hasClass('error')) {\n\t\t\t$.ajax({\n\t\t\t\turl: Urls.isFirstCustomerOrder,\n\t\t\t\tdata: {'email': emailField.val()},\n\t\t\t\tdataType: 'text',\n\t\t\t\tsuccess: function(response){\n\t\t\t\t\tif(response){\n\t\t\t\t\t\tvar res = JSON.parse(response);\n\t\t\t\t\t\tif (res && res.success){\n\t\t\t\t\t\t\tif (res.successMsg){\n\t\t\t\t\t\t\t\t$('.js-first-order-msg').removeClass('hide').html(res.successMsg);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$('.js-first-order-msg').addClass('hide');\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\tif (res.successLabel){\n\t\t\t\t\t\t\t\t$('.js-order-shipping-label').html(res.successLabel);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$('.js-order-shipping-label').html('');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (res.oldShippingPrice){\n\t\t\t\t\t\t\t\t$('.js-order-shipping-old-value').html(res.oldShippingPrice);\n\t\t\t\t\t\t\t\t$('.js-order-shipping-value').hide();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$('.js-order-shipping-old-value').html('')\n\t\t\t\t\t\t\t\tif(res.shippingPrice === 0 && res.successMsg) {\n\t\t\t\t\t\t\t\t\t$('.js-order-shipping-value').hide();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$('.js-order-shipping-value').show().html(res.shippingPriceFormatted);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (res.totalPrice){\n\t\t\t\t\t\t\t\t$('.order-totals-table .order-value').html(res.totalPrice);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} \n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\t\t\n\t\t}\n\t});\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/checkout/address.js?\n}");
396
397/***/ }),
398
399/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/checkout/adyen-checkout.js":
400/*!***********************************************************************************!*\
401  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/checkout/adyen-checkout.js ***!
402  \***********************************************************************************/
403/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
404
405"use strict";
406eval("{\n\nconst progress = __webpack_require__(/*! ../../progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\");\n\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context);
406 if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (undefined === method) { if (context.delegate = null, \"throw\" === context.method) { if (delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method)) return ContinueSentinel; context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a 'throw' method\"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEac
406h(resetTryEntry), !skipTempReset) for (var name in this) { \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { tr
406y { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\n\nvar qrCodeMethods = ['swish', 'wechatpayQR', 'bcmc_mobile', 'pix'];\nvar installmentLocales = ['pt_BR', 'ja_JP', 'tr_TR', 'es_MX'];\nvar maskedCardNumber;\nvar MASKED_CC_PREFIX = '************';\nvar selectedMethod;\nvar componentsObj = {};\nvar checkoutConfiguration;\nvar sessionsResponse;\nvar paymentMethodsResponse;\nvar checkout;\nvar formErrorsExist;\nvar isValid;\nvar paypalTerminatedEarly = false;\n/**\n * @function\n * @description Initializes Adyen Secured Fields  Billing events\n */\nfunction initializeBillingEvents() {\n  return _initializeBillingEvents.apply(this, arguments);\n}\nfunction _initializeBillingEvents() {\n  _initializeBillingEvents = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {\n    return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            $('#billing-submit').on('click', function () {\n              var isAdyenPOS = document.querySelector('[name=dwfrm_billing_paymentMethods_selectedPaymentMethodID]').value === 'AdyenPOS';\n              var isAdyen = document.querySelector('[name=dwfrm_billing_paymentMethods_selectedPaymentMethodID]').value === 'AdyenComponent';\n              if (isAdyenPOS) {\n                document.querySelector('#dwfrm_adyPaydata_terminalId').value = document.querySelector('#terminalList').value;\n                return true;\n              }\n              if (isAdyen) {\n                var adyenPaymentMethod = document.querySelector('#adyenPaymentMethodName');\n                var paymentMethodLabel = document.querySelector(\"#lb_\".concat(selectedMethod)).innerHTML;\n                adyenPaymentMethod.value = paymentMethodLabel;\n                window.dataLayer.push({\n                    'eventCategory': 'Billing page',\n                    'eventAction': 'Continue to billing',\n                    'eventLabel': paymentMethodLabel,\n                    'event': 'GA Tracking',\n                });\n                validateComponents();\n                return showValidation();\n              }\n            });\n            if (!window.sessionsResponse) {\n              _context2.next = 16;\n              break;\n            }\n            sessionsResponse = window.sessionsResponse;\n            checkoutConfiguration = window.Configuration;\n            checkoutConfiguration.onChange = function (state /* , component */) {\n              isValid = state.isValid;\n              if (!componentsObj[selectedMethod]) {\n                componentsObj[selectedMethod] = {};\n              }\n              componentsObj[selectedMethod].isValid = isValid;\n              componentsObj[selectedMethod].stateData = state.data;\n            };\n            checkoutConfiguration.showPayButton = false;\n            checkoutConfiguration.paymentMethodsConfiguration = {\n              card: getCardConfig(),\n              bcmc: getCardConfig(),\n              storedCard: getCardConfig(),\n              boletobancario: {\n                personalDetailsRequired: true,\n                // turn personalDetails section on/off\n                billingAddressRequired: false,\n                // turn billingAddress section on/off\n                showEmailAddress: false // allow shopper to specify their email address\n              },\n\n              paywithgoogle: getGooglePayConfig(),\n              googlepay: getGooglePayConfig(),\n              paypal: {\n                environment: window.Configuration.environment,\n                showPayButton: true,\n                onClick: function onClick(data, actions) {\n                  if (paypalTerminatedEarly) {\n                    paymentFromComponent({\n                      cancelTransaction: true,\n                      merchantReference: document.querySelector('#merchantReference').value\n                    });\n                    paypalTerminatedEarly = false;\n                    return actions.resolve();\n                  }\n                  paypalTerminatedEarly = true;\n                  if (formErrorsExist) {\n                    paypalTerminatedEarly = false;\n                    return actions.reject();\n                  }\n                },\n                onSubmit: function onSubmit(state, component) {\n                  assignPaymentMethodValue();\n                  paymentFromComponent(state.data, component);\n                  document.querySelector('#adyenStateData').value = JSON.stringify(state.data);\n                },\n                onCancel: function onCancel(data, component) {\n                  paypalTerminatedEarly = false;\n                  paymentFromComponent({\n                    cancelTransaction: true,\n                    merchantReference: document.querySelector('#merchantReference').value\n                  }, component);\n                },\n                onError: function onError( /* error, component */\n                ) {\n                  paypalTerminatedEarly = false;\n                  paymentFromComponent({\n                    cancelTransaction: true,\n                    merchantReference: document.querySelector('#merchantReference').value\n                  });\n                },\n                onAdditionalDetails: function onAdditionalDetails(state /* , component */) {\n                  paypalTerminatedEarly = false;\n                  document.querySelector('#paymentFromComponentStateData').value = JSON.stringify(state.data);\n                  $('.js-billing-submit-hidden').trigger('click');\n                }\n              },\n              mbway: {\n                showPayButton: true,\n                onSubmit: function onSubmit(state, component) {\n                  assignPaymentMethodValue();\n                  if (formErrorsExist) {\n                    return false;\n                  }\n                  document.getElementById('component_mbway').querySelector('button').disabled = true;\n                  paymentFromComponent(state.data, component);\n                  document.querySelector('#adyenStateData').value = JSON.stringify(state.data);\n                },\n                onError: function onError( /* error, component */\n                ) {\n                },\n                onAdditionalDetails: function onAdditionalDetails(state /* , component */) {\n                  document.querySelector('#paymentFromComponentStateData').value = JSON.stringify(state.data);\n                  $('.js-billing-submit-hidden').trigger('click');\n                }\n              },\n              swish: getQRCodeConfig(),\n              bcmc_mobile: getQRCodeConfig(),\n              wechatpayQR: getQRCodeConfig(),\n              pix: getQRCodeConfig(),\n              amazonpay: getAmazonpayConfig()\n            };\n            if (window.googleMerchantID !== 'null' && window.Configuration.environment === 'live') {\n              checkoutConfiguration.paymentMethodsConfiguration.paywithgoogle.configuration.merchantIdentifier = window.googleMerchantID;\n              checkoutConfiguration.paymentMethodsConfiguration.googlepay.configuration.merchantIdentifier = window.googleMerchantID;\n            }\n            if (window.cardholderNameBool !== 'null') {\n              checkoutConfiguration.paymentMethodsConfiguration.card.hasHolderName = true;\n              checkoutConfiguration.paymentMethodsConfiguration.card.holderNameRequired = true;\n            }\n            checkoutConfiguration.session = {\n              id: window.sessionsResponse.id,\n              sessionData: window.sessionsResponse.sessionData\n            };\n            _context2.next = 12;\n            return AdyenCheckout(checkoutConfiguration);\n          case 12:\n            checkout = _context2.sent;\n            paymentMethodsResponse = checkout.paymentMethodsResponse;\n            $('#paymentMethodsList li').not('#li_giftcert').not('#li_applepay').detach();\n            renderGenericComponent();\n          case 16:\n          case \"end\":\n            return _context2.stop();\n        }\n      }\n    }, _callee2);\n  }));\n  return _initializeBillingEvents.apply(this, arguments);\n}\nfunction zeroAuth(data, checkout) {\n  $.ajax({\n    url: window.zeroAuthURL,\n    type: 'POST',\n    contentType: 'application/; charset=utf-8',\n    data: JSON.stringify(data),\n    async: false,\n    success: function success(data) {\
406n      if (data.zeroAuthResult.action) {\n        document.querySelector('#buttonsContainer').style.display = 'none';\n        checkout.createFromAction(data.zeroAuthResult.action).mount('#newCard');\n      }\n      if (data.zeroAuthResult.resultCode === 'Authorised') {\n        window.location.href = window.paymentInstrumentsList;\n      } else if (data.zeroAuthResult.resultCode === 'Refused') {\n        window.location.href = window.paymentInstrumentsListError;\n      }\n    }\n  });\n}\nfunction paymentsDetails(state) {\n  $.ajax({\n    type: 'post',\n    url: window.paymentsDetails,\n    data: JSON.stringify({\n      data: state.data\n    }),\n    contentType: 'application/; charset=utf-8',\n    async: false,\n    success: function success(data) {\n      if (data.response.isSuccessful) {\n        window.location.href = window.paymentInstrumentsList;\n      } else if (!data.response.isFinal && _typeof(data.response.action) === 'object') {\n        checkout.createFromAction(data.action).mount('#action-container');\n      } else {\n        window.location.href = window.paymentInstrumentsListError;\n      }\n    }\n  });\n}\n\n/**\n * @function\n * @description Initializes Adyen Checkout My Account events\n */\nfunction initializeAccountEvents() {\n  return _initializeAccountEvents.apply(this, arguments);\n}\nfunction _initializeAccountEvents() {\n  _initializeAccountEvents = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {\n    var newCard, adyenStateData, isValid, node;\n    return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n      while (1) {\n        switch (_context3.prev = _context3.next) {\n          case 0:\n            checkoutConfiguration = window.Configuration;\n            checkoutConfiguration.onAdditionalDetails = function (state) {\n              paymentsDetails(state);\n            };\n            checkoutConfiguration.session = window.sessionData;\n            _context3.next = 5;\n            return AdyenCheckout(checkoutConfiguration);\n          case 5:\n            checkout = _context3.sent;\n            newCard = document.getElementById('newCard');\n            isValid = false;\n            node = checkout.create('card', {\n              hasHolderName: true,\n              holderNameRequired: true,\n              onChange: function onChange(state) {\n                adyenStateData = state.data;\n                isValid = state.isValid;\n              }\n            }).mount(newCard);\n            $('#applyBtn').on('click', function (e) {\n              e.preventDefault();\n              if (!isValid) {\n                node.showValidation();\n                return false;\n              }\n              document.querySelector('#adyenStateData').value = JSON.stringify(adyenStateData);\n              zeroAuth(adyenStateData, checkout);\n            });\n          case 10:\n          case \"end\":\n            return _context3.stop();\n        }\n      }\n    }, _callee3);\n  }));\n  return _initializeAccountEvents.apply(this, arguments);\n}\nfunction assignPaymentMethodValue() {\n  var adyenPaymentMethod = document.querySelector('#adyenPaymentMethodName');\n  adyenPaymentMethod.value = document.querySelector(\"#lb_\".concat(selectedMethod)).innerHTML;\n}\n\n/**\n * To avoid re-rendering components twice, unmounts existing components from payment methods list\n */\nfunction unmountComponents() {\n  var promises = Object.entries(componentsObj).map(function (_ref) {\n    var _ref2 = _slicedToArray(_ref, 2),\n      key = _ref2[0],\n      val = _ref2[1];\n    delete componentsObj[key];\n    return resolveUnmount(key, val);\n  });\n  return Promise.all(promises);\n}\nfunction resolveUnmount(key, val) {\n  try {\n    return Promise.resolve(val.node.unmount(\"component_\".concat(key)));\n  } catch (e) {\n    // try/catch block for val.unmount\n    return Promise.resolve(false);\n  }\n}\nfunction displaySelectedMethod(type) {\n  selectedMethod = type;\n  resetPaymentMethod();\n  if (['paypal', 'paywithgoogle', 'googlepay', 'mbway', 'amazonpay'].concat(qrCodeMethods).indexOf(type) > -1) {\n    document.querySelector('#billing-submit').disabled = true;\n  } else {\n    document.querySelector('#billing-submit').disabled = false;\n  }\n  document.querySelector(\"#component_\".concat(type)).setAttribute('style', 'display:block');\n}\nfunction resetPaymentMethod() {\n  $('.additionalFields').hide();\n}
406\nfunction showValidation() {\n  if (componentsObj[selectedMethod] && !componentsObj[selectedMethod].isValid) {\n    componentsObj[selectedMethod].node.showValidation();\n    return false;\n  }\n  return true;\n}\n\n/**\n * Assigns stateData value to the hidden stateData input field\n * so it's sent to the backend for processing\n */\nfunction validateComponents() {\n  var stateData;\n  if (componentsObj[selectedMethod] && componentsObj[selectedMethod].stateData) {\n    stateData = componentsObj[selectedMethod].stateData;\n  } else {\n    var type = document.querySelector(\"#component_\".concat(selectedMethod, \" .type\")) ? document.querySelector(\"#component_\".concat(selectedMethod, \" .type\")).value : selectedMethod;\n    stateData = {\n      paymentMethod: {\n        type: type\n      }\n    };\n    var brandElm = document.querySelector(\"#component_\".concat(selectedMethod, \" .brand\"));\n    if (brandElm && brandElm.value) {\n      stateData.paymentMethod.brand = brandElm.value;\n    }\n  }\n  document.querySelector('#adyenStateData').value = JSON.stringify(stateData);\n}\n\n/**\n * Contains fallback components for payment methods that don't have an Adyen web component yet\n */\nfunction getFallback(paymentMethod) {\n  var fallback = {\n    giftcard: \"\\n      <input type=\\\"hidden\\\" class=\\\"brand\\\" name=\\\"brand\\\" value=\\\"\".concat(paymentMethod.brand, \"\\\"/>\\n      <input type=\\\"hidden\\\" class=\\\"type\\\" name=\\\"type\\\" value=\\\"\").concat(paymentMethod.type, \"\\\"/>\")\n  };\n  return fallback[paymentMethod.type];\n}\n\n/**\n * Renders all payment methods (including card component) retrieved from Adyen session\n */\nfunction renderGenericComponent() {\n  return _renderGenericComponent.apply(this, arguments);\n}\nfunction _renderGenericComponent() {\n  _renderGenericComponent = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {\n    var amazonpay, i, paymentMethod, firstPaymentMethod;\n    return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n      while (1) {\n        switch (_context4.prev = _context4.next) {\n          case 0:\n            if (!Object.keys(componentsObj).length) {\n              _context4.next = 3;\n              break;\n            }\n            _context4.next = 3;\n            return unmountComponents();\n          case 3:\n            checkoutConfiguration.paymentMethodsResponse = paymentMethodsResponse;\n            if (sessionsResponse.amount) {\n              checkoutConfiguration.amount = sessionsResponse.amount;\n              checkoutConfiguration.paymentMethodsConfiguration.paypal.amount = sessionsResponse.amount;\n              checkoutConfiguration.paymentMethodsConfiguration.amazonpay.amount = sessionsResponse.amount;\n              setInstallments(sessionsResponse.amount);\n            }\n            if (sessionsResponse.countryCode) {\n              checkoutConfiguration.countryCode = sessionsResponse.countryCode;\n            }\n            amazonpay = paymentMethodsResponse.paymentMethods.find(function (paymentMethod) {\n              return paymentMethod.type === 'amazonpay';\n            });\n            if (amazonpay) {\n              checkoutConfiguration.paymentMethodsConfiguration.amazonpay.configuration = amazonpay.configuration;\n            }\n            if (paymentMethodsResponse.storedPaymentMethods) {\n              for (i = 0; i < checkout.paymentMethodsResponse.storedPaymentMethods.length; i++) {\n                paymentMethod = checkout.paymentMethodsResponse.storedPaymentMethods[i];\n                if (paymentMethod.supportedShopperInteractions.includes('Ecommerce')) {\n                  renderPaymentMethod(paymentMethod, true, sessionsResponse.imagePath);\n                }\n              }\n            }\n            paymentMethodsResponse.paymentMethods.reverse().forEach(function (pm) {\n              renderPaymentMethod(pm, false, sessionsResponse.imagePath);\n            });\n            firstPaymentMethod = document.querySelector('input[type=radio][name=dwfrm_billing_paymentMethods_brandCode]');\n            firstPaymentMethod.checked = true;\n            firstPaymentMethod = document.querySelector('input[type=radio][name=brandCode]');\n            firstPaymentMethod.checked = true;\n            displaySelectedMethod(firstPaymentMethod.value);\n            $('#paymentMethodsList').addClass('is-visible');\n            progress.hide();\n          case 13:\n          case \"end\":\n            return _context4.stop();\n        }\n      }\n    }, _callee4);\n  }));\n  return _renderGenericComponent.apply(this, arguments);\n}\nfunction getPaymentMethodID(isStored, paymentMethod) {\n  if (isStored) {\n    return \"storedCard\".concat(paymentMethod.id);\n  }\n  if (paymentMethod.brand) {\n    // gift cards all share the same type. Brand is used to differentiate between them\n    return \"\".concat(paymentMethod.type, \"_\").concat(paymentMethod.brand);\n  }\n  return paymentMethod.type;\n}\nfunction renderPaymentMethod(paymentMethod, storedPaymentMethodBool, path) {\n  var paymentMethodsUI = document.querySelector('#paymentMethodsList');\n  var li = document.createElement('li');\n  var paymentMethodID = getPaymentMethodID(storedPaymentMethodBool, paymentMethod);\n  var isSchemeNotStored = paymentMethod.type === 'scheme' && !storedPaymentMethodBool;\n  var paymentMethodImage = storedPaymentMethodBool ? \"\".concat(path).concat(paymentMethod.brand, \".png\") : \"\".concat(path).concat(paymentMethod.type, \".png\");\n  var cardImage = \"\".concat(path, \"card.png\");\n  var imagePath = isSchemeNotStored ? cardImage : paymentMethodImage;\n  var label = storedPaymentMethodBool ? \"\".concat(paymentMethod.name, \" \").concat(MASKED_CC_PREFIX).concat(paymentMethod.lastFour) : \"\".concat(paymentMethod.name);\n    var liContents = \"\\n                              <input name=\\\"dwfrm_billing_paymentMethods_brandCode\\\" type=\\\"radio\\\" value=\\\"\".concat(paymentMethodID, \"\\\">\\n                              <input name=\\\"brandCode\\\" type=\\\"radio\\\" value=\\\"\").concat(paymentMethodID, \"\\\" id=\\\"rb_\").concat(paymentMethodID, \"\\\">\\n <label class=\\\"payment_method_label\\\" id=\\\"lb_\").concat(paymentMethodID, \"\\\" for=\\\"rb_\").concat(paymentMethodID, \"\\\">\").concat(label, \"</label>\\n                              <img class=\\\"logo\\\" src=\\\"\").concat(imagePath, \"\\\" ></img>\\n\");\n  var container = document.createElement('div');\n  li.innerHTML = liContents;\n  li.classList.add('form-row','row-'+paymentMethodID);\n  var node = renderCheckoutComponent(storedPaymentMethodBool, checkout, paymentMethod, container, paymentMethodID);\n  container.classList.add('additionalFields');\n  container.setAttribute('id', \"component_\".concat(paymentMethodID));\n  container.setAttribute('style', 'display:none');\n  li.append(container);\n  paymentMethodsUI.prepend(li);\n  if (paymentMethod.type !== 'paywithgoogle') {\n    node && node.mount(container);\n  } else {\n    node.isAvailable().then(function () {\n      node.mount(container);\n    })[\"catch\"](function () {}); // eslint-disable-line no-empty\n  }\n\n  var input = document.querySelector(\"#rb_\".concat(paymentMethodID));\n  input.onchange = /*#__PURE__*/function () {\n    var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(event) {\n      return _regeneratorRuntime().wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              if (document.querySelector('.adyen-checkout__qr-loader') && qrCodeMethods.indexOf(selectedMethod) > -1 || paypalTerminatedEarly) {\n                paypalTerminatedEarly = false;\n                paymentFromComponent({\n                  cancelTransaction: true,\n                  merchantReference: document.querySelector('#merchantReference').value\n                });\n              }\n              displaySelectedMethod(event.target.value);\n            case 2:\n            case \"end\":\n              return _context.stop();\n          }\n        }\n      }, _callee);\n    }));\n    return function (_x) {\n      return _ref3.apply(this, arguments);\n    };\n  }();\n  if (paymentMethodID === 'giropay') {\n    container.innerHTML = '';\n  }\n  if (storedPaymentMethodBool && ['bcmc', 'scheme'].indexOf(paymentMethodID) > -1) {\n    componentsObj[paymentMethodID].isValid = true;\n  }\n}\nfunction renderCheckoutComponent(storedPaymentMethodBool, checkout, paymentMethod, container, paymentMethodID) {\n  if (storedPaymentMethodBool) {\n    return createCheckoutComponent(checkout, paymentMethod, container, paymentMethodID);\n  }\n  var fallback = getFallback(paymentMethod);\n  if (fallback) {\n    var template = document.createElement('template');\n    template.innerHTML = fallback;\n    container.append(template.content);\n    return;\n  }\n  return createCheckoutComponent(checkout, paymentMethod, container, paymentMethodID);\n}\nfunction getPersonalDetails() {\n  var shippingAddress = sessionsResponse.shippingAddress;\n  return {\n    firstName: shippingAddress.firstName,\n    lastName: shippingAddress.lastName,\n    telephoneNumber: shippingAddress.phone\n  };\n}\nfunction createCheckoutComponent(checkout, paymentMethod, container, paymentMethodID) {\n  try {\n    var nodeData = Object.assign(paymentMethod, {\n      data: Object.assign(getPersonalDetails(), {\n        personalDetails: getPersonalDetails()\n      }),\n      visibility: {\n        personalDetails: 'editable',\n        billingAddress: 'hidden',\n        deliveryAddress: 'hidden'\n      }\n    });\n    var node = checkout.create(paymentMethod.type, nodeData);\n    if (!componentsObj[paymentMethodID]) {\n      componentsObj[paymentMethodID] = {};\n    }\n    componentsObj[paymentMethodID].node = node;\n    componentsObj[paymentMethodID].isValid = node.isValid;\n    return node;\n  } catch (e) {} // eslint-disable-line no-empty\n  return false;\n}\n\n/**\n * Makes an ajax call to the controller function PaymentFromComponent.\n * Used by certain payment methods like paypal\n */\nfunction paymentFromComponent(data, component) {\n  $.ajax({\n    url: window.paymentFromComponentURL,\n    type: 'post',\n    data: JSON.stringify(data),\n    contentType: 'application/;
406 charset=utf-8',\n    success: function success(data) {\n      if (data.result && data.result.orderNo && data.result.orderToken) {\n        document.querySelector('#orderToken').value = data.result.orderToken;\n        document.querySelector('#merchantReference').value = data.result.orderNo;\n      }\n      if (data.result && data.result.fullResponse && data.result.fullResponse.action) {\n        component.handleAction(data.result.fullResponse.action);\n      } else {\n        document.querySelector('#paymentFromComponentStateData').value = JSON.stringify('null');\n        $('.js-billing-submit-hidden').trigger('click');\n      }\n    }\n  }).fail(function /* xhr, textStatus */ () {});\n}\n$('.js-billing-submit-hidden').on('click', function (e) {\n  if (['paypal', 'mbway', 'amazonpay'].concat(qrCodeMethods).indexOf(selectedMethod) > -1 && !document.querySelector('#paymentFromComponentStateData').value) {\n    e.preventDefault();\n    var form = $(this).closest('form');\n    var url = form.attr('action');\n    $.ajax({\n      type: 'POST',\n      url: url,\n      data: form.serialize(),\n      async: false,\n      success: function success(data) {\n        formErrorsExist = data.fieldErrors;\n      }\n    });\n  }\n});\nfunction getQRCodeConfig() {\n  return {\n    showPayButton: true,\n    onSubmit: function onSubmit(state, component) {\n      $('.js-billing-submit-hidden').trigger('click');\n      if (formErrorsExist) {\n        return;\n      }\n      assignPaymentMethodValue();\n      document.querySelector('#adyenStateData').value = JSON.stringify(state.data);\n      paymentFromComponent(state.data, component);\n    },\n    onAdditionalDetails: function onAdditionalDetails(state /* , component */) {\n      document.querySelector('#paymentFromComponentStateData').value = JSON.stringify(state.data);\n      $('.js-billing-submit-hidden').trigger('click');\n    }\n  };\n}\nfunction getCardConfig() {\n  return {\n    enableStoreDetails: showStoreDetails,\n    showBrandsUnderCardNumber: false,\n    onBrand: function onBrand(brandObject) {\n      $('#cardType').val(brandObject.brand);\n    },\n    onFieldValid: function onFieldValid(data) {\n      if (data.endDigits) {\n        maskedCardNumber = MASKED_CC_PREFIX + data.endDigits;\n        $('#cardNumber').val(maskedCardNumber);\n      }\n    },\n    onChange: function onChange(state) {\n      isValid = state.isValid;\n      var methodToUpdate = state.data.paymentMethod.storedPaymentMethodId ? \"storedCard\".concat(state.data.paymentMethod.storedPaymentMethodId) : selectedMethod;\n      $('#browserInfo').val(JSON.stringify(state.data.browserInfo));\n      componentsObj[methodToUpdate].isValid = isValid;\n      componentsObj[methodToUpdate].stateData = state.data;\n    }\n  };\n}\nfunction getGooglePayConfig() {\n  return {\n    environment: window.Configuration.environment,\n    onSubmit: function onSubmit() {\n      assignPaymentMethodValue();\n      document.querySelector('#billing-submit').disabled = false;\n      document.querySelector('#billing-submit').click();\n    },\n    configuration: {\n      gatewayMerchantId: window.merchantAccount\n    },\n    showPayButton: true,\n    buttonColor: 'white'\n  };\n}\nfunction getAmazonpayConfig() {\n  return {\n    showPayButton: true,\n    productType: 'PayAndShip',\n    checkoutMode: 'ProcessOrder',\n    locale: window.Configuration.locale,\n    returnUrl: window.returnURL,\n    addressDetails: {\n      name: sessionsResponse.shippingAddress.firstName + ' ' + sessionsResponse.shippingAddress.lastName,\n      addressLine1: sessionsResponse.shippingAddress.address1,\n      city: sessionsResponse.shippingAddress.city,\n      stateOrRegion: sessionsResponse.shippingAddress.city,\n      postalCode: sessionsResponse.shippingAddress.postalCode,\n      countryCode: sessionsResponse.shippingAddress.country,\n      phoneNumber: sessionsResponse.shippingAddress.phone\n    },\n    onClick: function onClick(resolve, reject) {\n      $('.js-billing-submit-hidden').trigger('click');\n      if (formErrorsExist) {\n        reject();\n      } else {\n        assignPaymentMethodValue();\n        resolve();\n      }\n    },\n    onError: function onError() {}\n  };\n}\nfunction getInstallmentValues(maxValue) {\n  var values = [];\n  for (var i = 1; i <= maxValue; i += 1) {\n    values.push(i);\n  }\n  return values;\n}\nfunction setInstallments(amount) {\n  try {\n    if (installmentLocales.indexOf(window.Configuration.locale) < 0) {\n      return;\n    }\n    var _ref4 = window.installments ? window.installments.replace(/\\[|]/g, '').split(',') : [null, null],\n      _ref5 = _slicedToArray(_ref4, 2),\n      minAmount = _ref5[0],\n      numOfInstallments = _ref5[1];\n    if (minAmount <= amount.value) {\n      checkoutConfiguration.paymentMethodsConfiguration.card.installmentOptions = {\n        card: {}\n      }; // eslint-disable-next-line max-len\n      checkoutConfiguration.paymentMethodsConfiguration.card.installmentOptions.card.values = getInstallmentValues(numOfInstallments);\n      checkoutConfiguration.paymentMethodsConfiguration.card.showInstallmentAmounts = true;\n    }\n  } catch (e) {} // eslint-disable-line no-empty\n}\n\n/**\n * @function\n * @description Initializes Adyen CSE billing events\n */\n\nexports.initBilling = function () {\n  initializeBillingEvents();\n};\nexports.initAccount = function () {\n  initializeAccountEvents();\n};\nexports.renderGenericComponent = function () {\n  renderGenericComponent();\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/checkout/adyen-checkout.js?\n}");
407
408/***/ }),
409
410/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/checkout/applepay.js":
411/*!*****************************************************************************!*\
412  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/checkout/applepay.js ***!
413  \*****************************************************************************/
414/***/ (function(module) {
415
416"use strict";
417eval("{\n\nvar checkout = null;\nvar appleComponent;\nvar paymentMethod = null;\nvar cartPayment = false;\nvar errorArea = null;\nvar adyenStateData = null;\n\nconst cache = {\n    appleButton: $('#apple-pay-button'),\n    appleErrorsWrapper: $('.js-apple-pay-errors')\n};\n\nconst selectors = {\n    BUTTON: '#apple-pay-button'\n};\n\nasync function init() {\n    if (!cache.appleButton.length) return;\n\n    if($('.pt_cart').length > 0) {\n        cartPayment = true;\n    }\n\n    if (appleComponent) {\n        appleComponent.unmount();\n    }\n\n    var locale = null;\n    var country = \"NL\";\n    try {\n        locale = $(\".js-country-detector\").data(\"currentlocale\");\n\n        if (locale != \"en\") {\n            var localeArray = locale.split(\"_\");\n            country = localeArray[1];\n        }\n    } catch(e) {\n        console.log(\"we are using NL as default counrty,country not important when initializing apple pay button\")\n    }\n\n    try {\n        var configuration = {\n            clientKey : window.Configuration.clientKey,\n            environment: window.Configuration.environment,\n            locale: window.Configuration.locale,\n            paymentMethodsResponse: window.paymentMethodsArray.paymentMethods.adyenPaymentMethods,\n            risk: window.Configuration.risk\n        };\n\n        checkout = await AdyenCheckout(configuration);\n\n        var webComponentConfig = {\n            amount: {\n                value: cache.appleButton.attr('amount'),\n                currency: cache.appleButton.attr('currency')\n            },\n            countryCode: country,\n            // events\n            onSubmit: onSubmit,\n            onAuthorized: onAuthorized,\n            onShippingContactSelected: validateShippingData,\n            onClick: onClick,\n            onPaymentMethodSelected:onPaymentMethodSelected\n        };\n\n        if (cartPayment) {\n            webComponentConfig[\"requiredShippingContactFields\"] = [\"postalAddress\",\"name\",\"phone\",\"email\"];\n        }\n\n        appleComponent = checkout.create('applepay', webComponentConfig);\n        appleComponent\n            .isAvailable()\n            .then(() => {\n                //in the check out page we are visually hid the apple pay button in the begingin, when customer click the apple pay selection we are showing it again(showing again in the billing.js:line 272)\n                //we are also removing hidden class if apple pay is enabled\n                if (!cartPayment) {\n                    $('.apple-pay').addClass('visually-hidden');\n                    $('.row-applepay').removeClass('visually-hidden');\n                }\n                appleComponent.mount(selectors.BUTTON);\n            })\n            .catch(e => {\n                // Apple Pay is not available\n                console.log('Apple pay not available', e);\n            });\n    } catch (error) {\n        console.log('error during Adyen Apple pay initialization', error);\n    }\n}\n\n//When Payment Method Selected this function called\nvar onPaymentMethodSelected = function(resolve, reject, event) {\n\n    var result = {\n        status: 0,\n        errors:[],\n        newTotal: {\n            \"amount\": (parseFloat(cache.appleButton.attr('amount'))/100.0).toFixed(2),\n            \"label\": \"Paula's Choice\",\n            \"type\": \"final\"\n        }\n    };\n    resolve(result);\n}\n\n// When apple pay button clicked this function called, all of our side validation of front-end should be done here.\nvar onClick = function(resolve, reject) {\n\n    if (cartPayment && !$('#cart-items-form').valid()) {\n        reject();\n    } else {\n        resolve();\n    }\n}\n\nvar onSubmit = function(state) {\n    if (!state.isValid) {\n        return;\n    }\n    paymentMethod = state.data.paymentMethod;\n    adyenStateData = JSON.stringify(state.data);\n}\n\n\nvar onAuthorized = function(resolve, reject, event) {\n    var data = {\n        \"paymentMethod\": paymentMethod,\n        \"shippingData\": cartPayment ? event.payment.shippingContact : null,\n        \"cartPayment\": cartPayment,\n        \"adyenStateData\": adyenStateData\n    };\n\n    $.ajax({\n        type: 'POST',\n        contentType: 'application/json; charset=utf-8',\n        dataType: 'json',\n        url: cache.appleButton.attr('submitDataApplePayURL'),\n        data: JSON.stringify(data)\n    }).done(function(result) {\n        //form field problems\n        if (result.errors && result.errors.length) {\n\n            reject();\n            //update cart page with info\n            if(cartPayment) {\n                var appleErrors = '';\n                for(var i = 0; i < result.errors.length;
417 i++) {\n                    appleErrors += '<div class=\"apple-pay__error\"><span class=\"apple-pay__error-name\">' + result.errors[i].field + '</span><span class=\"apple-pay__error-msg\">' + result.errors[i].message + '</span></div>';\n                }\n\n                cache.appleErrorsWrapper.addClass('apple-pay__errors--show').html(appleErrors);\n            }\n           //\n            return;\n        } else if (!result.error) { // success\n            resolve({\n                status: 0, // ApplePaySession.STATUS_SUCCESS = 0,\n            });\n\n            if (result.redirectUrl) {\n                window.location.href = result.redirectUrl;\n                return;\n            }\n        } else { //error\n            reject();\n        }\n\n    }).fail(function(jqXHR, textStatus, errorThrown) {\n        reject();\n    });\n}\n\nvar validateShippingData = function(resolve, reject, shippingEvent) {\n    $.ajax({\n        type: 'POST',\n        contentType: 'application/json; charset=UTF-8',\n        dataType: 'json',\n        url: cache.appleButton.attr('validateShippingAddressApplePayURL'),\n        data: JSON.stringify(shippingEvent.shippingContact)\n    }).done(function(result) {\n        if (result.errors.length) {\n            var appleErrors = [], error;\n            for(var i=0; i < result.errors.length; i++) {\n                error = result.errors[i];\n                appleErrors.push(new ApplePayError(error.invalidForm, error.field, error.message));\n            }\n            result.errors = appleErrors;\n        }\n        resolve(result);\n    }).fail(function(jqXHR, textStatus, errorThrown) {\n        reject();\n    });\n}\n\nvar applepay = {\n    init: function () {\n        init();\n    }\n};\n\nmodule.exports = applepay;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/checkout/applepay.js?\n}");
418
419/***/ }),
420
421/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/checkout/billing.js":
422/*!****************************************************************************!*\
423  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/checkout/billing.js ***!
424  \****************************************************************************/
425/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
426
427"use strict";
428eval("{\n\nvar ajax = __webpack_require__(/*! ../../ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\"),\n        formPrepare = __webpack_require__(/*! ./formPrepare */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/formPrepare.js\"),\n        bonusProductsView = __webpack_require__(/*! ../../bonus-products-view */ \"./cartridges/app_paulaschoice/cartridge/js/bonus-products-view.js\"),\n        util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n        adyenCheckout = __webpack_require__(/*! ./adyen-checkout */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/adyen-checkout.js\"),\n        applepay = __webpack_require__(/*! ./applepay */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/applepay.js\"),\n        progress = __webpack_require__(/*! ../../progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\");\n\n/**\n * @function\n * @description loads billing address, Gift Certificates, Coupon and Payment methods\n */\nexports.init = function () {\n    function _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n    function _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context);
428 if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (undefined === method) { if (context.delegate = null, \"throw\" === context.method) { if (delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method)) return ContinueSentinel; context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a 'throw' method\"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEac
428h(resetTryEntry), !skipTempReset) for (var name in this) { \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\n    function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\n    function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\n    // This script is executed only on the checkout final page\n    if ((window.location.pathname.includes('checkout/billing') || window.location.pathname.includes('COBilling') || window.location.pathname.includes('Adyen-ShowConfirmation')) && window.isAdyenPayment) {\n        var handleAction = /*#__PURE__*/function () {\n            var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(action) {\n            var checkout, actionContainer;\n            return _regeneratorRuntime().wrap(function _callee$(_context) {\n                while (1) {\n                switch (_context.prev = _context.next) {\n                    case 0:\n                    window.Configuration.onAdditionalDetails = onAdditionalDetails;\n                    _context.next = 3;\n                    return AdyenCheckout(window.Configuration);\n                    case 3:\n                    checkout = _context.sent;\n                    actionContainer = document.getElementById('action-container');\n                    checkout.createFromAction(action).mount(actionContainer);\n                    case 6:\n                    case \"end\":\n                    return _context.stop();\n                }\n                }\n            }, _callee);\n            }));\n            return function handleAction(_x) {\n            return _ref.apply(this, arguments);\n            };\n        }(); // onAdditionalDetails event handler to be included in Adyen Component configuration\n        // serializes form data and submits to place order. Then proceeds to handle the result\n        var placeOrder = function placeOrder(formId) {\n            var form = $('#' + formId);\n            var formData = 'dwfrm_billing_save=&' + $(form).serialize();\n            $.ajax({\n                method: 'POST',\n                url: window.billingSubmitUrl,\n                data: formData,\n                success: function success(data) {\
428n                    if (data.action) {\n                        window.orderToken = data.orderToken;\n                        document.getElementById('action-modal-SG').style.display = \"block\";\n                        handleAction(data.action);\n                    } else {\n                        window.location.href = data.continueUrl;\n                    }\n                },\n                error: function error(err) {}\n            });\n        };\n        var onAdditionalDetails = function onAdditionalDetails(state) {\n            $.ajax({\n                type: 'POST',\n                url: window.paymentsDetails,\n                data: JSON.stringify({\n                    data: state.data,\n                    orderToken: window.orderToken\n                }),\n                contentType: 'application/json; charset=utf-8',\n                async: false,\n                success: function success(data) {\n                    if (!data.response.isFinal && _typeof(data.response.action) === 'object') {\n                        handleAction(data.action);\n                    } else {\n                        window.location.href = data.response.redirectUrl;\n                    }\n                }\n            });\n        };\n    }\n\n    // initiate Adyen\n    if ($('#paymentMethodsList').length) { // except PayPal Express\n        progress.show();\n        adyenCheckout.initBilling();\n        // Override default submit form behavior\n        var formId = 'submit-order-form';\n        var form = document.getElementById(formId);\n        form.addEventListener(\"submit\", function (event) {\n            var paymentMethod = $('input[name$=\"_selectedPaymentMethodID\"]').val();\n            if (paymentMethod == 'AdyenComponent') {\n                event.preventDefault();\n                placeOrder(formId);\n            }\n        });\n    }\n\n    var $checkoutForm = $('.checkout-billing');\n    var $addGiftCert = $('#add-giftcert');\n    var $giftCertCode = $('input[name$=\"_giftCertCode\"]');\n    var $addCoupon = $('#add-coupon');\n    var $couponCode = $('input[name$=\"_couponCode\"]');\n    // Adyen additions\n    var $payType = $('[name=\"brandCode\"]');\n    var $issuer = $('.issuer');\n    var selectedPayType = $payType.find(':checked').val();\n\n    $(document).on('click', '[name=\"brandCode\"]', function () {\n        var paymentMethod = $(this).val();\n        $('#selectedIssuer').val('');\n        $issuer.hide();\n        $('.checkoutComponent').hide();\n        $('#component_' + paymentMethod).show();\n        if ($(this).siblings('.issuer').length > 0) {\n          $('#selectedIssuer').val($(this).siblings('.issuer').val());\n          $(this).siblings('.issuer').show();\n        }\n        updatePaymentMethod(paymentMethod);\n        updatePaymentType(paymentMethod, false);\n    });\n    $issuer.on('change', function () {\n        updatePaymentType($(this).val(), true);\n    });\n\n    initCheckedPaymentType(selectedPayType);\n\n    // select credit card from list\n    $('#creditCardList').on('change', function () {\n        var cardUUID = $(this).val();\n        if (!cardUUID) {\n            return;\n        }\n        populateCreditCardForm(cardUUID);\n        // remove server side error\n        $('.required.error').removeClass('error');\n        $('.error-message').remove();\n    });\n\n    $addGiftCert.on('click', function (e) {\n        e.preventDefault();\n        var code = $giftCertCode.val(),\n            $message = $checkoutForm.find('.giftcert-message');\n        if (code.length === 0) {\n        \t$message.html(Resources.GIFT_CERT_MISSING);\n            window.dataLayer.push({\n                'eventCategory': 'Billing page',\n                'eventAction': 'Billing page error',\n                'eventLabel': Resources.GIFT_CERT_MISSING,\n                'event': 'GA Tracking',\n            });\n            return;\n        }\n        var url = util.appendParamsToUrl(Urls.redeemGiftCert, {giftCertCode: code, format: 'ajax'});
428\n        $.getJSON(url, function (data) {\n            var fail = false;\n            var msg = '';\n            if (!data) {\n                msg = Resources.BAD_RESPONSE;\n                fail = true;\n            } else if (!data.success) {\n                msg = data.message.split('<').join('&lt;').split('>').join('&gt;');\n                fail = true;\n            }\n            if (fail) {\n            \t$giftCertCode.addClass('error');\n            \t$message.removeClass('success').addClass('error').html(msg);\n                window.dataLayer.push({\n                    'eventCategory': 'Billing page',\n                    'eventAction': 'Billing page error',\n                    'eventLabel': msg,\n                    'event': 'GA Tracking',\n                });\n                return;\n            } else {\n            \t// empty input field\n            \t$giftCertCode.removeClass('error').val('');\n            \t$message.removeClass('error').addClass('success').html(data.message);\n            \t// hide gift card input\n            \t$('#component_giftcert').addClass('visually-hidden');\n            \t$('#orderTotal').val(data.remainingValue);\n            \t// if no amount is left to pay hide other payment options, else set form to no payment selected state\n            \tif ( data.remainingValue == 0 ) {\n            \t\t$('#paymentMethodsList').find('li').not('.row-giftcert').addClass('visually-hidden');\n                    document.querySelector('#billing-submit').disabled = false;\n            \t} else {\n                    $('input[name$=\"_selectedPaymentMethodID\"]').val('AdyenComponent');\n                    document.querySelector('input[type=radio][name=dwfrm_billing_paymentMethods_brandCode]').checked = true;\n            \t\tdocument.querySelector('input[type=radio][name=brandCode]').checked = true;\n            \t}\n            \t// update order total visually to inform user about remaining amount to pay\n            \tif ( data.remainingAmount ) {\n            \t\t$('.order-totals-table .order-value').html(data.remainingAmount);\n                    if ($('#apple-pay-button').length > 0) {\n                        $('#apple-pay-button').attr(\"amount\", (data.remainingValue * 100.0).toFixed(2));\n                    }\n            \t}\n\n            }\n        });\n    });\n\n    $addCoupon.on('click', function (e) {\n        e.preventDefault();\n        var $error = $checkoutForm.find('.coupon-error'),\n                code = $couponCode.val();\n        if (code.length === 0) {\n            $error.html(Resources.COUPON_CODE_MISSING);\n            return;\n        }\n        var url = util.appendParamsToUrl(Urls.addCoupon, {couponCode: code, format: 'ajax'});
428\n        $.getJSON(url, function (data) {\n            var fail = false;\n            var msg = '';\n            if (!data) {\n                msg = Resources.BAD_RESPONSE;\n                fail = true;\n            } else if (!data.success) {\n                msg = data.message.split('<').join('&lt;').split('>').join('&gt;');\n                fail = true;\n            } else {\n                msg = data.message.split('<').join('&lt;').split('>').join('&gt;');\n            }\n\n            if (fail) {\n                $error.html(msg).removeClass('success').addClass('error');\n                return;\n            } else {\n                $error.html(data.message).removeClass('error').addClass('success');\n                $('#js-checkout-summary').load(Urls.summaryRefreshURL, function () {\n                    // hide edit shipping method link\n                \t$('#js-checkout-summary').fadeIn('fast');\n                \t$('#js-checkout-summary').find('#js-checkout-productlist .minishipment .header a').hide();\n                \t$('#js-checkout-summary').find('#js-checkout-productlist .order-shipping .label a').hide();\n                });\n            }\n            //basket check for displaying the payment section, if the adjusted total of the basket is 0 after applying the coupon\n            //this will force a page refresh to display the coupon message based on a parameter message\n            if (data.success && data.baskettotal === 0) {\n                window.location.assign(Urls.billing);\n            }\n        });\n    });\n\n    // trigger events on enter\n    $couponCode.on('keydown', function (e) {\n        if (e.which === 13) {\n            e.preventDefault();\n            $addCoupon.click();\n        }\n    });\n    $giftCertCode.on('keydown', function (e) {\n        if (e.which === 13) {\n            e.preventDefault();\n            $addGiftCert.click();\n        }\n    });\n\n    $('#js-checkout-productlist').on('click', '.js-show-bonus', function (e) {\n        e.preventDefault();\n        bonusProductsView.show(this.href);\n    });\n    applepay.init();\n};\n\nfunction initCheckedPaymentType(selectedPayType) {\n    if (selectedPayType) {\n        $(selectedPayType).trigger('click');\n    }\n}\n\n/**\n * @function\n * @description Fills the Credit Card form with the passed data-parameter and clears the former cvn input\n * @param {Object} data The Credit Card data (holder, type, masked number, expiration month/year)\n */\nfunction setCCFields(data) {\n    var $creditCard = $('[data-method=\"CREDIT_CARD\"]');\n    $creditCard.find('input[name$=\"creditCard_owner\"]').val(data.holder).trigger('change');\n    $creditCard.find('select[name$=\"_type\"]').val(data.type).trigger('change');\n    $creditCard.find('input[name*=\"_creditCard_number\"]').val(data.maskedNumber).trigger('change');\n    $creditCard.find('[name$=\"_month\"]').val(data.expirationMonth).trigger('change');\n    $creditCard.find('[name$=\"_year\"]').val(data.expirationYear).trigger('change');\n    $creditCard.find('input[name$=\"_cvn\"]').val('').trigger('change');\n    $creditCard.find('[name$=\"creditCard_selectedCardID\"]').val(data.selectedCardID).trigger('change');\n}\n\n/**\n * @function\n * @description Updates the credit card form with the attributes of a given card\n * @param {String} cardID the credit card ID of a given card\n */\nfunction populateCreditCardForm(cardID) {\n    // load card details\n    var url = util.appendParamToURL(Urls.billingSelectCC, 'creditCardUUID', cardID);\n    ajax.getJson({\n        url: url,\n        callback: function (data) {\
428n            if (!data) {\n                window.alert(Resources.CC_LOAD_ERROR);\n                return false;\n            }\n            setCCFields(data);\n        }\n    });\n}\n\n/**\n * @function\n * @description Changes the payment method form depending on the passed paymentMethodID\n * @param {String} paymentMethodID the ID of the payment method, to which the payment method form should be changed to\n */\nfunction updatePaymentMethod(paymentMethodID) {\n    var $paymentMethods = $('.payment-method');\n    $paymentMethods.removeClass('payment-method-expanded');\n    var $selectedPaymentMethod = $paymentMethods.filter(\"[data-method=\\\"\".concat(paymentMethodID, \"\\\"]\"));\n    if ($selectedPaymentMethod.length) {\n        $selectedPaymentMethod.addClass('payment-method-expanded');\n    }\n    // ensure checkbox of payment method is checked\n    $('input[name$=\"_selectedPaymentMethodID\"]').removeProp('checked').removeAttr('checked');\n    $('input[value=' + paymentMethodID + ']').prop('checked', 'checked').attr('checked', 'checked');\n    if (paymentMethodID == 'giftcert') {\n        $('input[name$=\"_selectedPaymentMethodID\"]').val('GIFT_CERTIFICATE');\n    } else if (paymentMethodID == 'applepay') {\n        $('input[name$=\"_selectedPaymentMethodID\"]').val('Adyen');\n    } else {\n        $('input[name$=\"_selectedPaymentMethodID\"]').val('AdyenComponent');\n    }\n    formPrepare.validateForm();\n}\n\n/**\n * @function\n * @description Changes the payment type or issuerId of the selected payment method\n * @param {String, Boolean} value of payment type or issuerId and a test value to see which one it is, to which the payment type or issuerId should be changed to\n */\nfunction updatePaymentType(selectedPayType, issuerType) {\n    if (issuerType) {\n        $('#dwfrm_adyPaydata_issuer').val(selectedPayType);\n    } else {\n        $('input[name=\"brandCode\"]').removeAttr('checked');\n        $('input[value=' + selectedPayType + ']').prop('checked', 'checked');\n        // if the payment type has hidden fields reveal it\n        $('.checkoutComponent').addClass('visually-hidden');\n        $('#component_' + selectedPayType).removeClass('visually-hidden');\n    }\n\n    if (selectedPayType == \"applepay\") {\n        $('.js-btn-billing-save').addClass('visually-hidden');\n        $('.apple-pay').removeClass('visually-hidden');\n    } else {\n        $('.js-btn-billing-save').removeClass('visually-hidden');\n        $('.apple-pay').addClass('visually-hidden');\n    }\n\n    formPrepare.validateForm();\n}\n\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/checkout/billing.js?\n}");
429
430/***/ }),
431
432/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/checkout/formPrepare.js":
433/*!********************************************************************************!*\
434  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/checkout/formPrepare.js ***!
435  \********************************************************************************/
436/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
437
438"use strict";
439eval("{\n\nvar _ = __webpack_require__(/*! lodash */ \"./node_modules/lodash/lodash.js\");\nvar util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar $form, $inputs, $requiredInputs, validator;\n\nvar hasEmptyRequired = function () {\n\t// filter out only the visible fields\n    var requiredValues = $requiredInputs.filter(':visible').map(function () {\n        return $(this).val() || '';\n    });\n    return _(requiredValues).includes('');\n};\n\nvar validateForm = function () {\n    // only validate form when all required fields are filled to avoid\n    // throwing errors on empty form\n    if (!validator) {\n        return;\n    }\n\n    \n    if (hasEmptyRequired()) {\n        var emptyRequiredInputs = $requiredInputs.filter(function(i){\n        \tif ( $requiredInputs[i].id.indexOf('dwfrm_billing_paymentMethods_issuerId') > -1 || $requiredInputs[i].id.indexOf('birthDayDay') > -1 || $requiredInputs[i].id.indexOf('birthDayMonth') > -1 || $requiredInputs[i].id.indexOf('birthDayYear') > -1 ) {\n        \t\treturn false;\n        \t}\n        });\n        $(emptyRequiredInputs).addClass('error');\n    } else {\n    \t$requiredInputs.removeClass('error');\n    }\n};\n\nvar init = function (opts) {\n    if (!opts.formSelector || !opts.continueSelector) {\n        throw new Error('Missing form and continue action selectors.');\n    }\n    $form = $(opts.formSelector);\n    validator = $form.validate();\n    $requiredInputs = $('select.required, .required input', $form);\n    $inputs = $($form).find('input,select');\n    validateForm();\n    // start listening\n    $inputs.on('change', validateForm);\n    $inputs.filter('input').on('keyup', _.debounce(validateForm, 200));\n};\n\nexports.init = init;\nexports.validateForm = validateForm;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/checkout/formPrepare.js?\n}");
440
441/***/ }),
442
443/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/checkout/index.js":
444/*!**************************************************************************!*\
445  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/checkout/index.js ***!
446  \**************************************************************************/
447/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
448
449"use strict";
450eval("{\n\nvar address = __webpack_require__(/*! ./address */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/address.js\"),\n    billing = __webpack_require__(/*! ./billing */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/billing.js\"),\n    multiship = __webpack_require__(/*! ./multiship */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/multiship.js\"),\n    shipping = __webpack_require__(/*! ./shipping */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/shipping.js\"),\n    dialog = __webpack_require__(/*! ../../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\"),\n    util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\n    var addShippingDisclaimers = function(countrySelect) {\n      var shipmentDisclaimer = $('#js-shipment-disclaimer-wrapper');\n      var UKshipmentNotice = $('#js-shipping-notice');\n      var $countrySelect = $(countrySelect);\n      var selectedCountry = $countrySelect.find('option:selected');\n      var shipmentMessageCookie = util.getCookie('shipmentMessageCookie');\n\n      if(UKshipmentNotice.attr('data-show') == 'true' && shipmentMessageCookie != 'false') {\n    \t  UKshipmentNotice.css('display','block');\n  \t  }\n\n      if ($countrySelect.length <= 0 ) {\n        console.log('No country selection available');\n        return;\n      } else {\n    \tif (selectedCountry.val() === \"GB\" || selectedCountry.val() === \"FR\") {\n    \t\t$('.input-select.country').css('background','none');\n    \t}\n        if (selectedCountry.val() === \"GB\") {\n          $countrySelect.parents(\".form-row\").addClass('shipment-disclaimer-active').find('label').after(shipmentDisclaimer);\n          $('#js-info-icon').on(\"click\", function() {\n            shipmentDisclaimer.addClass('disclaimer-shown');\n          });\n        }\n      }\n\n      $(document).on(\"click\", function (e) {\n        var outsidePopup = (!$(e.target).hasClass(\"js-shipment-disclaimer-wrapper\") && $(e.target).closest(\".js-shipment-disclaimer-wrapper\").length === 0);\n        if (outsidePopup) {\n          shipmentDisclaimer.removeClass('disclaimer-shown');\n        }\n      });\n\n      UKshipmentNotice.find('.js-close-toggle').on(\"click\", function() {\n    \tif(shipmentMessageCookie === null || shipmentMessageCookie == 'true'){\n    \t\tutil.setCookie('shipmentMessageCookie', false , 60 * 24 * 90);\n    \t}\n        UKshipmentNotice.slideUp();\n      });\n    };\n\n/**\n * @function Initialize and handle click event on shipping info link\n */\nfunction initShippingInfoEvent(){\n    $('.js-shipping-faq-popup').on('click', function(e){\n        e.preventDefault();\n\n        dialog.open({\n            url: Urls.faqShipping,\n            closeText : '',\n            options: {\n                dialogClass: \"faq-shipping-popup\",\n                closeText : '',\n                open: function() {\n                    // force dialog to show top of content every time\n                    // jquery ui dialog focuses on <a> links on open\n                    $('.ui-dialog a').blur();\n                    $('.ui-dialog').scrollTop(0);\n\n                    // close when overlay is clicked\n                    $('.ui-widget-overlay').on('click', function () {\n                        dialog.close();\n                    });\n                }\n            },\n        });\n    });\n}\n\n/**\n * @function Initializes the page events depending on the checkout stage (shipping/billing)\n */\nexports.init = function () {\n    address.init();\n    if ($('.checkout-shipping').length > 0) {\n        shipping.init();\n        addShippingDisclaimers('#dwfrm_singleshipping_shippingAddress_addressFields_country');\n    } else if ($('.checkout-multi-shipping').length > 0) {\n        multiship.init();\n    }
450 else {\n        billing.init();\n        addShippingDisclaimers('#dwfrm_billing_billingAddress_addressFields_country');\n    }\n\n    //if on the order review page and there are products that are not available diable the submit order button\n    if ($('.order-summary-footer').length > 0) {\n        if ($('.notavailable').length > 0) {\n            $('.order-summary-footer .submit-order .button-fancy-large').attr('disabled', 'disabled');\n        }\n    }\n\n    // init click event on shipping info\n    initShippingInfoEvent();\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/checkout/index.js?\n}");
451
452/***/ }),
453
454/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/checkout/multiship.js":
455/*!******************************************************************************!*\
456  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/checkout/multiship.js ***!
457  \******************************************************************************/
458/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
459
460"use strict";
461eval("{\n\nvar address = __webpack_require__(/*! ./address */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/address.js\"),\n    formPrepare = __webpack_require__(/*! ./formPrepare */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/formPrepare.js\"),\n    dialog = __webpack_require__(/*! ../../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\"),\n    util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n    validator = __webpack_require__(/*! ../../validator */ \"./cartridges/app_paulaschoice/cartridge/js/validator.js\");\n\n/**\n * @function\n * @description shows gift message box in multiship, and if the page is the multi shipping address page it will call initmultishipshipaddress() to initialize the form\n */\nexports.init = function () {\n    if ($('.cart-row .shippingaddress .select-address').length > 0) {\n        formPrepare.init({\n            continueSelector: '[name$=\"addressSelection_save\"]',\n            formSelector: '[id$=\"multishipping_addressSelection\"]'\n        });\n    }\n    $('.edit-address').on('click', 'span', function (e) {\n        dialog.open({url: this.attributes.href.value, closeText : '', options: {open: function () {\n            address.init();\n            addEditAddress(e.target);\n        }}});\n    });\n};\n\n/**\n * @function\n * @description capture add edit adddress form events\n */\nfunction addEditAddress(target) {\n    var $addressForm = $('form[name$=\"multishipping_editAddress\"]'),\n        $addressDropdown = $addressForm.find('select[name$=_addressList]'),\n        $addressList = $addressForm.find('.address-list'),\n        add = true,\n        originalUUID,\n        resetOptionValue = false,\n        selectedAddressUUID = $(target).parent().siblings('.select-address').val();\n\n    $addressDropdown.on('change', function (e) {\n        e.preventDefault();\n\n        var selectedAddress = $addressList.find('select').val();\n        if (selectedAddress !== 'newAddress') {\n            selectedAddress = $.grep($addressList.data('addresses'), function (add) {\n                return add.UUID === selectedAddress;\n            })[0];\n            add = false;\n            resetOptionValue = false;\n            // proceed to fill the form with the selected address\n            util.fillAddressFields(selectedAddress, $addressForm);\n        } else if  (selectedAddress === 'newAddress') {\n            add = true;\n            resetOptionValue = true;\n            $addressForm.find('.input-text, .input-select').val('');\n        } else {\n            //reset the form if the value of the option is not a UUID\n            $addressForm.find('.input-text, .input-select').val('');\n        }\n    });\n\n    $addressForm.on('click', '.cancel', function (e) {\n        e.preventDefault();\n        dialog.close();\n    });\n\n    $addressForm.on('submit', function (e) {\n        e.preventDefault();\n        if (!$addressForm.valid()) {\n            return false;\n        }\n\n        $.getJSON(Urls.addEditAddress, $addressForm.serialize(), function (response) {\n            if (!response.success) {\n                $('#multiaddresserror').html(Resources.COULD_NOT_SAVE_ADDRESS);\n                return;\n            }\n            $('#multiaddresserror').toggleClass('hidden', response.success);\n\n            var address = response.address,\n                $shippingAddress = $(target).closest('.shippingaddress'),\n                $select = $shippingAddress.find('.select-address'),\n                $selected = $select.find('option:selected'),\n                newOption = '<option value=\"' + address.UUID + '\">' +\n                    ((address.ID) ? '(' + address.ID + ')' : address.firstName + ' ' + address.lastName) + ', ' +\n                    address.address1 + ', ' + address.city + ', ' + address.stateCode + ', ' + address.postalCode +\n                    '</option>';
461\n            dialog.close();\n\n            if (address.UUID !== originalUUID) {\n                resetOptionValue = true;\n            }\n\n            if (add) {\n                $('.shippingaddress select').removeClass('no-option').append(newOption);\n                $('.no-address').hide();\n            } else {\n                $('.shippingaddress select').find('option[value=\"' + address.UUID + '\"]').html(newOption);\n            }\n            // if there's no previously selected option, select it\n            if ($selected.length === 0 || $selected.val() === '' || resetOptionValue) {\n                $select.find('option[value=\"' + address.UUID + '\"]').prop('selected', 'selected').trigger('change');\n            }\n        });\n    });\n\n    //preserve the uuid of the option for the hop up form\n    if (selectedAddressUUID) {\n        //update the form with selected address\n        $addressList.find('option').each(function () {\n            //check the values of the options\n            if ($(this).attr('value') === selectedAddressUUID) {\n                $(this).prop('selected', 'selected');\n                $addressDropdown.trigger('change');\n            }\n        });\n        originalUUID = selectedAddressUUID;\n    }\n\n    validator.init();\n}\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/checkout/multiship.js?\n}");
462
463/***/ }),
464
465/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/checkout/shipping.js":
466/*!*****************************************************************************!*\
467  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/checkout/shipping.js ***!
468  \*****************************************************************************/
469/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
470
471"use strict";
472eval("{\n\nvar ajax = __webpack_require__(/*! ../../ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\"),\n    progress = __webpack_require__(/*! ../../progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\"),\n    tooltip = __webpack_require__(/*! ../../tooltip */ \"./cartridges/app_paulaschoice/cartridge/js/tooltip.js\"),\n    gtmtracking = __webpack_require__(/*! ../../gtmtracking */ \"./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js\"),\n    bonusProductsView = __webpack_require__(/*! ../../bonus-products-view */ \"./cartridges/app_paulaschoice/cartridge/js/bonus-products-view.js\"),\n    formPrepare = __webpack_require__(/*! ./formPrepare */ \"./cartridges/app_paulaschoice/cartridge/js/pages/checkout/formPrepare.js\"),\n    util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n    dialog = __webpack_require__(/*! ../../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\"),\n    scriptsInjection = __webpack_require__(/*! ../../scriptsInjection */ \"./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js\"),\n    captchaContainerRegister = null,\n    billingClickEvent = null,\n    subscriptionSent = false;\n\nvar shippingMethods;\n\nvar fastCreateAccount = $('#dwfrm_singleshipping_shippingAddress_password');\n\n/**\n * @function\n * @description updates the order summary based on a possibly recalculated basket after a shipping promotion has been applied\n */\nfunction updateSummary() {\n    var $summary = $('#js-checkout-summary');\n    // indicate progress\n    progress.show($summary);\n\n    // load the updated summary area\n    $summary.load(Urls.summaryRefreshURL, function () {\n        // hide edit shipping method link\n        $summary.fadeIn('fast');\n        $summary.find('#js-checkout-productlist .minishipment .header a').hide();\n        $summary.find('.order-totals-table .order-shipping .label a').hide();\n    });\n}\n\nfunction initRecaptchaRegister() {\n\n    var loadCaptchaRegister = function () {\n        if ($('#captcha_container_checkout_page').length > 0 && !captchaContainerRegister) {\n            captchaContainerRegister = grecaptcha.render('captcha_container_checkout_page', {\n                'sitekey': Resources.RECAPTCHA_SITEKEY,\n                'callback': recaptchaCallbackRegister,\n                'size': 'invisible'\n            });\n        }\n    };\n    loadCaptchaRegister();\n};\n\nfunction recaptchaCallbackRegister(response) {\n    return new Promise(function (resolve, reject) {\n\n        if (grecaptcha === undefined) {\n            reject();\n        }\n\n        var form = $('#captcha_container_checkout_page').parents('form');\n        $(form).find('input[name=\"dwfrm_singleshipping_shippingAddress_recaptcha\"]').val(response);\n        handleSubmitBtn();\n    });\n}\n\nfunction handleSubmitBtn(e){\n    var event = e || billingClickEvent;\n    if (!fastCreateAccountFrontEndValidation(fastCreateAccount)) {\n        event.preventDefault();\n        dataLayer.push( {\n            'eventCategory': 'Shipping Page',\n            'eventAction': 'Password error - password in wrong format',\n            'eventLabel': 'none',\n            'event': 'GA Tracking'\n        });\n\n        $('#dwfrm_singleshipping_shippingAddress_password').focus();\n    }\n\n    var signup = document.getElementById('dwfrm_singleshipping_subscribeToNewsletter');\n    if (signup === null) {\n        // UK case\n        signup = document.getElementById('dwfrm_singleshipping_shippingAddress_personalInformation_subscribeToNewsletter');\n    }\n    if ( !signup.checked || subscriptionSent ) {\n        formAjaxHandle(event);\n        return;\n    }\n    var emailAddress = $('.emailAddress').val();\n    if ( emailAddress.indexOf('@') < 1 ) {\n        return;\n    }\n\n\n    event.preventDefault();\n    $('.js-newletter-input').val(emailAddress);\n    var form = $('.js-newsletter-subscribe').closest('form');\n    var action = $(form).attr('action');\n    var data = {};\n    var inputs = $(form).find('input');
472\n    var input,name,value;\n    for ( var i=0; i < inputs.length; i++ ) {\n        input = inputs[i];\n        name = $(input).attr('name');\n        value = $(input).val();\n        data[name] = value;\n    }\n    $.ajax({\n        url:action,\n        method:'POST',\n        data:data\n    }).always(function(){\n        subscriptionSent = true;\n        gtmtracking.newsletterSubscription('Newsletter Checkbox', 'Shipping Page');\n        $('#dwfrm_singleshipping_shippingAddress').submit();\n    });\n}\n\nfunction formAjaxHandle(event){\n    event.preventDefault();\n    $('#dwfrm_singleshipping_shippingAddress').submit();\n}\n\n/**\n * @function\n * @description Helper method which constructs a URL for an AJAX request using the\n * entered address information as URL request parameters.\n */\nfunction getShippingMethodURL(url, extraParams) {\n    var $form = $('.address');\n    var params = {\n        address1: $form.find('input[name$=\"_address1\"]').val(),\n        address2: $form.find('input[name$=\"_address2\"]').val(),\n        countryCode: $form.find('select[id$=\"_country\"]').val(),\n        stateCode: $form.find('select[id$=\"_state\"]').val(),\n        postalCode: $form.find('input[name$=\"_postal\"]').val(),\n        city: $form.find('input[name$=\"_city\"]').val()\n    };\n    return util.appendParamsToUrl(url, $.extend(params, extraParams));\n}\n\n/**\n * @function\n * @description selects a shipping method for the default shipment and updates the summary section on the right hand side\n * @param\n */\nfunction selectShippingMethod(shippingMethodID) {\n    // nothing entered\n    if (!shippingMethodID) {\n        return;\n    }\n    // attempt to set shipping method\n    var url = getShippingMethodURL(Urls.selectShippingMethodsList, {shippingMethodID: shippingMethodID});\n    ajax.getJson({\n        url: url,\n        callback: function (data) {\
472n            updateSummary();\n            if (!data || !data.shippingMethodID) {\n                window.alert('Couldn\\'t select shipping method.');\n                return false;\n            }\n            // display promotion in UI and update the summary section,\n            // if some promotions were applied\n            $('.shippingpromotions').empty();\n\n\n            // if (data.shippingPriceAdjustments && data.shippingPriceAdjustments.length > 0) {\n            //     var len = data.shippingPriceAdjustments.length;\n            //     for (var i=0; i < len; i++) {\n            //         var spa = data.shippingPriceAdjustments[i];\n            //     }\n            // }\n        }\n    });\n}\n\n/**\n * @function\n * @description Make an AJAX request to the server to retrieve the list of applicable shipping methods\n * based on the merchandise in the cart and the currently entered shipping address\n * (the address may be only partially entered).  If the list of applicable shipping methods\n * has changed because new address information has been entered, then issue another AJAX\n * request which updates the currently selected shipping method (if needed) and also updates\n * the UI.\n */\nfunction updateShippingMethodList() {\n    var $shippingMethodList = $('#shipping-method-list');\n    if (!$shippingMethodList || $shippingMethodList.length === 0) { return; }\n    var url = getShippingMethodURL(Urls.shippingMethodsJSON);\n\n    ajax.getJson({\n        url: url,\n        callback: function (data) {\
472n            if (!data) {\n                window.alert('Couldn\\'t get list of applicable shipping methods.');\n                return false;\n            }\n            if (shippingMethods && shippingMethods.toString() === data.toString()) {\n                // No need to update the UI.  The list has not changed.\n                return true;\n            }\n\n            // We need to update the UI.  The list has changed.\n            // Cache the array of returned shipping methods.\n            shippingMethods = data;\n            // indicate progress\n            progress.show($shippingMethodList);\n\n            // load the shipping method form\n            var smlUrl = getShippingMethodURL(Urls.shippingMethodsList);\n            $shippingMethodList.load(smlUrl, function () {\n                $shippingMethodList.fadeIn('fast');\n                // rebind the radio buttons onclick function to a handler.\n                $shippingMethodList.find('[name$=\"_shippingMethodID\"]').on('click', function () {\n                    selectShippingMethod($(this).val());\n                });\n\n                // update the summary\n                updateSummary();\n                progress.hide();\n                tooltip.init();\n                //if nothing is selected in the shipping methods select the first one\n                if ($shippingMethodList.find('.input-radio:checked').length === 0) {\n                    $shippingMethodList.find('.input-radio:first').prop('checked', 'checked');\n                }\n            });\n        }\n    });\n}\n\nfunction urlParam (name) {\n    var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);\n    if (results==null){\n       return null;\n    }\n    else{\n       return results[1] || 0;\n    }\n}\n\nfunction fastCreateAccountFrontEndValidation (fastCreateAccount) {\n    //Check Server Validation\n    var answerFromServer = urlParam('fastCreateAccount');\n    var parent =  fastCreateAccount.parent();\n    if (answerFromServer != null && answerFromServer != 0 && answerFromServer == 'false') {\n        parent.find('label').addClass('error');\n        parent.find('label').html(decodeURI(urlParam('message')));\n        fastCreateAccount.addClass('error');\n        parent.removeClass('valid');\n\n        //get full URL\n        var currURL= window.location.href; //get current address\n        //Get the URL between what's after '/' and befor '?'\n        //1- get URL after'/'\n        var afterDomain= currURL.substring(currURL.lastIndexOf('/') + 1);\n        //2- get the part before '?'\n        var beforeQueryString= afterDomain.split(\"?\")[0];\n        //replace url\n        window.history.replaceState({}, document.title, \"/\" + beforeQueryString);\n\n        return false;\n    }\n\n    //Check validation\n    if( fastCreateAccount.length > 0 && fastCreateAccount.val() != '' && fastCreateAccount.val().length < 8) {\n        //Show error Message\n        parent.find('label').addClass('error');\n        parent.find('label').html(Resources.VALIDATE_PASSWORD);\n        fastCreateAccount.addClass('error');\n        parent.removeClass('valid');\n\n        return false;\n    }\n\n    parent.find('label').removeClass('error');\n    parent.find('label').html('');\n    fastCreateAccount.removeClass('error');\n    parent.addClass('valid');\n\n    return true;\n\n}\n\nexports.init = function () {\n\tvar countrySelect = $('#dwfrm_singleshipping_shippingAddress_addressFields_country');\n    var countrySelectBilling = $('#dwfrm_billing_billingAddress_addressFields_country');\n\n    var recaptchaContainer = $('#captcha_container_register');\n    if (recaptchaContainer != null) {\n        recaptchaContainer.attr('id', 'captcha_container_checkout_page');\n    }\n    if(typeof grecaptcha !== \"undefined\") initRecaptchaRegister();\n\n    // adding datalayer event to track if it's legacy shipping page\n    dataLayer.push({\n        eventcategory: 'C-sitegenesis-vs-composable-checkout-t420',\n        event: 'VwoActive'\n    })\n\n    $('.address').on('change',\n        'select[name$=\"_addressFields_country\"], input[name$=\"_addressFields_address1\"], input[name$=\"_addressFields_address2\"], select[name$=\"_addressFields_states_state\"], input[name$=\"_addressFields_city\"], input[name$=\"_addressFields_zip\"]',\n        updateShippingMethodList\n    );\n\n    updateShippingMethodList();\n\n    $('.packstation-info').toggle(countrySelect.val() === 'DE');\n\n    countrySelect.on('change', function () {\n        $('.packstation-info').toggle(countrySelect.val() === 'DE');\n        if (window.SitePreferences.LOCALE === 'en' && countrySelect.val() == 'ES') {\n            $('[id$=\"_shippingAddress_addressFields_postal\"]').addClass('postal-spain');\n        } else if(countrySelect.val() === 'BE' && window.SitePreferences.LOCALE === 'fr') {\n            $('[id$=\"_shippingAddress_addressFields_postal\"]').removeClass('postal-monaco');\n        } else if (countrySelect.val() === 'FR' && window.SitePreferences.LOCALE === 'fr') {\n            $('[id$=\"_shippingAddress_addressFields_postal\"]').addClass('postal-monaco');\n        }\n    });\n\n    countrySelectBilling.on('change', function () {\n        $('.packstation-info').toggle(countrySelect.val() === 'DE');\n        if (window.SitePreferences.LOCALE === 'en' && countrySelect.val() == 'ES') {\n            $('[id$=\"_shippingAddress_addressFields_postal\"]').addClass('postal-spain');\n        } else if(countrySelectBilling.val() === 'BE' && window.SitePreferences.LOCALE === 'fr') {\n            $('[id$=\"_billingAddress_addressFields_postal\"]').removeClass('postal-monaco');\n        } else if (countrySelectBilling.val() === 'FR' && window.SitePreferences.LOCALE === 'fr') {\n            $('[id$=\"_billingAddress_addressFields_postal\"]').addClass('postal-monaco');\n        }\n    });\n\n    subscriptionSent = false;\n\n\n    if (!fastCreateAccountFrontEndValidation(fastCreateAccount)) {\
472n        dataLayer.push( {\n            'eventCategory': 'Shipping Page',\n            'eventAction': 'Password error - account exists',\n            'eventLabel': 'none',\n            'event': 'GA Tracking'\n        });\n        $('#dwfrm_singleshipping_shippingAddress_password').focus();\n    }\n\n    fastCreateAccount.focusout(function(){\n        fastCreateAccountFrontEndValidation($(this));\n    });\n\n    $('.js-shipping-submit').on('click',function(e){\n        billingClickEvent = e;\n        e.preventDefault();\n        var form = $('#captcha_container_checkout_page').parents('form');\n\n        if (!form.length) {\n            handleSubmitBtn(e);\n            return;\n        }\n\n        if (!form.valid()) {\n            if (document.querySelector('input.error')) { // scroll to first invalid field\n                document.querySelector('input.error').scrollIntoView({ block: \"center\" });\n            }\n            var errorMessage = $('label.error:visible').html().trim();\n            window.dataLayer.push({\n                'eventCategory': 'Shipping page',\n                'eventAction': 'Shipping page error',\n                'eventLabel': errorMessage,\n                'event': 'GA Tracking',\n            });\n            return false;\n        } else if (typeof grecaptcha === \"undefined\" && e.currentTarget.classList.contains('recaptcha')) {\n            scriptsInjection.loadRecaptcha(executeRecaptcha, initRecaptchaRegister);\n        } else {\n            executeRecaptcha();\n        }\n\n        function executeRecaptcha() {\n            if(e.currentTarget.classList.contains('recaptcha') && $('#dwfrm_singleshipping_shippingAddress_password').val()){\n                grecaptcha.reset(captchaContainerRegister);\n                grecaptcha.execute(captchaContainerRegister);\n            }else {\n                handleSubmitBtn(e);\n            }\n        }\n    });\n\n    $('#js-checkout-productlist').on('click', '.js-show-bonus', function (e) {\n        e.preventDefault();\n        bonusProductsView.show(this.href);\n    });\n\n    var billingFormToggler = document.getElementById('dwfrm_singleshipping_shippingAddress_differentBillingAddress');\n    $(billingFormToggler).on('change',function(){\n    \tinitBillingFormEvents(this);\n    });\n\n    initBillingFormEvents(billingFormToggler);\n\n    $('.paypal-country-mismatch').find('.js-close-toggle').on('click', function() {\n    \t$(this).parent().slideUp();\n    });\n\n    var shippingFormPostal = document.getElementById('dwfrm_singleshipping_shippingAddress_addressFields_postal');\n    var shippingFormHouse = document.getElementById('dwfrm_singleshipping_shippingAddress_addressFields_houseNumber');\n    var shippingFormHouseAdd = document.getElementById('dwfrm_singleshipping_shippingAddress_addressFields_houseNumberAddition');\n    var shippingFormStreet = document.getElementById('dwfrm_singleshipping_shippingAddress_addressFields_address1');\n    var shippingFormCity = document.getElementById('dwfrm_singleshipping_shippingAddress_addressFields_city');\n    var regexObj = Resources.postalCodeRegexes[\"NL\"];\n    shippingFormPostal.addEventListener('focusout', function() {\n        if (countrySelect.val() === \"NL\") {\n            updateStreetCountry(shippingFormPostal,shippingFormHouse,shippingFormHouseAdd,shippingFormStreet,shippingFormCity);\n        }\n    }, true);\n    if (shippingFormHouse) {\n        shippingFormHouse.addEventListener('focusout', function() {\n            if (countrySelect.val() === \"NL\") {\n                updateStreetCountry(shippingFormPostal,shippingFormHouse,shippingFormHouseAdd,shippingFormStreet,shippingFormCity);\n            }\n        }, true);\n    }\n    if (shippingFormHouseAdd) {\n        shippingFormHouseAdd.addEventListener('focusout', function() {\n            if (countrySelect.val() === \"NL\") {\n                updateStreetCountry(shippingFormPostal,shippingFormHouse,shippingFormHouseAdd,shippingFormStreet,shippingFormCity);\n            }\n        }, true);\n    }\n    $('#dwfrm_singleshipping_shippingAddress_addressFields_postal').on(\"keyup change\", function() {\
472n        var zipcode = $(this).val();\n        if (new RegExp(regexObj).test(zipcode)) {\n            if (countrySelect.val() === \"NL\") {\n                updateStreetCountry(shippingFormPostal,shippingFormHouse,shippingFormHouseAdd,shippingFormStreet,shippingFormCity);\n            }\n        }\n    });\n};\n\nfunction updateStreetCountry(shippingFormPostal,shippingFormHouse,shippingFormHouseAdd,shippingFormStreet,shippingFormCity){\n    if(localStorage.zipcode != shippingFormPostal.value || localStorage.housenumber != shippingFormHouse.value)\n    {\n        if(!$(shippingFormPostal).hasClass('error') && !$(shippingFormHouse).hasClass('error') && !$(shippingFormHouseAdd).hasClass('error') &&\n            shippingFormPostal.value != \"\" && shippingFormHouse.value != \"\" )\n        {\n            var url = Urls.getPostCodeService;\n            var defaultWidth = '800';\n\n            if ($(window).width() < 800) {\n                defaultWidth = '90%';\n            }\n            var options = {\n                data: {\n                    'zipcode': shippingFormPostal.value,\n                    'house': shippingFormHouse.value,\n                    'houseadd': shippingFormHouseAdd.value\n                },\n                url: url,\n                dataType: 'json'\n            };\n            $.ajax(options).done(function(response) {\n                if(response.success) {\n                    $(shippingFormStreet).val(response.street);\n                    $(shippingFormStreet).valid();\n                    $(shippingFormCity).val(response.city);\n                    $(shippingFormCity).valid();\n                } else {\n                    dialog.open({\n                        html: response.errormessage,\n                        closeText : '',\n                        options: {\n                            dialogClass: 'postal-code-popup',\n                            width: defaultWidth,\n                            height: 'auto',\n                            closeText : '',\n                            open: function() {\n                                if ($('.ui-widget-overlay')) {\n                                    $('.ui-widget-overlay').on('click', function() {\n                                        dialog.close();\n                                    });\n                                }\n                            }\n                        }\n                    });\n                    dataLayer.push({\n                        'eventCategory': 'Shipping Page',\n                        'eventAction': 'NL Unrecognized postcode',\n                        'eventLabel': 'none',\n                        'event': 'GA Tracking'\n                    });\n                }\n                localStorage.zipcode = shippingFormPostal.value;\n                localStorage.housenumber = shippingFormHouse.value;\n            });\n        }\n    }\n}\n\nfunction initBillingFormEvents(billingFormToggler) {\n    if ( billingFormToggler.checked ) {\n        $('#billing-form').removeClass('visually-hidden');\n        $('#billing-form').find('input,select').removeClass('ignore-me');\n        formPrepare.init({\n            continueSelector: '[name$=\"shippingAddress_save\"]',\n            formSelector: '[id=\"shipping-form\"],[id=\"billing-form\"]'\n        });\n    } else {\n        $('#billing-form').addClass('visually-hidden');\n        $('#billing-form').find('input,select').addClass('ignore-me');\n    }\n}\n\nexports.updateShippingMethodList = updateShippingMethodList;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/checkout/shipping.js?\n}");
473
474/***/ }),
475
476/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/checkout/showAddressTwo.js":
477/*!***********************************************************************************!*\
478  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/checkout/showAddressTwo.js ***!
479  \***********************************************************************************/
480/***/ (function(__unused_webpack_module, __webpack_exports__) {
481
482"use strict";
483eval("{const showAddressTwo = function() {\n    const addressTwoShowButtons = document.querySelectorAll('.js-show-address-2');\n\n    if (!addressTwoShowButtons && !addressTwoShowButtons.length) return;\n\n    addressTwoShowButtons.forEach((button) => {\n        button.addEventListener('click', () => {\n            button.classList.add('expanded');\n        });\n    });\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (showAddressTwo);\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/checkout/showAddressTwo.js?\n}");
484
485/***/ }),
486
487/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/collection.js":
488/*!**********************************************************************!*\
489  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/collection.js ***!
490  \**********************************************************************/
491/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
492
493eval("{var activateAccordeon = __webpack_require__(/*! ../accordeon */ \"./cartridges/app_paulaschoice/cartridge/js/accordeon.js\");\nvar collectionPage = {\n\n  scrollToSection: function (trigger, target) {\n    var topOffset = !!$('#js-top-banner').length ? ( $('#js-top-banner').outerHeight() + $('#js-top-banner').offset().top ) : !!$('.js-header').length ? $('.js-header').outerHeight() + $('.js-header').offset().top : 0;\n    var targetPos = target.offset().top - topOffset,\n        triggerPos = trigger.offset().top - topOffset;\n    var animatedDistance = targetPos < triggerPos ? Math.abs( targetPos + triggerPos ) : Math.abs( targetPos - triggerPos ),\n        animationSpeed = parseInt( ( animatedDistance * 300) / 1000 );\n    var targetExists = typeof target != \"undefined\" && target !== null && target.length !== null && target.length > 0;\n\n    if ( targetExists ) {\n      $(\"html, body\").animate({\n        scrollTop: targetPos\n      }, {\n        duration: animationSpeed,\n        easing: \"easeInOutSine\"\n      });\n    } else {\n      console.error(\"position of target called, but can't find target\");\n      return null;\n    }\n  },\n\n  init: function () {\n\n    activateAccordeon.init();\n\n    $('#js-scroll-to-seo').on('click', function(e) {\n      e.preventDefault();\n      collectionPage.scrollToSection($(this), $(\"#js-seo-target\") );\n    });\n\n    $('#js-scroll-to-top').on('click', function(e) {\n      e.preventDefault();\n      collectionPage.scrollToSection($(this), $(\"#js-lister-top\") );\n    });\n\n  },\n\n};\n\nmodule.exports = collectionPage;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/collection.js?\n}");
494
495/***/ }),
496
497/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/compare.js":
498/*!*******************************************************************!*\
499  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/compare.js ***!
500  \*******************************************************************/
501/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
502
503"use strict";
504eval("{\n\nvar addProductToCart = __webpack_require__(/*! ./product/addToCart */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js\"),\n    ajax = __webpack_require__(/*! ../ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\"),\n    page = __webpack_require__(/*! ../page */ \"./cartridges/app_paulaschoice/cartridge/js/page.js\");\n\n/**\n * @private\n * @function\n * @description Binds the click events to the remove-link and quick-view button\n */\nfunction initializeEvents() {\n    $('#compare-table').on('click', '.remove-link', function (e) {\n        e.preventDefault();\n        ajax.getJson({\n            url: this.href,\n            callback: function () {\n                page.refresh();\n            }\n        });\n    });\n\n    $('#compare-category-list').on('change', function () {\n        $(this).closest('form').submit();\n    });\n\n\n}\n\n\nexports.init = function () {\n    initializeEvents();\n    addProductToCart();\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/compare.js?\n}");
505
506/***/ }),
507
508/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/giftcertpurchase.js":
509/*!****************************************************************************!*\
510  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/giftcertpurchase.js ***!
511  \****************************************************************************/
512/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
513
514eval("{var util = __webpack_require__(/*! ../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nvar dialog = __webpack_require__(/*! ../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\");\nvar scriptsInjection = __webpack_require__(/*! ../scriptsInjection */ \"./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js\");\nvar regex = /^[0-9]+(\\.[0-9]{1,2})?$/;\nvar inputValue;\nvar currencySymbol = $(\".gift-currency\").html();\nvar captchaContainers = {};\nvar $popup = $('.js-popup-content');\nvar $initialHTML = $popup.html();\n\nfunction initRecaptcha () {\n\tif(typeof grecaptcha === \"undefined\" ) {\n\t\treturn;\n\t}\n\n\tfunction recaptchaCreate(containerid, callback) {\n\t\tif($('#'+containerid).length > 0) {\n\t\t\tcaptchaContainers[containerid] = grecaptcha.render(containerid, {\n\t\t        'sitekey' : Resources.RECAPTCHA_SITEKEY,\n\t\t        'callback' : callback.bind(this, containerid),\n\t\t        'size' : 'invisible'\n\t\t\t });\n\t\t}\n\t}\n\n\trecaptchaCreate('captcha_container_giftcertbalance', recaptchaCallback);\n};\n\nfunction recaptchaCallback (containerid,response) {\n\treturn new Promise(function(resolve, reject) {\n\t    var form = $('#'+containerid).parents('form');\n\t    $(form).find('input[name=\"dwfrm_giftcert_recaptcha_recaptchabalance\"]').val(response);\n\t    checkBalance(form);\n\t});\n}\n\nfunction openGiftAccordions() {\n\tvar accordeonSection = $('.js-gift-accordeon-section');\n\tvar toggle = accordeonSection.find('.js-toggle');\n\tvar trigger = accordeonSection.find('.js-gift-accordeon-trigger');\n\n\ttrigger.on('click', function() {\n\t  $(this).next().slideToggle();\n\t  return $(this).children(toggle).hasClass('open') ? $(this).children(toggle).removeClass('open') : $(this).children(toggle).addClass('open');\n\t});\n}\n\nfunction firstActive() {\n\tvar $acc = $('.gift-card-accordions').find('.js-gift-accordeon-section').first();\n\n\t$acc.find('.js-gift-accordeon-body').slideDown();\n\t$acc.find('.js-gift-accordeon-trigger').children('.js-toggle').addClass('open');\n}\n\nfunction initGiftPopupEvents(){\n\tvar $addCartBtn = $('.js-add-giftcard-to-cart');\n\tvar $inputField = $('.js-giftcard-amount-input');\n\tvar minimumValue = $addCartBtn.data('minimum');\n\tvar maximumValue = $addCartBtn.data('maximum');\n\n    // add listener add giftcard to cart\n    // and open popup\n\t$addCartBtn.on('click', function(e) {\n        e.preventDefault();\n\n\t\t$(\".form-caption\").removeClass(\"error-message\");\n\t\te.preventDefault();\n\t\tinputValue = $inputField.val().replace(',','.');\n\t\t$inputField.val(inputValue);\n\n\t\tif(!regex.test(inputValue)){\n\t\t\t$popup.addClass('error-message').html(Resources.GIFT_CERT_REGEX_ERROR);\n\t\t\topenGiftCardPopup();\n\t\t} else if(inputValue < minimumValue || $inputField.val() == '' || !inputValue) {\n\t\t\t$popup.addClass('error-message').html(Resources.GIFT_CERT_MIN_ERROR + \" \" + currencySymbol + parseInt(minimumValue));\n\t\t\topenGiftCardPopup();\n\t\t} else if(inputValue > maximumValue || $inputField.val() == '') {\n\t\t\t$popup.addClass('error-message').html(Resources.GIFT_CERT_MAX_ERROR +\" \" + currencySymbol + parseInt(maximumValue));\n\t\t\topenGiftCardPopup();\n\t\t} else {\n\t\t\taddGiftcardToCart($initialHTML);\n        }\n\n\t\tsetTimeout(function() {\n\t\t\t$inputField.val('');\n        }, 500);\n\n    });\n}\n\nfunction openGiftCardPopup(){\n    dialog.open({\n        target: $popup,\n        options: {\n            dialogClass: \"giftcard-added-popup\",\n            title: Resources.BONUS_PRODUCTS,\n            autoOpen: true,\n            closeText : '',\n            open: function(){\n                // if continue shopping button is clicked\n                // close dialog\n                var $currentDialog = $(this);\n                // close on click \"continue\"\n                $currentDialog.find('.js-continue').on('click', function(){\n                    $currentDialog.dialog('close');\n                })\n                // close on click overlay\n                $('.ui-widget-overlay').on('click', function () {\n                \t$currentDialog.dialog('close');\n                });\n            }\n        }\n    });\n}\n\nvar giftCardPage = {\n\tinit: function () {\n\t\topenGiftAccordions();\n        initGiftPopupEvents();\n\t\tfirstActive();\n\t\tinitBalanceButton();\n\t\tif(typeof grecaptcha !== \"undefined\") initRecaptcha();\n\t}\n};\n\nfunction addGiftcardToCart(initialHTML) {\n\tvar $form = $('#GiftCertificateForm');\n\tvar $basket = $('#js-minicart-quantity');\n\tvar basketValue = $basket.text();\n\tvar basketValueInt = parseFloat(basketValue);\n\n\tvar url = util.appendParamToURL($form.attr('action'), 'format', 'ajax');\n\n    $.ajax({\n        type: 'POST',\n        url: url,\n        data: $form.serialize(),\n        success: function (response) {\n            $popup.removeClass('error-message').html(initialHTML);\n\t\t\tvar $valuespan = $(\".js-value-span\", $popup);\n\t\t\t$valuespan.html(currencySymbol + parseFloat(inputValue).toFixed(2));\n            openGiftCardPopup();\n\t\t\tbasketValueInt += 1;\n\t\t\t$basket.text(basketValueInt);\n\t\t\t$('#empty-minicart').removeClass('mini-cart-empty');
514\n\t\t\tsetTimeout(function() {\n\t\t\t\t$basket.addClass('animate');\n\t\t\t}, 100);\n        },\n        error: function (response) {\n            $popup.addClass('error-message').html(Resources.GIFT_CERT_GENERALERROR);\n\t\t\topenGiftCardPopup();\n        }\n    }).fail(function () {\n        $popup.addClass('error-message').html(Resources.GIFT_CERT_GENERALERROR);\n        openGiftCardPopup();\n    });\n}\n\n\n//initialize in case of recaptcha and no recaptcha\nfunction initBalanceButton(){\n\t$(\"#CheckBalanceButton\").on('click', function(e) {\n        e.preventDefault();\n\t\tvar $form = $('#GiftCertificateBalanceForm');\n\t\tcheckBalance($form);\n\t})\n\n\t$(\"#CheckBalanceButton-recaptcha\").on('click', function(e) {\n\t\te.preventDefault();\n\t\tvar $form = $('#GiftCertificateBalanceForm');\n\n\t\tif (!$form.valid()) {\n            return;\n        } else if (typeof grecaptcha === \"undefined\") {\n            scriptsInjection.loadRecaptcha(executeRecaptcha , initRecaptcha);\n\t\t} else {\n\t\t\texecuteRecaptcha();\n\t\t}\n\n\t\tfunction executeRecaptcha() {\n\t\t\tgrecaptcha.reset(captchaContainers[$(this).attr(\"data-captchaId\")]);\n        \tgrecaptcha.execute(captchaContainers[$(this).attr(\"data-captchaId\")]);\n\t\t}\n\t})\n}\n\nfunction checkBalance(form) {\n\tvar url = util.appendParamToURL(form.attr('action'), 'format', 'ajax');\n\n    $.ajax({\n        type: 'POST',\n        url: url,\n        data: form.serialize(),\n        success: function (response) {\n            if(response.success) {\n                showBalanceInForm(response)\n                $('.form-row.success').show();\n            }\n            if (!response.success){\n                showErrorMsg(response.ErrorMsg);\n            }\n        },\n        error: function () {\n            showErrorMsg(Resources.GIFT_CERT_GENERALERROR);\n        }\n    }).fail(function () {\n        showErrorMsg(Resources.GIFT_CERT_GENERALERROR);\n    });\n}\n\nfunction showErrorMsg(ErrorMsg){\n\tvar $balanceForm = $('#GiftCertificateBalanceForm');\n\tvar $errorRow = $balanceForm.find('div.form-row.error');\n\t$errorRow.addClass('error').html(ErrorMsg);\n}\n\nfunction showBalanceInForm(data){\n\tvar $balanceForm = $('#GiftCertificateBalanceForm');\n\tvar $balanceTable = $balanceForm.find('div.form-row.success');\n\tvar dueDateField = $balanceTable.find('.table-row.due-date');\n\tvar amountField = $balanceTable.find('.table-row.amount');\n\tdueDateField.html(data.expirationDate);\n\tamountField.html(data.balance);\n}\n\nmodule.exports = giftCardPage;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/giftcertpurchase.js?\n}");
515
516/***/ }),
517
518/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/orderconfirmation.js":
519/*!*****************************************************************************!*\
520  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/orderconfirmation.js ***!
521  \*****************************************************************************/
522/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
523
524"use strict";
525eval("{\n\nvar captchaContainer = null;\nvar progress = __webpack_require__(/*! ../progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\");\nvar dialog = __webpack_require__(/*! ../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\");\nvar scriptsInjection = __webpack_require__(/*! ../scriptsInjection */ \"./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js\");\nvar klaviyoOnsite = __webpack_require__(/*! ../klaviyoOnsite */ \"./cartridges/app_paulaschoice/cartridge/js/klaviyoOnsite.js\");\nvar alhenaCheckout = __webpack_require__(/*! ../alhenaCheckout */ \"./cartridges/app_paulaschoice/cartridge/js/alhenaCheckout.js\");\n\nfunction initRecaptcha () {\n\n    var loadCaptcha = function() {\n       if($('#captcha_container_dialog_confirmation').length > 0 && !captchaContainer) {\n           captchaContainer = grecaptcha.render(\"captcha_container_dialog_confirmation\", {\n           'sitekey' : Resources.RECAPTCHA_SITEKEY,\n           'callback' : recaptchaCallback,\n           'size' : 'invisible'\n           });\n       }\n    };\n    loadCaptcha();\n};\n\nfunction recaptchaCallback (response) {\n    return new Promise(function(resolve, reject) {\n\n           if (grecaptcha === undefined) {\n               reject();\n           }\n\n           $('#recaptchaConfirmationRegister-input').val(response);\n           handleWishlistSignUp()\n    });\n}\n\nfunction handleWishlistSignUp(){\n    var confirmationSignUpBtn = $('.js-confirmation-register-recaptcha');\n    var form = confirmationSignUpBtn.closest('form');\n    form.submit();\n}\n\nexports.init = function () {\n    alhenaCheckout.init();\n    $('.confirmation-to-subscribe').on('click', function(){\n        var scrollToElement = $('.newsletter-footer');\n        $('body,html').animate({\n            scrollTop: scrollToElement.offset().top - 120 }, 700, 'easeInOutQuad');\n    });\n\n    $('.js-confirmation-register-recaptcha').on('click', function(e) {\n        e.preventDefault();\n        var form = $('.confirmation_account-form');\n\n        if (!form.valid()) {\n            return false;\n        } else if (typeof grecaptcha === \"undefined\") {\n            scriptsInjection.loadRecaptcha(executeRecaptcha , initRecaptcha);\n        } else {\n            executeRecaptcha();\n        }\n\n        function executeRecaptcha() {\n            grecaptcha.reset(captchaContainer);\n            grecaptcha.execute(captchaContainer);\n        }\n    });\n\n    $('.js-confirmation-order-details-btn').on('click', function(e) {\n        e.preventDefault();\n        var order = $('.js-confirmation-order-details');\n\n        dialog.open({\n            target: order,\n            options: {\n                autoOpen: true,\n                closeText : '',\n                modal: true,\n                dialogClass: \"confirmation__order-popup-dialog\",\n                draggable: false,\n                autoReposition: true,\n                width: 980,\n                position: {\n                    my: \"center\",\n                    at: \"center\",\n                    of: window\n                },\n                open: function() {\n                    $('.ui-widget-overlay, .js-confirmation-order-details-close').on('click', function () {\n                        dialog.close();\n                    });\n                }\n            }\n        });\n\n        $(window).on('resize', function () {\n            $(\".confirmation__order-popup-dialog\").position({\n                my: \"center\", at: \"center\", of: window\n            });\n        });\n    });\n\n    var recaptchaContainer = $('#captcha_container_confirmation_register');\n    if (recaptchaContainer != null) {\n        recaptchaContainer.attr('id', 'captcha_container_dialog_confirmation');\n    }\n\n    if (typeof grecaptcha !== \"undefined\") {\n    \tif(!(grecaptcha.render instanceof Function)) {\n    \t\t$(document).on('recaptchaReady', function() {\
525n    \t\t\tinitRecaptcha();\n    \t\t});\n    \t} else {\n\t\t\tinitRecaptcha();\n\t\t}\n    }\n\n    var registrationForm = $('#ThankyouRegistrationForm');\n    registrationForm.on('submit',function(e){\n        e.preventDefault();\n        progress.show();\n        var url = registrationForm.attr('action');\n        var submitButton = registrationForm.find('button[type=submit]');\n        $(\"<input/>\").attr({type:\"hidden\",name:submitButton.attr(\"name\"),value:submitButton.attr(\"value\")}).appendTo(registrationForm);\n        var data = registrationForm.serialize();\n        $.ajax({\n            type: 'POST',\n            url: url,\n            data: data\n        }).done(function(response){\n            progress.hide();\n            if (response.success) {\n                registrationForm.detach();\n                $('.js-confirmation-register').addClass('confirmation_account-section--success');\n                $('.user-info__icon').removeClass('icon-account').addClass('icon-account-full');\n                $('.user-info__name').text(response.name);\n                $('.user-info__account').attr('title',response.name);\n            }\n            $('.js-confirmation-register .js-response').html(response.message);\n        });\n    });\n\n    var loginForm = $('#ThankyouLoginForm');\n    loginForm.on('submit',function(e){\n        e.preventDefault();\n        progress.show();\n        var url = loginForm.attr('action');\n        var submitButton = loginForm.find('button[type=submit]');\n        $(\"<input/>\").attr({type:\"hidden\",name:submitButton.attr(\"name\"),value:submitButton.attr(\"value\")}).appendTo(loginForm);\n        var data = loginForm.serialize();\n        $.ajax({\n            type: 'POST',\n            url: url,\n            data: data\n        }).done(function(response){\n            progress.hide();\n            if (response.success) {\n                klaviyoOnsite.identifyOnLoginSuccess(loginForm);\n                loginForm.detach();\n                $('.js-confirmation-login').addClass('confirmation_account-section--success');\n                $('.user-info__icon').removeClass('icon-account').addClass('icon-account-full');\n                $('.user-info__name').text(response.name);\n                $('.user-info__account').attr('title',response.name);\n            }\n            $('.js-confirmation-login .js-response').html(response.message);\n        });\n    });\n\n    // Custom overlay for TrustBadge for DE site\n    // Check whether TrustBadge has been initialized inside custom div, before showing custom overlay\n    // Using mutationObserver because TrustBadge does not allow callbacks\n    var callback = function(mutationsList, observer) {\n        $(\"#trustBadgeOverlay\").removeClass('hidden');\n        observer.disconnect();\n    };\n\n    var targetNode = document.getElementById('customCheckoutDiv');\n    if (targetNode) {\n    var config = { attributes: true, childList: true, subtree: true };\n    var observer = new MutationObserver(callback);\n    observer.observe(targetNode, config);\n\n    $('#customCloseTrust').on('click', function() {\n        $('#trustBadgeOverlay').addClass('hidden');\n    });\n    if(typeof grecaptcha !== \"undefined\") initRecaptcha();\n    }\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/orderconfirmation.js?\n}");
526
527/***/ }),
528
529/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/accordeon.js":
530/*!*****************************************************************************!*\
531  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/accordeon.js ***!
532  \*****************************************************************************/
533/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
534
535eval("{/**\n * @description Initialize (scroll events to) information accordeon on PDP including reviews\n */\n\nvar accordeon = (function ($) {\n\n    var reviews = __webpack_require__(/*! ./reviews */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/reviews.js\"),\n        util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\n    var elem = {\n        pdpPage: null,\n        accordeonBody: null,\n        review: null\n    };\n\n    var priv = {\n\n        activateAccordeon: function (el) {\n            var accordeonSection = el.closest($('.js-accordeon-section'));\n            var toggle = accordeonSection.find('.js-toggle');\n            var hideExpandClick = $('.js-product-skin__expand');\n\n            accordeonSection.find(elem.accordeonBody).slideToggle();\n\n            if (el.parents('#js-accordeon-reviews')) {\n                priv.toggleReviewLength();\n            }\n\n            return toggle.hasClass('open') ? toggle.removeClass('open') : toggle.addClass('open');\n        },\n\n        scrollToSection: function (target, toggleAccordeon) {\n            var thisAccordeonBody = target.find(elem.accordeonBody);\n            var toggle = target.find('.js-toggle');\n            var topOffset;\n            var targetPos;\n            if (!!$('.js-header').length) {\n                topOffset = $('.js-header').outerHeight();\n            }\n            if (!!$('.top-banner').length) {\n                // On mobile or when scrolling upwards (i.e. not scrolling down towards accordeon section), header height is plenty\n                if (util.isMobile() || !toggleAccordeon) {\n                    topOffset = $('.top-banner').outerHeight();\n                } else {\n                    // On desktop when scrolling down, initial offset causes a miscalculation\n                    topOffset = $('.top-banner').outerHeight() + $('.top-banner').offset().top;\n                }\n            }\n            targetPos = target.offset().top - topOffset;\n\n            // Don't animate if no target is found\n            if (typeof target != \"undefined\" && target !== null && target.length !== null && target.length > 0) {\n                $(\"html, body\").animate({\n                    scrollTop: targetPos\n                }, 500);\n\n                if (toggleAccordeon === true && target.find(thisAccordeonBody).is(':hidden')) {\n                    if (!toggle.hasClass('open')) {\n                        toggle.addClass('open');\n                    } else {\n                        toggle.removeClass('open');\n                    }\n                    target.find(thisAccordeonBody).slideToggle();\n                    if (thisAccordeonBody.parents($('#js-accordeon-reviews'))) {\n                        priv.toggleReviewLength();\n                    }\n                }\n            } else {\n                console.error(\"position of target called, but can't find target\");\n                return null;\n            }\n        },\n\n        showMoreReviews: function () {\n            if (elem.review.length >= 4) {\n                $('.product-review-article:nth-of-type(n+4)').addClass('shown-extra').slideDown();\n                priv.toggleReviewLength();\n                $('.js-trigger-more-reviews').hide();\n                $('.js-trigger-less-reviews').show();\n            }\n        },\n\n        showLessReviews: function () {\n            var extraReview = $('.shown-extra');\n\n            if (extraReview.length > 0) {\n                $('.shown-extra').slideUp();\n                $('.js-trigger-less-reviews').hide();\n                $('.js-trigger-more-reviews').show();\n            }\n            priv.scrollToSection($('#js-accordeon-reviews'), false);\n        },\n\n        toggleReviewLength: function () {\n            var reviewComment = $('.js-review-comment');\n\n            reviewComment.each(function () {\n                var thisComment = $(this);\n                var lengthToggle = thisComment.next($('.js-review-length-buttons'));\n\n                if (thisComment.height() <= 60 && !thisComment.hasClass('cropped')) {\n                    thisComment.addClass('full-review');\n                    lengthToggle.hide();\n                } else {\n                    thisComment.addClass('cropped');\n                    lengthToggle.show();\n                }\n            });\n        },\n\n        showFullReview: function (el) {\n            var reviewComment = el.parents('.product-review-article').find($('.js-review-comment'));\n            if (reviewComment.hasClass('cropped')) {\n                reviewComment.addClass('full-review').removeClass('cropped');\n                el.hide();\n                el.siblings($('.js-show-cropped-review')).show();\n            }\n        },\n\n        hideFullReview: function (el) {\n            var reviewComment = el.parents('.product-review-article').find($('.js-review-comment'));\n            if (reviewComment.height() >
535 60 && reviewComment.hasClass('full-review')) {\n                reviewComment.removeClass('full-review').addClass('cropped');\n                el.hide();\n                el.siblings($('.js-read-full-review')).show();\n            }\n        },\n\n        productInsideAccordion: function() {\n            var accordionButton = $('.js-product-inside__accordion-title');\n\n            accordionButton.on('click', function () {\n                var placeholderImage = $(this).parent().parent().attr('data-image');\n                var placeholderImageSource = $('.js-product-inside__placeholder');\n                var accordionParent = $(this).parent();\n                var accordionContent = accordionParent.find('.js-product-inside-accordion-content');\n                var activeAccordion = $('.js-product-inside__accordion.is-active');\n\n                if (activeAccordion.length) { // if there are active accordion close them\n                    activeAccordion.find('.js-product-inside-accordion-content').slideUp(700);\n                    activeAccordion.removeClass('is-active');\n                }\n\n                if (!accordionParent.is(activeAccordion)) { // if we clicked on the open accordion it should be kept closed\n                    accordionContent.slideToggle(700); // else we open the other accordion\n                    accordionParent.toggleClass('is-active');\n                }\n\n                //  Change image source For the Product bundle\n                placeholderImageSource.attr('src', placeholderImage);\n            });\n        },\n\n        showFullRoutine: function () {\n            var expandRoutineButton = $('.js-product-how__step-expand');\n            var closeRoutineButton = $('.js-product-how__step-close');\n            var routineContent = $('.js-product-how__step-content');\n\n            expandRoutineButton.on('click', function () {\n                $(this).toggleClass('is-active').next().slideToggle(700);\n                routineContent.not($(this).next()).slideUp(700);\n                $(this).parent().addClass('is-expanded');\n\n                if (!util.isMobile()) {\n                    closeRoutineButton.show();\n                    expandRoutineButton.toggleClass('is-hidden');\n                    $(this).hide();\n                }\n            });\n        },\n\n        hideFullRoutine: function () {\n            var expandRoutineButton = $('.js-product-how__step-expand');\n            var closeRoutineButton = $('.js-product-how__step-close');\n            var routineContent = $('.js-product-how__step-content');\n\n            closeRoutineButton.on('click', function () {\n                routineContent.not($(this).next()).slideUp(700);\n                $(this).parent().removeClass('is-expanded');\n\n                if (!util.isMobile()) {\n                    $(this).hide();\n                    expandRoutineButton.show();\n                }\n            });\n        }\n    };\n\n    return {\n        init: function () {\n            elem.pdpPage = $('.pdp-main');\n            elem.accordeonBody = $('.js-accordeon-body');\n            elem.review = $('#js-accordeon-reviews .product-review-article');\n\n            priv.toggleReviewLength();\n\n            /**\n            * @description Initialize hide routine\n            */\n            priv.hideFullRoutine();\n\n            /**\n            * @description Initialize show routine\n            */\n            priv.showFullRoutine();\n\n            /**\n            * @description Initialize hide and show Expand / Collapse Accordion (What's inside PDP)\n            */\n            priv.productInsideAccordion();\n\n            priv.hideFullReview($('.js-show-cropped-review'));\n\n            elem.pdpPage.on('click', '.js-accordeon-trigger', function () {\n                priv.activateAccordeon($(this));\n            });\n\n            elem.pdpPage.on('click', '.js-scroll-to-ingredients', function () {\n                priv.scrollToSection($('#js-ingredients-anchorpoint'), true);\n            });\n\n            elem.pdpPage.on('click', '.js-product-content .js-scroll-to-reviews', function () {\n                priv.scrollToSection($('#js-accordeon-reviews'), true);\n            });\n\n            elem.pdpPage.on('click', '.js-product-bundles-button', function () {\n                priv.scrollToSection($('#js-accordeon-product-bundles'), true);\n            });
535\n\n            /**\n             * @description Initialize review section inside information accordeon\n             */\n\n            // Don't show \"more reviews\" link if there aren't any more than three\n            if (elem.review.length < 4) {\n                $('.js-trigger-more-reviews').hide();\n            }\n\n\n            elem.pdpPage.on('click', '.js-trigger-more-reviews', function (event) {\n                event.preventDefault();\n                priv.showMoreReviews();\n            });\n\n            elem.pdpPage.on('click', '.js-trigger-less-reviews', function (event) {\n                event.preventDefault();\n                priv.showLessReviews();\n            });\n\n            elem.pdpPage.on('click', '.js-read-full-review', function () {\n                priv.showFullReview($(this));\n            });\n\n            elem.pdpPage.on('click', '.js-show-cropped-review', function () {\n                priv.hideFullReview($(this));\n            });\n\n            reviews.init();\n            if (window.location.hash.indexOf('write-review') !== -1) {\n                $('.product-reviews-tab').removeClass('hidden');\n                $('.accordeon-review-summary > span').hide();\n                priv.scrollToSection($('#js-accordeon-reviews'), true);\n            }\n            $('.accordeon-review-summary .js-write-review').on('click', function () {\n                $('.product-reviews-tab').removeClass('hidden');\n                $('.accordeon-review-summary > span').hide();\n            });\n\n            /**\n            * @description Initialize hide and show Expand / Collapse button (Product-Skin PDP)\n            */\n\n            elem.pdpPage.on('click', '.js-trigger-expand', function () {\n                $('.js-trigger-expand').hide();\n            });\n\n            elem.pdpPage.on('click', '.js-trigger-collapse', function () {\n                $('.js-trigger-expand').show();\n            });\n\n        }\n    };\n\n}(jQuery));\n\nmodule.exports = accordeon;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/accordeon.js?\n}");
536
537/***/ }),
538
539/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js":
540/*!*****************************************************************************!*\
541  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js ***!
542  \*****************************************************************************/
543/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
544
545"use strict";
546eval("{\n\nvar ajax = __webpack_require__(/*! ../../ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\"),\n\tdialog = __webpack_require__(/*! ../../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\"),\n    productaddedpopup = __webpack_require__(/*! ../../productaddedpopup */ \"./cartridges/app_paulaschoice/cartridge/js/productaddedpopup.js\"),\n    page = __webpack_require__(/*! ../../page */ \"./cartridges/app_paulaschoice/cartridge/js/page.js\"),\n    util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n    Promise = __webpack_require__(/*! promise */ \"./node_modules/promise/index.js\"),\n    _ = __webpack_require__(/*! lodash */ \"./node_modules/lodash/lodash.js\");\n\nvar freezeAddToCart = false;\n\nvar ADD_TO_CART_BTN_SELECTORS = '.add-to-cart-link, .js-add-to-cart, .js-add-to-cart-link, .js-add-to-cart-review-popup, .add-to-cart-einstein';\n\n/**\n * @param {jQuery.Event} e\n * @returns {jQuery}\n */\nfunction resolveAddToCartBtn(e) {\n    var $addToCartBtn = $(e.currentTarget);\n\n    if (!$addToCartBtn.is(ADD_TO_CART_BTN_SELECTORS)) {\n        $addToCartBtn = $(e.target).closest(ADD_TO_CART_BTN_SELECTORS);\n    }\n\n    return $addToCartBtn;\n}\n\nfunction triggerKlaviyoAddToCart(payload) {\n    if (!payload || !payload.Items || !payload.Items.length || !payload.Items[0].ProductID) {\n        return;\n    }\n    $(document).trigger('klaviyo:addToCart', [payload]);\n}\n\nfunction triggerKlaviyoUpdatedCart(payload) {\n    var items = payload && (payload.Items\n        || (payload.properties && payload.properties.Items));\n    if (!payload || !items || !items.length || !items[0].ProductID) {\n        return;\n    }\n    $(document).trigger('klaviyo:cartUpdated', [payload]);\n}\n\n/**\n * @param {jQuery} $context\n * @returns {{ productName: string, imageUrl: string }}\n */\nfunction extractProductMeta($context) {\n    var productName = '';\n    var imageUrl = '';\n\n    if ($context && $context.length) {\n        productName = (\n            $context.find('.product-name').first().text()\n            || $context.find('.js-product-tile-name-link').first().text()\n            || $context.find('.recomm-product-name').first().text() || ''\n        ).trim();\n\n        var $img = $context.find('.product-image img, .image-container img').first();\n        if (!$img.length) {\n            $img = $context.find('img').first();\n        }\n        imageUrl = $img.attr('data-src') || $img.attr('src') || '';\n        if (imageUrl.indexOf('data:') === 0) {\n            imageUrl = '';\n        }\n    }\n\n    return {\n        productName: productName,\n        imageUrl: imageUrl\n    };\n}\n\nfunction extractPdpProductMeta() {\n    var productName = (\n        $('.product-detail .product-name__name').first().text()\n        || $('.product-detail h1.product-name').first().text()\n        || $('.product-detail .product-name').first().text()\n        || ''\n    ).trim();\n\n    var imageUrl = '';\n    var $img = $('.js-primary-image, .js-product-redesign-image').first();\n    imageUrl = $img.attr('src') || $img.attr('data-src') || '';\n    if (imageUrl.indexOf('data:') === 0) {\n        imageUrl = '';\n    }\n\n    return {\n        productName: productName,\n        imageUrl: imageUrl\n    };\n}\n\nfunction buildKlaviyoPayload(productId, quantity, source, productName, imageUrl) {\n    return {\n        URL: window.location.href,\n        Source: source,\n        Items: [{\n            ProductID: productId ? String(productId) : null,\n            Quantity: quantity || 1,\n            ProductName: productName || '',\n            ImageUrl: imageUrl || ''\n        }]\n    };\n}\n\n/**\n * Reads current cart line items from [data-cartdata].\n * @returns {Array}\n */\nfunction getCartDataForKlaviyo() {\n    var el = document.querySelector('[data-cartdata]');\n    if (!el) {\n        return [];\n    }\n\n    try {\n        var raw = el.getAttribute('data-cartdata');\n        if (!raw) {\n            return [];\n        }\n        var parsed = JSON.parse(raw);\n        return Array.isArray(parsed) ? parsed : [];\n    } catch (e) {\n        return [];\n    }\n}\n\n/**\n * Builds a Cart Updated track payload (classic Track API shape).\n * Uses optional cartItems; otherwise reads [data-cartdata].\n * Extra item fields (ProductName, Category, ImageURL, ProductURL, InStock)\n * are included when present on the cart item; otherwise empty/default.\n *\n * @returns {Object|null}\n */\nfunction buildKlaviyoUpdatedPayload() {\n    var items = getCartDataForKlaviyo();\n    if (!items.length) {\n        return null;\n    }\n\n    var value = 0;\n    var itemCount = 0;\n    var mappedItems = items.map(function (item) {\n        var quantity = Number(item.quantity) || 1;\n        var unitPrice;\n        if (item.price != null && !isNaN(Number(item.price))) {\n            // Legacy data-cartdata stores line prorated total in `price`\n            unitPrice = quantity > 0 ? Number((Number(item.price) / quantity).toFixed(2)) : Number(item.price);\n        } else {\n            unitPrice = 0;\n        }\n\n        value += unitPrice * quantity;\n        itemCount += quantity;\n\n        return {\n            ProductID: String(item.sku || ''),\n            ProductName: item.ProductName || '',\n            Category: item.Category || '',\n            ImageURL: item.ImageURL || '',\n            ProductURL: item.ProductURL || '',\n            Price: parseFloat(Number(unitPrice).toFixed(2)),\n            Quantity: quantity,\n            InStock: item.InStock !== false && item.InStock !== 'false'\n        };\n    }).filter(function (Finalitem) {\n        return !!Finalitem.ProductID;\n    });\n\n    if (!mappedItems.length) {\n        return null;\n    }\n\n    var email = '';\n    if (window.KlaviyoConfig && window.KlaviyoConfig.customerEmail) {\n        email = String(window.KlaviyoConfig.customerEmail).trim();\n    }\n\n    var currency = '';\n    if (window.dataLayer && window.dataLayer.length) {\n        for (var i = 0; i < window.dataLayer.length;
546 i++) {\n            if (window.dataLayer[i] && window.dataLayer[i].pageCurrency) {\n                currency = String(window.dataLayer[i].pageCurrency);\n                break;\n            }\n        }\n    }\n    if (!currency && window.SitePreferences && window.SitePreferences.CURRENCY_CODE) {\n        currency = String(window.SitePreferences.CURRENCY_CODE);\n    }\n\n    var checkoutUrl = (typeof Urls !== 'undefined' && Urls.cartShow)\n        ? Urls.cartShow\n        : window.location.origin + '/cart';\n\n    if (checkoutUrl.indexOf('http') !== 0) {\n        checkoutUrl = window.location.origin + checkoutUrl;\n    }\n\n    return {\n        properties: {\n            Value: parseFloat(Number(value).toFixed(2)),\n            Currency: currency,\n            ItemCount: itemCount,\n            CheckoutURL: checkoutUrl,\n            Items: mappedItems\n        },\n        time: new Date().toISOString()\n    };\n}\n\nfunction extractPayloadFromForm($form, source) {\n    var pid = $form.find('input[name=\"pid\"]').first().val();\n    var qty = parseInt($form.find('input[name=\"Quantity\"]').first().val(), 10);\n    var meta = extractPdpProductMeta();\n\n    return buildKlaviyoPayload(\n        pid,\n        !qty || qty < 1 ? 1 : qty,\n        source || 'pdp',\n        meta.productName,\n        meta.imageUrl\n    );\n}\n\nfunction extractPayloadFromTile($addToCartBtn, productId, source) {\n    var pid = productId || $addToCartBtn.attr('data-productid') || $addToCartBtn.data('productid');\n    // .closest() always returns a jQuery object (even if empty), so || never falls through —\n    // include all containers in one selector instead.\n    var $tile = $addToCartBtn.closest('.js-product-tile, .product-tile, .recommended-product-details');\n    var meta = extractProductMeta($tile);\n\n    return buildKlaviyoPayload(pid, 1, source || 'tile', meta.productName, meta.imageUrl);\n}\n\n/**\n * @description Make the AJAX request to add an item to cart\n * @param {Element} form The form element that contains the item quantity and ID data\n * @returns {Promise}\n */\nvar addItemToCart = function (form) {\n    var $form = $(form),\n        $qty = $form.find('input[name=\"Quantity\"]');\n    if ($qty.length === 0 || isNaN($qty.val()) || parseInt($qty.val(), 10) === 0) {\n        $qty.val('1');\n    }\n    return Promise.resolve($.ajax({\n        type: 'POST',\n        url: util.ajaxUrl(Urls.addProduct),\n        data: $form.serialize() + \"&list=\" + getListTitle()\n    })).then(function (response) {\n        // handle error in the response\n        if (response.error) {\n            throw new Error(response.error);\n        } else {\n            return response;\n        }\n    });\n};\n\n/**\n * @description Handler to handle the add to cart event\n */\nvar addToCart = function (e) {\n    e.preventDefault();\n    var $form = $(this).closest('form');\n\n    addItemToCart($form).then(function (response) {\n        triggerKlaviyoAddToCart(extractPayloadFromForm($form, 'pdp'));\n        var $uuid = $form.find('input[name=\"uuid\"]');\n        if ($uuid.length > 0 && $uuid.val().length > 0) {\n            page.refresh();\n        } else {\n            updateCartDataInfo().then(function () {\n                triggerKlaviyoUpdatedCart(buildKlaviyoUpdatedPayload());\n            });\n            productaddedpopup.show(response);\n            // cloudinary start: Update cloudinary responsive image //\n            if (typeof window.makeCloudinaryImagesResponsive !== 'undefined') {\n                window.makeCloudinaryImagesResponsive();\n            }\n            // cloudinary end: Update cloudinary responsive image //\n        }\n    }.bind(this));\n};\n\n/**\n * @description Handler to handle the add all items to cart event\n */\nvar addAllToCart = function (e) {\n    e.preventDefault();\n    var $productForms = $('#product-set-list').find('form').toArray();\n    Promise.all(_.map($productForms, addItemToCart))\n        .then(function (responses) {\n            dialog.close();\n            // show the final response only, which would include all the other items\n            productaddedpopup.show(responses[responses.length - 1]);\n            updateCartDataInfo().then(function () {\n                triggerKlaviyoUpdatedCart(buildKlaviyoUpdatedPayload());\n            });\n        });\n};\n\nvar addToCartFromCartSlider = function(productId) {\n\t $.ajax({\n\t\t type: 'GET',\n\t     url: util.appendParamToURL(util.appendParamToURL(Urls.addProductViaGET, 'pid' ,productId), 'format', 'ajax')\n     })\n     .done(function (response) {\n        var $tile = $('.js-product-tile, .product-tile').filter(function () {\n            var $t = $(this);\n            var tileId = $t.data('itemid') || $t.attr('data-itemid');\n            if (tileId && String(tileId) === String(productId)) {\n                return true;\n            }\n            var btnPid = $t.find('[data-productid]').first().attr('data-productid');\n            return btnPid && String(btnPid) === String(productId);\n        }).first();\n        var meta = extractProductMeta($tile);\n        triggerKlaviyoAddToCart(buildKlaviyoPayload(productId, 1, 'cart', meta.productName, meta.imageUrl));\n        updateCartDataInfo().then(function () {\n            triggerKlaviyoUpdatedCart(buildKlaviyoUpdatedPayload());\n        });\n        $(document).on('popup:close', () => {\n            page.refresh();\n        });\n        productaddedpopup.show(response);\n\t })\n\t .fail(function(response) {\n         throw new Error(response.error);\n\t });\n};
546\n\nvar getListTitle = function() {\n    var categoryName = 'Product Slider';\n    if ( $('#wrapper').hasClass('pt_storefront') ) {\n        categoryName = 'Home Page Slider';\n    } else if ( $('#wrapper').hasClass('pt_content') ) {\n        categoryName = 'Content Page Slider';\n    } else if ( pageContext.ns === 'search' ) {\n        categoryName = $('.lister-top-info-header > h1').data('categoryid')\n            || $('.slot-grid-header h1').data('categoryid')\n            || $('.category-slot > .cat-banner > h1').data('categoryid')\n            || $('.category-slot > .cat-banner > h1').html()\n            || $('.category-scrolling-blocks > .category-scrolling-block > .block-wrapper > .block > h2').html();\n        if(typeof categoryName === 'undefined' && $('#wrapper').hasClass('pt_product-search-result')){\n            categoryName = 'Search Results';\n        } else {\n            categoryName = \"\";\n        }\n    }\n    if ( $('#wrapper').hasClass('pt_product-search-result') || $('#wrapper').hasClass('pt_collectionlanding') || $('#wrapper').hasClass('pt_product-details')) {\n        categoryName = localStorage.categoryName;\n        if($('#wrapper').hasClass('pt_product-details') && localStorage.categoryName === undefined) {\n            categoryName = $('.gtm-details').find('.product-detail-categorypdp').data('categorypdp');\n        }\n    }\n    if(categoryName) {\n        categoryName = categoryName.replace(/\\n
546/g, '');\n    }\n    return categoryName;\n};\n\nfunction addRoutineProductToCart(productId) {\n    return Promise.resolve($.ajax({\n        type: 'POST',\n        url: util.ajaxUrl(Urls.addProduct),\n        data: { pid: productId, format: 'ajax' }\n    })).then(function (response) {\n        if (response.error) {\n            throw new Error(response.error);\n        }\n        return response;\n    });\n}\n\nfunction buildRoutineKlaviyoItems(productIds) {\n    return productIds.map(function (productId) {\n        var pid = String(productId);\n        var productName = '';\n        var imageUrl = '';\n        var $tile = $('.routine-search-results-list .js-product-tile').filter(function () {\n            var $t = $(this);\n            var tileId = $t.data('itemid') || $t.attr('data-itemid');\n            if (tileId && String(tileId) === pid) {\n                return true;\n            }\n            var btnPid = $t.find('[data-productid]').first().attr('data-productid');\n            return btnPid && String(btnPid) === pid;\n        }).first();\n\n        if ($tile.length) {\n            productName = ($tile.find('.product-name').first().text() || '').trim();\n            var $img = $tile.find('.product-image img').first();\n            imageUrl = $img.attr('data-src') || $img.attr('src') || '';\n            if (imageUrl.indexOf('data:') === 0) {\n                imageUrl = '';\n            }\n        }\n\n        return {\n            ProductID: pid,\n            Quantity: 1,\n            ProductName: productName,\n            ImageUrl: imageUrl\n        };\n    });\n}\n\nfunction buildRoutineKlaviyoHandoff(productIds) {\n    var ids = productIds.map(String);\n    return {\n        ids: ids,\n        items: buildRoutineKlaviyoItems(productIds),\n        url: window.location.href\n    };\n}\n\nvar addToCartFromRoutineFinder = function (e) {\n    e.preventDefault();\n\n    var $btn = jQuery(this);\n    if ($btn.prop('disabled')) {\n        return;\n    }\n\n    var productIds = $btn.data('productids');\n    if (!productIds || !productIds.length) {\n        return;\n    }\n\n    productIds = productIds.filter(function (id) {\n        return id != null && String(id).trim() !== '';\n    });\n\n    if (!productIds.length) {\n        return;\n    }\n\n    $btn.prop('disabled', true);\n\n    Promise.all(productIds.map(function (productId) {\n        return addRoutineProductToCart(productId);\n    }))\n        .then(function () {\n            var handoff = buildRoutineKlaviyoHandoff(productIds);\n            var ids = handoff.ids.join(',');\n            try {\n                sessionStorage.setItem('klaviyo_routine', JSON.stringify(handoff));\n            } catch (e) {\n                // ignore\n            }\n            // Hash survives Safari redirects when sessionStorage does not flush in time.\n            var cartUrl = Urls.cartShow + '#klaviyo_routine=' + encodeURIComponent(ids);\n            return updateCartDataInfo().then(function () {\n                triggerKlaviyoUpdatedCart(buildKlaviyoUpdatedPayload());\n            }).then(function () {\n                window.location.href = cartUrl;\n            });\n        })\n        .catch(function () {\n            $btn.prop('disabled', false);\n        });\n};\n\n/**\n * @description Handler to handle the add to cart event\n */\nvar addToCartFromTile = function (e) {\n    e.preventDefault();\n\n    freezeAddToCart = true;\n\n    setTimeout(function() {\n        freezeAddToCart = false;\n    }, 1000);\n\n    var $addToCartBtn = resolveAddToCartBtn(e);\n    var productId = $addToCartBtn.attr('data-productid') || $addToCartBtn.data('productid');\n\tvar uuid = $addToCartBtn.data('uuid');\n\n    if (productId || uuid) {\n        if($addToCartBtn.closest('.pt_cart').length > 0) {\n            addToCartFromCartSlider(productId);\n            return;\n        }\n\n        Promise.resolve($.ajax({\n            type: 'POST',\n            url: util.ajaxUrl(Urls.addProduct),\n            data: {pid:productId,format:\"ajax\",uuid:uuid,list:getListTitle()}\n        })).then(function (response) {\n            // handle error in the response\n            if (response.error) {\n                throw new Error(response.error);\n            } else {\n                triggerKlaviyoAddToCart(extractPayloadFromTile($addToCartBtn, productId, 'tile'));\n                updateCartDataInfo().then(function () {\n                    triggerKlaviyoUpdatedCart(buildKlaviyoUpdatedPayload());\n                });\n                productaddedpopup.show(response);\n            }\n        });\n    }\n};\n\nvar updateCartDataInfo = function () {\n    return Promise.resolve($.ajax({\n        url: Urls.getCartSkusInfo,\n        dataType: 'text'\n    })).then(function (response) {\n        if (response) {\n            document.querySelector('[data-cartdata]').dataset.cartdata = JSON.parse(response);\n        }\n    });\n};\n\nfunction exportEventsForAjaxedTiles() {\n    $('.routine-search-results').off('click').on('click', '.add-to-cart-link, .js-add-to-cart', function(e) {\n        if (freezeAddToCart) {\n            return;\n        }\n        e.stopPropagation();\n        addToCartFromTile(e);\n    });\n}\n\n/**\n * @function\n * @description Binds the click event to a given target for the add-to-cart handling\n */\nmodule.exports = function () {\n    $('.product-detail').off('click').on('click', '.add-to-cart', addToCart);\n    $('#add-all-to-cart').off('click').on('click', addAllToCart);\n    exportEventsForAjaxedTiles();\n    $('.add-to-cart-link, .js-add-to-cart').off('click').on('click', function(e) {\n        addToCartFromTile(e);\n    });\n    $('.js-add-to-cart-routine-essential').off('click').on('click', addToCartFromRoutineFinder);\n    $('.js-add-to-cart-routine-all').off('click').on('click', addToCartFromRoutineFinder);\n\n    // Einstein ATC lives in the product-added popup; popup is portaled to <body>\n    // so it is no longer under .js-mini-cart — use document delegation.\n    $(document).off('click.einsteinAtc', '.add-to-cart-einstein').on('click.einsteinAtc', '.add-to-cart-einstein', addToCartFromTile);\n    if(!$('#add-to-cart').data('outofstock')){\n    \t$('#add-to-cart').removeAttr('disabled');\n    } else {\n        $('.add-to-cart[disabled]').attr('title', $('.availability-msg').text());\n    }\n    // add to cart event for poverreviews popup\n    $('.js-reviews-popup .js-add-to-cart-review-popup').off('click').on('click', addToCartFromTile);\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js?\n}");
547
548/***/ }),
549
550/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/availability.js":
551/*!********************************************************************************!*\
552  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/availability.js ***!
553  \********************************************************************************/
554/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
555
556"use strict";
557eval("{\n\nvar ajax =  __webpack_require__(/*! ../../ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\"),\n    util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar updateContainer = function (parentContainer, data) {\n    var $availabilityMsg = $(parentContainer).find('.availability .availability-msg');\n    var message; // this should be lexically scoped, when `let` is supported (ES6)\n    if (!data) {\n        $availabilityMsg.html(Resources.ITEM_STATUS_NOTAVAILABLE);\n        return;\n    }\n    $availabilityMsg.empty();\n    // Look through levels ... if msg is not empty, then create span el\n    if (data.levels.IN_STOCK > 0) {\n        if (data.levels.PREORDER === 0 && data.levels.BACKORDER === 0 && data.levels.NOT_AVAILABLE === 0) {\n            // Just in stock\n            message = Resources.IN_STOCK;\n        } else {\n            // In stock with conditions ...\n            message = data.inStockMsg;\n        }\n        $availabilityMsg.append('<p class=\"in-stock-msg\">' + message + '</p>');\n    }\n    if (data.levels.PREORDER > 0) {\n        if (data.levels.IN_STOCK === 0 && data.levels.BACKORDER === 0 && data.levels.NOT_AVAILABLE === 0) {\n            message = Resources.PREORDER;\n        } else {\n            message = data.preOrderMsg;\n        }\n        $availabilityMsg.append('<p class=\"preorder-msg\">' + message + '</p>');\n    }\n    if (data.levels.BACKORDER > 0) {\n        if (data.levels.IN_STOCK === 0 && data.levels.PREORDER === 0 && data.levels.NOT_AVAILABLE === 0) {\n            message = Resources.BACKORDER;\n        } else {\n            message = data.backOrderMsg;\n        }\n        $availabilityMsg.append('<p class=\"backorder-msg\">' + message + '</p>');\n    }\n    if (data.inStockDate !== '') {\n        $availabilityMsg.append('<p class=\"in-stock-date-msg\">' + String.format(Resources.IN_STOCK_DATE, data.inStockDate) + '</p>');\n    }\n    if (data.levels.NOT_AVAILABLE > 0) {\n        if (data.levels.PREORDER === 0 && data.levels.BACKORDER === 0 && data.levels.IN_STOCK === 0) {\n            message = Resources.NOT_AVAILABLE;\n        } else {\n            message = Resources.REMAIN_NOT_AVAILABLE;\n        }\n        $availabilityMsg.append('<p class=\"not-available-msg\">' + message + '</p>');\n    }\n};\n\nmodule.exports = function () {\n    $('body').on('change', '.pdpForm input[name=\"Quantity\"]', function(){ \n        var parentContainer = $(this).parents('.pdp-main'); \n        ajax.getJson({\n            url: util.appendParamsToUrl(Urls.getAvailability, {\n                pid: $(parentContainer).find('.js-pid').val(),\n                Quantity: $(this).val()\n            }),\n            callback: function(data) {\n                updateContainer(parentContainer, data);\n            }\n        });\n    });\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/availability.js?\n}");
558
559/***/ }),
560
561/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/basePDP.js":
562/*!***************************************************************************!*\
563  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/basePDP.js ***!
564  \***************************************************************************/
565/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
566
567"use strict";
568eval("{/* harmony import */ var swiper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! swiper */ \"./node_modules/swiper/swiper.esm.js\");\n\n\nconst quantityButtons = {\n    init: function () {\n        if (!document.querySelector('.js-qty-select')) return;\n        const qtySelect = document.querySelector('.js-qty-select');\n        const deductBtn = qtySelect.querySelector('.js-qty-select-remove');\n        const addButton = qtySelect.querySelector('.js-qty-select-add');\n\n        deductBtn.onclick = function () {\n            const currentInputBox = deductBtn.nextElementSibling;\n            let inputValue = parseInt(currentInputBox.value);\n            if (inputValue > 0) {\n                inputValue = inputValue - 1;\n                quantityButtons.updateGTMQuantity(\n                    deductBtn,\n                    inputValue\n                );\n            }\n\n            currentInputBox.value = inputValue;\n\n            if (inputValue <= 1) {\n                deductBtn.classList.add('qty-hide');\n                return;\n            }\n\n            deductBtn.classList.remove('qty-hide');\n        };\n\n        addButton.onclick = () => {\n            const currentInputBox = addButton.previousElementSibling;\n            const inputValue = parseInt(currentInputBox.value) + 1;\n            currentInputBox.value = inputValue;\n            quantityButtons.updateGTMQuantity(\n                addButton,\n                inputValue\n            );\n\n            if (inputValue <= 1) {\n                deductBtn.classList.add('qty-hide');\n                return;\n            }\n\n            deductBtn.classList.remove('qty-hide');\n        };\n    },\n    updateGTMQuantity: function (quantityBtn, value) {\n        const gtmContainer = quantityBtn.closest('.js-product-content').querySelector('.gtm-details');\n        const inputQuantity = gtmContainer.querySelector('.product-detail-quantity');\n        inputQuantity.setAttribute('data-quantity', value);\n    },\n};\n\nconst initSwiper = {\n    init: function () {\n        const swiper = new swiper__WEBPACK_IMPORTED_MODULE_0__[\"default\"](\".js-swiper-pdp-base\", {\n            modules: [swiper__WEBPACK_IMPORTED_MODULE_0__.Navigation, swiper__WEBPACK_IMPORTED_MODULE_0__.Pagination],\n            loop: !$(\".js-swiper-pdp-base\").find('.js-cloudinary-video'),\n            preloadImages: false,\n            resizeReInit: true,\n            observer: true,\n            observeParents: true,\n            watchSlidesProgress: true,\n            watchOverflow: true,\n            pagination: {\n                el: \".swiper-pagination\",\n                type: \"progressbar\",\n            },\n            navigation: {\n                nextEl: \".swiper-button-next\",\n                prevEl: \".swiper-button-prev\",\n            },\n            on: {\n                init: function () {\n                    if (!!window.lazyLoadInstance) window.lazyLoadInstance.update();\n                },\n                transitionStart: function () {\n                    if (!!$(\".js-swiper-pdp-base\").find('.js-cloudinary-video').length) {\n                        var videos = $(\".js-swiper-pdp-base\").find('.video-js');\n                        if (videos) {\n                            videos.each(function (i, video) {\n                                if ($(video)[0].player) $(video)[0].player.pause();\n                            });\n                        }\n                    }\n\n                },\n                transitionEnd: function () {\n                    var activeIndex = this.activeIndex;\n                    var activeSlide = $(\".js-swiper-pdp-base\").find('.swiper-slide')[activeIndex];\n                    if (!!$(activeSlide).find('.js-cloudinary-video').length) {\n                        var activeSlideVideo = $(activeSlide).find('.video-js')[0].player;\n\n                        if (activeSlideVideo) activeSlideVideo.play();\n                    }\n                }\n            },\n        });\n    }\n};\n\nconst initOOSDialog = {\n    init: function (pid) {\n        $(document).on('click', '.js-oos-dialog-trigger', function (e) {\n            e.preventDefault();\n            const dialogId = $(this).attr('data-dialog-id');\n            $('.js-oos-dialog.ui-dialog-content[data-id=\"' + dialogId + '\"]').dialog('open');\n        });\n\n        if (pid && $('.js-oos-dialog[data-id=\"' + pid + '\"]').hasClass('ui-dialog-content')) {\n            $('.js-oos-dialog[data-id=\"' + pid + '\"]').not('.ui-dialog-content').remove();\n            return;\n        };\n        const dialogOOS = $('.js-oos-dialog').dialog({\n            autoOpen: false,\n            width: 490,\n            modal: true,\n            draggable: false,\n            dialogClass: 'redesign-pdp-oos__dialog-container',\n            closeText: '',\n            position: {\n                my: \"right center\",\n                at: \"right\",\n                of: $('.js-product-content')\n            },\n            open: function () {\n                $(document).on('click', '.ui-widget-overlay, .js-dialog-close, .js-add-to-cart', function (e) {\n                    if (dialogOOS.dialog('isOpen')) {\
568n                        dialogOOS.dialog('close');\n                    }\n                });\n            }\n        });\n    }\n};\n\n/**\n * @description Hide \"Suitable for my skin\" after clicking on the button\n **/\nconst initHideBanner = {\n    init: function () {\n        if (!document.querySelector('.js-take-test')) return;\n        const testBtn = document.querySelector('.js-take-test');\n        const skinBanner = document.querySelector('.js-fits-my-skin');\n        const labelsContainer = document.querySelector('.js-fits-my-skin__labels');\n\n        testBtn.onclick = function () {\n            skinBanner.classList.add('is-hidden');\n            labelsContainer.classList.add('is-visible');\n        };\n    },\n};\n\nvar basePDP = {\n    init: function () {\n        quantityButtons.init();\n        initSwiper.init();\n        initOOSDialog.init();\n        initHideBanner.init();\n    },\n    quantityButtons: quantityButtons,\n    initOOSDialog: initOOSDialog,\n    initSwiper: initSwiper,\n    initHideBanner: initHideBanner\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (basePDP);\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/basePDP.js?\n}");
569
570/***/ }),
571
572/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/image.js":
573/*!*************************************************************************!*\
574  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/image.js ***!
575  \*************************************************************************/
576/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
577
578"use strict";
579eval("{\nvar util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\n/**\n * @description Sets the main image attributes\n * @param {Object} atts Object with url, alt, title and hires properties\n */\nfunction setMainImage (atts) {\n    var $primaryImage = $('#js-pdp-main .js-primary-image');\n    var $desktopImageSource = $primaryImage.closest('picture').find('.js-desktop-img-src');\n\n    // if image inside <picture> element, change <source>\n    // else change src attr directly\n    if ($desktopImageSource.length > 0){\n        $desktopImageSource.attr('srcset', atts.url);\n    } else {\n        $primaryImage.attr('src', atts.url)\n    }\n\n    $('#js-pdp-main .js-primary-image').attr({\n        alt: atts.alt,\n        title: atts.title\n    });\n}\n\n/**\n * @description Replaces the images in the image container, for eg. when a different color was clicked.\n */\nfunction replaceImages () {\n    var $newImages = $('#update-images .js-product-visuals'),\n    $newThumbnails = $('#update-images #js-thumbnails'),\n    $imageContainer = $('.js-product-visuals'),\n    $imageContainerWithVideo = !!$imageContainer.find('.js-cloudinary-video')\n\n    if ($newImages.length === 0) { return; }\n\n    $imageContainer.html($newImages.html());\n    $newImages.remove();\n\n    if ($imageContainer.length === 0 && $imageContainerWithVideo) {\n        $imageContainer.parent().find('#js-thumbnails').remove();\n        $imageContainer.parent().prepend($newThumbnails[0].outerHTML);\n        $newThumbnails.remove();\n    }\n}\n\n/**\n * @description Removes new look badge on old PDP after the first image. New PDP has different setup, this is not needed there.\n */\nfunction toggleNewLookBadge (el) {\n    if ( $('.js-badge').hasClass('badge-new-look') ) {\n        if ( el.is(':first-child') ) {\n            $('.js-badge').removeClass('hide');\n        } else {\n            $('.js-badge').addClass('hide');\n        }\n    }\n}\n\n/* @module image\n * @description this module handles the primary image viewer on PDP\n **/\nfunction init () {\n    $('#js-pdp-main').on('click', '.js-thumb img', function () {\n        $('#js-thumbnails').find('.js-thumb.selected').removeClass('selected');\n        $(this).closest('.js-thumb').addClass('selected');\n        setMainImage($(this).data('lgimg'));\n        toggleNewLookBadge($(this).parent());\n    });\n}\n\n\nmodule.exports.init = init;\nmodule.exports.setMainImage = setMainImage;\nmodule.exports.replaceImages = replaceImages;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/image.js?\n}");
580
581/***/ }),
582
583/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/index.js":
584/*!*************************************************************************!*\
585  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/index.js ***!
586  \*************************************************************************/
587/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
588
589"use strict";
590eval("{\n\nvar dialog = __webpack_require__(/*! ../../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\"),\n    productStoreInventory = __webpack_require__(/*! ../../storeinventory/product */ \"./cartridges/app_paulaschoice/cartridge/js/storeinventory/product.js\"),\n    tooltip = __webpack_require__(/*! ../../tooltip */ \"./cartridges/app_paulaschoice/cartridge/js/tooltip.js\"),\n    util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n    addToCart = __webpack_require__(/*! ./addToCart */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js\"),\n    availability = __webpack_require__(/*! ./availability */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/availability.js\"),\n    productNav = __webpack_require__(/*! ./productNav */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/productNav.js\"),\n    productSet = __webpack_require__(/*! ./productSet */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/productSet.js\"),\n    recommendations = __webpack_require__(/*! ./recommendations */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/recommendations.js\"),\n    variant = __webpack_require__(/*! ./variant */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/variant.js\"),\n    reviews = __webpack_require__(/*! ./reviews */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/reviews.js\"),\n    image = __webpack_require__(/*! ./image */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/image.js\"),\n    accordeon = __webpack_require__(/*! ./accordeon */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/accordeon.js\"),\n    scrollingBlocks = __webpack_require__(/*! ./scrollingBlocks */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/scrollingBlocks.js\"),\n    notifyme = __webpack_require__(/*! ./notifyme */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/notifyme.js\"),\n    wishlist = __webpack_require__(/*! ../wishlist */ \"./cartridges/app_paulaschoice/cartridge/js/pages/wishlist.js\"),\n    login = __webpack_require__(/*! ../../login */ \"./cartridges/app_paulaschoice/cartridge/js/login.js\"),\n    powerreviews = __webpack_require__(/*! ../../powerreviews */ \"./cartridges/app_paulaschoice/cartridge/js/powerreviews.js\");\n\nvar product = {\n    initializeEvents: initializeEvents,\n    init: function () {\n        initializeDom();\n        initializeEvents();\n    }\n};\n\nmodule.exports = product;\n\n/**\n * @description Initialize product detail page with reviews, recommendation and product navigation.\n */\nfunction initializeDom() {\n    productNav();\n    recommendations();\n    tooltip.init();\n}\n\n/**\n * @description Initialize event handlers on product detail page\n */\nfunction initializeEvents() {\n    var $pdpMain = $('.pdp-main');\n    var shouldOpenWriteReview = (window.location.hash.indexOf(\"write-review\") !== -1);\n\n    addToCart();\n    availability();\n    productSet();\n    accordeon.init();\n    image.init();\n\n    scrollingBlocks.init();\n    variant.init({\n    \tsuccess: function() {\n            if (SitePreferences.STORE_PICKUP) {\n                productStoreInventory.init();\n            }\n\n            tooltip.init();\n            addToCart();\n    \t}\n    });
590\n\n    wishlist.init();\n    login.init();\n    if (SitePreferences.STORE_PICKUP) {\n        productStoreInventory.init();\n    }\n\n    // Skin concerns show entire text and hide\n    $(\".js-skin-concernes\").on(\"mouseenter\", function() {\n\t\t$(\".js-skin-concernes\").removeClass(\"product-concerns\").addClass(\"product-concerns-no-break\");\n\t});\n\t$(\".js-skin-concernes\").on(\"mouseleave\", function(){\n\t\t$(\".js-skin-concernes\").removeClass(\"product-concerns-no-break\").addClass(\"product-concerns\");\n\t});\n\n    // product options\n    $pdpMain.on('change', '.product-options select', function () {\n        var salesPrice = $pdpMain.find('.product-add-to-cart .price-sales');\n        var selectedItem = $(this).children().filter(':selected').first();\n        salesPrice.text(selectedItem.data('combined'));\n    });\n\n    if ( $('.recommendation-item').length > 0 ) {\n    \t$('.recommendation-item').on('click',function(){\n    \t\tlocalStorage.categoryName = \"Recommended Products\";\n    \t});\n    }\n\n    if ( $('#js-accordeon-reviews').length > 0 && (window.location.hash === '#1' || window.location.href.indexOf(\"#reviews\") > -1)) {\n        $('.js-scroll-to-reviews').trigger('click');\n    }\n\n    powerreviews.powerReviewWriteReviewPDP();\n}\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/index.js?\n}");
591
592/***/ }),
593
594/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/notifyme.js":
595/*!****************************************************************************!*\
596  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/notifyme.js ***!
597  \****************************************************************************/
598/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
599
600"use strict";
601eval("{\n\nvar util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nvar dialog = __webpack_require__(/*! ../../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\");\nvar validator = __webpack_require__(/*! ../../validator */ \"./cartridges/app_paulaschoice/cartridge/js/validator.js\");\nvar scriptsInjection = __webpack_require__(/*! ../../scriptsInjection */ \"./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js\");\nvar recaptchaUtils = __webpack_require__(/*! ../../recaptchaUtils */ \"./cartridges/app_paulaschoice/cartridge/js/recaptchaUtils.js\");\nvar captchaContainer = null;\n\nvar NOTIFY_ME_CAPTCHA_CONTAINER = 'captcha_container_dialog';\n\nfunction initRecaptcha() {\n    return recaptchaUtils.renderWidget(\n        NOTIFY_ME_CAPTCHA_CONTAINER,\n        recaptchaCallback,\n        function () { return captchaContainer; },\n        function (widgetId) { captchaContainer = widgetId; }\n    );\n}\n\nfunction ensureNotifyMeRecaptcha() {\n    return recaptchaUtils.ensureWidget(\n        NOTIFY_ME_CAPTCHA_CONTAINER,\n        recaptchaCallback,\n        function () { return captchaContainer; },\n        function (widgetId) { captchaContainer = widgetId; },\n        initRecaptcha\n    );\n}\n\nfunction runRecaptchaSubmit(executeFn, initFn) {\n    if (recaptchaUtils.isRecaptchaScriptMissing()) {\n        scriptsInjection.loadRecaptcha(executeFn, initFn);\n    } else {\n        executeFn();\n    }\n}\nconst selectors = {\n    POPUP: '.js-notify-me',\n    TITLE: '.js-notify-me-title',\n    IMAGE: '.js-notify-me-image',\n    NAME: '.js-notify-me-name',\n    TYPE: '.js-notify-me-type',\n    PRICE: '.js-notify-me-price',\n    NOTIFY_ME_CLASS: '.js-notify-me-popup',\n    PREORDER_CLASS: '.js-pre-order-popup',\n    PRODUCT_TILE: '.js-product-tile',\n    PRODUCT_TILE_ALT: '.product-tile',\n    PRODUCT_SLIDER_TILE: 'js-product-slider-tile'\n};\n\nfunction recaptchaCallback(response) {\n\t return new Promise(function(resolve, reject) {\n\n\t\t    if (grecaptcha === undefined) {\n\t\t        reject();\n\t\t    }\n\t\t    var form = $('#captcha_container_dialog').parents('form');\n\t\t    $(form).find('input[name=\"dwfrm_notifyme_recaptcha\"]').val(response);\n\n\t\t    formAjaxCall(form);\n\t });\n}\n\n/**\n * @description This generates popup with all necessery information for function openNotifyMeForm\n * @param {Object} html\n */\nfunction generateNotifyMePopup(html) {\n    captchaContainer = null;\n    const dialogDomObject = $('<output>').append($.parseHTML(html));\n    const recaptchaContainer = $('#captcha_container', dialogDomObject);\n    if (recaptchaContainer != null) {\n        recaptchaContainer.attr('id', NOTIFY_ME_CAPTCHA_CONTAINER);\n        html = dialogDomObject.html();\n    }\n    dialog.open({\n        autoOpen: true,\n        html: html,\n        draggable: false,\n        closeText : '',\n        options: {\n            dialogClass: \"notify-me-popup\",\n            closeText : '',\n            open: function() {\n                validator.init();\n                $('.ui-widget-overlay').on('click', function () {\n                    grecaptcha.reset();\n                    dialog.close();\n                });\n            },\n        },\n    });\n\n    recaptchaUtils.setupOnReady(initRecaptcha);\n    var emailInput = $('.notify-me-popup input[type=\"email\"]');\n    emailInput.mailtip({\n        onselected: function (mail){ // this is called when a suggestion is selected from the dropdown\n            $(this).change();\n            $(this).blur();\n        }\n    });\n}\n\n/**\n * @description open notify form or preorder form\n */\nfunction openNotifyMeForm(button, isPreOrder = false){\n    const productTile = button.closest(selectors.PRODUCT_TILE) || button.closest(selectors.PRODUCT_TILE_ALT);\n    const tilePopup = productTile ? productTile.querySelector(selectors.POPUP) : null;\n    const popup = tilePopup || document.querySelector(selectors.POPUP);\n\n    popup.classList.remove(selectors.NOTIFY_ME_CLASS, selectors.PREORDER_CLASS);\n    popup.classList.add(isPreOrder ? selectors.PREORDER_CLASS : selectors.NOTIFY_ME_CLASS);\n\n    if(productTile && !tilePopup && popup.dataset.productId !== productTile.dataset.itemid){\n        const productTileNew = productTile.classList.contains(selectors.PRODUCT_SLIDER_TILE);\n        const productTitleClass = productTileNew ? '.js-product-tile-name-link' : '.product-name a';\n        const productImageClass = productTileNew ? '.js-product-tile-image' : '.product-image img';\n        const productPriceClass = productTileNew ? '.js-product-tile-pricing' : '.product-pricing';\n\n        const popupTitle = isPreOrder ? button.dataset.popupPreorder : button.dataset.popupNotify;\n        const productID = productTile.dataset.itemid;\n        const productType = productTile.dataset.variant;\n        const productTitle = productTile.querySelector(productTitleClass).innerText;\n        const productImage = productTile.querySelector(productImageClass).getAttribute('data-src');\n        const productPrice = productTile.querySelector(productPriceClass).firstElementChild.innerText;\n\n        if (!!popup.querySelector('.js-notify-user-input')) {\n            popup.querySelector('.js-notify-user-input').remove();\n        }\n\n        popup.setAttribute('data-product-id', productID);\n        popup.querySelector(selectors.TITLE).textContent = popupTitle;\n        popup.querySelector(selectors.NAME).textContent = productTitle;\n        popup.querySelector(selectors.IMAGE).setAttribute('src', productImage);\n        popup.querySelector(selectors.TYPE).textContent = productType;\n        popup.querySelector(selectors.PRICE).textContent = productPrice;\n\n        if (popup.querySelector('input[name=\"dwfrm_notifyme_productID\"]')) {\n            popup.querySelector('input[name=\"dwfrm_notifyme_productID\"]').value = productID;\n        }\n\n        $.ajax({\n            type: 'GET',\n            url: util.appendParamToURL(Urls.includeNotifyMeUserInputAjax, 'productID', productID)\n        })\n        .done(function (response) {\n            if (response.success) {\
601n                const notifyMeUserInputForm = document.createElement('div');\n                notifyMeUserInputForm.innerHTML = response.encodedUserInput;\n                popup.appendChild(notifyMeUserInputForm);\n                generateNotifyMePopup(popup.innerHTML)\n            }\n        })\n        .fail(function(response) {\n            throw new Error(response.error);\n        });\n\n        return;\n    }\n\n    return generateNotifyMePopup(popup.innerHTML);\n}\n\nfunction formAjaxCall (form) {\n\t$('#dwfrm_notifyme_email-error').css('display','none');\n\n    if(!$(form).valid()){\n        return;\n    }\n\n    var url = $(form).attr('action');\n    var formData = {};\n    $(form).find(\"input[name]\").each(function (index, node) {\n        formData[node.name] = node.value;\n    });\n    formData['dwfrm_notifyme_submit'] = '';\n    $.post(url,formData).done(function(response){\n        if ( response.success ) {\n            if (response.result == 'existing') {\n            \t$(form).find('p.js-hint-notify-me').removeClass('success-message').addClass('error-message').html(Resources.NOTIFYME_EXISTINGEMAIL);\n            } else if (response.result == 'new') {\n                $(form).find('p.js-hint-notify-me').removeClass('error-message').addClass('success-message').html(Resources.NOTIFYME_SUCCESS);\n            }\n        } else {\n        \t$(form).find('p.js-hint-notify-me').removeClass('success-message').addClass('error-message').html(Resources.NOTIFYME_ERROR);\n        }\n    }).fail(function () {\n    \t$(form).find('p.js-hint-notify-me').removeClass('success-message').addClass('error-message').html(Resources.NOTIFYME_ERROR);\n    });\n}\n\n\n/**\n * @description send notification request\n */\nfunction sendNotificationRequest(e){\n    var button = e.target || e.srcElement;\n    var form = $(button).parents('form');\n    formAjaxCall(form);\n}\n\n/**\n * @description Initialize event handlers\n */\nfunction initEvents() {\n    // delegated event because part of the PDP is ajax'ed in\n    $(document).on('click', '.js-toggle-notify-me, .js-toggle-pre-order', function(e){\n        e.preventDefault();\n        e.stopPropagation();\n        if ($('.notify-me-popup') && $('.notify-me-popup').is(':visible')) return;\n\n        openNotifyMeForm(this, this.dataset.preorder);\n    });\n\n    // delegated event because part of the PDP is ajax'ed in\n    $('body').on('click', '.js-notifyme', function(e){\n        e.preventDefault();\n        sendNotificationRequest(e);\n    });\n\n    $('body').on('click', '.js-notifyme-recaptcha', function(e){\n        e.preventDefault();\n        var form = $('#captcha_container_dialog').parents('form');\n\n        if (!$(form).valid()) {\n            return;\n        }\n\n        runRecaptchaSubmit(function () {\n            ensureNotifyMeRecaptcha().then(recaptchaUtils.executeWidget);\n        }, initRecaptcha);\n    });\n}\n\nvar notifyme = {\n    init: function () {\n        initEvents();\n        validator.initForm('.js-notifyme-form');\n    }\n};\n\nmodule.exports = notifyme;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/notifyme.js?\n}");
602
603/***/ }),
604
605/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/powerReviewMutation.js":
606/*!***************************************************************************************!*\
607  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/powerReviewMutation.js ***!
608  \***************************************************************************************/
609/***/ (function(module) {
610
611"use strict";
612eval("{\n\nconst selectors = {\n    PRODUCT_REVIEW_RATING: '.product-collection-name-top-section .pr-category-snippet__total.pr-category-snippet__item'\n}\n\nfunction observePowerReviews() {\n    const observer = new MutationObserver(() => {\n        $(selectors.PRODUCT_REVIEW_RATING)\n            .not('[data-pr-processed]')\n            .each(function() {\n                const $el = $(this);\n\n                // mark as processed to avoid duplicate work\n                $el.attr('data-pr-processed', 'true');\n\n                // Extract the number from the text, e.g. \"48 reviews\"\n                const text = $el.text().trim();\n                const match = text.match(/(\\d+)/); // grab the number part\n                if (match) {\n                    const number = match[1];\n                    // Replace text with format: (48)\n                    $el.text(`(${number})`);\n                }\n            });\n    });\n\n    observer.observe(document.body, {\n        childList: true,\n        subtree: true\n    });\n}\n\nvar powerReviewMutation = {\n    init: function () {\n        observePowerReviews();\n    }\n};\n\nmodule.exports = powerReviewMutation;\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/powerReviewMutation.js?\n}");
613
614/***/ }),
615
616/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/productNav.js":
617/*!******************************************************************************!*\
618  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/productNav.js ***!
619  \******************************************************************************/
620/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
621
622"use strict";
623eval("{\n\nvar ajax = __webpack_require__(/*! ../../ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\"),\n    util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\n/**\n * @description loads product's navigation\n **/\nmodule.exports = function () {\n    var $pidInput = $('.pdpForm input[name=\"pid\"]').last(),\n        $navContainer = $('#product-nav-container');\n    // if no hash exists, or no pid exists, or nav container does not exist, return\n    if (window.location.hash.length <= 1 || $pidInput.length === 0 || $navContainer.length === 0) {\n        return;\n    }\n\n    var pid = $pidInput.val(),\n        hash = window.location.hash.substr(1),\n        url = util.appendParamToURL(Urls.productNav + '?' + hash, 'pid', pid);\n\n    ajax.load({\n        url: url,\n        target: $navContainer\n    });\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/productNav.js?\n}");
624
625/***/ }),
626
627/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/productSet.js":
628/*!******************************************************************************!*\
629  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/productSet.js ***!
630  \******************************************************************************/
631/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
632
633"use strict";
634eval("{\n\nvar ajax = __webpack_require__(/*! ../../ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\"),\n    tooltip = __webpack_require__(/*! ../../tooltip */ \"./cartridges/app_paulaschoice/cartridge/js/tooltip.js\"),\n    util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nmodule.exports = function () {\n    var $addToCart = $('#add-to-cart'),\n        $addAllToCart = $('#add-all-to-cart'),\n        $productSetList = $('#product-set-list');\n    \n   var updateAddToCartButtons = function () {\n        if ($productSetList.find('.add-to-cart[disabled]').length > 0) {\n            $addAllToCart.attr('disabled', 'disabled');\n            // product set does not have an add-to-cart button, but product bundle does\n            $addToCart.attr('disabled', 'disabled');\n        } else {\n            $addAllToCart.removeAttr('disabled');\n            $addToCart.removeAttr('disabled');\n        }\n    };\n\n    if ($productSetList.length > 0) {\n        updateAddToCartButtons();\n    }\n    // click on swatch for product set\n    $productSetList.on('click', '.product-set-item .swatchanchor', function (e) {\n        e.preventDefault();\n        if ($(this).parents('li').hasClass('unselectable')) { return; }\n        var url = Urls.getSetItem + this.search;\n        var $container = $(this).closest('.product-set-item');\n        var qty = $container.find('form input[name=\"Quantity\"]').first().val();\n\n        ajax.load({\n            url: util.appendParamToURL(url, 'Quantity', isNaN(qty) ? '1' : qty),\n            target: $container,\n            callback: function () {\n                updateAddToCartButtons();\n                tooltip.init();\n            }\n        });\n    });\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/productSet.js?\n}");
635
636/***/ }),
637
638/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/recommendations.js":
639/*!***********************************************************************************!*\
640  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/recommendations.js ***!
641  \***********************************************************************************/
642/***/ (function(module) {
643
644"use strict";
645eval("{\n\n/**\n * @description Creates product recommendation carousel using jQuery jcarousel plugin\n **/\nmodule.exports = function () {\n    var $carousel = $('#carousel-recommendations');\n    if (!$carousel || $carousel.length === 0 || $carousel.children().length === 0) {\n        return;\n    }\n    $carousel.jcarousel();\n    $('#carousel-recommendations .jcarousel-prev')\n        .on('jcarouselcontrol:active', function () {\n            $(this).removeClass('inactive');\n        })\n        .on('jcarouselcontrol:inactive', function () {\n            $(this).addClass('inactive');\n        })\n        .jcarouselControl({\n            target: '-=1'\n        });\n\n    $('#carousel-recommendations .jcarousel-next')\n        .on('jcarouselcontrol:active', function () {\n            $(this).removeClass('inactive');\n        })\n        .on('jcarouselcontrol:inactive', function () {\n            $(this).addClass('inactive');\n        })\n        .jcarouselControl({\n            target: '+=1'\n        });\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/recommendations.js?\n}");
646
647/***/ }),
648
649/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/reviewPopup.js":
650/*!*******************************************************************************!*\
651  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/reviewPopup.js ***!
652  \*******************************************************************************/
653/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
654
655"use strict";
656eval("{\n\nvar addProductToCart = __webpack_require__(/*! ./addToCart */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js\");\nvar dialog = __webpack_require__(/*! ../../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\");\nvar gtmtracking = __webpack_require__(/*! ../../gtmtracking */ \"./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js\");\nvar helpers = __webpack_require__(/*! ../../redesign/utils/helpers */ \"./cartridges/app_paulaschoice/cartridge/js/redesign/utils/helpers.js\");\n\nconst selectors = {\n    REVIEWSHOLDER: '.js-plp-product-tile .js-toggle-reviews-popup',\n    PRODUCT_TILE: '.js-product-tile',\n    PRODUCT_TILE_ALT: '.product-tile',\n    ADD_TO_CART: 'js-add-to-cart-review-popup',\n}\n\n/**\n * @description Initialize event handlers\n */\nfunction initEvents() {\n    const popupBtnOpen = document.querySelectorAll(selectors.REVIEWSHOLDER);\n    popupBtnOpen.forEach(btn => {\n        btn.addEventListener('click', (e) => {\n            e.preventDefault();\n            e.stopPropagation();\n            openReviewPopup(e);\n        })\n    });\n}\n\nfunction openReviewPopup(button){\n    const productTile = !!button.target.closest(selectors.PRODUCT_TILE) ? button.target.closest(selectors.PRODUCT_TILE) : button.target.closest(selectors.PRODUCT_TILE_ALT);\n    const productID = productTile.dataset.itemid;\n    $.ajax({\n        url: Urls.showReviewPopup + '?pid=' + productID\n    })\n    .done(function (response) {\n        generateReviewPopup(response);\n    })\n}\n\nfunction generateReviewPopup(html) {\n    const dialogDomObject = $('<output>').append($.parseHTML(html));\n    html = dialogDomObject.html();\n\n    dialog.open({\n        autoOpen: true,\n        html: html,\n        draggable: false,\n        closeText : '',\n        options: {\n            dialogClass: \"js-reviews-popup reviews-popup-dialog\",\n            closeText : '',\n            position: {\n                my: \"center top\",\n                at: \"center top+10%\",\n                of: window\n            },\n            open: function() {\n                // disable scroll while popup is open\n                helpers.default.disableScroll();\n                // include add to cart\n                addProductToCart();\n                // include gtm for add to cart event\n                gtmtracking.init();\n                // load the powerreview script with related data\n                var api_key = $('#js-pr-apikey').val();\n                var locale = $('#js-pr-locale').val();\n                var merchant_group_id = $('#js-pr-merchantgroupid').val();\n                var merchant_id = $('#js-pr-merchantid').val();\n                var page_id = $('#js-pageid').val();\n                $('#js-review-script-holder').html(\"<script>var powerReviewsObjects = {'REVIEW_DISPLAY_PAGINATION_TYPE':'VERTICAL', api_key: '\"+api_key+\"',locale: '\"+locale+\"',merchant_group_id: '\"+merchant_group_id+\"',merchant_id: '\"+merchant_id+\"',page_id: '\"+page_id+\"',style_sheet: 'null',components: {ReviewDisplay: 'pr-reviewdisplay', ReviewSnippet: 'pr-reviewsnippet'}};</script><script>window.pwr = window.pwr || function () {(pwr.q = pwr.q || []).push(arguments);};pwr('render', powerReviewsObjects);</script>\");\n\n                setTimeout(function () {\n                    if ($('#pr-review-display .pr-review').length > 8) {\n                        $('#pr-review-display').append('<a class=\"js-reviews-popup-showmore\" href='+$(\".js-reviews-popup .reviews-popup__product\").attr(\"href\")+'#reviews>'+Resources.PR_LISTERPOPUP_MOREREVIEWS+'</a>');\n                    }\n                }, 2000);\n\n                $('.ui-widget-overlay').on('click', function () {\n                    dialog.close();\n                    helpers.default.enableScroll();\n                });\n                $('.js-add-to-cart-review-popup').on('click', function () {\n                    dialog.close();\n                    helpers.default.enableScroll();\n                });\n            }
656,\n            close: function() {\n                helpers.default.enableScroll();\n            }\n        },\n    });\n}\n\nvar reviewPopup = {\n    init: function () {\n        initEvents();\n    }\n};\n\nmodule.exports = reviewPopup;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/reviewPopup.js?\n}");
657
658/***/ }),
659
660/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/reviews.js":
661/*!***************************************************************************!*\
662  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/reviews.js ***!
663  \***************************************************************************/
664/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
665
666"use strict";
667eval("{\n\nvar captchaContainer = null;\nvar scriptsInjection = __webpack_require__(/*! ../../scriptsInjection */ \"./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js\");\n\nmodule.exports = {\n    init: function (options) {\n        var $reviewsTab = $('.product-reviews-tab');\n        var defaults = {\n            writeReview: false\n        };\n        var settings = $.extend(defaults, options);\n\n        if(typeof grecaptcha !== \"undefined\") initRecaptcha();\n\n        $reviewsTab.toggleClass(\"active\", settings.writeReview);\n\n        $(\".write-review\").on(\"click\", function (e) {\n            e.preventDefault();\n            $reviewsTab.toggleClass(\"active\", true);\n        });\n\n        $reviewsTab.on('click', '.js-reviews-submit-recaptcha', function(e){\n            e.preventDefault();\n            var form = $('#captcha_container_reviews').parents('form');\n\n            if (!form.valid()) {\n\t\t\t\treturn false;\n            } else if (typeof grecaptcha === \"undefined\") {\n                scriptsInjection.loadRecaptcha(executeRecaptcha , initRecaptcha);\n            } else {\n                executeRecaptcha();\n            }\n\n            function executeRecaptcha(){\n                grecaptcha.reset(captchaContainer);\n                grecaptcha.execute(captchaContainer);\n            }\n        });\n\n        $reviewsTab.find('.send-button').on('click', function (e) {\n            e.preventDefault();\n            var form = $(this).parents('form');\n            $.ajax({\n                url: form.attr('action'),\n                type: 'post',\n                dataType: 'json',\n                data: form.serialize(),\n                success: function (data) {\
667n                    if (data.success) {\n                        $reviewsTab.toggleClass(\"active\", false);\n                        $(\".product-review-confirmation\").addClass(\"active\");\n                    }\n                }\n            }).done(function() {\n                form[0].reset();\n                form.hide();\n            });\n        });\n    }\n};\n\n\n\n\nfunction initRecaptcha () {\n\t \n        var loadCaptcha = function() {\n            if($('#captcha_container_reviews').length > 0) {\n                captchaContainer = grecaptcha.render('captcha_container_reviews', {\n                'sitekey' : Resources.RECAPTCHA_SITEKEY,\n                'callback' : recaptchaCallback,\n                'size' : 'invisible'\n                });\n            }\n        };\n        loadCaptcha();\n};\n\nfunction recaptchaCallback (response) {\n    return new Promise(function(resolve, reject) {  \n         \n            if (grecaptcha === undefined) {\n                reject();\n            }\n\n            if (!response) {\n                reject();\n            }\n           \n           $(\"#dwfrm_productreview_recaptchareviews\").val(response);\n           formAjaxCall($('#captcha_container_reviews').parents('form'));\n    });\n}\n\n\nfunction formAjaxCall (form) {\n\n    if(!$(form).valid()){\n        return;\n    }\n    \n    $.ajax({\n        url: form.attr('action'),\n        type: 'post',\n        dataType: 'json',\n        data: form.serialize(),\n        success: function (data) {\
667n            if (data.success) {\n                $('.product-reviews-tab').toggleClass(\"active\", false);\n                $(\".product-review-confirmation\").addClass(\"active\");\n            }\n        }\n    }).done(function() {\n        form[0].reset();\n        form.hide();\n    });\n}\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/reviews.js?\n}");
668
669/***/ }),
670
671/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/scrollingBlocks.js":
672/*!***********************************************************************************!*\
673  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/scrollingBlocks.js ***!
674  \***********************************************************************************/
675/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
676
677eval("{/* global ScrollMagic */\n\nvar util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nvar nav = __webpack_require__(/*! ../../scrolling-blocks-nav */ \"./cartridges/app_paulaschoice/cartridge/js/scrolling-blocks-nav.js\");\n\nvar scrollingBlocks = {\n    init: function () {\n        var isDesktop = false;\n\n        if(isDesktop){\n            var controller = new PdpController();\n            new ScrollDownButton($('.scroll-down'), controller);\n        }\n    }\n};\n\nmodule.exports = scrollingBlocks;\n\nfunction ScrollDownButton(element, controller){\n    element.on('click', function(){\n        var nextScene = getNextScene(controller.scenes);\n\n        if(typeof nextScene !== 'undefined') {\n            controller.controller.scrollTo(nextScene);\n        } else {\n            var $elementAfterScrollingBlocks = $('.pdp-main').parent().next();\n            var PositionToScrollTo = $elementAfterScrollingBlocks.offset().top - 60;\n\n            if($(window).scrollTop() < PositionToScrollTo - $(window).height()) {\n                controller.controller.scrollTo(controller.scenes[controller.scenes.length -1].leaveScene);\n            }\n\n            $('body,html').animate({\n                    scrollTop: PositionToScrollTo\n            }, 700, 'easeInOutQuad');\n        }\n    });\n\n    function getNextScene(scenes){\n        for (var i = 0; i < scenes.length; i++) {\n            if(scenes[i].leaveScene.state() !== \"DURING\" && i !== scenes.length-1) {\n                return scenes[i+1].activeScene;\n            }\n        }\n    }\n}\n\nfunction PdpController(){\n    var gap = $(window).height();\n    var pdpController = new ScrollMagic.Controller();\n    var $productInfoSections = $(\".product-info-container section\");\n    var scenes = [];\n\n    new PinScene(pdpController, $productInfoSections.length, gap);\n\n    $productInfoSections.each(function (i) {\n        scenes.push(new ScrollableSection(i, $(this), pdpController, gap, (i === $productInfoSections.length - 1)));\n    });\n\n    util.toggleEnertiaScrolling($(\"#main\"), util.isIE());\n\n    return {\n        controller: pdpController,\n        scenes: scenes\n    };\n}\n\nfunction PinScene(controller, numberOfBlocks, gap) {\n    var scene = new ScrollMagic.Scene({\n        duration: 60 + ((numberOfBlocks - 1) * gap)\n    }).addTo(controller);\n\n    scene.setPin(\".pt_product-details .pdp-main\");\n\n    return scene;\n}\n\nfunction ScrollableSection(index, element, controller, gap) {\n    var activeOffset = 60 + ((index - 1) * gap);\n    var leaveOffset = 60 + ((index - 1) * gap) + gap;\n\n    var activeScene = new $.ScrollMagic.Scene({\n        offset: activeOffset,\n        reverse: true\n    }).addTo(controller);\n\n    var leaveScene = new $.ScrollMagic.Scene({\n        offset: leaveOffset,\n        reverse: true\n    }).addTo(controller);\n\n    nav.createNavElement($('.scrolling-blocks-nav'), controller, activeOffset, leaveOffset);\n\n    activeScene.setClassToggle(element, \"active\").refresh();\n    leaveScene.setClassToggle(element, \"leave\").refresh();\n\n    return {\n        activeScene: activeScene,\n        leaveScene: leaveScene\n    };\n}\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/scrollingBlocks.js?\n}");
678
679/***/ }),
680
681/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/product/variant.js":
682/*!***************************************************************************!*\
683  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/product/variant.js ***!
684  \***************************************************************************/
685/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
686
687"use strict";
688eval("{\n\nconst basePDP = (__webpack_require__(/*! ./basePDP */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/basePDP.js\")[\"default\"]);\nvar ajax = __webpack_require__(/*! ../../ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\"),\n    image = __webpack_require__(/*! ./image */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/image.js\"),\n    util = __webpack_require__(/*! ../../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n    slider = (__webpack_require__(/*! ../../slider */ \"./cartridges/app_paulaschoice/cartridge/js/slider.js\")[\"default\"]),\n    gtmtracking = __webpack_require__(/*! ../../gtmtracking */ \"./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js\"),\n    _ = __webpack_require__(/*! lodash */ \"./node_modules/lodash/lodash.js\"),\n    isScrollAttached = false,\n    isMobile = ($(window).width() < 768),\n    fitsmyskin = __webpack_require__(/*! ../../fitsmyskin */ \"./cartridges/app_paulaschoice/cartridge/js/fitsmyskin.js\"),\n    powerreviews = __webpack_require__(/*! ../../powerreviews */ \"./cartridges/app_paulaschoice/cartridge/js/powerreviews.js\");\n\n/**\n * @description update product content with new variant from href, load new content to .js-product-content panel\n * @param {String} href - url of the new product variant\n **/\n\n// sticky add to cart functionality\nvar addStickyClass = function () {\n    var pdpBaseLook = $('.pdp-base-look');\n    var cartBtn = $('.js-add-to-cart, .js-toggle-pre-order, .js-toggle-notify-me');\n    if (isMobile && cartBtn.length && !isScrollAttached) {\n        isScrollAttached = true;\n        $(document).on('scroll', _.throttle(function () {\n            if (cartBtn.length === 0) return;\n            if (!pdpBaseLook && window.pageYOffset > 700) {\n                $('body').addClass('add-to-cart-sticky');\n            } else if (window.pageYOffset > 1200) {\n                $('body').addClass('add-to-cart-sticky');\n            } else {\n                $('body').removeClass('add-to-cart-sticky');\n            }\n        }, 200));\n    }\n}\n\nvar checkForVariants = function () {\n    var thumbnailsContainer = $('#js-thumbnails');\n\n    if (!isMobile) {\n        thumbnailsContainer.addClass('active');\n    }\n    if ($(document).find(thumbnailsContainer).length !== -1) {\n        var visibleThumbnails = thumbnailsContainer.find($('.js-thumb:visible,.js-vi
688deo-button'));\n        if (visibleThumbnails.length === 0) {\n            thumbnailsContainer.removeClass('active');\n        }\n    }\n};\n\nfunction waitForElm(selector) {\n    return new Promise((resolve) => {\n        if (document.querySelector(selector)) {\n            return resolve(document.querySelector(selector));\n        }\n\n        const observer = new MutationObserver((mutations) => {\n            if (document.querySelector(selector)) {\n                resolve(document.querySelector(selector));\n                observer.disconnect();\n            }\n        });\n\n        observer.observe(document.body, {\n            childList: true,\n            subtree: true,\n            attributes: false,\n            characterData: false,\n        });\n    });\n}\n\nvar updateWriteReviewIframe = function(variant) {\n    var pr_iframe = document.querySelector('.pr-review-write__iframe');\n    if (!pr_iframe) {\n        return;\n    }\n    var additionalParameter = `&pr_page_variation_id=${variant}`;\n    var currentDataSrc = pr_iframe.getAttribute('data-src') || '';\n\n    // Check if the data-src already contains pr_page_variation_id\n    if (currentDataSrc.indexOf('pr_page_variation_id') !== -1) {\n        // If present, update the parameter value\n        var updatedDataSrc = currentDataSrc.replace(/(&pr_page_variation_id=)[^\\&]+/, '$1' + variant);\n        pr_iframe.setAttribute('data-src', updatedDataSrc);\n\n        // Load the iframe content with the updated data-src attribute\n        pr_iframe.src = updatedDataSrc;\n    } else {\n        // If not present, add the parameter\n        pr_iframe.setAttribute('data-src', currentDataSrc + additionalParameter);\n\n        // Load the iframe content with the updated data-src attribute\n        pr_iframe.src = currentDataSrc + additionalParameter;\n    }\n}\n\nvar updateContent = function (container, href, callbackPassed) {\n    var $pdpForm = $(container).find('.pdpForm');\n    var qty = $pdpForm.find('input[name=\"Quantity\"]').first().val();\n    var $reviewTab = $('.reviews-tab');\n    var params = {\n        Quantity: isNaN(qty) ? '1' : qty,\n        format: 'ajax',\n        productlistid: $pdpForm.find('input[name=\"productlistid\"]').first().val()\n    };\n\n    ajax.load({\n        url: util.appendParamsToUrl(href, params),\n        target: $(container).find('.js-product-content'),\n        callback: function () {\n            const pid = $(container).find('input[name=\"pid\"]').val();\n            image.replaceImages();\n            if (!!$(container).find('.js-cloudinary-video')) window.renderCloudinaryVideoPlayer(),\n            slider.init('#js-pdp-slider');\n            if (!!window.lazyLoadInstance) window.lazyLoadInstance.update();\n            $reviewTab.attr('href', $reviewTab.attr('data-review-url') + pid);\n            addStickyClass(); // on scroll add sticky class to add-to-cart button\n            basePDP.quantityButtons.init();\n            if (typeof callbackPassed === 'function') {\n                callbackPassed();\n            }\n            gtmtracking.productDetail();\n            gtmtracking.init();\n            fitsmyskin.init();\n\n            // ==============\n            // Only on PDP\n            // ==============\n            const classNamesPDP = ['pdp-base-look'];\n\n            if (document.body.classList.contains(classNamesPDP)) {\n                basePDP.initOOSDialog.init(pid);\n                waitForElm(\".js-swiper-pdp-base .swiper-wrapper\").then(elm => {\n                    basePDP.initSwiper.init()\n                    if (!!window.lazyLoadInstance) window.lazyLoadInstance.update();\n                })\n                const priceWrapper = document.querySelector('.product-pricing-red');\n                const priceCurrent = document.querySelector('.product-basic-actions .product-pricing');\n                const priceCurrentElement = document.createElement('div');\n                if (!!priceCurrent) {\n                    priceCurrentElement.classList.add('product-pricing');\n                    priceCurrentElement.innerHTML = priceCurrent.innerHTML;\n                }\n                waitForElm('.pr-snippet-write-review-link').then(elm => {\n                    powerreviews.initPowerReviewWriteReviewPDP();\n                });\n                if (!priceWrapper) return\n                priceWrapper.appendChild(priceCurrentElement);\n            }\n        }\n    });\n};\n\nmodule.exports = {\n    init: function (options) {\n        var defaults = { success: function () { } };\n        var settings = $.extend(defaults, options);\n        checkForVariants();\n\n        // on scroll add sticky class to add-to-cart button\n        addStickyClass();\n        // click on swatch - should replace product content with new variant\n        $(document).on('click', '.product-detail .swatchanchor', function (e) {\n            e.preventDefault();\n            if ($(this).parents('li').hasClass('unselectable')) {\n                return;\n            }\n            updateContent($(this).parents('.pdp-main'), this.href, settings.success);\n        });\n\n        // new PDP\n        $(document).on('click', '.js-product-size', function () {\n            if ($(this).parent().hasClass('selected-size')) {\n                return;\n            }\n\n            var variant = $(this).data('variant');\n\n            updateWriteReviewIframe(variant);\n\n            $('.js-thumb').addClass('hide').removeClass('selected');\n            if ($('.js-thumb.' + variant).length > 1) {\n                $('.js-thumb.' + variant).removeClass('hide').first().addClass('selected');\n            }\n            checkForVariants();\n            updateContent($(this).parents('.pdp-main'), $(this).data('url'), settings.success);\n        });\n\n        $(document).on('change', 'select.js-product-size', function () {\n            var $selectedOption = $(this).find('option:selected');\n            var variant = $selectedOption.data('variant');\n            var url = $selectedOption.data('url');\n\n            $('.js-product-size').removeClass('selected-size');\n\n            $('.js-product-size[data-variant=\"' + variant + '\"]').addClass('selected-size');\n\n            updateWriteReviewIframe(variant);\n\n            $('.js-thumb').addClass('hide').removeClass('selected');\n            if ($('.js-thumb.' + variant).length > 1) {\n                $('.js-thumb.' + variant).removeClass('hide').first().addClass('selected');\n            }\n            checkForVariants();\n            updateContent($(this).parents('.pdp-main'), url, settings.success);\n        });\n    }\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/product/variant.js?\n}");
689
690/***/ }),
691
692/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/producttilevariationchange.js":
693/*!**************************************************************************************!*\
694  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/producttilevariationchange.js ***!
695  \**************************************************************************************/
696/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
697
698eval("{const addToCart = __webpack_require__(/*! ./product/addToCart */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js\");\nconst gtmtracking = __webpack_require__(/*! ../gtmtracking */ \"./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js\");\n\nconst selectors = {\n    PRODUCT_TILE: '.js-plp-product-tile',\n    SELECTED_BUTTON: '.product-tile__variation-button--active',\n    PRODUCT_IMAGE: '.product-image img',\n    PRODUCT_NAME_LINK: '.name-link',\n    PRODUCT_THUMB_LINK: '.thumb-link',\n    ICON: '.fa',\n    ICON_PLP: '.icon',\n    PRODUCT_TILE_BUTTON: '.product-tile-footer .button',\n    CURRENT_PRICE: '.product-sales-price',\n    DISCOUNTED_PRICE: '.product-standard-price',\n    GTM_DETAILS: '.gtm-details',\n    PRODUCT_GRUNDPREIS: '.grundpreis'\n}\n\nconst gtmSelectors = {\n    PRODUCT_ID: '.product-detail-id',\n    PRODUCT_NAME:'.product-detail-name',\n    PRODUCT_PRICE:'.product-detail-price',\n    PRODUCT_DISCOUNT:'.product-detail-discount-price',\n    PRODUCT_VARIANT:'.product-detail-variant',\n    PROMOTION_ID:'.promotion-id',\n    PROMOTION_NAME:'.promotion-name'\n}\n\nconst classes = {\n    SELECTED_BUTTON_CLASS: 'product-tile__variation-button--active',\n    NOTIFY_ME_CLASS: 'plp-notify-me-btn',\n    NOTIFY_ME_OUT_OF_STOCK_CLASS: 'js-toggle-notify-me',\n    NOTIFY_ME_PRE_ORDER_CLASS: 'js-toggle-pre-order',\n    NOTIFY_ME_ICON: 'fa-mail',\n    ADD_TO_CART_CLASS: 'add-to-cart-link',\n    ADD_TO_CART_ICON: 'fa-shopping-cart',\n    ADD_TO_CART_ICON_PLP: 'icon-cart'\n}\n\nconst productTileVariationChange = {\n    init: function() {\n        const variationChangeButtons = document.querySelectorAll('.js-tile-variation-change');\n\n        if (!variationChangeButtons.length) return;\n\n        variationChangeButtons.forEach(btn => {\n            btn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                if (btn.classList.contains(classes.SELECTED_BUTTON_CLASS)) return;\n\n                let currentProductImageSrc = null;\n                let currentProductPrice = null;\n                let currentProductTitle = null;\n                let currentProductLinkToPDP = null;\n                let isProductAvailable = false;\n                let isProductPreOrder = false;\n                let currentProductID = null;\n                let currentProductVariation = null;\n                let currentProductPromotion = null;\n\n                let parentProductTile = btn.closest(selectors.PRODUCT_TILE);\n                let data = JSON.parse(parentProductTile.getAttribute('data-variantdata-backend'));\n                if (data === null) {\n                    data = this.getMoisuriserData(data, parentProductTile);\n                }\n                const PID = btn.getAttribute('data-sku');\n\n                for (const prop in data) {\n                    if (data[prop].productID && (PID == data[prop].productID || PID + '-02' == data[prop].productID)) {\n                        const currentProductData = data[prop];\n                        isProductAvailable = currentProductData.dimension.inStock;\n                        isProductPreOrder = currentProductData.dimension.isPreOrder;\n                        currentProductPrice = currentProductData.price;\n                        currentProductImageSrc = currentProductData.image.url;\n                        currentProductTitle = currentProductData.title;\n                        currentProductLinkToPDP = currentProductData.linkToPDP;\n                        currentProductID = currentProductData.productID;\n                        currentProductVariation = currentProductData.dimension.size;\n\n                        if(currentProductData.promotion) {\n                            currentProductPromotion = currentProductData.promotion;\n                        } else {\n                            currentProductPromotion = ''\n                        }\n                    }\n                }\n                //if we on routine finder page, get correct tile for specified product\n                if (parentProductTile.querySelectorAll('.product-tile').length > 1) {\n                    parentProductTile = btn.closest('.product-tile');\n                }\n\n                // Update add to cart or notify me button\n                this.handleAddToCartOrNotifyMe(isProductAvailable, parentProductTile.querySelector(selectors.PRODUCT_TILE_BUTTON), PID, isProductPreOrder);\n\n                // Update selected button\n                parentProductTile.querySelector(selectors.SELECTED_BUTTON).classList.remove(classes.SELECTED_BUTTON_CLASS);\n                btn.classList.add(classes.SELECTED_BUTTON_CLASS);\n\n                // update image\n                parentProductTile.querySelector(selectors.PRODUCT_IMAGE).removeAttribute('srcset');\n                parentProductTile.querySelector(selectors.PRODUCT_IMAGE).setAttribute('src', currentProductImageSrc);\n\n                // update link\n                parentProductTile.querySelector(selectors.PRODUCT_NAME_LINK).setAttribute('href', currentProductLinkToPDP);\n                parentProductTile.querySelector(selectors.PRODUCT_THUMB_LINK).setAttribute('href', currentProductLinkToPDP);\n\n                // update price\n                this.handleUpdatePrice(parentProductTile, currentProductPrice);\n\n                // handle sorting attributes for updating by price\n                const oldJSONData = JSON.parse(parentProductTile.getAttribute('data-jsondata'));\n                const newJSONData = oldJSONData;\n                newJSONData.price = currentProductPrice.current.value;\n                parentProductTile.setAttribute('data-jsondata', JSON.stringify(newJSONData));
698\n\n                this.handleUpdateGTMDetails(parentProductTile,currentProductID, currentProductTitle, currentProductPrice, currentProductVariation, currentProductPromotion);\n            });\n        });\n    },\n\n    getMoisuriserData(data, parentProductTile) {\n        data = [];\n        var dataDayMoisturiser = JSON.parse(parentProductTile.getAttribute('data-variantdata-backend-daymoisturiser'));\n        var dataNightMoisturiser = JSON.parse(parentProductTile.getAttribute('data-variantdata-backend-nightmoisuriser'));\n        if (dataDayMoisturiser !== null) {\n            this.pushMoisuriserData(data, dataDayMoisturiser);\n        }\n        if (dataNightMoisturiser !== null) {\n            this.pushMoisuriserData(data, dataNightMoisturiser);\n        }\n        return data;\n    },\n\n    pushMoisuriserData(data, moisturiserData) {\n        moisturiserData.forEach(function(dataProduct) {\n            data.push(dataProduct);\n        })\n    },\n\n    handleUpdateGTMDetails(tile, productID, name, price, variation, promotion) {\n        const gtmContainer = tile.querySelector(selectors.GTM_DETAILS);\n\n        gtmContainer.querySelector(gtmSelectors.PRODUCT_ID).dataset.id = productID;\n        gtmContainer.querySelector(gtmSelectors.PRODUCT_NAME).dataset.name = name;\n        gtmContainer.querySelector(gtmSelectors.PRODUCT_PRICE).dataset.price = price.current.value;\n\n        if (price.actual && price.actual != null) {\n            gtmContainer.querySelector(gtmSelectors.PRODUCT_DISCOUNT).dataset.price = price.actual.value;\n        }\n\n        gtmContainer.querySelector(gtmSelectors.PRODUCT_VARIANT).dataset.variant = variation;\n\n        if (promotion != '') {\n            gtmContainer.querySelector(gtmSelectors.PROMOTION_ID).dataset.id = promotion.promotionID;\n            gtmContainer.querySelector(gtmSelectors.PROMOTION_NAME).dataset.name = promotion.promotionName;\n        }\n    },\n\n    handleUpdatePrice: function(tile, priceObject) {\n        tile.querySelector(selectors.CURRENT_PRICE).textContent = priceObject.current.formatted;\n\n        const discountedPrice = priceObject.actual;\n        const discountedPriceElement = tile.querySelector(selectors.DISCOUNTED_PRICE);\n\n        if (priceObject.grundPrice && tile.querySelector(selectors.PRODUCT_GRUNDPREIS)) {\n            tile.querySelector(selectors.PRODUCT_GRUNDPREIS).innerText = priceObject.grundPrice + ' / 100 ml';\n        }\n\n        if (discountedPrice) {\n            if (discountedPriceElement) {\n                discountedPriceElement.classList.remove('hidden');\n                discountedPriceElement.textContent = discountedPrice.formatted;\n            } else {\n                tile.querySelector('.product-pricing').insertAdjacentHTML('afterbegin', `<span class=\"product-standard-price price-standard strike-throughprice\">${discountedPrice.formatted}</span>`);\n            }\n            return;\n        }\n        if (discountedPriceElement) {\n            discountedPriceElement.classList.add('hidden');\n        }\n    },\n\n    handleAddToCartOrNotifyMe: function(isProductAvailable, button, PID, isProductPreOrder) {\n        const buttonIsCurrentlyAddToCart = button.classList.contains(classes.ADD_TO_CART_CLASS);\n \n        if (button.dataset.preorder) {\n            button.removeAttribute('data-preorder');\n        }\n\n        if (!isProductAvailable && !buttonIsCurrentlyAddToCart) {\n            button.classList.remove(classes.NOTIFY_ME_OUT_OF_STOCK_CLASS, classes.NOTIFY_ME_PRE_ORDER_CLASS);\n            if (isProductPreOrder) {\n                button.classList.add(classes.NOTIFY_ME_PRE_ORDER_CLASS);\n                button.dataset.preorder = true;\n            } else {\n                button.classList.add(classes.NOTIFY_ME_OUT_OF_STOCK_CLASS);\n            }\n            return;\n        }\n\n        if (isProductAvailable && buttonIsCurrentlyAddToCart) {\n            button.setAttribute('data-productid', PID);\n            return;\n        }\n\n        if (!isProductAvailable && buttonIsCurrentlyAddToCart) {\n            button.removeAttribute('data-productid');\n            button.classList.remove(classes.ADD_TO_CART_CLASS);\n            button.classList.add(classes.NOTIFY_ME_CLASS);\n            if (isProductPreOrder) {\n                button.classList.add(classes.NOTIFY_ME_PRE_ORDER_CLASS);\n                button.dataset.preorder = true;\n            } else {\n                button.classList.add(classes.NOTIFY_ME_OUT_OF_STOCK_CLASS);\n            }\n            var iconElement = button.querySelector(selectors.ICON + ', ' + selectors.ICON_PLP);\n            iconElement.classList.remove(classes.ADD_TO_CART_ICON, classes.ADD_TO_CART_ICON_PLP);\n            if (!iconElement.classList.contains(\"fa\")) {\n                iconElement.classList.add(\"fa\");\n                iconElement.classList.remove(\"icon\");\n            }\n            iconElement.classList.add(classes.NOTIFY_ME_ICON);\n            iconElement.setAttribute('data-popup-title', isProductPreOrder ? button.dataset.popupPreorder : button.dataset.popupNotify);\n            return;\n        }\n\n        if (isProductAvailable && !buttonIsCurrentlyAddToCart) {\n            button.setAttribute('data-productid', PID);\n            button.classList.remove(classes.NOTIFY_ME_CLASS, classes.NOTIFY_ME_OUT_OF_STOCK_CLASS, classes.NOTIFY_ME_PRE_ORDER_CLASS);\n            button.classList.add(classes.ADD_TO_CART_CLASS);\n            button.querySelector(selectors.ICON).classList.remove(classes.NOTIFY_ME_ICON);\n            button.querySelector(selectors.ICON).removeAttribute('data-popup-title');\n            if (button.querySelector(selectors.ICON).classList.contains(\"plp\")) {\n                button.querySelector(selectors.ICON).classList.add(classes.ADD_TO_CART_ICON_PLP);\n                button.querySelector(selectors.ICON).classList.add(\"icon\");\n                button.querySelector(selectors.ICON).classList.remove(\"fa\");\n            } else {\n                button.querySelector(selectors.ICON).classList.add(classes.ADD_TO_CART_ICON);\n            }\n            \n            addToCart();\n            gtmtracking.incrementProductImpressions();\n\t\t\tgtmtracking.incrementPromotionImpressions();\n\t\t\tgtmtracking.productInit();\n\t\t\tgtmtracking.observationBind(1000);\n            return;\n        }\n    }\n}\n\nmodule.exports = productTileVariationChange;\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/producttilevariationchange.js?\n}");
699
700/***/ }),
701
702/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/registry.js":
703/*!********************************************************************!*\
704  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/registry.js ***!
705  \********************************************************************/
706/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
707
708"use strict";
709eval("{\n\nvar addProductToCart = __webpack_require__(/*! ./product/addToCart */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js\"),\n    ajax = __webpack_require__(/*! ../ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\"),\n    login = __webpack_require__(/*! ../login */ \"./cartridges/app_paulaschoice/cartridge/js/login.js\"),\n    util = __webpack_require__(/*! ../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\n/**\n * @function\n * @description Loads address details to a given address and fills the address form\n * @param {String} addressID The ID of the address to which data will be loaded\n */\nfunction populateForm(addressID, $form) {\n    // load address details\n    var url = Urls.giftRegAdd + addressID;\n    ajax.getJson({\n        url: url,\n        callback: function (data) {\
709n            if (!data || !data.address) {\n                window.alert(Resources.REG_ADDR_ERROR);\n                return false;\n            }\n            // fill the form\n            $form.find('[name$=\"_addressid\"]').val(data.address.ID);\n            $form.find('[name$=\"_firstname\"]').val(data.address.firstName);\n            $form.find('[name$=\"_lastname\"]').val(data.address.lastName);\n            $form.find('[name$=\"_address1\"]').val(data.address.address1);\n            $form.find('[name$=\"_address2\"]').val(data.address.address2);\n            $form.find('[name$=\"_city\"]').val(data.address.city);\n            $form.find('[name$=\"_country\"]').val(data.address.countryCode).trigger('change');\n            $form.find('[name$=\"_postal\"]').val(data.address.postalCode);\n            $form.find('[name$=\"_state\"]').val(data.address.stateCode);\n            $form.find('[name$=\"_phone\"]').val(data.address.phone);\n            // $form.parent('form').validate().form();\n        }\n    });\n}\n\n/**\n * @private\n * @function\n * @description Initializes events for the gift registration\n */\nfunction initializeEvents() {\n    var $eventAddressForm = $('form[name$=\"_giftregistry\"]'),\n        $beforeAddress = $eventAddressForm.find('fieldset[name=\"address-before\"]'),\n        $afterAddress = $eventAddressForm.find('fieldset[name=\"address-after\"]');\n\n    $('.usepreevent').on('click', function () {\n        // filter out storefront toolkit\n        $(':input', $beforeAddress).not('[id^=\"ext\"]').not('select[name$=\"_addressBeforeList\"]').each(function () {\n            var fieldName = $(this).attr('name'),\n                $afterField = $afterAddress.find('[name=\"' + fieldName.replace('Before', 'After') + '\"]');\n            $afterField.val($(this).val()).trigger('change');\n        });\n    });\n    $eventAddressForm.on('change', 'select[name$=\"_addressBeforeList\"]', function () {\n        var addressID = $(this).val();\n        if (addressID.length === 0) { return; }\n        populateForm(addressID, $beforeAddress);\n    })\n    .on('change', 'select[name$=\"_addressAfterList\"]', function () {\n        var addressID = $(this).val();\n        if (addressID.length === 0) { return; }\n        populateForm(addressID, $afterAddress);\n    });\n}\n\nexports.init = function () {\n    initializeEvents();\n    addProductToCart();\n    login.init();\n    util.setDeleteConfirmation('.item-list', String.format(Resources.CONFIRM_DELETE, Resources.TITLE_GIFTREGISTRY));\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/registry.js?\n}");
710
711/***/ }),
712
713/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/search.js":
714/*!******************************************************************!*\
715  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/search.js ***!
716  \******************************************************************/
717/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
718
719"use strict";
720eval("{\n\nvar compareWidget = __webpack_require__(/*! ../compare-widget */ \"./cartridges/app_paulaschoice/cartridge/js/compare-widget.js\"),\n    productTile = __webpack_require__(/*! ../product-tile */ \"./cartridges/app_paulaschoice/cartridge/js/product-tile.js\"),\n    progress = __webpack_require__(/*! ../progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\"),\n    util = __webpack_require__(/*! ../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n    searchoptions = __webpack_require__(/*! ../searchoptions */ \"./cartridges/app_paulaschoice/cartridge/js/searchoptions.js\"),\n    addToCart = __webpack_require__(/*! ./product/addToCart */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js\"),\n    categoryPage = __webpack_require__(/*! ./category */ \"./cartridges/app_paulaschoice/cartridge/js/pages/category.js\"),\n    gtmtracking = __webpack_require__(/*! ../gtmtracking */ \"./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js\"),\n    slider = (__webpack_require__(/*! ../slider */ \"./cartridges/app_paulaschoice/cartridge/js/slider.js\")[\"default\"]),\n    collectionPage = __webpack_require__(/*! ./collection */ \"./cartridges/app_paulaschoice/cartridge/js/pages/collection.js\"),\n    searchFilter = __webpack_require__(/*! ../searchfilterv2 */ \"./cartridges/app_paulaschoice/cartridge/js/searchfilterv2.js\"),\n    notifyme = __webpack_require__(/*! ./product/notifyme */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/notifyme.js\"),\n    wishlist = __webpack_require__(/*! ./wishlist */ \"./cartridges/app_paulaschoice/cartridge/js/pages/wishlist.js\"),\n    login = __webpack_require__(/*! ../login */ \"./cartridges/app_paulaschoice/cartridge/js/login.js\");\n\n\nfunction infiniteScroll() {\n    // getting the hidden div, which is the placeholder for the next page\n    var loadingPlaceHolder = $('.infinite-scroll-placeholder[data-loading-state=\"unloaded\"]');\n    // get url hidden in DOM\n    var gridUrl = loadingPlaceHolder.attr('data-grid-url');\n\n    if (loadingPlaceHolder.length === 1 && util.elementInViewport(loadingPlaceHolder.get(0), 250)) {\n        // switch state to 'loading'\n        // - switches state, so the above selector is only matching once\n        // - shows loading indicator\n        loadingPlaceHolder.attr('data-loading-state', 'loading');\n        loadingPlaceHolder.addClass('infinite-scroll-loading');\n\n\n        // named wrapper function, which can either be called, if cache is hit, or ajax repsonse is received\n        var fillEndlessScrollChunk = function (html) {\n            loadingPlaceHolder.removeClass('infinite-scroll-loading');\n            loadingPlaceHolder.attr('data-loading-state', 'loaded');\n            $('div.search-result-content').append(html);\n        };\n\n        // old condition for caching was `'sessionStorage' in window && sessionStorage[\"scroll-cache_\" + gridUrl]`\n        // it was removed to temporarily address RAP-2649\n\n        $.ajax({\n            type: 'GET',\n            dataType: 'html',\n            url: gridUrl,\n            success: function (response) {\n                // put response into cache\n                try {\n                    sessionStorage['scroll-cache_' + gridUrl] = response;\n                } catch (e) {\n                    // nothing to catch in case of out of memory of session storage\n                    // it will fall back to load via ajax\n                }\n                // update UI\n                fillEndlessScrollChunk(response);\n                productTile.init();\n            }\n        });\n    }\n}\n\n/**\n * @public\n * @function\n * @description replaces breadcrumbs, lefthand nav and product listing with ajax and puts a loading indicator over the product listing\
720n */\nfunction updateProductListing(url) {\n    if (!url || url === window.location.href) {\n        return;\n    }\n    progress.show($('.search-result-content'));\n    $('#main').load(util.appendParamToURL(url, 'format', 'ajax'), function () {\n        compareWidget.init();\n        productTile.init();\n        searchoptions.init();\n        progress.hide();\n        addToCart();\n        collectionPage.init();\n        history.pushState(undefined, '', url);\n        $('body,html').animate({\n            scrollTop: 0\n        }, 700, 'easeInOutQuad');\n        checkForPromotion();\n        checkForFeaturedProduct();\n        gtmtracking.incrementProductImpressions();\n        gtmtracking.incrementPromotionImpressions();\n        gtmtracking.observationBind(1000);\n        slider.init('.productslider-items');\n        if (url.indexOf('searchfilter=true')) {\n        \tsearchFilter.RebuildTheFilter();\n        \tsearchFilter.BindCheckBoxChangeEventsForFilter();\n        }\n        // cloudinary start: Update cloudinary responsive image //\n        if (typeof window.makeCloudinaryImagesResponsive !== 'undefined') {\n            window.makeCloudinaryImagesResponsive();\n        }\n        // cloudinary end: Update cloudinary responsive image //\n    });\n}\n\n/**\n * @private\n * @function\n * @description Initializes events for the following elements:<br/>\n * <p>refinement blocks</p>\n * <p>updating grid: refinements, pagination, breadcrumb</p>\n * <p>item click</p>\n * <p>sorting changes</p>\n */\nfunction initializeEvents() {\n    var $main = $('#main');\n    // compare checked\n    $main.on('click', 'input[type=\"checkbox\"].compare-check', function () {\n        var cb = $(this);\n        var tile = cb.closest('.product-tile');\n\n        var func = this.checked ? compareWidget.addProduct : compareWidget.removeProduct;\n        var itemImg = tile.find('.product-image a img').first();\n        func({\n            itemid: tile.data('itemid'),\n            uuid: tile[0].id,\n            img: itemImg,\n            cb: cb\n        });\n\n    });\n\n    // handle toggle refinement blocks\n    $main.on('click', '.refinement h3', function () {\n        $(this).toggleClass('expanded')\n        .siblings('ul').toggle();\n    });\n\n    // handle events for updating grid\n    $main.on('click', '.refinements a, .pagination a, .breadcrumb-refinement-value a', function (e) {\n        // don't intercept for category and folder refinements, as well as unselectable\n    \tif ($(this).parents('.category-refinement').length > 0 || $(this).parents('.folder-refinement').length > 0 || $(this).parents('.js-content-search').length > 0 || $(this).parent().hasClass('unselectable')) {\n            return;\n        }\n        e.preventDefault();\n        updateProductListing($(this).data('link'));\n    });\n\n    // handle events item click. append params.\n    $main.on('click', '.product-tile a', function () {\n        var a = $(this);\n        // get current page refinement values\n        var wl = window.location;\n\n        var qsParams = (wl.search.length > 1) ? util.getQueryStringParams(wl.search.substr(1)) : {};\n        var hashParams = (wl.hash.length > 1) ? util.getQueryStringParams(wl.hash.substr(1)) : {};\n\n        // merge hash params with querystring params\n        var params = $.extend(hashParams, qsParams);\n        if (!params.start) {\n            params.start = 0;\n        }\n\n        // get top offset of selected item to use as top offset parameter\n        var tile = a.closest('.product-tile');\n        var grid = $(tile).parent()[0];\n        params.top = $(grid).offset().top;\n\n        // convert params.start to integer\n        params.start = +params.start;\n        // set the hash and allow normal action to continue\n        a[0].hash = $.param(params);\n    });\n\n\n    $main.on('change', '.items-per-page select', function () {\n        var refineUrl = $(this).find('option:selected').val();\n        if (refineUrl === 'INFINITE_SCROLL') {\n            $('html').addClass('infinite-scroll').removeClass('disable-infinite-scroll');\n        } else {\n            $('html').addClass('disable-infinite-scroll').removeClass('infinite-scroll');\n            updateProductListing(refineUrl);\n        }\n    });\n\n    notifyme.init();\n}\n\n/**\n * @private\n * @function\n * @description If promotion content slot is shown on the screen, remove 13th element of search and update pagination.\n */\nfunction checkForPromotion() {\
720n\tvar $tiles = $('.js-grid-tile');\n\n\tif( $('.js-active-promotion').length && $tiles.length > 11 ) {\n\n\t\t//Hide last element\n\t\tvar $lastTile = $tiles.slice(11);\n\t   \t$($lastTile).hide();\n\n\t   \t//Switch pagination system.\n\t   \t$(\".js-std-pagination\").hide();\n\t   \t$(\".js-alt-pagination\").show();\n\t}\n}\n\nfunction checkForFeaturedProduct() {\n\tvar $tiles = $('.js-grid-tile');\n\n\tif( $(document).find('.js-featured-product').length && $tiles.length > 11 ) {\n\n\t\t//Hide last element\n\t\tvar $lastTile = $tiles.slice(11);\n\t   \t$($lastTile).hide();\n\n\t   \t//Switch pagination system.\n\t   \t$(\".js-std-pagination\").hide();\n\t   \t$(\".js-alt-pagination\").show();\n\t}\n}\n\nexports.init = function () {\n    compareWidget.init();\n    searchoptions.init();\n    categoryPage.init();\n    collectionPage.init();\n    wishlist.init();\n    login.init();\n    productTile.init();\n    initializeEvents();\n    addToCart();\n    checkForPromotion();\n    checkForFeaturedProduct();\n\n   if($('.js-content-search').length>0) {\n\t   util.clearDynamicCss();\n\t\tutil.loadDynamicCss(window.SitePreferences.OJSON);\n   }\n\n   if (window.location.href.indexOf('&top=') > -1) {\n\t   var scroll = window.location.href.split('&top=')[1];\n\t   $('html,body').animate({scrollTop:scroll-50},1000);\n   }\n};\nexports.UpdateProductListing = updateProductListing;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/search.js?\n}");
721
722/***/ }),
723
724/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/storefront.js":
725/*!**********************************************************************!*\
726  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/storefront.js ***!
727  \**********************************************************************/
728/***/ (function(__unused_webpack_module, exports) {
729
730"use strict";
731eval("{\nexports.init = function () {\n\n\n    $(\".content-mosaic > button\").on(\"click\", function () {\n        $(this).parents(\".content-mosaic\").toggleClass(\"show-all\");\n    });\n\n    $(\"form.filters button[type='submit']\").click(function (e) {\n        e.preventDefault();\n        if (homeFormValidation()) {\n            $(\"form.filters\").submit();\n        }\n    });\n\n    $(\"form.filters select.js-home-filter-cat\").change(function (e) {\n        e.preventDefault();\n        var categoryUrl = $('.js-home-filter-cat option:selected').val();\n        $('form.filters').attr('action', categoryUrl);\n    });\n\n    $(\"form.filters select\").on(\"change\", function () {\n        homeFormV
731alidation();\n    });\n\n    $('.homepage-banner').one('click',function(){\n    \twindow.location.href = $(this).find('button,.js-button').filter(':visible').first().attr('href');\n    });\n\n    localStorage.categoryName = \"Home page\";\n    if ( $('.js-product-slider').length > 0 ) {\n    \t$('.js-product-slider').on('click','.product-tile',function(){\n    \t\tlocalStorage.categoryName = \"Home Page Slider\";\n    \t});\n\t}\n};\n\nfunction homeFormValidation() {\n    var fields = $(\"form.filters select\");\n    var isValid = false;\n\n    for (var i = 0; i < fields.length; i++) {\n        if (fields[i].selectedIndex !== 0) {\n            isValid = true;\n        }\n    }\n\n    if (!isValid) {\n        $(\"form.filters select\").css('border-color', 'red');\n        $(\"form.filters\").find(\"button[type='submit']\").prop(\"disabled\", true);\n    } else {\n        $(\"form.filters select\").removeAttr('style');\n        $(\"form.filters\").find(\"button[type='submit']\").prop(\"disabled\", false);\n        $(\"form.filters\").find(\"input[type='submit']\").prop(\"disabled\", false);\n\n    }\n\n    return isValid;\n}\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/storefront.js?\n}");
732
733/***/ }),
734
735/***/ "./cartridges/app_paulaschoice/cartridge/js/pages/wishlist.js":
736/*!********************************************************************!*\
737  !*** ./cartridges/app_paulaschoice/cartridge/js/pages/wishlist.js ***!
738  \********************************************************************/
739/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
740
741"use strict";
742eval("{\n\nvar addProductToCart = __webpack_require__(/*! ./product/addToCart */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js\"),\n    page = __webpack_require__(/*! ../page */ \"./cartridges/app_paulaschoice/cartridge/js/page.js\"),\n    login = __webpack_require__(/*! ../login */ \"./cartridges/app_paulaschoice/cartridge/js/login.js\"),\n    util = __webpack_require__(/*! ../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\n    progress = __webpack_require__(/*! ../progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\"),\n    dialog = __webpack_require__(/*! ../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\"),\n    scriptsInjection = __webpack_require__(/*! ../scriptsInjection */ \"./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js\"),\n    recaptchaUtils = __webpack_require__(/*! ../recaptchaUtils */ \"./cartridges/app_paulaschoice/cartridge/js/recaptchaUtils.js\"),\n    captchaContainer = null,\n    captchaContainerRegister = null,\n    pid = null;\n\nvar LOGIN_CAPTCHA_CONTAINER = 'captcha_container_wishlist_login';\nvar REGISTER_CAPTCHA_CONTAINER = 'captcha_container_dialog_register_popup';\n\nfunction initRecaptcha() {\n    return recaptchaUtils.renderWidget(\n        LOGIN_CAPTCHA_CONTAINER,\n        recaptchaCallback,\n        function () { return captchaContainer; },\n        function (widgetId) { captchaContainer = widgetId; }\n    );\n}\n\nfunction initRecaptchaRegister() {\n    return recaptchaUtils.renderWidget(\n        REGISTER_CAPTCHA_CONTAINER,\n        recaptchaCallbackRegister,\n        function () { return captchaContainerRegister; },\n        function (widgetId) { captchaContainerRegister = widgetId; }\n    );\n}\n\nfunction ensureLoginRecaptcha() {\n    return recaptchaUtils.ensureWidget(\n        LOGIN_CAPTCHA_CONTAINER,\n        recaptchaCallback,\n        function () { return captchaContainer; },\n        function (widgetId) { captchaContainer = widgetId; },\n        initRecaptcha\n    );\n}\n\nfunction ensureRegisterRecaptcha() {\n    return recaptchaUtils.ensureWidget(\n        REGISTER_CAPTCHA_CONTAINER,\n        recaptchaCallbackRegister,\n        function () { return captchaContainerRegister; },\n        function (widgetId) { captchaContainerRegister = widgetId; },\n        initRecaptchaRegister\n    );\n}\n\nfunction runRecaptchaSubmit(executeFn, initFn) {\n    if (recaptchaUtils.isRecaptchaScriptMissing()) {\n        scriptsInjection.loadRecaptcha(executeFn, initFn);\n    } else {\n        executeFn();\n    }\n}\n\nfunction updateWishlistIcon(icon) {\n    if (icon.hasClass('absent-in-wishlist')) {\n        icon.removeClass('absent-in-wishlist js-wishlist-add').addClass('exists-in-wishlist js-wishlist-remove');\n        icon.find('.fa')\n            .removeClass('fa-heart--inactive')\n            .addClass('fa-heart--active');\n    } else {\n        icon.removeClass('exists-in-wishlist js-wishlist-remove').addClass('absent-in-wishlist js-wishlist-add');\n        icon.find('.fa')\n            .removeClass('fa-heart--active')\n            .addClass('fa-heart--inactive');\n    }\n}\n\nfunction recaptchaCallback(response) {\n   return new Promise(function(resolve, reject) {\n\n          if (grecaptcha === undefined) {\n              reject();\n          }\n          $('#recaptchaWishlistLogin-input').val(response);\n          handleWishlistSignIn();\n   });\n}\n\nfunction recaptchaCallbackRegister(response) {\n    return new Promise(function(resolve, reject) {\n\n           if (grecaptcha === undefined) {\n               reject();\n           }\n           $('#recaptchaWishlistRegister-input').val(response);\n           handleWishlistSignUp();\n    });\n}\n\nfunction handleWishlistSignUp(){\n    var wishlistSignUpBtn = $('.js-wishlist-create-account');\n    var form = wishlistSignUpBtn.closest('form');\n    if ( !form.valid() ) {\n        return false;\n    }\n    progress.show();\n    $(\"<input/>\").attr({type:\"hidden\", name: wishlistSignUpBtn.attr(\"name\"), value: wishlistSignUpBtn.attr(\"value\")}).appendTo(form);\n    var formData = form.serialize();\n    var url = form.attr('action');\n    $.ajax({\n        type: \"POST\",\n        url: url,\n        data: formData\n    }).done(function(response){\n        if ( response.success ) {\n            dialog.close();\n            var wishlistIcon = $('.js-wishlist[data-pid=' + pid + ']');\n            updateWishlistIcon(wishlistIcon);\n            $('.menu-utility-user').load(response.call, function(){\n                progress.hide();\n            });\n        } else {\n            progress.hide();\n            dialog.open({\n                autoOpen: true,\n                html: response,\n                draggable: false,\n                options: {\n                    dialogClass: \"wishlist-popup wishlist-popup--register\",\n                    open: function() {\
742n                        $('.ui-widget-overlay').on('click', function () {\n                            dialog.close();\n                        });\n                    }\n                }\n            });\n        }\n    });\n}\n\nfunction handleWishlistSignIn(){\n    var wishlistSignBtn = $('.js-wishlist-login')\n    var form = wishlistSignBtn.closest('form');\n    if ( !form.valid() ) {\n        return false;\n    }\n    progress.show();\n    $(\"<input/>\").attr({type:\"hidden\", name: wishlistSignBtn.attr(\"name\"), value: wishlistSignBtn.attr(\"value\")}).appendTo(form);\n    var formData = form.serialize();\n    var url = form.attr('action');\n    $.ajax({\n        type: \"POST\",\n        url: url,\n        data: formData\n    }).done(function(response){\n        if ( response.success ) {\n            dialog.close();\n            if ( $('.js-wishlist-plp').length ) {\n                window.location.reload();\n            } else {\n                var wishlistIcon = $('.js-wishlist[data-pid=' + pid + ']');\n                updateWishlistIcon(wishlistIcon);\n                $('.menu-utility-user').load(response.call, function(){\n                    progress.hide();\n                });\n            }\n        } else {\n            progress.hide();\n            if (response.reason == 'passwordexpired') {\n                window.currentEmailValue = ($('.js-email-field-to-copy').length && $('.js-email-field-to-copy').last().val().length) ? $('.js-email-field-to-copy').last().val() : null;\n                response = response.message; // this is the HTML that will populate the dialog.\n            }\n            dialog.open({\n                autoOpen: true,\n                html: response,\n                draggable: false,\n                options: {\n                    dialogClass: \"wishlist-popup\",\n                    open: function() {\n                        $('.ui-widget-overlay').on('click', function () {\n                            dialog.close();\n                        });\n                    }\n                }\n            });\n        }\n    });\n}\n\nexports.init = function () {\n\n    $(document).on('click', '.js-wishlist', function (e) {\n        e.stopImmediatePropagation();\n        progress.show();\n        var wishlistIcon = $(this);\n        pid = wishlistIcon.data('pid');\n        if ( wishlistIcon.hasClass('js-wishlist-add') ) {\n            var url = wishlistIcon.attr('data-href-wishlist-add');\n            $.ajax({\n                url: url\n            }).done(function(response){\n                if ( typeof response == 'object' && response.success ) {\n                    updateWishlistIcon(wishlistIcon);\n                    $('.menu-utility-user').load(response.call, function(){\n                        progress.hide();\n                    });\n                } else {\n                    progress.hide();\n                    dialog.open({\n                        autoOpen: true,\n                        html: response,\n                        draggable: false,\n                        options: {\n                            dialogClass: \"wishlist-popup\",\n                            open: function() {\n                                $('.ui-widget-overlay').on('click', function () {\n                                    dialog.close();\n                                });\n                            }\n                        }\n                    });\n                }\n                recaptchaUtils.setupOnReady(initRecaptcha);\n            });\n        } else {\n            var url = wishlistIcon.attr('data-href-wishlist-remove');\n            $.ajax({\n                url: url\n            }).done(function(response){\n                if ( typeof response == 'object' && response.success ) {\n                    if ( wishlistIcon.hasClass('js-wishlist-remove-accountpage') ) {\n                        wishlistIcon.closest('li').detach();\n                    } else {\n                        updateWishlistIcon(wishlistIcon);\n                    }\n                    $('.menu-utility-user').load(response.call, function(){\n                        progress.hide();\n                    });\n                } else {\n                    progress.hide();\n                }\n            });\n        }\n    });\n\n    $(document).on('click', '.js-wishlist-login', function (e) {\n        e.preventDefault();\n        var form = $('.frmlogin');\n\n        if (!form.valid()) {\n            return false;\n        }
742\n\n        if (!e.target.classList.contains('recaptcha')) {\n            handleWishlistSignIn();\n            return;\n        }\n\n        runRecaptchaSubmit(function () {\n            ensureLoginRecaptcha().then(recaptchaUtils.executeWidget);\n        }, initRecaptcha);\n    });\n\n    $(document).on('click', '.js-wishlist-register', function (e) {\n        e.preventDefault();\n        progress.show();\n        var form = $(this).closest('form');\n        $(\"<input/>\").attr({type:\"hidden\", name:$(this).attr(\"name\"), value:$(this).attr(\"value\")}).appendTo(form);\n        var formData = form.serialize();\n        var url = form.attr('action');\n        $.ajax({\n            type: \"POST\",\n            url: url,\n            data: formData\n        }).done(function(response){\n            progress.hide();\n            dialog.open({\n                autoOpen: true,\n                html: response,\n                draggable: false,\n                options: {\n                    dialogClass: \"wishlist-popup wishlist-popup--register\",\n                    open: function() {\n                        $('.ui-widget-overlay').on('click', function () {\n                            dialog.close();\n                        });\n                        const passwordStrengthChecker = (__webpack_require__(/*! ../components/passwordStrengthChecker.js */ \"./cartridges/app_paulaschoice/cartridge/js/components/passwordStrengthChecker.js\")[\"default\"]);\n                        passwordStrengthChecker.init();\n                    }\n                }\n            });\n            var recaptchaContainer = $('#captcha_container_wishlist_register');\n            if (recaptchaContainer != null) {\n                recaptchaContainer.attr('id', REGISTER_CAPTCHA_CONTAINER);\n            }\n            recaptchaUtils.setupOnReady(initRecaptchaRegister);\n        });\n    });\n\n    $(document).on('click', '.js-wishlist-create-account', function (e) {\n        e.preventDefault();\n\n        var form = $('#RegistrationForm');\n        if (!form.valid()) {\n            return false;\n        }\n\n        if (!e.target.classList.contains('recaptcha')) {\n            handleWishlistSignUp();\n            return;\n        }\n\n        runRecaptchaSubmit(function () {\n            ensureRegisterRecaptcha().then(recaptchaUtils.executeWidget);\n        }, initRecaptchaRegister);\n    });\n\n    if ( window.location.href.indexOf('#wishlist') > -1 ) {\n        $('.account__tabs-list .wishlist').trigger('click');\n    }\n\n    addProductToCart();\n    $('#editAddress').on('change', function () {\n        page.redirect(util.appendParamToURL(Urls.wishlistAddress, 'AddressID', $(this).val()));\n    });\n\n    //add js logic to remove the , from the qty feild to pass regex expression on client side\n    $('.option-quantity-desired input').on('focusout', function () {\n        $(this).val($(this).val().replace(',', ''));\n    });\n\n    login.init();\n\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/pages/wishlist.js?\n}");
743
744/***/ }),
745
746/***/ "./cartridges/app_paulaschoice/cartridge/js/password-show.js":
747/*!*******************************************************************!*\
748  !*** ./cartridges/app_paulaschoice/cartridge/js/password-show.js ***!
749  \*******************************************************************/
750/***/ (function(module) {
751
752"use strict";
753eval("{\n\nmodule.exports = function () {\n    $(document).on('click', '.js-password-show', function () {\n        const $button = $(this);\n        const $input = $button.siblings('.input-text');\n        const inputType = $input.attr('type');\n        \n        if (inputType === 'password') {\n            $input.attr('type', 'text');\n            $button.addClass('show');\n        } else {\n            $input.attr('type', 'password');\n            $button.removeClass('show');\n       }\n   });\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/password-show.js?\n}");
754
755/***/ }),
756
757/***/ "./cartridges/app_paulaschoice/cartridge/js/personalisation.js":
758/*!*********************************************************************!*\
759  !*** ./cartridges/app_paulaschoice/cartridge/js/personalisation.js ***!
760  \*********************************************************************/
761/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
762
763"use strict";
764eval("{\n\nvar util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nvar slider = (__webpack_require__(/*! ./slider */ \"./cartridges/app_paulaschoice/cartridge/js/slider.js\")[\"default\"]);\n\nvar personalisation = {\n    init: function () {\n        document.addEventListener('initPersonalisation', activatePersonalisation, true);\n\n        var personalisationElem = $('#js-personalcluster');\n        if ($('#js-personalcluster').length < 1) {\n            return;\n        }\n\n        var customerCluster = personalisationElem.data('clusterid');\n        // check if cluster is already set in DOM\n        if (customerCluster) {\n            // trigger customerCluster event for VWO\n            // update the existing cookie if the url contains -1\n            var url = window.location.href;\n            if(url.indexOf('cluster') != -1) {\n                var urlObj = new URL(url);\n                customerCluster = parseInt(urlObj.searchParams.get('cluster'));\n                if (customerCluster == -1) {\n                    customerCluster = '';\n                    updateClusterCookie(customerCluster, 'url');\n                    triggerCustomerClusterEvent(customerCluster);\n                }\n            }\n            console.log(\"Welcome to cluster \" + customerCluster);\n        } else {\n            //check if there is a cluster variable in url\n            var url = window.location.href;\n            if(url.indexOf('cluster') != -1) {\n                //if yes, create or update dedicated cluster cookie\n                var urlObj = new URL(url);\n                customerCluster = parseInt(urlObj.searchParams.get('cluster'));\n                if (isNaN(customerCluster)) {\n                    return;\n                } else if (customerCluster == -1) {\n                    customerCluster = '';\n                }\n                updateClusterCookie(customerCluster, 'url');\n                triggerCustomerClusterEvent(customerCluster);\n\n                return;\n            }\n\n            // if not, look up the cluster for user's GA ID in cluster database (csv/custom objects)\n            // go fetch from personalisation engine\n            var gaID = getGaCookie('_ga');\n            if (!gaID) {\n                return;\n            }\n\n            var emailAddress = personalisationElem.data('email');\n            getCustomerCluster(gaID, emailAddress, personalisationElem.data('customerclusterendpoint'));\n\n        }\n    }\n};\n\n//creates or updates cluster cookie\nfunction updateClusterCookie(cluster, source) {\n    var clusterCookie = util.getCookie('cluster');\n    var epochTimestamp = Date.now();\n\n    //if cookie already exists, preserve initial created timestamp and original source\n    if(clusterCookie) {\n        epochTimestamp = JSON.parse(clusterCookie).created;\n        source = JSON.parse(clusterCookie).source;\n    }\n\n    clusterCookie = {\n        clusterID: cluster,\n        source: source,\n        created: epochTimestamp\n    }
764\n\n    util.setCookie('cluster', JSON.stringify(clusterCookie), 60 * 24 * 365);\n}\n\nvar triggerCustomerClusterEvent = function(cluster) {\n    //console.log(\"Trigger event: \" + cluster);\n    var event = new CustomEvent('initPersonalisation', { 'detail': { 'cluster': cluster} });\n    document.dispatchEvent(event);\n};\n\nvar activatePersonalisation = function(event) {\n    var customerCluster = event.detail.cluster;\n\n    var personalisationElem = $('#js-personalcluster');\n\n    // update DOM with cluster\n    personalisationElem.attr('data-clusterid', customerCluster);\n    personalisationElem.addClass('personalisationCompleted');\n\n    // tell SFCC about your new cluster for customer group\n    var personalisationEndpoint = personalisationElem.data('clusterassignmentendpoint');\n    assignClusterOnProfile(personalisationEndpoint, customerCluster);\n}\n\nfunction getGaCookie(key) {\n    var keyValue = util.getCookie(key);\n    if (keyValue == null) {\n        return null;\n    }\n    var keyValueArray = keyValue.split(\".\");\n    if (keyValueArray.length < 3) {\n        return null;\n    } else if (keyValueArray.length == 4) {\n        return keyValueArray[2];\n    } else if (keyValueArray.length == 5) {\n        return keyValueArray[2] + '.' + keyValueArray[3];\n    }\n}\n\nvar getCustomerCluster = function(gaID, emailAddress, getCustomerClusterEndpoint) {\n    //console.log('getCustomerCluster gaID: ' + gaID + ' and email: ' + emailAddress + '  from ' + getCustomerClusterEndpoint);\n    var url = getCustomerClusterEndpoint; // azure REST endpoint url\n    var options = {\n        type: 'GET',\n        data: {\n            'gaID': gaID,\n            'emailAddress': emailAddress\n        },\n        url: url\n    };\n\n    // ajax call to PE to get value\n    $.ajax(options)\n        .done(function(data) {\n            var clusterId;\n\n            if(data.result) {\n                //if cluster is found, create or update dedicated cluster cookie\n                clusterId = data.result;\n            } else {\n                //if not, check cluster cookie\n                var clusterCookie = util.getCookie(\"cluster\");\n                if(clusterCookie) {\n                    clusterId = JSON.parse(clusterCookie).clusterID;\n                }\n            }\n\n            if (typeof clusterId !== \"undefined\") {\n                updateClusterCookie(clusterId, 'db');\n                // trigger customerCluster event for VWO\n                triggerCustomerClusterEvent(clusterId);\n            }\n\n        });\n\n    // DEBUG WITHOUT AJAX CALL\n    //triggerCustomerClusterEvent(3);\n};\n\nvar assignClusterOnProfile = function(personalisationEndpoint, cluster) {\n    //console.log('personalisationEndpoint: ' + personalisationEndpoint);\n\n    var url = util.appendParamToURL(personalisationEndpoint, 'format', 'ajax');\n\n\tvar options = {\n\t\turl: url,\n\t\tdata: { 'cluster': cluster },\n\t\ttype: 'POST'\n    };
764\n\n\t$.ajax(options)\n\t\t.done(function (data) {\n            console.log('Updating SFCC cluster on profile complete.');\n            updateCustomerGroupHomepage(cluster);\n    \t});\n};\n\nvar updateCustomerGroupHomepage = function(customerCluster) {\n    var personalisationElem = $('#js-personalcluster');\n    var updateEndpoint = personalisationElem.data('updateclusterhomepage');\n    var url = util.appendParamToURL(updateEndpoint, 'format', 'ajax');\n\n\tvar options = {\n\t\turl: url,\n\t\ttype: 'GET'\n    };\n\n\t$.ajax(options)\n\t\t.done(function (data) {\n            var html = $(data).find(\"#primary\").html();\n            if(data) {\n                $('#primary').empty().append(html)\n                slider.init();\n\n                if(customerCluster) {\n                    dataLayer.push( { 'clusterId': parseInt(customerCluster), 'event': 'clusterTracking' });\n                }\n            }\n    \t});\n}\n\n\nmodule.exports = personalisation;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/personalisation.js?\n}");
765
766/***/ }),
767
768/***/ "./cartridges/app_paulaschoice/cartridge/js/powerreviews.js":
769/*!******************************************************************!*\
770  !*** ./cartridges/app_paulaschoice/cartridge/js/powerreviews.js ***!
771  \******************************************************************/
772/***/ (function(module) {
773
774"use strict";
775eval("{\n\nconst classes = {\n    iframeLoaded: 'pr-review-write__iframe--loaded',\n    headerId: 'js-top-banner',\n    openDialog: 'dialog-open'\n};\n\nconst selectors = {\n    header: '.js-header',\n    miniReview: '.js-powerreviews-minireview',\n    writeReviewLink: '.pr-snippet-write-review-link',\n    writeReviewBlock: '.js-writereview-block',\n    writeReviewIframe: '.js-writereview-iframe',\n    writeReviewThankYouPage: '.thank-you-page',\n    reviewDisplay: '#pr-review-display',\n    reviewModal: '.pr-media-modal',\n    reviewContentBlock: '.p-w-r .pr-review-display .pr-rd-content-block'\n};\n\nvar powerreviews = {\n    powerReviewsTiles: function () {\n        var pList = [];\n        $(selectors.miniReview).each(function () {\n            var pid = $(this).data('pid'); //product ID\n            var locale = $(this).data('locale'); //locale\n            var mgid = $(this).data('mgid'); //merchant group ID\n            var mid = $(this).data('mid'); //merchant ID\n            var api = $(this).data('api'); //API Key\n            var css = $(this).data('css');\n            var powerReviewsObject = {\n                ENABLE_CLIENT_SIDE_STRUCTURED_DATA: false,\n                api_key: api,\n                locale: locale,\n                merchant_group_id: mgid,\n                merchant_id: mid,\n                page_id: pid,\n                style_sheet: css,\n                components: {\n                    CategorySnippet: 'category-snippet-' + pid,\n                }\n            };\n            pList.push(powerReviewsObject);\n        });\n        if (pList.length > 0) {\n            window.pwr = window.pwr || function () {\n                (pwr.q = pwr.q || []).push(arguments);\n            };\n            pwr('render', pList);\n        }\n    },\n\n    /**\n     * Power Review - Initiate write a review iframe logic on window load\n     */\n    powerReviewWriteReviewPDP: function() {\n        // window.addEventListener('load') and window.onload was not every time on Firefox\n        // Solution is jQuery load\n        $(window).load(this.initPowerReviewWriteReviewPDP);\n    },\n\n    powerReviewDisplayModalMutation: function() {\n        const targetNode = document.querySelector(selectors.reviewDisplay);\n\n        const config = { childList: true, subtree: true };\n\n        const callback = function(mutationsList, observer) {\n            for (let mutation of mutationsList) {\n                if (mutation.type === 'childList') {\n                    mutation.addedNodes.forEach(node => {\n                        if (node.matches || node.find(selectors.reviewModal)) {\n                            const closestParent = node.closest(selectors.reviewContentBlock);\n                            closestParent.classList.add(classes.openDialog)\n                        }\n                    });\n\n                    if (mutation.removedNodes.length > 0) {\n                        const openDialogParent = targetNode.querySelector(`${selectors.reviewContentBlock}.${classes.openDialog}`);\n                        if (openDialogParent) {\n                            openDialogParent.classList.remove(classes.openDialog);\n                        }\n                    }\n                }\n            }\n        };\n\n        const observer = new MutationObserver(callback);\n\n        observer.observe(targetNode, config);\n    },\n\n    /**\n     * Power Review - Write a review iframe logic\n    */\n    initPowerReviewWriteReviewPDP: function() {\n        if (!document.querySelectorAll(selectors.writeReviewLink).length) return;\n\n        powerreviews.powerReviewDisplayModalMutation();\n\n        document.querySelectorAll(selectors.writeReviewLink).forEach((button) => {\n            if (!document.querySelectorAll(selectors.writeReviewIframe).length) return;\n\n            var iframe = document.querySelector(selectors.writeReviewIframe);\n\n            if (button.href === 'javascript:;') {\n                powerreviews.powerReviewScrollToContainerPosition();\n                return;\n            }\n\n            button.setAttribute('data-href', button.href);\n            button.href = 'javascript:;';\n            button.addEventListener('click', (e) => {\n                e.preventDefault();\n                e.stopImmediatePropagation();
775\n\n                if (!iframe.classList.contains(classes.iframeLoaded)) {\n                    iframe.style.height = '300px';\n                    iframe.src = iframe.dataset.src;\n\n                    iframe.onload = () => {\n                        var iframeBody = iframe.contentWindow.document.body;\n\n                        iframe.classList.add(classes.iframeLoaded);\n                        powerreviews.powerReviewMutationObserver(iframeBody, iframe);\n                        iframeBody.setAttribute('data-loaded', true);\n                    };\n                }\n\n                powerreviews.powerReviewScrollToContainerPosition();\n            });\n        });\n    },\n\n\n\n    /**\n     * Iframe height resize function\n     * @param {Object} iframe - iframe object\n     */\n    powerReviewIframeHeight: function (iframe) {\n        iframe.style.height = iframe.contentWindow.document.documentElement.scrollHeight + 'px';\n    },\n\n    /**\n     * Write Review block position\n     */\n    powerReviewScrollToContainerPosition: function () {\n        var reviewBlock = document.querySelector(selectors.writeReviewBlock);\n        var scrollPos = window.pageYOffset || document.documentElement.scrollTop;\n        var headerSize = !!document.getElementById(classes.headerId) ? document.getElementById(classes.headerId).getBoundingClientRect().height : document.querySelector(selectors.header).getBoundingClientRect().height;\n        var reviewBlockPosTop = reviewBlock.getBoundingClientRect().top + scrollPos - headerSize;\n        if (scrollPos === reviewBlockPosTop) return;\n\n        scroll({top: reviewBlockPosTop, behavior: 'smooth'});\n    },\n\n    /**\n     * MutationObserver for Write review iframe\n     * @param {Object} element - observation object\n     * @param {Object} iframe - iframe object\n     * @returns\n     */\n    powerReviewMutationObserver: function (element, iframe) {\n        if (!element) return;\n\n        const observerConfig = {\n            attributes: true,\n            childList: true,\n            characterData: true,\n            subtree: true\n        };\n\n        const observer = new MutationObserver(function (mutations, observer) {\n            mutations.forEach(function(mutation) {\n                setTimeout(powerreviews.powerReviewIframeHeight(iframe), 200);\n\n                if (element.querySelector(selectors.writeReviewThankYouPage)) {\n                    powerreviews.powerReviewScrollToContainerPosition();\n\n                    setTimeout(iframe.style.height = iframe.contentWindow.document.querySelector('#pr-write').getBoundingClientRect().height + 'px', 300);\n\n                    setTimeout(observer.disconnect(), 3000);\n                }\n            });\n        });\n        observer.observe(element, observerConfig);\n    }\n};\n\nmodule.exports = powerreviews;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/powerreviews.js?\n}");
776
777/***/ }),
778
779/***/ "./cartridges/app_paulaschoice/cartridge/js/product-tile.js":
780/*!******************************************************************!*\
781  !*** ./cartridges/app_paulaschoice/cartridge/js/product-tile.js ***!
782  \******************************************************************/
783/***/ (function(__unused_webpack_module, exports) {
784
785"use strict";
786eval("{\n\n/**\n * @private\n * @function\n * @description Initializes events on the product-tile for the following elements:\n * - swatches\n * - thumbnails\n */\nfunction initializeEvents() {\n    gridViewToggle();\n    $('.swatch-list').on('mouseleave', function () {\n        // Restore current thumb image\n        var $tile = $(this).closest('.product-tile'),\n            $thumb = $tile.find('.product-image .thumb-link img').eq(0),\n            data = $thumb.data('current');\n\n        $thumb.attr({\n            src: data.src,\n            alt: data.alt,\n            title: data.title\n        });\n    });\n    $('.swatch-list .swatch').on('click', function (e) {\n        e.preventDefault();\n        if ($(this).hasClass('selected')) { return; }\n\n        var $tile = $(this).closest('.product-tile');\n        $(this).closest('.swatch-list').find('.swatch.selected').removeClass('selected');\n        $(this).addClass('selected');\n        $tile.find('.thumb-link').attr('href', $(this).attr('href'));\n        $tile.find('name-link').attr('href', $(this).attr('href'));\n\n        var data = $(this).children('img').filter(':first').data('thumb');\n        var $thumb = $tile.find('.product-image .thumb-link img').eq(0);\n        var currentAttrs = {\n            src: data.src,\n            alt: data.alt,\n            title: data.title\n        };\n        $thumb.attr(currentAttrs);\n        $thumb.data('current', currentAttrs);\n    }).on('mouseenter', function () {\n        // get current thumb details\n        var $tile = $(this).closest('.product-tile'),\n            $thumb = $tile.find('.product-image .thumb-link img').eq(0),\n            data = $(this).children('img').filter(':first').data('thumb'),\n            current = $thumb.data('current');\n\n        // If this is the first time, then record the current img\n        if (!current) {\n            $thumb.data('current', {\n                src: $thumb[0].src,\n                alt: $thumb[0].alt,\n                title: $thumb[0].title\n            });\n        }\n\n        // Set the tile image to the values provided on the swatch data attributes\n        $thumb.attr({\n            src: data.src,\n            alt: data.alt,\n            title: data.title\n        });\n    });\n}\n\nexports.init = function () {\n    var $tiles = $('.tiles-container .product-tile');\n    if ($tiles.length === 0) { return; }\n\n    $(window).on('resize', function () {\n        $tiles.each(function (idx) {\n                $(this).data('idx', idx);\n            });\n    });\n    initializeEvents();\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/product-tile.js?\n}");
787
788/***/ }),
789
790/***/ "./cartridges/app_paulaschoice/cartridge/js/productaddedpopup.js":
791/*!***********************************************************************!*\
792  !*** ./cartridges/app_paulaschoice/cartridge/js/productaddedpopup.js ***!
793  \***********************************************************************/
794/***/ (function(module) {
795
796"use strict";
797eval("{\n\nvar POPUP_Z = '200100';\n\nvar productaddedpopup = {\n  init: function () {\n      this.$el = $('#js-product-added-popup');\n      // events\n      this.$el.find('.js-close-toggle, .js-continue').on('click', function () {\n          productaddedpopup.hide();\n      });\n    },\n\n  /**\n   * Popup HTML is returned inside .js-mini-cart (in the sticky header).\n   * Header creates a stacking context, so the modal's z-index can never\n   * compete with Alhena on <body>. Move the overlay to body instead.\n   */\n  mountOnBody: function () {\n      $('body > .product-added-popup-wrapper').remove();\n      var $wrapper = $('.js-mini-cart .product-added-popup-wrapper').detach();\n      if ($wrapper.length) {\n          $('body').append($wrapper);\n          $wrapper[0].style.setProperty('z-index', POPUP_Z, 'important');\n      }\n  },\n\n  /**\n  * @function\n  * @description Displays the product added popup\n  */\n  display: function () {\n      // show the item\n      $('body').addClass('added-popup-visible', function() {\n        setTimeout(function() {\n          var wrapper = document.querySelector('body > .product-added-popup-wrapper');\n          if (wrapper) {\n              wrapper.style.setProperty('z-index', POPUP_Z, 'important');\n          }\n          $('#js-product-added-popup').addClass('active');\n          $('#js-minicart-quantity').addClass('animate');\n        }, 100);\n      });\n    },\n  /**\n   * @function\n   * @description Closes the product added popup\n   */\n  hide: function () {\n      $('body').removeClass('added-popup-visible');\n      $('#js-product-added-popup').removeClass('active');\n      $('#js-minicart-quantity').removeClass('animate');\n      $('body > .product-added-popup-wrapper').remove();\n      $(document).trigger('popup:close');\n  },\n  /**\n   * @function\n   * @description Shows the given content in the mini cart\n   * @param {String} A HTML string with the content which will be shown\n   */\n   show: function (html) {\n      $('.js-mini-cart').html(html);\n      this.mountOnBody();\n      this.init();\n      this.display();\n   }\n};\n\n// Used by Alhena BM preference script (and any non-bundled callers).\nwindow.pcShowProductAddedPopup = function (html) {\n    productaddedpopup.show(html);\n    if (typeof window.makeCloudinaryImagesResponsive !== 'undefined') {\n        window.makeCloudinaryImagesResponsive();\n    }\n};\n\n// Close overlay when clicking outside of popup\n$(document).on(\"click\", '.js-product-added-modal', function (e) {\n    e.stopPropagation();\n    var outsidePopup = (!$(e.target).hasClass(\"js-added-popup\") && $(e.target).closest(\"#js-product-added-popup\").length === 0);\n\n    if (outsidePopup) {\n        productaddedpopup.hide();\n    }\n});\n\nmodule.exports = productaddedpopup;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/productaddedpopup.js?\n}");
798
799/***/ }),
800
801/***/ "./cartridges/app_paulaschoice/cartridge/js/progress.js":
802/*!**************************************************************!*\
803  !*** ./cartridges/app_paulaschoice/cartridge/js/progress.js ***!
804  \**************************************************************/
805/***/ (function(__unused_webpack_module, exports) {
806
807"use strict";
808eval("{\n\nvar $loader;\n\n/**\n * @function\n * @description Shows an AJAX-loader on top of a given container\n * @param {Element} container The Element on top of which the AJAX-Loader will be shown\n */\nvar show = function (container) {\n    var target = (!container || $(container).length === 0) ? $('body') : $(container);\n    $loader = $loader || $('.loader');\n\n    if ($loader.length === 0) {\n        $loader = $('<div/>').addClass('loader')\n            .append($('<div/>').addClass('loader-indicator'), $('<div/>').addClass('loader-bg'));\n    }\n    return $loader.appendTo(target).show();\n};\n/**\n * @function\n * @description Hides an AJAX-loader\n */\nvar hide = function () {\n    if ($loader) {\n        $loader.hide();\n    }\n};\n\nexports.show = show;\nexports.hide = hide;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/progress.js?\n}");
809
810/***/ }),
811
812/***/ "./cartridges/app_paulaschoice/cartridge/js/recaptchaUtils.js":
813/*!********************************************************************!*\
814  !*** ./cartridges/app_paulaschoice/cartridge/js/recaptchaUtils.js ***!
815  \********************************************************************/
816/***/ (function(module) {
817
818"use strict";
819eval("{\n\nfunction waitForGrecaptcha() {\n\treturn new Promise(function (resolve) {\n\t\tif (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\tvar interval = setInterval(function () {\n\t\t\tif (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n\t\t\t\tclearInterval(interval);\n\t\t\t\tresolve();\n\t\t\t}\n\t\t}, 100);\n\t});\n}\n\nfunction isGrecaptchaReady() {\n\treturn typeof window.grecaptcha !== 'undefined' &&\n\t\ttypeof window.grecaptcha.render === 'function';\n}\n\nfunction isRecaptchaScriptMissing() {\n\treturn !isGrecaptchaReady();\n}\n\nfunction renderWidget(containerId, callback, getWidgetId, setWidgetId) {\n\treturn waitForGrecaptcha().then(function () {\n\t\tvar widgetId = getWidgetId();\n\t\tif (widgetId != null) {\n\t\t\treturn widgetId;\n\t\t}\n\t\tif ($('#' + containerId).length > 0) {\n\t\t\twidgetId = grecaptcha.render(containerId, {\n\t\t\t\t'sitekey': Resources.RECAPTCHA_SITEKEY,\n\t\t\t\t'callback': callback,\n\t\t\t\t'size': 'invisible'\n\t\t\t});\n\t\t\tsetWidgetId(widgetId);\n\t\t}\n\t\treturn widgetId;\n\t});\n}\n\nfunction ensureWidget(containerId, callback, getWidgetId, setWidgetId, initFn) {\n\tif (getWidgetId() != null) {\n\t\treturn Promise.resolve(getWidgetId());\n\t}\n\tvar initResult = initFn();\n\tif (initResult && typeof initResult.then === 'function') {\n\t\treturn initResult.then(function () {\n\t\t\treturn getWidgetId();\n\t\t});\n\t}\n\treturn renderWidget(containerId, callback, getWidgetId, setWidgetId);\n}\n\nfunction executeWidget(widgetId) {\n\tif (widgetId == null) {\n\t\treturn Promise.resolve();\n\t}\n\tgrecaptcha.reset(widgetId);\n\tgrecaptcha.execute(widgetId);\n\treturn Promise.resolve();\n}\n\nfunction setupOnReady(initFn) {\n\tif (isGrecaptchaReady()) {\n\t\tinitFn();\n\t} else {\n\t\t$(document).one('recaptchaReady', initFn);\n\t}\n}\n\nmodule.exports = {\n\twaitForGrecaptcha: waitForGrecaptcha,\n\tisGrecaptchaReady: isGrecaptchaReady,\n\tisRecaptchaScriptMissing: isRecaptchaScriptMissing,\n\trenderWidget: renderWidget,\n\tensureWidget: ensureWidget,\n\texecuteWidget: executeWidget,\n\tsetupOnReady: setupOnReady\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/recaptchaUtils.js?\n}");
820
821/***/ }),
822
823/***/ "./cartridges/app_paulaschoice/cartridge/js/redesign/utils/helpers.js":
824/*!****************************************************************************!*\
825  !*** ./cartridges/app_paulaschoice/cartridge/js/redesign/utils/helpers.js ***!
826  \****************************************************************************/
827/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
828
829"use strict";
830eval("{__webpack_require__.r(__webpack_exports__);\nconst helpers = {\n\tbody: document.querySelector('body'),\n\n\ttopScroll: 0,\n\tisScrollDisabled: false,\n\tdisabledScrollClass: 'scroll-disabled',\n    // Disable window scroll when popups, navigation and similar are opened\n    disableScroll: function() {\n        if (!this.isScrollDisabled) {\n            this.topScroll = window.pageYOffset || document.documentElement.scrollTop;\n            this.body.style.top = `-${this.topScroll}px`;\n            this.body.classList.add(this.disabledScrollClass);\n            window.scrollTo(0, 0);\n            this.isScrollDisabled = true;\n        }\n    },\n\n    // Enable back window scroll when closing the opened overlays\n    enableScroll: function() {\n        this.body.removeAttribute('style');\n        this.body.classList.remove(this.disabledScrollClass);\n        document.documentElement.scrollTop = this.topScroll;\n        this.isScrollDisabled = false;\n    },\n\n    isMobile: function() {\n        return window.matchMedia(\"screen and (max-width: 767px)\").matches;\n    },\n\n    isTablet: function() {\n        const userAgent = navigator.userAgent.toLowerCase();\n        const isTablet = /(ipad|tablet|(android(?!.*mobile))|(windows(?!.*phone)(.*touch))|kindle|playbook|silk|(puffin(?!.*(IP|AP|WP))))/.test(userAgent);\n\n        return isTablet && window.matchMedia(\"screen and (min-width: 768px)\").matches;\n    },\n\n    isDesktop: function() {\n        return !this.isMobile() && !this.isTablet();\n    },\n\n    isJSONvalid: function(str) {\n        try {\n            JSON.parse(str);\n        } catch (e) {\n            return false;\n        }\n        return true;\n    },\n\n    throttle: function(func, interval) {\n        let timeout;\n        return function() {\n            const _this = this;\n            const args = arguments;\n            const later = function() {\n                timeout = false;\n            };\n            if (!timeout) {\n                func.apply(_this, args);\n                timeout = true;\n                setTimeout(later, interval || 250);\n            }\n        };\n    },\n\n    debounce: function(func, interval) {\n        let timeout;\n        return function() {\n            const _this = this;\n            const args = arguments;\n            const later = function() {\n                timeout = null;\n                func.apply(_this, args);\n            };\n            clearTimeout(timeout);\n            timeout = setTimeout(later, interval || 100);\n        };\n    },\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (helpers);\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/redesign/utils/helpers.js?\n}");
831
832/***/ }),
833
834/***/ "./cartridges/app_paulaschoice/cartridge/js/routine-slider.js":
835/*!********************************************************************!*\
836  !*** ./cartridges/app_paulaschoice/cartridge/js/routine-slider.js ***!
837  \********************************************************************/
838/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
839
840"use strict";
841eval("{/* harmony import */ var swiper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! swiper */ \"./node_modules/swiper/swiper.esm.js\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_util__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nconst selectors = {\n    slider: '.js-routine-slider',\n    addToCartCta: document.querySelector('.js-add-to-cart-routine-all'),\n    sliderButtonContainer: document.querySelector('.js-routine-slider-controls'),\n    sliderButtons: 'js-routine-slider-control',\n    customSlideClass: 'routine-search-result__slide--small',\n    sliderButtonActiveClass: 'routine-finder__button-step--active'\n}\n\nconst routineSlider = {\n\n    init: function() {\n\n        const buttonContainer = selectors.sliderButtonContainer;\n        const slider = selectors.slider;\n        if(!slider) return;\n        if(!buttonContainer) return;\n\n        this.initSlider(slider);\n        this.slidesChange(slider);\n\n        buttonContainer.addEventListener('click', (e) => {\n            if (e.target.parentNode.classList.contains(selectors.sliderButtons)) {\n                this.slidesToggle(e.target.parentNode)\n                this.toggleActiveButton(e.target.parentNode, buttonContainer)\n            }\n        })\n\n        if(_util__WEBPACK_IMPORTED_MODULE_1__.isMobile()) {\n            this.stickyMobileCta(slider);\n        }\n\n    },\n\n    toggleActiveButton: function(button, buttonWrapper) {\n        const btnWrap = buttonWrapper.children;\n        Array.from(btnWrap).forEach(element => {\n            if(element.classList.contains(selectors.sliderButtonActiveClass)) element.classList.remove(selectors.sliderButtonActiveClass)\n        });\n        button.classList.add(selectors.sliderButtonActiveClass)\n    },\n\n    initSlider: function (slider) {\n        const swiper = new swiper__WEBPACK_IMPORTED_MODULE_0__[\"default\"](slider, {\n            modules: [swiper__WEBPACK_IMPORTED_MODULE_0__.EffectCoverflow],\n            centeredSlides: true,\n            effect: 'coverflow',\n            grabCursor: true,\n            initialSlide: 2,\n            loop: false,\n            observer: true,\n            preloadImages: false,\n            resizeReInit: true,\n            slideToClickedSlide: true,\n            slidesPerView: 'auto',\n            spaceBetween: 0,\n            speed: 1000,\n            watchOverflow: true,\n            watchSlidesProgress: true,\n            watchSlidesVisibility: true,\n            coverflowEffect: {\n                rotate: 0,\n                stretch: 110,\n                depth: 100,\n                modifier: 1,\n                scale: 0.9,\n                slideShadows: false\n            },\n            breakpoints: {\n                768: {\n                    coverflowEffect: {\n                        rotate: 0,\n                        stretch: 55,\n                        depth: 160,\n                        modifier: 1,\n                        scale: 0.9,\n                        slideShadows: false\n                    },\n                },\n            },\n            on: {\n                transitionStart: function () {\n                    const slides = this.el.querySelectorAll('.js-plp-product-tile');\n                    for (var i = 0; i < slides.length; i++) {\n                        if (slides[i].classList.contains('routine-search-result__slide-transtion-end')) {\n                            slides[i].classList.remove('routine-search-result__slide-transtion-end');\n                        }\n                    }\n                },\n                transitionEnd: function () {\n                    if (!!this.clickedSlide) {\n                        this.clickedSlide.classList.add('routine-search-result__slide-transtion-end');\n                    }\n                }\n            }\n        });\n    },\n\n    slidesToggle: function(button) {\n        const currentIndex = parseInt(button.dataset.index)\n        const routineSlider = document.querySelector(selectors.slider).swiper\n        routineSlider.slideTo(currentIndex - 1)\n    },\n\n    slidesChange: function(slider) {\n        const routineSlider = document.querySelector(slider).swiper\n        routineSlider.on('slideChange', () => {\n            const prevCustomSlideIndex = 3;\n            const nextCustomSlideIndex = 4;\n            const slide = document.querySelector('.routine-search-result__slide:nth-child(1)');\n            const slides = document.querySelectorAll('.routine-search-result__slide');\n            if(routineSlider.realIndex === prevCustomSlideIndex) {\n                slides.forEac
841h(item => {\n                    if(item.classList.contains(selectors.customSlideClass)) {\n                        item.classList.remove(selectors.customSlideClass)\n                    };\n                });\n                slide.classList.add(selectors.customSlideClass);\n            } else if(routineSlider.realIndex === nextCustomSlideIndex) {\n                slide.classList.remove(selectors.customSlideClass);\n                slides.forEach(slide => {\n                    if(!slide.classList.contains('swiper-slide-visible')) {\n                        slide.classList.add(selectors.customSlideClass);\n                    }\n                });\n            } else {\n                slides.forEach(item => {\n                    if(item.classList.contains(selectors.customSlideClass)) {\n                        item.classList.remove(selectors.customSlideClass)\n                    };\n                })\n                slide.classList.remove(selectors.customSlideClass)\n            }\n\n            if (routineSlider.realIndex >= 5) {\n                return this.updateActiveButtonClass(4);\n            }\n\n            this.updateActiveButtonClass(routineSlider.realIndex)\n        })\n    },\n\n    updateActiveButtonClass: function(currentIndex) {\n        const sliderButtons = document.querySelectorAll(`.${selectors.sliderButtons}`)\n        sliderButtons.forEach(btn => {\n            btn.classList.remove(selectors.sliderButtonActiveClass)\n            if(btn.dataset.index == (currentIndex + 1)) {\n                btn.classList.add(selectors.sliderButtonActiveClass)\n            }\n        })\n    },\n\n    stickyMobileCta: function(slider) {\n        const routineSlider = document.querySelector(slider)\n        window.addEventListener('scroll', () => {\n            if (window.scrollY < routineSlider.getBoundingClientRect().bottom - 200) {\n                document.body.classList.add('routine-finder-sticky');\n            } else {\n                document.body.classList.remove('routine-finder-sticky');\n            }\n        });\n    }\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (routineSlider);\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/routine-slider.js?\n}");
842
843/***/ }),
844
845/***/ "./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js":
846/*!**********************************************************************!*\
847  !*** ./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js ***!
848  \**********************************************************************/
849/***/ (function(module) {
850
851"use strict";
852eval("{\n\nvar RECAPTCHA_URL = 'https://www.google.com/recaptcha/api.js?onload=onloadRecaptchaCallback&render=explicit';\n\nfunction isGrecaptchaReady() {\n    return typeof window.grecaptcha !== 'undefined' &&\n        typeof window.grecaptcha.render === 'function';\n}\n\nfunction createScriptElement() {\n    if (typeof window.__nativeCreateElement === 'function') {\n        return window.__nativeCreateElement('script');\n    }\n    return document.createElement('script');\n}\n\nfunction unblockRecaptcha() {\n    if (typeof window.pcUnblockRecaptchaScripts === 'function') {\n        window.pcUnblockRecaptchaScripts();\n    }\n}\n\nfunction getLoadedRecaptchaScript() {\n    var scripts = document.querySelectorAll('script[src*=\"google.com/recaptcha/api.js\"]');\n    var i;\n    for (i = 0; i < scripts.length; i++) {\n        if (scripts[i].getAttribute('src')) {\n            return scripts[i];\n        }\n    }\n    return null;\n}\n\nvar scriptsInjection = {\n    loadRecaptcha: function (executeRecaptcha, initRecaptcha) {\n        window.onloadRecaptchaCallback = function () {\n            var initResult = initRecaptcha();\n            if (initResult && typeof initResult.then === 'function') {\n                initResult.then(executeRecaptcha);\n            } else {\n                executeRecaptcha();\n            }\n        };\n\n        if (isGrecaptchaReady()) {\n            window.onloadRecaptchaCallback();\n            return;\n        }\n\n        if (getLoadedRecaptchaScript()) {\n            if (typeof window.jQuery !== 'undefined') {\n                window.jQuery(document).one('recaptchaReady', window.onloadRecaptchaCallback);\n            }\n            return;\n        }\n\n        unblockRecaptcha();\n\n        var script = createScriptElement();\n        script.setAttribute('type', 'text/javascript');\n        script.setAttribute('src', RECAPTCHA_URL);\n        script.async = true;\n        script.defer = true;\n        document.head.appendChild(script);\n    }\n};\n\nmodule.exports = scriptsInjection;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/scriptsInjection.js?\n}");
853
854/***/ }),
855
856/***/ "./cartridges/app_paulaschoice/cartridge/js/scrolling-blocks-nav.js":
857/*!**************************************************************************!*\
858  !*** ./cartridges/app_paulaschoice/cartridge/js/scrolling-blocks-nav.js ***!
859  \**************************************************************************/
860/***/ (function(module) {
861
862eval("{var scrollingBlocksNav = {\n  createNavElement : function (element, controller, start, end){\n      return new NavItem(element, controller, start, end);\n  }  \n};\n\nmodule.exports = scrollingBlocksNav;\n\nfunction NavItem(element, controller, start, end) {\n    var $navItem = $('<li><button class=\"simple\"></button></li>').appendTo(element.find('ul'));\n    \n    setActive($navItem, isActive(start, end));   \n\n    $(document).on(\"scroll\", function() {\n        setActive($navItem, isActive(start, end));   \n    });\n\n    $navItem.on(\"click\", function(e){\n        e.preventDefault();\n        controller.scrollTo(start);\n    });\n    \n    return $navItem;\n    \n    function isActive(start, end){\n        return start <= $(document).scrollTop() && $(document).scrollTop() < end;\n    }\n    \n    function setActive(element, shouldSetActive) {\n        if(shouldSetActive) {\n            element.parent().find(\"li\").removeClass(\"active\");     \n            $(element).addClass(\"active\");\n        }\n    }\n}\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/scrolling-blocks-nav.js?\n}");
863
864/***/ }),
865
866/***/ "./cartridges/app_paulaschoice/cartridge/js/searchTabs.js":
867/*!****************************************************************!*\
868  !*** ./cartridges/app_paulaschoice/cartridge/js/searchTabs.js ***!
869  \****************************************************************/
870/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
871
872eval("{var util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\")\n\nvar searchTabs =  {\n    init: function(){\n        var productsWrapper = $('.js-products-wrapper');\n        var beautpediaWrapper = $('.js-beautpedia-wrapper');\n        var productsLink = $('.js-search-result-products');\n        var beautpediaLink = $('.js-search-result-beautpedia');\n\n\n        if (productsLink.length !== 0) {\n            productsLink.on('click', function(){\n                beautpediaWrapper.addClass('is-hidden');\n                productsWrapper.removeClass('is-hidden');\n                $(this).addClass('is-active');\n                beautpediaLink.removeClass('is-active');\n            });\n        }\n\n        if (beautpediaLink.length !== 0) {\n            beautpediaLink.on('click', function (e) {\n                productsWrapper.addClass('is-hidden');\n                beautpediaWrapper.removeClass('is-hidden');\n                $(this).addClass('is-active');\n                productsLink.removeClass('is-active');\n            });\n        }\n    }\n};\n\nmodule.exports = searchTabs;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/searchTabs.js?\n}");
873
874/***/ }),
875
876/***/ "./cartridges/app_paulaschoice/cartridge/js/searchfilterv2.js":
877/*!********************************************************************!*\
878  !*** ./cartridges/app_paulaschoice/cartridge/js/searchfilterv2.js ***!
879  \********************************************************************/
880/***/ (function(module, exports, __webpack_require__) {
881
882"use strict";
883eval("{\nvar ajax = __webpack_require__(/*! ./ajax */ \"./cartridges/app_paulaschoice/cartridge/js/ajax.js\"),\nsearch = __webpack_require__(/*! ./pages/search */ \"./cartridges/app_paulaschoice/cartridge/js/pages/search.js\"),\ncompareWidget = __webpack_require__(/*! ./compare-widget */ \"./cartridges/app_paulaschoice/cartridge/js/compare-widget.js\"),\nproductTile = __webpack_require__(/*! ./product-tile */ \"./cartridges/app_paulaschoice/cartridge/js/product-tile.js\"),\nprogress = __webpack_require__(/*! ./progress */ \"./cartridges/app_paulaschoice/cartridge/js/progress.js\"),\nutil = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\nsearchoptions = __webpack_require__(/*! ./searchoptions */ \"./cartridges/app_paulaschoice/cartridge/js/searchoptions.js\"),\nsearchTabs = __webpack_require__(/*! ./searchTabs */ \"./cartridges/app_paulaschoice/cartridge/js/searchTabs.js\"),\naddToCart = __webpack_require__(/*! ./pages/product/addToCart */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js\"),\ncategoryPage = __webpack_require__(/*! ./pages/category */ \"./cartridges/app_paulaschoice/cartridge/js/pages/category.js\"),\ngtmtracking = __webpack_require__(/*! ./gtmtracking */ \"./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js\"),\nslider = (__webpack_require__(/*! ./slider */ \"./cartridges/app_paulaschoice/cartridge/js/slider.js\")[\"default\"]),\ndialog = __webpack_require__(/*! ./dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\"),\ncollectionPage = __webpack_require__(/*! ./pages/collection */ \"./cartridges/app_paulaschoice/cartridge/js/pages/collection.js\"),\npowerreviews = __webpack_require__(/*! ./powerreviews */ \"./cartridges/app_paulaschoice/cartridge/js/powerreviews.js\"),\nproductTileVariationChange = __webpack_require__(/*! ./pages/producttilevariationchange */ \"./cartridges/app_paulaschoice/cartridge/js/pages/producttilevariationchange.js\");\n\nconst mobileWidth = 768;\nconst numberOfProductsPerPage = 48;\n\nvar searchfilter = {\n\n\tparentcgid:\"\",\n\tcgid: \"\",\n\tsortingRule: \"\",\n\tsearchRefinements: {},\n\tsearchRefinementsOldState:{},\n\taccordionState: [],\n\tmobileSelectedLevel: \"\",\n\n\tinit: function() {\n\t\tbindCheckBoxChangeEvents();\n        rebuildTheFilter();\n        sortProductsOnFE();\n        sortByPrice();\n\t\tshowFilterExplanation();\n\t\tpowerreviews.powerReviewsTiles();\n\t\tvar selectedList = $(\".selected-refinements-filter-wrapper ul\");\n\t\t$(\".search-refinements-list li li\").each(function() {\n\t\t\t\tvar $li = $(this);\n\t\t\t\tvar $checkbox = $li.find('input[type=\"checkbox\"]');\n\n\t\t\t\tif ($checkbox.length > 0) {\n\t\t\t\t\tvar isChecked = $checkbox.is(':checked');\n\n\t\t\t\t\t// Find the nearest parent <form> and get its ID\n\t\t\t\t\tvar formId = $li.closest('form').attr('id');\n\n\t\t\t\t\tif (isChecked) {\n\t\t\t\t\t\tvar value = $checkbox.val();\n\t\t\t\t\t\tvar li = $('<li/>')\n\t\t\t\t\t\t\t\t\t.data('info', value)\n\t\t\t\t\t\t\t\t\t.appendTo(selectedList);\n\n\t\t\t\t\t\tvar link = $('<a/>')\n\t\t\t\t\t\t\t\t\t\t.text(value)\n\t\t\t\t\t\t\t\t\t\t.addClass('js-remove-filter')\n\t\t\t\t\t\t\t\t\t\t.data('filterValue', formId)\n\t\t\t\t\t\t\t\t\t\t.appendTo(li);\n\n\t\t\t\t\t\tvar itag = $('<i/>')\n\t\t\t\t\t\t\t\t\t\t.addClass('fa fa-close')\n\t\t\t\t\t\t\t\t\t\t.prependTo(link);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t},\n\t//We are doing a fake category search actually,all  primary categories added manually the products in 'searchPlacement' attribute of Product\n\tgetResults: function (justNumbers) {\n\t\tvar searchRefinementsArray = [];\n\t\tvar keysForRefinements = Object.keys(this.searchRefinements);\n\t\tvar refinementIndex = 1;\n\n\t\tfor (var i = 0; i < keysForRefinements.length;
883 i++) {\n\n\t\t\tif(this.searchRefinements[keysForRefinements[i]].length == 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsearchRefinementsArray[refinementIndex] = this.createSearchRefinementString(refinementIndex,keysForRefinements[i],this.searchRefinements[keysForRefinements[i]]);\n\t\t\trefinementIndex++;\n\t\t}\n\t\tvar lastParameters = searchRefinementsArray.join('&');\n\t\tvar host = window.location.origin + $('.header__logo').attr('href') + '/search';\n\t\tvar requestURL = encodeURI(  host + (lastParameters != \"\" ? (\"?\" +lastParameters) : \"\") );\n\t\tconst keywordSearchElement = document.querySelector('[data-keywordsearch]');\n\t\t//inform server this is ajax\n\t\trequestURL = util.appendParamToURL(requestURL,'format', 'ajax');\n\t\t//inform server this is a filter call\n\t\trequestURL = util.appendParamToURL(requestURL,'searchfilter', 'true');\n\t\t//inform server about the category id\n\t\trequestURL = util.appendParamToURL(requestURL,'cgid', this.cgid);\n\t\t//inform server about the sorting rule\n\t\tif (keywordSearchElement) {\n\t\t\trequestURL = util.appendParamToURL(requestURL,'q', keywordSearchElement.getAttribute('data-keywordsearch'));\n\t\t}\n\t\tif (this.sortingRule != \"\") {\n\t\t\trequestURL = util.appendParamToURL(requestURL,'srule', this.sortingRule);\n\t\t}\n\t\tif (justNumbers) {\n\t\t\trequestURL = util.appendParamToURL(requestURL,'justnumbers', 'true');\n\n\n\t\t\t $.get(requestURL).done(function(response) {\n\t\t\t\t var searchCounts = JSON.parse(response.searchCounts);\n\t\t\t\t for(var i = 0; i < searchCounts.length; i++) {\n\t\t\t\t\t $(\"#\"+searchCounts[i].name).parent().find(\".hitcount\").html(searchCounts[i].number);\n\t\t\t\t\t $(\"#\"+searchCounts[i].name).parent().removeClass('disabled');\n\t\t\t\t\t if (searchCounts[i].number == 0) {\n\t\t\t\t\t\t $(\"#\"+searchCounts[i].name).parent().addClass('disabled');\n\t\t\t\t\t }\n\t\t\t\t }\n\t\t\t\t $(\".js-show-filter-results button\").attr(\"disabled\", false);\n\t\t\t\t var oldResultCount = $('#filterParameters').data('resultcount');\n\t\t\t\t if (response.totalSearchCount != oldResultCount) {\n\t\t\t\t\t $(\".search-result-options-subheader span\").html(response.totalSearchCount.toString() + \" \" + Resources.RESULT_FOUND);\n\t\t\t\t\t $('#filterParameters').data('resultcount',response.totalSearchCount);\n\t\t\t\t }\n\t\t\t\t if (response.totalSearchCount == 0) {\n\t\t\t\t\t $(\".js-show-filter-results button\").attr(\"disabled\", true);\n\t\t\t\t }\n\n\t\t\t\t $('.search-result-options-footer button').html(Resources.APPLY_RESULT + \" \" + response.totalSearchCount.toString());\n\t\t\t\t $('.js-show-filter-results button').html(Resources.SEARCH_RESULT + \" \" + response.totalSearchCount.toString());\n\n\t\t\t    }).fail(function (response) {\n\t\t\t    \t//Do nothing\n\t\t\t });\n\n\t\t\treturn;\n\t\t}\n\n\t\tif(searchfilter.mobileSelectedLevel != \"\") {\n\t\t\trequestURL = util.appendParamToURL(requestURL,'mobileselectedlevel', searchfilter.mobileSelectedLevel);\n\t\t}\n\t\tprogress.show($('.search-result-content'));\n\n\t\t$('.search-result-options-footer__dot-pulse').show();\n\n\t    $('#main').load(requestURL, function () {\n\t        compareWidget.init();\n\t        productTile.init();\n\t        searchoptions.init();\n\t        progress.hide();\n\t        addToCart();\n\t        collectionPage.init();\n\t        history.pushState(undefined, '', $('#filterParameters').data('filterpageurl'));\n\t        checkForComponents('js-featured-product');\n\t        checkForComponents('js-active-promotion');\n\t        slider.init('.productslider-items');\n\t        gtmtracking.incrementProductImpressions();\n\t\t\tgtmtracking.incrementPromotionImpressions();\n\t\t\tgtmtracking.productInit();\n\t\t\tgtmtracking.observationBind(1000);\n\t\t\tsearchTabs.init();\n\t        bindCheckBoxChangeEvents();\n\t        rebuildTheFilter();\n\t\t\trestoreAccordion();\n            sortProductsOnFE();\n            sortByPrice();\n            $('.search-result-options-footer__dot-pulse').hide();\n            alignProductTextHeights();\n\t\t\tshowFilterExplanation();\n\t\t\tpowerreviews.powerReviewsTiles();
883\n            productTileVariationChange.init();\n\n\t\t\tvar selectedList = $(\".selected-refinements-filter-wrapper ul\");\n\t\t\t$(\".search-refinements-list li li\").each(function() {\n\t\t\t\tvar $li = $(this);\n\t\t\t\tvar $checkbox = $li.find('input[type=\"checkbox\"]');\n\n\t\t\t\tif ($checkbox.length > 0) {\n\t\t\t\t\tvar isChecked = $checkbox.is(':checked');\n\n\t\t\t\t\tif(isChecked) {\n\t\t\t\t\t\tvar value = $checkbox.val();\n\t\t\t\t\t\tvar formId = $li.closest('form').attr('id');\n\t\t\t\t\t\tvar li = $('<li/>')\n\t\t\t\t\t\t\t\t\t.data('info', value)\n\t\t\t\t\t\t\t\t\t.appendTo(selectedList);\n\n\t\t\t\t\t\tvar link = $('<a/>')\n\t\t\t\t\t\t\t\t\t\t.text(value)\n\t\t\t\t\t\t\t\t\t\t.addClass('js-remove-filter')\n\t\t\t\t\t\t\t\t\t\t.data('filterValue', formId)\n\t\t\t\t\t\t\t\t\t\t.appendTo(li);\n\n\t\t\t\t\t\tvar itag = $('<i/>')\n\t\t\t\t\t\t\t\t\t\t.addClass('fa fa-close')\n\t\t\t\t\t\t\t\t\t\t.prependTo(link);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n            // Lazy load images update\n            if (!!window.lazyLoadInstance) window.lazyLoadInstance.update();\n\t    });\n\n\n\t},\n\n\tcreateSearchRefinementString: function (index, refinementName, refinementArray) {\n\t\tvar tempArray = [];\n\t\tfor(var i = 0; i < refinementArray.length; i++) {\n\t\t\ttempArray.push(refinementArray[i].value);\n\t\t}\n\t\treturn \"prefn\" +index.toString() + \"=\" + refinementName + \"&prefv\" + index.toString() +\"=\"+tempArray.join('|');\n\t},\n\n\taddToRefinementsArray: function(arrayName, val, presentationid) {\n\t\tif(!this.searchRefinements.hasOwnProperty(arrayName)) {\n\t\t\tthis.searchRefinements[arrayName] = [];\n\t\t}\n\t\tfor(var i = 0; i < this.searchRefinements[arrayName].length; i++) {\n\t\t\tif (this.searchRefinements[arrayName][i].value == val.replace(/!/g,'&') ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.searchRefinements[arrayName].push({\n\t\t\tvalue: val.replace(/!/g,'&'),\n\t\t\tpresentationid: presentationid\n\t\t});\n\t},\n\n\tremoveFromRefinementArray: function(arrayName, val) {\n\t\tif (!arrayName || !this.searchRefinements.hasOwnProperty(arrayName)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.searchRefinements[arrayName] = this.searchRefinements[arrayName].filter(function(ele){\n\t\t\treturn ele.value != val.replace(/!/g,'&');\n\t\t});\n\t},\n\n\tremoveAllValuesInOneRefinement: function (arrayName) {\n\t\t\tthis.searchRefinements[arrayName] = [];\n\t},\n\n\taddAccordionState: function (formid, state) {\n\t\tfor(var i = 0; i < this.accordionState.length; i++) {\n\t\t\tif (this.accordionState[i].formid == formid) {\n\t\t\t\tthis.accordionState[i].state = state;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.accordionState.push({\n\t\t\tformid: formid,\n\t\t\tstate: state\n\t\t});\n    },\n\n\trestorefilter: function () {\n\t\tvar keysForRefinements = Object.keys(this.searchRefinements);\n\t\t$(\"#allfilters input[type=checkbox]\").removeAttr(\"checked\"); //Removed level 2 checkboxes\n\t\t$(\"#allfilters .selected-refinements li\").remove(); // Removed selected filters level 1\n\t\t$('.search-result-options-subheader a').hide();\n\t\tfor (var i = 0; i < keysForRefinements.length; i++) {\n\n\t\t\tif(this.searchRefinements[keysForRefinements[i]].length == 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (var k = 0; k < this.searchRefinements[keysForRefinements[i]].length; k++) {\n\t\t\t\t//activate delete filter\n\t\t\t\t$('.search-result-options-subheader a').show();\n\t\t\t\t//Recreated level 2 checkbox state from memory\n\t\t\t\t$(\"#\" + keysForRefinements[i] + \" input[type=checkbox][value='\"+ this.searchRefinements[keysForRefinements[i]][k] + \"']\").prop(\"checked\",\"true\");\n\t\t\t\t//add selected refinements to main page from memory\n\n\t\t\t\tvar selectedList = $(\"#\" + keysForRefinements[i]).parents().eq(2).find(\".selected-refinements ul\");\n\n\t\t\t\tselectedList.parent().show();\n\t\t\t\tvar li = $('<li/>')\n\t\t\t\t \t\t.data('info',this.searchRefinements[keysForRefinements[i]][k].value)\n\t\t\t\t         .appendTo(selectedList);\n\t\t\t\tvar link = $('<a/>')\n\t\t\t\t         .text(this.searchRefinements[keysForRefinements[i]][k].value)\n\t\t\t\t         .addClass('js-remove-filter')\n\t\t\t\t         .data('filterValue', keysForRefinements[i])\n\t\t\t\t         .appendTo(l
883i);\n\t\t\t\tvar itag = $('<i/>')\n\t\t\t\t     \t .addClass('fa fa-close')\n\t\t\t\t     \t .prependTo(link);\n\t\t\t}\n\n\t\t}\n\t}\n\n\n};\n\nfunction bindCheckBoxChangeEvents() {\n\n\t$('#allfilters form').each(function( index ) {\n\t\tvar refinementId = $(this).attr('id');\n\t\t$(\"#\" + refinementId + \" input:checkbox\").change(function(e) {\n\t\t\tif ($(this).parent().hasClass('disabled')) {\n\t\t\t\t$(this).removeAttr(\"checked\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(this.checked) {\n\t\t        searchfilter.addToRefinementsArray(refinementId,this.value,$(this).data('presentationid'));\n\t\t    } else {\n\t\t    \tsearchfilter.removeFromRefinementArray(refinementId,this.value);\n\t\t    }\n\n\t\t    if($(window).width() > mobileWidth) {\n\t\t    \tsearchfilter.getResults();\n\t\t    } else {\n\t\t\t\tsearchfilter.mobileSelectedLevel = refinementId;\n\t\t\t\tsearchfilter.getResults();\n\t\t\t}\n\n\t\t});\n\t});\n\n\t//open level-2 filters\n\t$('.js-refinement-parents').on('click', function() {\n\t\t if($(window).width() < mobileWidth) {\n\t\t\t $(this).siblings('div').first().addClass('active');\n\t\t\t //ios overflow fix\n\t\t\t $('.search-result-options-container').css('overflow','visible');\n\t    } else {\n\t    \tif($(this).parent().hasClass(\"closed\")) {\n\t    \t\t$(this).parent().removeClass(\"closed\");\n\t    \t\t$(this).parent().find('.selected-refinements').hide();\n\t    \t\tsearchfilter.addAccordionState($(this).siblings('div').first().find('form').attr('id'),'open');\n\t    \t} else {\n\t    \t\t$(this).parent().addClass(\"closed\");\n\t    \t\t$(this).parent().find('.selected-refinements').show();\n\t    \t\tsearchfilter.addAccordionState($(this).siblings('div').first().find('form').attr('id'),'closed');\n\t    \t}\n\t    }\n\t});\n\n\n\n\t var searchOptionElement = $('.search-result-options');\n\n\t //Open Button for filter in mobile\n\t $('.search-result-options-toggle').on('click', function(){\n         if (searchOptionElement.hasClass('active')) {\n\t\t\t // while closing delete last changes and restore from the memory\n\t\t\t searchOptionElement.removeClass('active');\n        \t searchfilter.searchRefinements = JSON.parse(JSON.stringify(searchfilter.searchRefinementsOldState));\n        \t searchfilter.restorefilter();\n         } else {\n        \t //Opening Filter\n        \t //write last state of the filter to memory\n        \t searchfilter.searchRefinementsOldState = JSON.parse(JSON.stringify(searchfilter.searchRefinements))\n\t\t\t searchOptionElement.addClass('active');\n         }\n\t });\n\n\t //apply button or close level-2 filters back button\n\t $(\".search-result-options-footer button, .search-result-options-back-handle\").on('click', function(){\n\t\t $('.js-refinement-parents').siblings('div').removeClass('active')\n\t });\n\n\t //Show Results Button\n\t $(\".js-show-filter-results button, .search-result-options-close-handle\").on('click', function() {\n\t\t //Close the filter\n\t\t searchOptionElement.removeClass('active');\n\t });\n}\n\n// Tabs Page Between Products and Beautypedia\nsearchTabs.init();\n\n\n//Delete All Filter Button in Desktop\n$('#main').on('click', '.search-result-options-delete', function() {\n\tsearchfilter.searchRefinements = {};\n\tsearchfilter.getResults();\n});\n\n//Delete All Filter Button in Mobile Level 2(Inside Refinement Attributes)\n$('#main').on('click', '.js-delete-all-level-2 a', function() {\n\tvar refinementID = $(this).parent().parent().find('form').attr('id');\n\tsearchfilter.removeAllValuesInOneRefinement(refinementID);\n\t//Uncheck all inputs\n\t$('#' + refinementID +' input[type=checkbox]').removeAttr(\"checked\");\n\n\tsearchfilter.getResults();\n\n});\n\n//Delete All Filter Button in Mobile Level 1\n$('#main').on('click', '.js-delete-all-level-1 a', function() {\n\t//clear all refinements\n\tsearchfilter.searchRefinements = {};\n\t//Uncheck all inputs\n\t$('.search-result-options input[type=checkbox]').removeAttr(\"checked\");\n\tsearchfilter.mobileSelectedLevel = \"level1\";\n\n\tsearchfilter.getResults();\n\t//Remove all mini filter info from level-1\n\t$('.js-remove-filter').parent().remove();\n\n});\n\n// Toggle refinements section on Desktop\n$('#main').on('click', '.js-filter-btn-desktop, .js-search-refinements-close', function () {\n    $('.content-container__aside').toggleClass('open');\n});\n\n//Remove Filter event\n$('#main').on('click', 'a.js-remove-filter', function(){\n\t var $link = $(this);\n\t var removedRefimentID = $link.data('filterValue') || $link.parents().eq(3).find('form').attr('id');\n\t var removedValue = $link.parent().data('info') || $link.text();\n\n\t searchfilter.removeFromRefinementArray(removedRefimentID, removedValue);\n\t if($link.parents().eq(2).find('li').length == 1) {\n\t\t $link.parents().eq(2).hide();\n\t }\n\t  //Remove the filter\n\t  $link.parent().remove();\n\n\t  if($(window).width() > mobileWidth) {\n\t\tsearchfilter.getResults();\n\t  } else {\n\t\tsearchfilter.mobileSelectedLevel = \"level1\";\n\n\t\tsearchfilter.getResults();\n\t  }\n\t  //write to memory and restore fiter\n\t  searchfilter.searchRefinementsOldState = JSON.parse(JSON.stringify(searchfilter.searchRefinements));\n\t  searchfilter.restorefilter();\n\n});\n\nfunction updateSortOption (box) {\n\tsearchfilter.sortingRule = $(box).find('option:selected').data('sorting');\n    searchfilter.getResults();\n}\n\n\nfunction checkForComponents(componentClass) {\n\tvar $tiles = $('.js-grid-tile');\n\n\tif( $(document).find('.' + componentClass).length && $tiles.length > 11 ) {\n\n\t\t//Hide last element\n\t\tvar $lastTile = $tiles.slice(11);\n\t   \t$($lastTile).hide();\n\n\t   \t//Switch pagination system.\n\t   \t$(\".js-std-pagination\").hide();\n\t   \t$(\".js-alt-pagination\").show();\n\t}\n}\n\nfunction sortProductsOnFE() {\n\n\tif($('#grid-sort-header option:selected').data('sorting') != 'Relevance') {\n\t\treturn;\n\t}\n    var $productTile = $('.js-plp-product-tile');\n\tvar $productTilePromo = $('.js-plp-product-tile-promo');\n    var applySorting = false;\n    var sortingParameters = [];\n    var filteredProductDataArray = [];\n\n    if ('skinTypeExtended' in searchfilter.searchRefinements) {\n        if (searchfilter.searchRefinements.skinTypeExtended.length > 0) {\n            applySorting = true;\n            for (var i = 0; i < searchfilter.searchRefinements.skinTypeExtended.length;
883 i++) {\n                sortingParameters.push(searchfilter.searchRefinements.skinTypeExtended[i]);\n            }\n        }\n    }\n\n    if ('skinConcernExtended' in searchfilter.searchRefinements) {\n        if (searchfilter.searchRefinements.skinConcernExtended.length > 0) {\n            applySorting = true;\n            for (var i = 0; i < searchfilter.searchRefinements.skinConcernExtended.length; i++) {\n                sortingParameters.push(searchfilter.searchRefinements.skinConcernExtended[i]);\n            }\n        }\n    }\n\n    if (applySorting) {\n        for (var i = 0; i < sortingParameters.length; i++) {\n            sortingParameters[i].presentationid = sortingParameters[i].presentationid.replace(/\\s+/g, '-').toLowerCase();\n        }\n    } else {\n        return;\n    }\n\n    $productTile.each(function() {\n        var data = $(this).data('jsondata');\n        filteredProductDataArray.push(JSON.parse(JSON.stringify(data).toLowerCase()));\n    });\n\n\tvar maxSortValue = 0;\n    for (var i = 0; i < filteredProductDataArray.length; i++) {\n        var productTileData = filteredProductDataArray[i];\n        var sortValue = 0;\n\n        for (var j = 0; j < sortingParameters.length; j++) {\n            sortValue += productTileData[sortingParameters[j].presentationid];\n        }\n\n\t\tif (maxSortValue < sortValue) {\n\t\t\tmaxSortValue = sortValue\n\t\t}\n\n        productTileData['sortValue'] = sortValue;\n\n        $productTile.eq(i).css('order', -sortValue);\n    }\n\tif ($productTilePromo) {\n\t\t$productTilePromo.css('order', -maxSortValue - 1)\n\t}\n}\n\nfunction sortByPrice() {\n    var isPriceLowToHigh = $('.js-filter-box option:selected').data('sorting') == 'price-low-to-high';\n    var isPriceHighToLow = $('.js-filter-box option:selected').data('sorting') == 'price-high-to-low';\n\n    if(!isPriceLowToHigh && !isPriceHighToLow) {\n\t\treturn;\n\t}\n\n    var $productTile = $('.js-plp-product-tile');\n    var updatedProductList = false;\n\n    if (isPriceLowToHigh) {\n        updatedProductList = $productTile.sort(function(a, b) {\n\t\t    if($(a).data('jsondata') && $(b).data('jsondata')) {\n\t\t\t\treturn $(a).data('jsondata').price - $(b).data('jsondata').price;\n\t\t\t}\n        });\n    }\n\n    if (isPriceHighToLow) {\n        updatedProductList = $productTile.sort(function(a, b) {\n\t\t\tif($(a).data('jsondata') && $(b).data('jsondata')) {\n                return $(b).data('jsondata').price - $(a).data('jsondata').price;\n\t\t\t}\n        });\n    }\n\n    var currentPage = null;\n\n    // pagination is used\n    if (util.getQueryStringParams(util.getQueryString(window.location.href)).page && util.getQueryStringParams(util.getQueryString(window.location.href)).page != 1) {\n        currentPage = parseInt(util.getQueryStringParams(util.getQueryString(window.location.href)).page);\n    }\n\n    for (var i = 0; i < updatedProductList.length; i++) {\n        updatedProductList.eq(i).css('order', i);\n        updatedProductList.eq(i).addClass('hidden');\n\n        if (currentPage) {\n            var productFloor = numberOfProductsPerPage * (currentPage - 1);\n            var productCeil = numberOfProductsPerPage * currentPage;\n\n            if (i >= productFloor && i < productCeil) {\n                updatedProductList.eq(i).removeClass('hidden');\n            }\n        } else {\n            if (i < numberOfProductsPerPage) {\n                updatedProductList.eq(i).removeClass('hidden');\n            }\n        }\n    }\n    alignProductTextHeights();\n}\n\nfunction switchPage(index) {\n    var productCount = $('.js-plp-product-tile').length;\n    var productFloor = numberOfProductsPerPage * (index - 1);\n    var productCeil = numberOfProductsPerPage * index;\n\n    for (var i = 0; i < productCount; i++) {\n        $('.js-plp-product-tile').eq(i).addClass('hidden');\n        if (i >= productFloor && i < productCeil) {\n            $('.js-plp-product-tile').eq(i).removeClass('hidden');\n        }\n    }\n    $('.js-pagination li').removeClass('active');\n    $('.js-pagination li').eq(index - 1).addClass('active');\n    $('#js-scroll-to-top').trigger('click');
883\n    alignProductTextHeights();\n    sortByPrice();\n}\n\nfunction alignProductTextHeights() {\n    if ($('.product-tile > .product-name').length) {\n        if (util.isDesktop()) {\n            util.setEqualHeights($('.product-tile > .product-name'), 4);\n        } else if (util.isTablet()) {\n\t\t\tutil.setEqualHeights($('.product-tile > .product-name'), 3);\n\t\t} else if (util.isMobile()) {\n            util.setEqualHeights($('.product-tile > .product-name'), 2);\n        }\n    }\n\n    if ($('.product-tile .product-skin').length) {\n        if (util.isDesktop()) {\n            util.setEqualHeights($('.product-tile .product-skin'), 4);\n        } else if (util.isTablet()) {\n\t\t\tutil.setEqualHeights($('.product-tile .product-skin'), 3);\n\t\t} else if (util.isMobile()) {\n            util.setEqualHeights($('.product-tile .product-skin'), 2);\n        }\n    }\n}\n\n// Pagination\n$('#main').on('click', '.js-pagination li', function() {\n    var pageIndex = parseInt($(this).data('index'));\n    var url = util.appendParamToURL(window.location.href, 'page', pageIndex);\n\n    if (url.indexOf('page')) { // update page query param value if it's already there\n        url = util.removeParamFromURL(url, 'page');\n        url = util.appendParamToURL(url, 'page', pageIndex);\n    }\n\n    history.pushState(undefined, '', url);\n    switchPage(pageIndex);\n});\n\nif (util.getQueryStringParams(util.getQueryString(window.location.href)).page && util.getQueryStringParams(util.getQueryString(window.location.href)).page != 1) {\n    switchPage(parseInt(util.getQueryStringParams(util.getQueryString(window.location.href)).page));\n}\n\nfunction restoreAccordion() {\n\tif($(window).width() > mobileWidth) {\n\t\tfor(var i = 0; i < searchfilter.accordionState.length; i++) {\n\t\t\tvar jsRefinementTitle = $('#'+searchfilter.accordionState[i].formid).parents().eq(2);\n\t\t\tif (searchfilter.accordionState[i].state == 'open') {\n\t\t\t\tjsRefinementTitle.removeClass('closed');\n\t\t\t\tjsRefinementTitle.find('.selected-refinements').hide();\n\t\t\t} else if (searchfilter.accordionState[i].state == 'closed') {\n\t\t\t\tjsRefinementTitle.addClass('closed');\n\t\t\t\tjsRefinementTitle.find('.selected-refinements').show();\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction rebuildTheFilter() {\n\t$(\"#allfilters input[type=checkbox]\").removeAttr(\"checked\");\n\tvar parametersServer = $('#filterParameters').data('params');\n\tvar searchRefimentsIDs = $('#filterParameters').data('refimentattributes');\n\tvar searchRefinementsNewBuilded = {};\n\tvar refinementsSelected = false;\n\tif (parametersServer == null) {\n\t\treturn;\n\t}\n\tfor (var i = 0; i < parametersServer.length; i++ ) {\n\n\t\tif(parametersServer[i].name == \"cgid\") {\n\t\t\tsearchfilter.cgid = parametersServer[i].value;\n\t\t\tcontinue;\n\t\t}\n\t\tif(parametersServer[i].name == \"mobileselectedlevel\") {\n\t\t\tcontinue;\n\t\t}\n\t\tif (searchRefimentsIDs.indexOf(parametersServer[i].value) > -1) {\n\t\t\tvar ele = parametersServer.filter(function(element) {\n\t\t\t\treturn element.name == parametersServer[i].name.replace('n','v');\n\t\t\t});\n\t\t\tif(ele.length == 0) { continue; }\n\t\t\tvar values = ele[0].value.split(\"|\");\n\t\t\tsearchRefinementsNewBuilded[parametersServer[i].value] = [];\n\t\t\tfor (var k = 0; k < values.length ; k++) {\n\t\t\t\t$(\"#\" + parametersServer[i].value + \" input[type=checkbox][value='\"+ values[k] + \"']\").prop(\"checked\",\"true\");\n\t\t\t\tvar presentationid = $(\"#\" + parametersServer[i].value + \" input[type=checkbox][value='\"+ values[k] + \"']\").data('presentationid');\n\t\t\t\tsearchRefinementsNewBuilded[parametersServer[i].value].push({\n\t\t\t\t\tvalue: values[k],\n\t\t\t\t\tpresentationid: presentationid\n\t\t\t\t});\n\t\t\t\trefinementsSelected = true;\n\t\t\t\t//add selected refinements to main page from server response\n\t\t\t\tvar selectedList = $(\"#\" + parametersServer[i].value).parents().eq(2).find(\".selected-refinements ul\")\n\t\t\t\t if($(window).width() < mobileWidth) {\n\t\t\t\t\t selectedList.parent().show();\n\t\t\t    }\n\t\t\t\tvar li = $('<li/>')\n\t\t\t\t \t\t.data('info',values[k])\n\t\t\t\t         .appendTo(selectedList);\n\t\t\t\tvar link = $('<a/>')\n\t\t\t\t         .text(values[k])\n\t\t\t\t         .addClass('js-remove-filter')\n\t\t\t\t         .data('filterValue', parametersServer[i].value)\n\t\t\t\t         .appendTo(l
883i);\n\t\t\t\tvar itag = $('<i/>')\n\t\t\t\t     \t .addClass('fa fa-close')\n\t\t\t\t     \t .prependTo(link);\n\n\t\t\t}\n\t\t}\n\t}\n\n\tsearchfilter.searchRefinements = JSON.parse(JSON.stringify(searchRefinementsNewBuilded));\n\n\tif (refinementsSelected) {\n\t\t//Show delete all button in desktop if some attribute selected already\n\t\tif($(window).width() > mobileWidth) {\n\t\t\t$('.search-result-options-delete').show();\n\t\t}\n\t\t//Show delete all button in mobile if some attribute selected already\n\t\telse {\n\t\t\t$('.search-result-options-subheader a').show();\n\t\t}\n\n\t}\n}\n\nfunction showFilterExplanation () {\n\t$('.js-show-explanation').on('click', function (e) {\n\t\te.stopPropagation();\n\n\t\tconst explanation = $(this).data('explanation');\n\t\tconst explanationHtml = $('.js-' + explanation).html();\n\n\t\tdialog.open({\n\t\t\thtml: explanationHtml,\n            closeText : '',\n\t\t\toptions: {\n\t\t\t\twidth: 640,\n\t\t\t\tdialogClass: \"search-refinements__explanation-popup\",\n                closeText : '',\n\t\t\t\topen: function() {\n\t\t\t\t\t$('.ui-widget-overlay').on('click', function () {\n\t\t\t\t\t\tdialog.close();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n//Back button in Search filter\nvar isHandlingPopstate = false;\nwindow.onpopstate = function(event){\n\tif (isHandlingPopstate || !$('#filterParameters').length) return;\n\tisHandlingPopstate = true;\n    window.location.reload();\n};\n\n\nmodule.exports = searchfilter;\nexports.RebuildTheFilter = rebuildTheFilter;\nexports.BindCheckBoxChangeEventsForFilter = bindCheckBoxChangeEvents;\nexports.UpdateSortOption = updateSortOption;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/searchfilterv2.js?\n}");
884
885/***/ }),
886
887/***/ "./cartridges/app_paulaschoice/cartridge/js/searchoptions.js":
888/*!*******************************************************************!*\
889  !*** ./cartridges/app_paulaschoice/cartridge/js/searchoptions.js ***!
890  \*******************************************************************/
891/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
892
893eval("{var util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\"),\nsearchFilter = __webpack_require__(/*! ./searchfilterv2 */ \"./cartridges/app_paulaschoice/cartridge/js/searchfilterv2.js\");\n\nvar searchOptions =  {\n    init: function(){\n        var searchOptionElement = $('.search-result-options');\n        var targetElement = $('body');\n        var classToToggle = 'back-to-filter-visible';\n\n        if(searchOptionElement.length !== 0) {\n            $('.js-filter-box').on('change', function(){\n            \tsearchFilter.UpdateSortOption(this);\n            });\n\n            $(document).on('load scroll resize', function () {\n                targetElement.toggleClass(classToToggle, !util.jQueryElementInViewport(searchOptionElement, 120));\n            });\n        }\n    }\n};\n\nmodule.exports = searchOptions;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/searchoptions.js?\n}");
894
895/***/ }),
896
897/***/ "./cartridges/app_paulaschoice/cartridge/js/searchsuggest.js":
898/*!*******************************************************************!*\
899  !*** ./cartridges/app_paulaschoice/cartridge/js/searchsuggest.js ***!
900  \*******************************************************************/
901/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
902
903"use strict";
904eval("{\n\nvar util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nvar gtmtracking = __webpack_require__(/*! ./gtmtracking */ \"./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js\");\nvar currentQuery = null,\n    lastQuery = null,\n    runningQuery = null,\n    listTotal = -1,\n    listCurrent = -1,\n    delay = 30,\n    $resultsContainer,\n    $wrapper;\n\n/**\n * @function\n * @description Handles keyboard's arrow keys\n * @param keyCode Code of an arrow key to be handled\n */\nfunction handleArrowKeys(keyCode) {\n    switch (keyCode) {\n        case 38:\n            // keyUp\n            listCurrent = (listCurrent <= 0) ? (listTotal - 1) : (listCurrent - 1);\n            break;\n        case 40:\n            // keyDown\n            listCurrent = (listCurrent >= listTotal - 1) ? 0 : listCurrent + 1;\n            break;\n        default:\n            // reset\n            listCurrent = -1;\n            return false;\n    }\n\n    $resultsContainer.children().removeClass('selected').eq(listCurrent).addClass('selected');\n    $('input[name=\"q\"]').val($resultsContainer.find('.selected .suggestionterm').first().text());\n    return true;\n}\n\nvar searchsuggest = {\n    /**\n     * @function\n     * @description Configures parameters and required object instances\n     */\n    init: function (container, defaultValue) {\n        $wrapper = container;\n        var $searchContainer = $(container).find('.header-search-container');\n        var $searchForm = container.find('form[name=\"simpleSearch\"]');\n        var $searchField = $searchForm.find('input[name=\"q\"]');\n\n        // disable browser auto complete\n        $searchField.attr('autocomplete', 'off');\n\n        // on focus listener (clear default value)\n        $searchField.focus(function () {\n            if (!$resultsContainer) {\n                // create results container if needed\n                $resultsContainer = $('<
904div/>').attr('id', 'search-suggestions-container').attr('class', 'search-suggestions').appendTo($searchContainer);\n            }\n            if ($searchField.val() === defaultValue) {\n                $searchField.val('');\n            }\n        });\n\n        // on key up listener\n        $searchField.keyup(function (e) {\n\n            // get keyCode (window.event is for IE)\n            var keyCode = e.keyCode || window.event.keyCode;\n\n            // check and treat up and down arrows\n            if (handleArrowKeys(keyCode)) {\n                return;\n            }\n            // check for an ENTER or ESC\n            if (keyCode === 13 || keyCode === 27) {\n                this.clearResults();\n                return;\n            }\n\n            currentQuery = $searchField.val().trim();\n\n            // no query currently running, init an update\n            if (!runningQuery) {\n                runningQuery = currentQuery;\n                setTimeout(this.suggest.bind(this), delay);\n            }\n        }.bind(this));\n    },\n\n    /**\n     * @function\n     * @description trigger suggest action\n     */\n    suggest: function () {\n        // check whether query to execute (runningQuery) is still up to date and had not changed in the meanwhile\n        // (we had a little delay)\n        if (runningQuery !== currentQuery) {\n            // update running query to the most recent search phrase\n            runningQuery = currentQuery;\n        }\n\n        // if it's empty clear the results box and return\n        if (runningQuery.length === 0) {\n            this.clearResults();\n            runningQuery = null;\n            return;\n        }\n\n        // if the current search phrase is the same as for the last suggestion call, just return\n        if (lastQuery === runningQuery) {\n            runningQuery = null;\n            return;\n        }\n\n        // build the request url\n        var reqUrl = util.appendParamToURL(Urls.searchsuggest, 'q', runningQuery);\n\n        // execute server call\n        $.get(reqUrl, function (data) {\
904n            var suggestionHTML = data,\n                ansLength = suggestionHTML.trim().length;\n\n            // if there are results populate the results div\n            if (ansLength === 0) {\n                this.clearResults();\n            } else {\n                // update the results div\n                $wrapper.addClass('show-suggest');\n                $resultsContainer.html(suggestionHTML);\n                $('html,body').animate({scrollTop:'60px'},800);\n\n                if ($('.js-search-suggestions-view-all').length) {\n                    $('.js-search-suggestions-view-all').off('click').on('click', function() {\n                        $('.header-search__form').submit();\n                    });\n                }\n            }\n\n            // record the query that has been executed\n            lastQuery = runningQuery;\n            // reset currently running query\n            runningQuery = null;\n\n            // check for another required update (if current search phrase is different from just executed call)\n            if (currentQuery !== lastQuery) {\n                // ... and execute immediately if search has changed while this server call was in transit\n                runningQuery = currentQuery;\n                setTimeout(this.suggest.bind(this), delay);\n            }\n        }.bind(this)).then(function(){\n        \tgtmtracking.init();\n        });\n        localStorage.setItem('categoryName','Search Results');\n    },\n    /**\n     * @function\n     * @description\n     */\n    clearResults: function () {\n        if (!$resultsContainer) { return; }\n        $wrapper.removeClass('show-suggest');\n    }\n};\n\nmodule.exports = searchsuggest;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/searchsuggest.js?\n}");
905
906/***/ }),
907
908/***/ "./cartridges/app_paulaschoice/cartridge/js/servicecloudchat.js":
909/*!**********************************************************************!*\
910  !*** ./cartridges/app_paulaschoice/cartridge/js/servicecloudchat.js ***!
911  \**********************************************************************/
912/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
913
914"use strict";
915eval("{\n\nvar util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nconst chatSelector = \".messageArea\";\nconst systemMessagePrefix = '[System Message]';\nconst systemAgentPrefix = '[agent]';\nconst testUrl = 'https://www.pc.com/addtocart?pid=9139&addtocart=1'; // use this for triggering clickable buttons\nvar gtmtracking = __webpack_require__(/*! ./gtmtracking */ \"./cartridges/app_paulaschoice/cartridge/js/gtmtracking.js\");\n\nvar chat = {\n    init: function () {\n        window.listenAgentMessage = listenAgentMessage;\n        window.reconstructMessageField = reconstructMessageField;\n\n        $(document).on('click', '.uiButton--inverse', function (e) {\n            reconstructMessageField();\n        });\n    }\n};\n\nfunction listenAgentMessage() {\n    setTimeout(function () {\n        var messageArea = $(chatSelector);\n        messageArea.find('a').each(function () {\n            var chatLink = $(this);\n            var url = $(this).text();\n            var queryString = url.split('?')[1];\n            var params = util.getQueryStringParams(queryString);\n\n            if(!chatLink.parent().attr('productadded')) {\n                if (params['addtocart'] == '1') {\n                    var pid = params['pid'];\n                    chatAddtoCart(pid, chatLink);\n                }\n            }\n\n            if(!chatLink.parent().attr('productremoved')) {\n                if (params['removefromcart'] == '1') {\n                    var pid = params['pid'];\n                    chatRemovefromCart(pid, chatLink);\n                }\n            }\n\n            if(!chatLink.parent().attr('couponadded')) {\n                if (params['couponadd'] == '1') {\n                    var coupon = params['coupon'];\n                    chatAddtoCartCoupon(coupon, chatLink);\n                }\n            }\n\n            if (params['getcart'] == '1') {\n                getCart(chatLink);\n            }\n\n            if(!chatLink.parent().attr('allproductsremoved')) {\n                if (params['removeallfromcart'] == '1') {\n                    chatRemoveAllfromCart(chatLink);\n                }\n            }\n\n            if(!chatLink.parent().attr('couponremoved')) {\n                if (params['couponremove'] == '1') {\n                    chatRemoveCouponfromCart(chatLink);\n                }\n            }\n        });\n    }, 100);\n}\n\nfunction reconstructMessageField() {\n    setTimeout(function () {\n        var messageArea = $(chatSelector);\n\n        messageArea.find('a').each(function (index, element) {\n            var url = $(this).text();\n\n            var queryString = url.split('?')[1];\n            var params = util.getQueryStringParams(queryString);\n\n            if (params['addtocart'] == '1') {\n                var productAddedResource;\n\n                // turn it into a button\n                if(params['pid'].indexOf(',') > -1) {\n                    var pids = params['pid'].split(',');\n                    for (var i = 0; i < pids.length; i++) {\n                        var id = pids[i];\n                        var resource = getProductAddedResource(id);\n\n                        if(resource.indexOf('[agent]') == -1) {\n                            productAddedResource = productAddedResource ? productAddedResource + \"\\n\\n\" + resource : resource;\n                        }\n                    }\n                } else {\n                    productAddedResource = getProductAddedResource(params['pid']);\n                }\n\n                if(productAddedResource) {\n                   $(this).replaceWith(productAddedResource);\n                }\n            }\n\n            if (params['removefromcart'] == '1') {\n                // turn it into a button\n                var productRemovedResource = getProductRemovedResource(params['pid']);\n\n                if(productRemovedResource) {\n                   $(this).replaceWith(productRemovedResource);\n                }\n            }\n\n            if (params['couponadd'] == '1') {\n                // turn it into a button\n                var couponResource = getCouponResource(params['coupon']);\n                if(couponResource) {\n                    $(this).replaceWith(couponResource);\n                }\n            }\n\n            if(params['getcart'] == '1') {\n                $(this).replaceWith(systemMessagePrefix);\n            }\n\n            if(params['removeallfromcart'] == '1') {\n                // turn it into a button\n                var productsRemovedResource = getAllProductsRemovedResource();\n                if(productsRemovedResource) {\n                    $(this).replaceWith(productsRemovedResource);\n                 }\n            }\n\n            if(params['couponremove'] == '1') {\n                // turn it into a button\n                var couponRemovedResource = getCouponRemovedResource();\n                if(couponRemovedResource) {\n                    $(this).replaceWith(couponRemovedResource);\n                 }\n            }\n        });\n\n        hideAgentMessage();\n    }, 100);\n}\n\n/**\n * @function\n * @description Gets a correct resource message when adding product to the cart\n * @param {String}
915 pid product id\n */\nfunction getProductAddedResource(pid) {\n    var product = findObject('addedProducts', pid);\n\n    if(!product) {\n        return null;\n    }\n\n    return product.name ? product.name + ' ' + Resources.CHATPRODUCTADDED : product.error;\n}\n\n/**\n * @function\n * @description Gets a correct resource message when removing product from the cart\n * @param {String} pid product id\n */\n function getProductRemovedResource(pid) {\n    var product = findObject('removedProducts', pid);\n\n    if(!product) {\n        return null;\n    }\n\n    return product.name ? product.name + ' ' + Resources.CHATPRODUCTREMOVED : product.error;\n}\n\n/**\n * @function\n * @description Gets a correct resource message when removing all products from the cart\n */\nfunction getAllProductsRemovedResource() {\n    return Resources.CHATALLPRODUCTSREMOVED;\n}\n\n/**\n * @function\n * @description Gets a correct resource message when removing coupon from the cart\n */\nfunction getCouponRemovedResource() {\n    return Resources.COUPONREMOVED;\n}\n\n/**\n * @function\n * @description Gets a correct resource message for coupon\n * @param {String} couponCode\n */\nfunction getCouponResource(couponCode) {\n    var coupon = findObject('addedCoupons', couponCode);\n\n    if(!coupon) {\n        return null;\n    }\n\n    return coupon.message;\n}\n\nfunction chatAddtoCart(productId, chatLink) {\n    var options = {\n        type: 'POST',\n        url: util.ajaxUrl(Urls.addProductThroughChat),\n        data: \"pid=\" + productId\n    };\n\n    $.ajax(options).done(function (response) {\n        var lastAddedProduct, current, userMessage = \"\", agentMessage = \"\", agentPidPrefix;\n        for (var i = 0; i < response.addedProducts.length; i++) {\n            current = response.addedProducts[i];\n\n            if(!current.error) {\n                lastAddedProduct = {\n                    'id': current.id,\n                    'name': current.name\n                }\n                gtmtracking.getProductInfoAJAX(productId, true)\n            } else {\n                lastAddedProduct = {\n                    'id': current.id,\n                    'error': current.result\n                }\n            }\n\n            saveObjectInSessionStorage('addedProducts', lastAddedProduct, current.id);\n            chatLink.parent().attr('productadded', true);\n            agentPidPrefix = \"[PID: \" + current.id + \"] \";\n\n            if(current.error) {\n                var message = current.result;\n                agentMessage += agentMessage ? \"\\n\\n\" + agentPidPrefix + message : agentPidPrefix + message;\n                continue;\n            }\n\n            var resultResource = getProductAddedResource(current.id);\n            userMessage += userMessage ? \"\\n\\n\" + resultResource : resultResource;\n            agentMessage += agentMessage ? \"\\n\\n\" + agentPidPrefix + resultResource : agentPidPrefix + resultResource;\n        }\n\n        if(userMessage) {\n            chatLink.replaceWith(userMessage);\n            var $basket = $('#js-minicart-quantity');\n            var basketValueInt = parseFloat(response.cartQty);\n            $basket.text(basketValueInt);\n\n            $('#empty-minicart').removeClass('mini-cart-empty');\n            $(\".js-mini-cart-link\").removeClass(\"mini-cart__link--empty\");\n            setTimeout(function () {\n                $basket.addClass('animate');\n            }, 100);\n        } else {\n            $(chatLink).closest('.wrapper.chatMessage').css('display','none');\n        }\n\n        sendMessageToAgent(agentMessage);\n    });\n}\n\nfunction chatRemovefromCart(productId, chatLink) {\n    var options = {\n        type: 'POST',\n        url: util.ajaxUrl(Urls.removeProductThroughChat),\n        data: \"uuid=&cartAction=update&pid=\" + productId\n    };\n\n    $.ajax(options).done(function (response) {\n        var lastRemovedProduct;\n        if(!response.error) {\n            lastRemovedProduct = {\n                'id': productId,\n                'name': response.name\n            }\n        } else {\n            lastRemovedProduct = {\n                'id': productId,\n                'error': response.result\n            }\n        }\n\n        saveObjectInSessionStorage('removedProducts', lastRemovedProduct, productId);\n        chatLink.parent().attr('productremoved', true);\n\n        if(response.error) {\n            var message = response.result;\n            chatLink.replaceWith(message);\n            sendMessageToAgent(message);\n            return;\n        } else {\n            var message = response.result;\n            sendMessageToAgent(message);\n        }\n\n        var $basket = $('#js-minicart-quantity');\n        $basket.text(response.quantity);\n        if(response.quantity == 0) {\n            $(\".js-mini-cart-link\").addClass(\"mini-cart__link--empty\");\n            $('.js-mini-cart-link').attr('id', 'empty-minicart');\n        }\n        setTimeout(function () {\n            $basket.addClass('animate');\n        }, 100);\n\n        var resultResource = getProductRemovedResource(productId);\n        chatLink.replaceWith(resultResource);\n    });\n}\n\n/**\n * @function\n * @description Sends a [System Message] error message to agent\n * @param {String} message message to send\n */\nfunction sendMessageToAgent(message) {\n    var chatTextArea = document.getElementsByClassName(\"chasitorText\");\n\n    if(!chatTextArea.length) {\n        return;\n    }\n\n    $(chatTextArea).val(systemMessagePrefix + '\\n\\n' + message);\n\n    var keyboardEnterEvent = new KeyboardEvent('keydown', {\n        code: 'Enter',\n        key: 'Enter',\n        charKode: 13,\n        keyCode: 13,\n        view: window\n    });\n\n    chatTextArea[0].dispatchEvent(keyboardEnterEvent);\n\n    setTimeout(hideAgentMessage, 100);\n}\n\n/**\n * @function\n * @param {String} objects objects name\n * @param {String} message message to send\n * @param {String} message message to send\n * @description Saves an object to session storage\n */\nfunction saveObjectInSessionStorage(objects, object, id) {\n    if (!findObject(objects, id)) {\n        var addedObjects = sessionStorage.getItem(objects) ? JSON.parse(sessionStorage.getItem(objects)) : [];\n        addedObjects.push(JSON.stringify(object));\n\n        sessionStorage.setItem(objects, JSON.stringify(addedObjects));\n    }\n}\n\n/**\n * @function\n * @description Hides all [System Message] messages from customer\n */\nfunction hideAgentMessage() {\n    var messageArea = $(chatSelector);\n    var agentMessages = messageArea.find('.uiOutputRichText:contains(' + systemMessagePrefix + ')');\n    agentMessages.each(function () {\n        var parent = $(this).parent(3);\n        var agentMessage = parent.closest('li.chatMessage.agent');\n        if(!parent.closest('.chatMessage.agent').prev('.chatMessage').hasClass('agent') && agentMessage.length) {\n            agentMessage.remove();\n        } else {\n            $(parent).closest(\"li\").remove();\n        }\n    });\n\n    var messages = messageArea.find('.uiOutputRichText:contains(' + systemAgentPrefix + ')');\n    messages.each(function () {\n       $(this).closest(\"li.chatMessage\").remove();\n    });\n}\n\n/**\n * @function\n * @description Searches for an object with given id in the session storage\n * @param {String} objects session storage object to search in\n * @param {String} id object id\n */\nfunction findObject(objects, id) {\n    if (!sessionStorage.getItem(objects)) {\n        return;\n    }\n\n    var object = JSON.parse(sessionStorage.getItem(objects)).filter(function (object) {\n        return JSON.parse(object).id.toString() == id.toString()\n    });\n\n    if (!object || object.length == 0) {\n        return;\n    }\n\n    return JSON.parse(object[0]);\n}\n\nfunction chatAddtoCartCoupon(coupon, chatLink) {\n    $.ajax({\n        async: false,\n        type: 'POST',\n        url: util.ajaxUrl(Urls.addCouponFromChat),\n        data: \"coupon=\"+coupon,\n        success: function(response){\n            var message = response.result ? Resources[response.result] : '';\n            var couponCode = response.couponCode;\n            var success = response.success;\n\n            var lastAddedCoupon= {\n                'id': couponCode,\n                'message': message\n            }\n\n            saveObjectInSessionStorage('addedCoupons', lastAddedCoupon, couponCode);\n            chatLink.parent().attr('couponadded', true);\n\n            sendMessageToAgent(message);\n\n            //customer shouldn't get feedback about added coupons\n            chatLink.replaceWith(systemMessagePrefix);\n            hideAgentMessage();\n        }\n    });\n}\n\nfunction getCart(chatLink) {\n    $.ajax({\n        type: 'GET',\n        url: util.ajaxUrl(Urls.getCartForChat),\n        success: function(response){\n            sendMessageToAgent(response.result);\n            chatLink.replaceWith(systemMessagePrefix);\n            hideAgentMessage();\n        }\n    });\n}\n\nfunction chatRemoveAllfromCart(chatLink) {\n    var options = {\n        type: 'GET',\n        url: util.ajaxUrl(Urls.removeAllProductsThroughChat)\n    };\n\n    $.ajax(options).done(function (response) {\n        chatLink.parent().attr('allproductsremoved', true);\n\n        if(response.error) {\n            var message = response.result;\n            chatLink.replaceWith(message);\n            sendMessageToAgent(message);\n            return;\n        } else {\n            var message = response.result;\n            sendMessageToAgent(message);\n        }\n\n        var $basket = $('#js-minicart-quantity');\n        $basket.text('');\n        $(\".js-mini-cart-link\").addClass(\"mini-cart__link--empty\");\n        $('.js-mini-cart-link').attr('id', 'empty-minicart');\n        setTimeout(function () {\n            $basket.addClass('animate');\n        }, 100);\n\n        var resultResource = getAllProductsRemovedResource();\n        chatLink.replaceWith(resultResource);\n    });\n}\n\nfunction chatRemoveCouponfromCart(chatLink) {\n    var options = {\n        type: 'GET',\n        url: util.ajaxUrl(Urls.removeCouponFromChat)\n    };\n\n    $.ajax(options).done(function (response) {\n\n        if(response.error) {\n            var message = response.result;\n            chatLink.replaceWith(message);\n            sendMessageToAgent(message);\n            return;\n        } else {\n            chatLink.parent().attr('couponremoved', true);\n            var message = response.result;\n            sendMessageToAgent(message);\n        }\n\n        var resultResource = getCouponRemovedResource();\n        chatLink.replaceWith(resultResource);\n    });\n}\n\nmodule.exports = chat;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/servicecloudchat.js?\n}");
916
917/***/ }),
918
919/***/ "./cartridges/app_paulaschoice/cartridge/js/slider.js":
920/*!************************************************************!*\
921  !*** ./cartridges/app_paulaschoice/cartridge/js/slider.js ***!
922  \************************************************************/
923/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
924
925"use strict";
926eval("{/* harmony import */ var swiper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! swiper */ \"./node_modules/swiper/swiper.esm.js\");\n\n\nvar addToCart = __webpack_require__(/*! ./pages/product/addToCart */ \"./cartridges/app_paulaschoice/cartridge/js/pages/product/addToCart.js\");\nvar powerreviews = __webpack_require__(/*! ./powerreviews */ \"./cartridges/app_paulaschoice/cartridge/js/powerreviews.js\");\nconst util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar slider = {\n    setSwiperInstance: function (el, options) {\n        var $container = $(el);\n        var freeScroll = $container.data(\"freescroll\");\n        var defaultSettings = {\n            modules: [swiper__WEBPACK_IMPORTED_MODULE_0__.Navigation],\n            containerModifierClass: \"js-product-slider\",\n            wrapperClass: \"js-slide-wrapper\",\n            slideClass: \"js-slide\",\n            preloadImages: false,\n            updateOnImagesReady: true,\n            slidesPerView: 2.25,\n            slidesPerGroup: 1,\n            draggable: true,\n            resizeReInit: true,\n            observer: true,\n            observeParents: true,\n            freeMode: freeScroll,\n            watchOverflow: true,\n            breakpointsInverse: true,\n            breakpoints: {\n                // when window width is >= 768px\n                768: {\n                    snapOnRelease: false,\n                    slidesPerView: 5,\n                    slidesPerGroup: 5\n                },\n            },\n            navigation: {\n                nextEl: '.js-next-slide',\n                prevEl: '.js-prev-slide',\n            },\n            // Set aria-label texts on slider buttons\n            a11y: {\n                prevSlideMessage: Resources.PREV,\n                nextSlideMessage: Resources.NEXT,\n            },\n            on: {\n                init: function () {\n                    addToCart();\n                    if (!!window.lazyLoadInstance) window.lazyLoadInstance.update();\n                },\n                slideChange: function () {\n                    if($(window).width() <= 768 && $container.is(\"#js-pdp-slider\")) {\n                        window.dataLayer.push({'eventCategory': 'PDP', 'eventAction': 'Product Image', 'eventLabel': 'none', 'event': 'GA Tracking'});\n                    }\n                },\n                transitionStart: function(){\n                    if (!!$container.find('.js-cloudinary-video').length) {\n                        var videos = $container.find('.video-js');\n                        if (videos) {\n                            videos.each(function (i, video) {\n                                if($(video)[0].player) $(video)[0].player.pause();\n                            });\n                        }\n                    }\n\n                },\n                transitionEnd: function(){\n                    var activeIndex = this.activeIndex;\n                    var activeSlide = $container.find('.js-slide')[activeIndex];\n                    if (!!$(activeSlide).find('.js-cloudinary-video').length) {\n                        var activeSlideVideo = $(activeSlide).find('.video-js')[0].player;\n\n                        if (activeSlideVideo) activeSlideVideo.play();\n                    }\n                }\n            }\n        };\n        var settings = $.extend(defaultSettings, options);\n        new swiper__WEBPACK_IMPORTED_MODULE_0__[\"default\"] (el, settings);\n        if ( typeof settings.onInit === 'function' ) {\n            settings.onInit($container);\n        }\n    },\n\n    togglePDPSlider: function(selector, options) {\n        var mySwiper = this.swiper;\n        var initialisedSwipers = mySwiper.$el;\n\n        if( $(window).width() >= 768 && $(this).hasClass(\"js-pdp-visuals\") ) {\n            mySwiper.destroy();\n        }
926\n        $(window).on(\"resize\", function() {\n            initialisedSwipers.each(function() {\n                if( $(window).width() >= 768 && $(this).hasClass(\"js-pdp-visuals\") ) {\n                    mySwiper.destroy();\n                } else {\n                    slider.setSwiperInstance(this, settings);\n                    alignStepHeight();\n                }\n            });\n        });\n    },\n\n    // for enabling sliders on mobile and tablet only\n    toggleResponsiveSlider: function(selector, options, resolution) {\n        var initialisedSwipers = [];\n        var selectedElement = document.querySelector('.' + selector);\n\n        if (selectedElement && selectedElement.swiper) {\n            var selectedSwiper = selectedElement.swiper;\n            var initialisedSwipers = $(selectedSwiper.el);\n\n            $(window).on('load resize', function() {\n                if (!initialisedSwipers) return;\n                initialisedSwipers.each(function() {\n                    if (window.matchMedia(\"screen and (min-width: \" + resolution + \")\").matches && $(this).hasClass(selector)) {\n                        selectedSwiper.destroy();\n                    } else {\n                        slider.setSwiperInstance('.' + selector, options);\n                        if (resolution === '768px') {\n                            alignStepHeight();\n                        }\n                    }\n                });\n            });\n        }\n    },\n\n    init: function (selector, options) {\n        //initialize swiper when document ready\n        $(\".js-product-slider\").each(function() {\n            var settings = {};\n            var responsiveSize = '768px';\n            if( $(this).is(\"#js-pdp-slider\") ) {\n                settings = {\n                    centeredSlides: true,\n                    loop: !$(this).find('.js-cloudinary-video'),\n                    initialSlide: 0,\n                    slidesPerView: 1.2,\n                    slidesPerGroup: 1,\n                    breakpointsInverse: true,\n                    breakpoints: {\n                        // when window width is >= 768px\n                        768: {\n                            centeredSlides: false,\n                            loop: false,\n                            initialSlide: 0,\n                            slidesPerView: 1,\n                        },\n                    },\n                }\n            }\n            else if ( $(this).hasClass(\"js-highlight-slider\")) {\n                settings = {\n                    initialSlide: 0,\n                    slidesPerView: 1.6,\n                    slidesPerGroup: 1,\n                    spaceBetween: 20,\n                }\n            }\n            else if( $(this).hasClass(\"js-image-text-slider\") ) {\n                settings = {\n                    initialSlide: 0,\n                    slidesPerView: 2.3,\n                    slidesPerGroup: 1,\n                    spaceBetween: 21,\n                    slidesOffsetAfter: 20,\n                    slidesOffsetBefore: 20,\n                }\n            }\n            else if( $(this).hasClass(\"js-footer-slider\") ) {\n                settings = {\n                    initialSlide: 0,\n                    slidesPerView: 2.3,\n                    slidesPerGroup: 1,\n                    spaceBetween: 21,\n                    slidesOffsetAfter: 20,\n                    slidesOffsetBefore: 20,\n                }\n            }\n\n            if ($(this).hasClass('.js-usp-slider') && window.matchMedia(\"screen and (min-width: \" + resolution + \")\").matches) return;\n            slider.setSwiperInstance(this, settings);\n            alignStepHeight();\n\n            slider.toggleResponsiveSlider('js-highlight-slider', settings, responsiveSize);\n            slider.toggleResponsiveSlider('js-image-text-slider', settings, responsiveSize);\n            slider.toggleResponsiveSlider('js-footer-slider', settings, responsiveSize);\n        });\n\n        $('.js-slider').each(function() {\n            var settings = $(this).data('settings') || null;\n            if ($(this).hasClass('js-sliderWithScrollbar')) { // If the scroll is necessary, we must add this class to the slider.\n                settings.modules = [swiper__WEBPACK_IMPORTED_MODULE_0__.Navigation, swiper__WEBPACK_IMPORTED_MODULE_0__.Scrollbar];\n            }\n            slider.setSwiperInstance(this, settings);\n            if( $(this).hasClass('js-ingredient-slider') && $(this).context.swiper.slides.length <= 3 ) {\n                const slides = $(this).find('.js-slide');\n                const slideWrapper = $(this).find('.slide-wrapper');\n                slideWrapper.addClass('ingredient-detail__wrapper')\n                slides.each( function() {\
926n                    $(this).addClass('product-carousel__slider-tile--centered');\n                })\n            }\n        });\n\n        $(\".js-category-slider\").each(function() {\n            var settings = {\n                centeredSlides: false,\n                loop: false,\n                freeMode: false,\n                initialSlide: 1,\n                slidesPerView: 2.2,\n                slidesPerGroup: 1,\n                spaceBetween: 10,\n                breakpoints: {\n                    // when viewport width is >= 768\n                    768: {\n                        slidesPerView: 3,\n                        slidesPerGroup: 1,\n                    },\n                    769: {\n                        slidesPerView: 5,\n                        slidesPerGroup: 5,\n                    },\n                },\n            }\n            // if slider has parent expertadvice-blocks class\n            if ($(\".js-category-slider\").closest('.expertadvice-blocks').length){\n                settings.slidesPerView = 2.3;\n                settings.slidesPerGroup = 1;\n                settings.spaceBetween = 27;\n                settings.initialSlide = 0;\n                settings.slidesOffsetBefore = 22;\n                settings.slidesOffsetAfter = 22;\n                settings.breakpoints = {\n                    768: {\n                        slidesOffsetAfter: 0,\n                        slidesOffsetBefore: 0,\n                        slidesPerView: 3,\n                        slidesPerGroup: 1,\n                    },\n                    1180: {\n                        slidesOffsetAfter: 0,\n                        slidesOffsetBefore: 0,\n                        initialSlide: 1,\n                        slidesPerView: 5,\n                        slidesPerGroup: 5,\n                        spaceBetween: 10,\n                    }\n                }\n            }\n\n            slider.setSwiperInstance(this, settings);\n        });\n\n        $(\".js-homepage-products-slider\").each(function() {\n            var settings = {\n                centeredSlides: false,\n                loop: false,\n                freeMode: false,\n                initialSlide: 1,\n                slidesPerView: 2.2,\n                slidesPerGroup: 1,\n                spaceBetween: 10,\n                breakpoints: {\n                    // when viewport width is >= 768\n                    768: {\n                        slidesPerView: 3,\n                        slidesPerGroup: 1,\n                    },\n                    769: {\n                        slidesPerView: 5,\n                        slidesPerGroup: 5,\n                    },\n                },\n            }\n\n            // if slider has parent expertadvice-blocks class\n            if ($(\".js-homepage-products-slider\").closest('.expertadvice-blocks').length){\n                settings.slidesPerView = 2.3;\n                settings.slidesPerGroup = 1;\n                settings.spaceBetween = 15;\n                settings.initialSlide = 0;\n                settings.slidesOffsetBefore = 15;\n                settings.slidesOffsetAfter = 15;\n                settings.breakpoints = {\n                    768: {\n                        slidesOffsetAfter: 0,\n                        slidesOffsetBefore: 0,\n                        slidesPerView: 4,\n                        slidesPerGroup: 1,\n                        spaceBetween: 10\n                    }\n                }\n            }\n\n            slider.setSwiperInstance(this, settings);\n        });\n\n        $('.js-slide-wrapper').on('click','.product-tile',function(){\n            if (pageContext.ns === 'content' && pageContext.type === 'expert-advice-content') {\n                localStorage.categoryName = \"Content Page Slider\";\n            }\n        });\n\n        $('.js-mobile-slider').each(function() {\n            if( $(this).hasClass('js-usp-slider')) {\n                var settings = {\n                    containerModifierClass: 'js-mobile-slider',\n                    speed: 500,\n                    centeredSlides: false,\n                    loop: true,\n                    freeMode: false,\n                    slidesPerView: 1,\n                    slidesPerGroup: 1,\n                    noSwipingClass: 'js-mobile-slider',\n                    autoplay: {\n                        delay: 7000,\n                        disableOnInteraction: false,\n                    },\n                    breakpoints: {\n                        768: {\n                            slidesPerView: 1,\n                            slidesPerGroup: 1,\n                        },\n                    },\n                }\n            }\n            if (!window.matchMedia(\"screen and (min-width: 1180px)\").matches) {\n                slider.setSwiperInstance(this, settings);\n            }\n\n            slider.toggleResponsiveSlider('js-usp-slider', settings, '1180px');\n        });\n\n    }\n}\n\nutil.waitExist('.js-cart-product-slider', slider.init, powerreviews.powerReviewsTiles);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (slider);\n\n// For the product lister page, the tiles in the swiper have certain elements that cannot be styled to be the correct height\n// This little js should align them nicely.\
926nfunction alignStepHeight() {\n    var catHeight = 0;\n    var detailsHeight = 0;\n\n    $('.routine-step').each(function(){\n       var elementHeight = $(this).outerHeight();\n       if (elementHeight > catHeight) { catHeight = elementHeight; }\n    });\n\n    // Temporarily align price + buttons using JS until a decision is made on truncating the product description\n    $('.product-details').each(function() {\n        var elementHeight = $(this).outerHeight();\n        if (elementHeight > detailsHeight) { detailsHeight = elementHeight; }\n    });\n\n    $('.routine-step').height(catHeight);\n    $('.product-tile .product-details').height(detailsHeight);\n}\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/slider.js?\n}");
927
928/***/ }),
929
930/***/ "./cartridges/app_paulaschoice/cartridge/js/storeinventory/cart.js":
931/*!*************************************************************************!*\
932  !*** ./cartridges/app_paulaschoice/cartridge/js/storeinventory/cart.js ***!
933  \*************************************************************************/
934/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
935
936"use strict";
937eval("{\n\nvar inventory = __webpack_require__(/*! ./ */ \"./cartridges/app_paulaschoice/cartridge/js/storeinventory/index.js\");\n\nvar cartInventory = {\n    setSelectedStore: function (storeId) {\n        var $selectedStore = $('.store-tile.' + storeId),\n            $lineItem = $('.cart-row[data-uuid=\"' + this.uuid + '\"]'),\n            storeAddress = $selectedStore.find('.store-address').html(),\n            storeStatus = $selectedStore.find('.store-status').data('status'),\n            storeStatusText = $selectedStore.find('.store-status').text();\n        this.selectedStore = storeId;\n\n        $lineItem.find('.instore-delivery .selected-store-address')\n            .data('storeId', storeId)\n            .attr('data-store-id', storeId)\n            .html(storeAddress);\n        $lineItem.find('.instore-delivery .selected-store-availability')\n            .data('status', storeStatus)\n            .attr('data-status', storeStatus)\n            .text(storeStatusText);\n        $lineItem.find('.instore-delivery .delivery-option').removeAttr('disabled').trigger('click');\n    },\n    cartSelectStore: function (selectedStore) {\n        var self = this;\n        inventory.getStoresInventory(this.uuid).then(function (stores) {\n            inventory.selectStoreDialog({\n                stores: stores,\n                selectedStoreId: selectedStore,\n                selectedStoreText: Resources.SELECTED_STORE,\n                continueCallback: function () {},\n                selectStoreCallback: self.setSelectedStore.bind(self)\n            });\n        }).done();\n    },\n    setDeliveryOption: function (value, storeId) {\n        // set loading state\n        $('.js-item-delivery-options')\n            .addClass('loading')\n            .children().hide();\n\n        var data = {\n            plid: this.uuid,\n            storepickup: (value === 'store' ? true : false)\n        };\n        if (value === 'store') {\n            data.storepickup = true;\n            data.storeid = storeId;\n        } else {\n            data.storepickup = false;\n        }\n        $.ajax({\n            url: Urls.setStorePickup,\n            data: data,\n            success: function () {\n                // remove loading state\n                $('.js-item-delivery-options')\n                    .removeClass('loading')\n                    .children().show();\n            }\n        });\n    },\n    init: function () {\n        var self = this;\n        $('.item-delivery-options .set-preferred-store').on('click', function (e) {\n            e.preventDefault();\n            self.uuid = $(this).data('uuid');\n            var selectedStore = $(this).closest('.instore-delivery').find('.selected-store-address').data('storeId');\n            if (!User.zip) {\n                inventory.zipPrompt(function () {\n                    self.cartSelectStore(selectedStore);\n                });\n            } else {\n                self.cartSelectStore(selectedStore);\n            }\n        });\n        $('.item-delivery-options .delivery-option').on('click', function () {\n            // reset the uuid\n            var selectedStore = $(this).closest('.instore-delivery').find('.selected-store-address').data('storeId');\n            self.uuid = $(this).closest('.cart-row').data('uuid');\n            self.setDeliveryOption($(this).val(), selectedStore);\n        });\n    }\n};\n\nmodule.exports = cartInventory;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/storeinventory/cart.js?\n}");
938
939/***/ }),
940
941/***/ "./cartridges/app_paulaschoice/cartridge/js/storeinventory/index.js":
942/*!**************************************************************************!*\
943  !*** ./cartridges/app_paulaschoice/cartridge/js/storeinventory/index.js ***!
944  \**************************************************************************/
945/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
946
947"use strict";
948eval("{\n\nvar _ = __webpack_require__(/*! lodash */ \"./node_modules/lodash/lodash.js\"),\n    dialog = __webpack_require__(/*! ../dialog */ \"./cartridges/app_paulaschoice/cartridge/js/dialog.js\"),\n    TPromise = __webpack_require__(/*! promise */ \"./node_modules/promise/index.js\"),\n    util = __webpack_require__(/*! ../util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\n\nvar newLine = '\\n';\nvar storeTemplate = function (store, selectedStoreId, selectedStoreText) {\n    return [\n        '<li class=\"store-tile ' + store.storeId + (store.storeId === selectedStoreId ? ' selected' : '') + '\">',\n        '    <p class=\"store-address\">',\n        '        ' + store.address1 + '<br/>',\n        '        ' + store.city + ', ' + store.stateCode + ' ' + store.postalCode,\n        '    </p>',\n        '    <p class=\"store-status\" data-status=\"' + store.statusclass + '\">' + store.status + '</p>',\n        '    <button class=\"select-store-button\" data-store-id=\"' + store.storeId + '\"' +\n        (store.statusclass !== 'store-in-stock' ? 'disabled=\"disabled\"' : '') + '>',\n        '        ' + (store.storeId === selectedStoreId ? selectedStoreText : Resources.SELECT_STORE),\n        '    </button>',\n        '</li>'\n    ].join(newLine);\n};\n\nvar storeListTemplate = function (stores, selectedStoreId, selectedStoreText) {\n    if (stores && stores.length) {\n        return [\n            '<div class=\"store-list-container\">',\n            '<ul class=\"store-list\">',\n            _.map(stores, function (store) {\n                return storeTemplate(store, selectedStoreId, selectedStoreText);\n            }).join(newLine),\n            '</ul>',\n            '</div>',\n            '<div class=\"store-list-pagination\">',\n            '</div>'\n        ].join(newLine);\n    } else {\n        return '<div class=\"no-results\">' + Resources.INVALID_ZIP + '</div>';\n    }\n};\n\nvar zipPromptTemplate = function () {\n    return [\n        '<div id=\"preferred-store-panel\">',\n        '    <input type=\"text\" id=\"user-zip\" class=\"user-zip\" placeholder=\"' + Resources.ENTER_ZIP + '\" name=\"zipCode\"/>',\n        '</div>'\n    ].join(newLine);\n};\n\n/**\n * @description test whether zipcode is valid for either US or Canada\n * @return {Boolean} true if the zipcode is valid for either country, false if it's invalid for both\n **/\nvar validateZipCode = function (zipCode) {\n    var regexes = {\n            canada: /^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJKLMNPRSTVWXYZ]( )?\\d[ABCEGHJKLMNPRSTVWXYZ]\\d$/i,\n            usa: /^\\d{5}(-\\d{4})?$/\n        },\n        valid = false;\n    if (!zipCode) { return; }\n    _.each(regexes, function (re) {\n        var regexp = new RegExp(re);\n        valid = regexp.test(zipCode);\n    });\n    return valid;\n};\n\nvar storeinventory = {\n    zipPrompt: function (callback) {\n        var self = this;\n        dialog.open({\n            html: zipPromptTemplate(),\n            closeText : '',\n            options: {\n                title: Resources.STORE_NEAR_YOU,\n                width: 500,\n                buttons: [{\n                    text: Resources.SEARCH,\n                    click: function () {\n                        var zipCode = $('#user-zip').val();\n                        if (validateZipCode(zipCode)) {\n                            self.setUserZip(zipCode);\n                            if (callback) {\n                                callback(zipCode);\n                            }\n                        }\n                    }\n                }],\n                open: function () {\n                    $('#user-zip').on('keypress', function (e) {\n                        if (e.which === 13) {\n                            // trigger the search button\n                            $('.ui-dialog-buttonset .ui-button').trigger('click');\n                        }\n                    });\n                }\n            }\n        });\n    },\n    getStoresInventory: function (pid) {\n        return TPromise.resolve($.ajax({\n            url: util.appendParamsToUrl(Urls.storesInventory, {\n                pid: pid,\n                zipCode: User.zip\n            }),\n            dataType: 'json'\n        }));\n    }
948,\n    /**\n     * @description open the dialog to select store\n     * @param {Array} options.stores\n     * @param {String} options.selectedStoreId\n     * @param {String} options.selectedStoreText\n     * @param {Function} options.continueCallback\n     * @param {Function} options.selectStoreCallback\n     **/\n    selectStoreDialog: function (options) {\n        var self = this,\n            stores = options.stores,\n            selectedStoreId = options.selectedStoreId,\n            selectedStoreText = options.selectedStoreText,\n            storeList = storeListTemplate(stores, selectedStoreId, selectedStoreText);\n        dialog.open({\n            html: storeList,\n            closeText : '',\n            options: {\n                title: Resources.SELECT_STORE + ' - ' + User.zip,\n                buttons: [{\n                    text: Resources.CHANGE_LOCATION,\n                    click: function () {\n                        self.setUserZip(null);\n                        // trigger the event to start the process all over again\n                        $('.set-preferred-store').trigger('click');\n                    }.bind(this)\n                }, {\n                    text: Resources.CONTINUE,\n                    click: function () {\n                        if (options.continueCallback) {\n                            options.continueCallback(stores);\n                        }\n                        dialog.close();\n                    }\n                }],\n                open: function () {\n                    $('.select-store-button').on('click', function (e) {\n                        e.preventDefault();\n                        var storeId = $(this).data('storeId');\n                        // if the store is already selected, don't select again\n                        if (storeId === selectedStoreId) { return; }\n                        $('.store-list .store-tile.selected').removeClass('selected')\n                            .find('.select-store-button').text(Resources.SELECT_STORE);\n                        $(this).text(selectedStoreText)\n                            .closest('.store-tile').addClass('selected');\n                        if (options.selectStoreCallback) {\n                            options.selectStoreCallback(storeId);\n                        }\n                    });\n                }\n            }\n        });\n    },\n    setUserZip: function (zip) {\n        User.zip = zip;\n        $.ajax({\n            type: 'POST',\n            url: Urls.setZipCode,\n            data: {\n                zipCode: zip\n            }\n        });\n    },\n    shippingLoad: function () {\n        var $checkoutForm = $('.address');\n        $checkoutForm.off('click');\n    }\n};\n\nmodule.exports = storeinventory;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/storeinventory/index.js?\n}");
949
950/***/ }),
951
952/***/ "./cartridges/app_paulaschoice/cartridge/js/storeinventory/product.js":
953/*!****************************************************************************!*\
954  !*** ./cartridges/app_paulaschoice/cartridge/js/storeinventory/product.js ***!
955  \****************************************************************************/
956/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
957
958"use strict";
959eval("{\n\nvar _ = __webpack_require__(/*! lodash */ \"./node_modules/lodash/lodash.js\"),\n    inventory = __webpack_require__(/*! ./ */ \"./cartridges/app_paulaschoice/cartridge/js/storeinventory/index.js\");\n\nvar newLine = '\\n';\nvar pdpStoreTemplate = function (store) {\n    return [\n        '<li class=\"store-list-item ' + (store.storeId === User.storeId ? ' selected' : '') + '\">',\n        '    <div class=\"store-address\">' + store.address1 + ', ' + store.city + ' ' + store.stateCode +\n        ' ' + store.postalCode + '</div>',\n        '    <div class=\"store-status\" data-status=\"' + store.statusclass + '\">' + store.status + '</div>',\n        '</li>'\n    ].join(newLine);\n};\nvar pdpStoresListingTemplate = function (stores) {\n    if (stores && stores.length) {\n        return [\n            '<div class=\"store-list-pdp-container\">',\n            (stores.length > 1 ? '    <a class=\"stores-toggle collapsed\" href=\"#\">' + Resources.SEE_MORE + '</a>' : ''),\n            '    <ul class=\"store-list-pdp\">',\n            _.map(stores, pdpStoreTemplate).join(newLine),\n            '    </ul>',\n            '</div>'\n        ].join(newLine);\n    }\n};\n\nvar storesListing = function (stores) {\n    // list all stores on PDP page\n    if ($('.store-list-pdp-container').length) {\n        $('.store-list-pdp-container').remove();\n    }\n    $('.availability-results').append(pdpStoresListingTemplate(stores));\n};\n\nvar productInventory = {\n    setPreferredStore: function (storeId) {\n        User.storeId = storeId;\n        $.ajax({\n            url: Urls.setPreferredStore,\n            type: 'POST',\n            data: {storeId: storeId}\n        });\n    },\n    productSelectStore: function () {\n        var self = this;\n        inventory.getStoresInventory(this.pid).then(function (stores) {\n            inventory.selectStoreDialog({\n                stores: stores,\n                selectedStoreId: User.storeId,\n                selectedStoreText: Resources.PREFERRED_STORE,\n                continueCallback: storesListing,\n                selectStoreCallback: self.setPreferredStore\n            });\n        }).done();\n    },\n    init: function () {\n        var $availabilityContainer = $('.availability-results'),\n            self = this;\n        this.pid = $('input[name=\"pid\"]').val();\n\n        $('.set-preferred-store').on('click', function (e) {\n            e.preventDefault();\n            if (!User.zip) {\n                inventory.zipPrompt(function () {\n                    self.productSelectStore();\n                });\n            } else {\n                self.productSelectStore();\n            }\n        });\n\n        if ($availabilityContainer.length) {\n            if (User.storeId) {\n                inventory.getStoresInventory(this.pid).then(storesListing);\n            }\n\n            // See more or less stores in the listing\n            $availabilityContainer.on('click', '.stores-toggle', function (e) {\n                e.preventDefault();\n                $('.store-list-pdp .store-list-item').toggleClass('visible');\n                if ($(this).hasClass('collapsed')) {\n                    $(this).text(Resources.SEE_LESS);\n                } else {\n                    $(this).text(Resources.SEE_MORE);\n                }\n                $(this).toggleClass('collapsed');\n            });\n        }\n    }\n};\n\nmodule.exports = productInventory;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/storeinventory/product.js?\n}");
960
961/***/ }),
962
963/***/ "./cartridges/app_paulaschoice/cartridge/js/tooltip.js":
964/*!*************************************************************!*\
965  !*** ./cartridges/app_paulaschoice/cartridge/js/tooltip.js ***!
966  \*************************************************************/
967/***/ (function(__unused_webpack_module, exports) {
968
969"use strict";
970eval("{\n\n/**\n * @function\n * @description Initializes the tooltip-content and layout\n */\nexports.init = function () {\n    $(document).tooltip({\n        items: '.tooltip',\n        track: true,\n        content: function () {\n            return $(this).find('.tooltip-content').html();\n        }\n    });\n\n    $('.share-link').on('click', function (e) {\n        e.preventDefault();\n        var target = $(this).data('target');\n        if (!target) {\n            return;\n        }\n        $(target).toggleClass('active');\n    });\n};\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/tooltip.js?\n}");
971
972/***/ }),
973
974/***/ "./cartridges/app_paulaschoice/cartridge/js/topheader.js":
975/*!***************************************************************!*\
976  !*** ./cartridges/app_paulaschoice/cartridge/js/topheader.js ***!
977  \***************************************************************/
978/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
979
980eval("{var util = __webpack_require__(/*! ./util */ \"./cartridges/app_paulaschoice/cartridge/js/util.js\");\nvar searchsuggest = __webpack_require__(/*! ./searchsuggest */ \"./cartridges/app_paulaschoice/cartridge/js/searchsuggest.js\");\nvar header = __webpack_require__(/*! ./components/header */ \"./cartridges/app_paulaschoice/cartridge/js/components/header.js\");\nvar bodyScrollLock = __webpack_require__(/*! body-scroll-lock */ \"./node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js\");\nvar disableBodyScroll = bodyScrollLock.disableBodyScroll;\nvar enableBodyScroll = bodyScrollLock.enableBodyScroll;\n\nvar topHeader =  {\n    openSearch: function() {\n        header.default.closeSubmenu();\n        header.cache.HEADER.classList.remove(header.classes.MENU_OPEN);\n        $('#wrapper').addClass('search-active');\n        // Allow scrolling inside search overlay and it's children\n        disableBodyScroll( $(\"#js-header-search\").get(0));\n        $(\"#q\").focus();\n    },\n\n    closeSearch: function() {\n        $(\"#q\").blur();\n        setTimeout(function(){\n            $('#wrapper').removeClass('search-active');\n        }, 150);\n        enableBodyScroll($(\"#js-header-search\").get(0));\n    },\n\n    closeMenu: function() {\n        setTimeout(function(){\n            $('#js-menu-categories > li').removeClass('active');\n            $('#wrapper').removeClass('sub-menu-active');\n        }, 150);\n        enableBodyScroll($(\"#navigation\").get(0));\n    },\n\n    init: function() {\n\n        // Init search on mobile for navigation version B on input focus\n        $(\"#js-header-search input[type='text']\").on(\"click\", function() {\n            topHeader.openSearch();\n        });\n\n        // PC-2653-A version has one button with an ID, PC-2653-B version has two, with a class\n        $('#js-search-toggle, .js-search-toggle').on(\"click\", function () {\n            if ($('#wrapper').hasClass('search-active')) {\n                topHeader.closeSearch();\n                searchsuggest.clearResults();\n            } else {\n                topHeader.openSearch();\n            }\n        });\n\n        $('.js-toggle-sub-menu').on('click', function (e) {\n            e.preventDefault();\n            topHeader.closeSearch();\n            var $parentLi = $(this).closest('li');\n            $parentLi.siblings('li').removeClass('active');\n        });\n\n        $('.js-overlay').on('click', function() {\n            if ($('#wrapper').hasClass('search-active')) {\n                topHeader.closeSearch();\n            } else {\n                if ( !util.isDesktop() ) {\n                    $('.js-menu-toggle').trigger('click');\n                }\n            }\n        });\n    }\n};\n\nmodule.exports = topHeader;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/topheader.js?\n}");
981
982/***/ }),
983
984/***/ "./cartridges/app_paulaschoice/cartridge/js/util.js":
985/*!**********************************************************!*\
986  !*** ./cartridges/app_paulaschoice/cartridge/js/util.js ***!
987  \**********************************************************/
988/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
989
990"use strict";
991eval("{\n\nvar _ = __webpack_require__(/*! lodash */ \"./node_modules/lodash/lodash.js\");\nvar scrollPosition;\nvar scrollingFixed = false;\n\nvar util = {\n    /**\n     * @function\n     * @description appends the parameter with the given name and value to the given url and returns the changed url\n     * @param {String} url the url to which the parameter will be added\n     * @param {String} name the name of the parameter\n     * @param {String} value the value of the parameter\n     */\n    appendParamToURL: function (url, name, value) {\n        // quit if the param already exists\n        if (url.indexOf(name + '=') !== -1) {\n            return url;\n        }\n        var separator = url.indexOf('?') !== -1 ? '&' : '?';\n        return url + separator + name + '=' + encodeURIComponent(value);\n    },\n\n    /**\n     * @function\n     * @description remove the parameter and its value from the given url and returns the changed url\n     * @param {String} url the url from which the parameter will be removed\n     * @param {String} name the name of parameter that will be removed from url\n     */\n    removeParamFromURL: function (url, name) {\n        if (url.indexOf('?') === -1 || url.indexOf(name + '=') === -1) {\n            return url;\n        }\n        var hash;\n        var params;\n        var domain = url.split('?')[0];\n        var paramUrl = url.split('?')[1];\n        var newParams = [];\n        // if there is a hash at the end, store the hash\n        if (paramUrl.indexOf('#') > -1) {\n            hash = paramUrl.split('#')[1] || '';\n            paramUrl = paramUrl.split('#')[0];\n        }\n        params = paramUrl.split('&');\n        for (var i = 0; i < params.length; i++) {\n            // put back param to newParams array if it is not the one to be removed\n            if (params[i].split('=')[0] !== name) {\n                newParams.push(params[i]);\n            }\n        }\n        return domain + '?' + newParams.join('&') + (hash ? '#' + hash : '');\n    },\n\n    /**\n     * @function\n     * @description appends the parameters to the given url and returns the changed url\n     * @param {String} url the url to which the parameters will be added\n     * @param {Object} params\n     */\n    appendParamsToUrl: function (url, params) {\n        var _url = url;\n        _.each(params, function (value, name) {\n            _url = this.appendParamToURL(_url, name, value);\n        }.bind(this));\n        return _url;\n    },\n    /**\n     * @function\n     * @description extract the query string from URL\n     * @param {String} url the url to extra query string from\n     **/\n    getQueryString: function (url) {\n        var qs;\n        if (!_.isString(url)) {\n            return;\n        }\n        var a = document.createElement('a');\n        a.href = url;\n        if (a.search) {\n            qs = a.search.substr(1); // remove the leading ?\n        }\n        return qs;\n    },\n    /**\n     * @function\n     * @description\n     * @param {String}\n     * @param {String}\n     */\n    elementInViewport: function (el, offsetToTop) {\n        var top = el.offsetTop,\n                left = el.offsetLeft,\n                width = el.offsetWidth,\n                height = el.offsetHeight;\n\n        while (el.offsetParent) {\n            el = el.offsetParent;\n            top += el.offsetTop;\n            left += el.offsetLeft;\n        }\n\n        if (typeof (offsetToTop) !== 'undefined') {\n            top -= offsetToTop;\n        }\n\n        if (window.pageXOffset !== null) {\n            return (\n                    top < (window.pageYOffset + window.innerHeight) &&\n                    left < (window.pageXOffset + window.innerWidth) &&\n                    (top + height) > window.pageYOffset &&\n                    (left + width) > window.pageXOffset\n                    );\n        }\n\n        if (document.compatMode === 'CSS1Compat') {\n            return (\n                    top < (window.document.documentElement.scrollTop + window.document.documentElement.clientHeight) &&\n                    left < (window.document.documentElement.scrollLeft + window.document.documentElement.clientWidth) &&\n                    (top + height) > window.document.documentElement.scrollTop &&\n                    (left + width) > window.document.documentElement.scrollLeft\n                    );\n        }\n    },\n\n    jQueryElementInViewport: function (element, offsetToTop) {\n        if (typeof element === 'undefined' || element === null) {\n            return false;\n        }\n\n        var top = element.offset().top;\n        var height = element.height();\n\n        if (typeof (offsetToTop) !== 'undefined') {\n            top -= offsetToTop;\n        }\n\n        return (\n                top < (window.pageYOffset + window.innerHeight) &&\n                (top + height) > window.pageYOffset\n                );\n    }
991,\n\n    /**\n     * @function\n     * @description Appends the parameter 'format=ajax' to a given path\n     * @param {String} path the relative path\n     */\n    ajaxUrl: function (path) {\n        return this.appendParamToURL(path, 'format', 'ajax');\n    },\n\n    /**\n     * @function\n     * @description\n     * @param {String} url\n     */\n    toAbsoluteUrl: function (url) {\n        if (url.indexOf('http') !== 0 && url.charAt(0) !== '/') {\n            url = '/' + url;\n        }\n        return url;\n    },\n    /**\n     * @function\n     * @description Loads css dynamically from given urls\n     * @param {Array} urls Array of urls from which css will be dynamically loaded.\n     */\n    loadDynamicCss: function (urls) {\n        var i, len = urls.length;\n        for (i = 0; i < len; i++) {\n            this.loadedCssFiles.push(this.loadCssFile(urls[i]));\n        }\n    },\n\n    /**\n     * @function\n     * @description Loads css file dynamically from given url\n     * @param {String} url The url from which css file will be dynamically loaded.\n     */\n    loadCssFile: function (url) {\n        return $('<link/>').appendTo($('head')).attr({\n            type: 'text/css',\n            rel: 'stylesheet'\n        }).attr('href', url); // for i.e. <9, href must be added after link has been appended to head\n    },\n    // array to keep track of the dynamically loaded CSS files\n    loadedCssFiles: [],\n\n    /**\n     * @function\n     * @description Removes all css files which were dynamically loaded\n     */\n    clearDynamicCss: function () {\n        var i = this.loadedCssFiles.length;\n        while (0 > i--) {\n            $(this.loadedCssFiles[i]).remove();\n        }\n        this.loadedCssFiles = [];\n    },\n    /**\n     * @function\n     * @description Extracts all parameters from a given query string into an object\n     * @param {String} qs The query string from which the parameters will be extracted\n     */\n    getQueryStringParams: function (qs) {\n        if (!qs || qs.length === 0) {\n            return {};\n        }\n        var params = {},\n                unescapedQS = decodeURIComponent(qs);\n        // Use the String::replace method to iterate over each\n        // name-value pair in the string.\n        unescapedQS.replace(new RegExp('([^?=&]+)(=([^&]*))?', 'g'),\n                function ($0, $1, $2, $3) {\n                    params[$1] = $3;\n                }\n        );\n        return params;\n    },\n\n    fillAddressFields: function (address, $form) {\n        for (var field in address) {\n            if (field === 'ID' || field === 'UUID' || field === 'key') {\n                continue;\n            }\n            // if the key in address object ends with 'Code', remove that suffix\n            // keys that ends with 'Code' are postalCode, stateCode and countryCode\n            $form.find('[name$=\"' + field.replace('Code', '') + '\"]').val(address[field]);\n            if (field === 'stateCode') {\n                $form.find('[name$=\"stateCode\"]').val(address.stateCode);\n            }\n        }\n    },\n    /**\n     * @function\n     * @description Updates the number of the remaining character\n     * based on the character limit in a text area\n     */\n    limitCharacters: function () {\n        $('form').find('textarea[data-character-limit]').each(function () {\n            var characterLimit = $(this).data('character-limit');\n            var charCountHtml = String.format(Resources.CHAR_LIMIT_MSG,\n                    '<span class=\"char-remain-count\">' + characterLimit + '</span>',\n                    '<span class=\"char-allowed-count\">' + characterLimit + '</span>');\n            var charCountContainer = $(this).next('div.char-count');\n            if (charCountContainer.length === 0) {\n                charCountContainer = $('<
991div class=\"char-count\"/>').insertAfter($(this));\n            }\n            charCountContainer.html(charCountHtml);\n            // trigger the keydown event so that any existing character data is calculated\n            $(this).change();\n        });\n    },\n    /**\n     * @function\n     * @description Binds the onclick-event to a delete button on a given container,\n     * which opens a confirmation box with a given message\n     * @param {String} container The name of element to which the function will be bind\n     * @param {String} message The message the will be shown upon a click\n     */\n    setDeleteConfirmation: function (container, message) {\n        $(container).on('click', '.delete', function () {\n            return window.confirm(message);\n        });\n    },\n    /**\n     * @function\n     * @description Scrolls a browser window to a given x point\n     * @param {String} The x coordinate\n     */\n    scrollBrowser: function (xLocation) {\n        $('html, body').animate({scrollTop: xLocation}, 500);\n    },\n\n    isMobile: function () {\n        var mobileAgentHash = ['mobile', 'tablet', 'phone', 'ipad', 'ipod', 'android', 'blackberry', 'windows ce', 'opera mini', 'palm'];\n        var idx = 0;\n        var isMobile = false;\n        var userAgent = (navigator.userAgent).toLowerCase();\n\n        while (mobileAgentHash[idx] && !isMobile) {\n            isMobile = (userAgent.indexOf(mobileAgentHash[idx]) >= 0);\n            idx++;\n        }\n        return isMobile;\n    },\n\n    isTablet: function() {\n        const userAgent = navigator.userAgent.toLowerCase();\n        const isTablet = /(ipad|tablet|(android(?!.*mobile))|(windows(?!.*phone)(.*touch))|kindle|playbook|silk|(puffin(?!.*(IP|AP|WP))))/.test(userAgent);\n        return isTablet && window.matchMedia(\"screen and (min-width: 768px)\").matches;\n    },\n\n    isDesktop: function () {\n        return window.matchMedia(\"screen and (min-width: 1200px)\").matches;\n    },\n\n    isIE: function (){\n        return (window.navigator.userAgent.indexOf(\"MSIE \") > 0 ||\n                !!navigator.userAgent.match(/Trident/) ||\n                !!navigator.userAgent.match(/Edge/));\n    },\n\n    isIOS: function (){\n        return (!!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform));\n    },\n\n    preventScrolling: function () {\n        if ($(document).scrollTop() !== 0) {\n            scrollPosition = $(document).scrollTop();\n        }\n        $('html').css('overflow', 'hidden');\n        scrollingFixed = true;\n    },\n\n    resumeScrolling: function () {\n        $('html').css('overflow', 'auto');\n        if (typeof scrollPosition !== 'undefined') {\n            $('html').scrollTop(scrollPosition);\n        }\n        scrollingFixed = false;\n    },\n\n    toggleScrolling: function (shouldEnableScrolling) {\n        if (typeof shouldEnableScrolling === 'undefined' && scrollingFixed || !shouldEnableScrolling) {\n            this.resumeScrolling();\n        } else {\n            this.preventScrolling();\n        }\n    },\n\n    /**\n     * @function getCookie\n     *\n     * @param {string} key - The cookie name\n     * @returns {string} value - the value of the cookie if found, null otherwise\n     **/\n    getCookie: function (key) {\n        var cookies = document.cookie.split(';');\n        for (var i = 0; i < cookies.length; i++) {\n            var tokens = cookies[i].split('=');\n            var cookieKey = tokens[0].trim();\n            if (cookieKey === key) {\n                return tokens[1];\n            }\n        }\n        return null;\n    },\n\n    /**\n     * @function setCookie\n     *\n     * @param {string} key - The cookie name\n     * @param {string} value - The cookie value\n     * @param {integer} minutes - The number of minutes to expire the cookie\n     **/\n    setCookie: function (key, value, minutes) {\n        var date = new Date();\n        if ( minutes < 60 * 24 * 365 ) {\n        \tdate.setTime(date + (minutes * 60 * 1000));\n        } else {\n        \tdate.setFullYear(date.getFullYear() + Math.floor(minutes/(60*24*365)));\n        }\n\n        document.cookie = key + '=' + value + '; expires=' + date.toGMTString() + '; Secure; path=/';\n    },\n\n    /**\n     * @function deleteCookie\n     *\n     * @param {string} key - The cookie name\n     **/\n    deleteCookie: function (key) {\n        document.cookie = key + '= ; expires = Thu, 01 Jan 1970 00:00:01 GMT; Secure; path=/';\n    }
991,\n\n    extendCookie: function() {\n        $.ajax({\n            type: 'GET',\n            url: Urls.cookieExtendCookie\n        });\n    },\n\n    toggleEnertiaScrolling: function (element, shouldDisableEnertia) {\n        if (shouldDisableEnertia) {\n            $(element).on(\"mousewheel\", function () {\n                // remove default behavior\n                event.preventDefault();\n\n                //scroll without smoothing\n                var wheelDelta = event.wheelDelta;\n                var currentScrollPosition = window.pageYOffset;\n                window.scrollTo(0, currentScrollPosition - wheelDelta);\n            });\n        } else {\n            $(element).off(\"mousewheel\");\n        }\n    },\n\n    subscribeMutationObserver: function(elements, callback) {\n\t\t// config object\n\t\tvar config = {\n\t\t\tattributes: true,\n\t\t\tattributeOldValue: true,\n\t\t\tcharacterData: true,\n\t\t\tcharacterDataOldValue: true,\n\t\t\tchildList: true,\n\t\t\tsubtree: true\n\t\t};\n\n\t\t// set a MutationObserver for each element\n\t\t$(elements).each(function(index, el) {\n\t\t\tvar target = $(el)[0];\n\n\t\t\t// set mutation observer\n\t\t\tvar observer = new MutationObserver(function(mutationsList,observer) {\n\t\t\t\tcallback();\n\t\t\t});\n\n\t\t\t// observer should disconnect after fulfilling its purpose\n\t\t\t// create event listener\n\t\t\t$(el).on('disconnectObserver', function() {\n\t\t\t\tobserver.disconnect();\n\t\t\t});\n\n\t\t\t// set the observer on the target\n\t\t\tobserver.observe(target, config);\n\t\t});\n    },\n\n     /**\n     * @function shouldValidateForm\n     *\n     * @param {Element} element - HTML element\n     * @returns {Boolean} Returns false if the current form is 'shippingAddress' and the form is not submitted yet. Returns true otherwise.\n     **/\n    shouldValidateForm: function(element){\n        var currentForm = $(element).closest(\"form[id]\").attr('id');\n        if(currentForm == 'dwfrm_singleshipping_shippingAddress' && !window.isFormSubmitted){\n            return false;\n        }\n        return true;\n    },\n\n    /**\n     * @function\n     * @description Getting the biggest height of the array of items and setting it to all other items\n     * @param {Array} arrayItems dom items to set equal heights to\n     * @param {integer} Count number of items\n     */\n    setEqualHeights: function(arrayItems, count) {\n\t\tif(arrayItems !== undefined && arrayItems.length > 0) {\n\t\t\tarrayItems.height('');\n\n\t\t\tvar maxH = 0;\n\n\t\t\tif(count) {\n\t\t\t\tvar arrays = [];\n\t\t\t\twhile(arrayItems.length > 0) {\n\t\t\t\t\tarrays.push(arrayItems.splice(0, count));\n\t\t\t\t}\n\n\t\t\t\tfor(var i = 0; i < arrays.length; i += 1) {\n\t\t\t\t\tvar data = arrays[i];\n\t\t\t\t\tmaxH = 0;\n\t\t\t\t\tfor(var j = 0; j < data.length; j += 1) {\n\t\t\t\t\t\tvar currentH = $(data[j]).outerHeight();\n\t\t\t\t\t\tif(currentH > maxH) {\n\t\t\t\t\t\t\tmaxH = currentH;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor(var k = 0; k < data.length; k += 1) {\n\t\t\t\t\t\t$(data[k]).css('height', maxH);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tarrayItems.each(function() {\n\t\t\t\t\tvar currentH2 = $(this).outerHeight();\n\t\t\t\t\tif(currentH2 > maxH) {\n\t\t\t\t\t\tmaxH = currentH2;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tarrayItems.css('height', maxH);\n\t\t\t}\n\t\t}\n\t},\n\n    /**\n     * @function waitExist\n     * @description wait for element to exist\n     * @param {String} element - waiting element\n     * @param {waitExistCallback} callback - A callback to run when element exist\n     */\n     waitExist: function (element, callback, callFunction) {\n        let timer = setInterval(function() {\n            if ($(element).length) {\n               callback();\n               callFunction();\n               clearInterval(timer);\n            }\n        }, 100);\n    },\n\n    isJSONvalid: function(str) {\n        try {\n            JSON.parse(str);\n        } catch (e) {\n            return false;\n        }\n        return true;\n    }\n};\n\nmodule.exports = util;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/util.js?\n}");
992
993/***/ }),
994
995/***/ "./cartridges/app_paulaschoice/cartridge/js/validator.js":
996/*!***************************************************************!*\
997  !*** ./cartridges/app_paulaschoice/cartridge/js/validator.js ***!
998  \***************************************************************/
999/***/ (function(module) {
1000
1001"use strict";
1002eval("{/* global Resources */\n\n\n\nvar regex = {\n    email: Resources.emailAddressRegex,\n    phone: Resources.phonepRegexes,\n    date: Resources.dateRegex,\n    postal: Resources.postalCodeRegexes,\n    notCC: new RegExp(Resources.notCCRegex),\n    alphanumeric: new RegExp(Resources.alphanumericRegex),\n    alphanumericwithdot: new RegExp(Resources.alphanumericwithdotRegex),\n    alphanumericwithslash: new RegExp(Resources.alphanumericwithslashRegex),\n    alphanumericwithcomma: new RegExp(Resources.alphanumericwithcommaRegex),\n    alphanumericwithcommaslash: new RegExp(Resources.alphanumericwithcommaslashRegex),\n    alphanumericwithcommadotspace: new RegExp(Resources.alphanumericwithcommadotspace),\n    alphanumericwithslashand: new RegExp(Resources.alphanumericwithslashandRegex),\n    nameLength: new RegExp(Resources.nameLengthRegex),\n    onlydigit: new RegExp(Resources.onlydigitsRegex),\n    plusAndDigits: new RegExp(Resources.plusAndDigitsRegex),\n    GBcityvalidator: new RegExp(Resources.GBcityvalidatorRegex),\n    EShouseNumberAdditionValidator: new RegExp(Resources.EShouseNumberAdditionValidatorRegex),\n    ESAddressValidator: new RegExp(Resources.ESAddressValidatorRegex)\n};\n\n// global form validator settings\nvar settings = {\n    errorClass: 'error',\n    validClass: 'valid',\n    errorElement: 'label',\n    ignore: '#dwfrm_singleshipping_shippingAddress_password,#dwfrm_billing_couponCode, #dwfrm_singleshipping_addressList, #dwfrm_singleshipping_subscribeToNewsletter, #dwfrm_singleshipping_shippingAddress_personalInformation_subscribeToNewsletter, .ignore-me, #paazl-checkout *, .checkoutComponent *, .openinvoiceInput *, .adyen-checkout__input',\n\n    onkeyup: false,\n\n    highlight: function (element, errorClass, validClass) {\n        $(element).addClass(errorClass).removeClass(validClass);\n        $(element).parents(\".field-wrapper\").removeClass(validClass);\n        $(element).parents(\".form-row\").addClass(errorClass);\n    },\n    unhighlight: function (element, errorClass, validClass) {\n        $(element).parents(\".form-row\").removeClass(errorClass);\n        $(element).removeClass(errorClass);\n        $(element).addClass(validClass);\n        if ($(element).val()) {\n            $(element).parents(\".field-wrapper\").addClass(validClass);\n        } else {\n            $(element).parents(\".field-wrapper\").removeClass(validClass);\n        }\n    },\n    onfocusout: function (element) {\n        if (!this.checkable(element)) {\n            this.element(element);\n        }\n    }\n};\n\n// This is to fix form validation error when landing to billing page after initiating PayPal Express.\nvar brandCode = $('[name=dwfrm_billing_paymentMethods_brandCode]').val();\nif (brandCode == 'paypal_ecs') {\n    settings.ignore += ', #dwfrm_billing_paymentMethods_issuerId';\n}\n\nvar validator = {\n    regex: regex,\n    settings: settings,\n    init: function () {\n        var self = this;\n        var countrySelect = $('#dwfrm_singleshipping_shippingAddress_addressFields_country');\n        var countrySelectBilling = $('#dwfrm_billing_billingAddress_addressFields_country');\n        $('form:not(.suppress)').each(function () {\n            $(this).validate(self.settings);\n        });\n        preventPhoneTextandHouseNumber();\n        if (window.SitePreferences.LOCALE === 'es' && countrySelect.val() == 'ES') {\n            $('[id$=\"_shippingAddress_addressFields_postal\"]').addClass('postal-spain');\n        } else if (window.SitePreferences.LOCALE === 'en') {\n            checkPostalRequirement();\n            $('select[name$=country]').on('change', checkPostalRequirement);\n        } else if (window.SitePreferences.LOCALE === 'fr' && countrySelect.val() == 'FR') {\n            $('[id$=\"_shippingAddress_addressFields_postal\"]').addClass('postal-monaco');\n        } else if (window.SitePreferences.LOCALE === 'fr' && countrySelectBilling.val() == 'FR') {\n            $('[id$=\"_billingAddress_addressFields_postal\"]').addClass('postal-monaco');\n        } else if (window.SitePreferences.LOCALE === 'de' && countrySelect.val() == 'DE') {\n            $('[id$=\"_shippingAddress_addressFields_postal\"]').addClass('postal-germany');\n        }
1002 else if (window.SitePreferences.LOCALE === 'it' && countrySelect.val() == 'IT') {\n            $('[id$=\"_shippingAddress_addressFields_postal\"]').addClass('postal-italy');\n        }\n    },\n    initForm: function (f) {\n        $(f).validate(this.settings);\n    }\n};\n\nmodule.exports = validator;\n\n/**\n * Add email validation method to jQuery validation plugin.\n * Text fields must have 'emailAddress' css class to be validated as email\n */\n$.validator.addMethod('emailAddress', function (value) {\n    return validateEmail(value);\n}, Resources.VALIDATE_EMAIL);\n\n$.validator.addMethod('email', function (value) {\n    return validateEmail(value);\n}, Resources.VALIDATE_EMAIL);\n\n/**\n * Add date validation method to jQuery validation plugin.\n * Text fields must have 'date' css class to be validated as date\n */\n$.validator.addMethod('date', function (value, el) {\n    return validateDate(this, value, el);\n}, Resources.VALIDATE_DATE);\n\n/**\n * Add datewithmultiformat validation method to jQuery validation plugin.\n * Text fields must have 'datewithmultiformat' css class to be validated as date\n */\n$.validator.addMethod('datewithmultiformat', function (value, el) {\n    return validateDatewithmultiformat(this, value, el);\n}, Resources.VALIDATE_DATE);\n\n/**\n * Add phone validation method to jQuery validation plugin.\n * Text fields must have 'phone' css class to be validated as phone\n */\n$.validator.addMethod('phone', function (value, el) {\n    return validatePhone(this, value, el);\n}, Resources.INVALID_PHONE);\n\n/**\n * Add postal code validation method to jQuery validation plugin.\n * Text fields must have 'postal' css class to be validated as postal code\n */\n$.validator.addMethod('postal', function (value, el) {\n    return validateZip(value, el);\n}, Resources.INVALID_ZIP);\n\n/**\n * Add postal code validation method to jQuery validation plugin.\n * Text fields must have 'postal-monaco' css class to be validated as postal code\n */\n$.validator.addMethod('postal-monaco', function (value) {\n    return validateMonacoZip(value);\n}, Resources.INVALID_ZIP_CODE);\n\n/**\n * Add postal code validation method to jQuery validation plugin.\n * Text fields must have 'postal-spain' css class to be validated as postal code\n */\n$.validator.addMethod('postal-spain', function (value) {\n    return validateZipCountryCode(value, 'ES');\n}, Resources.INVALID_ZIP_CODE);\n\n/**\n * Add postal code validation method to jQuery validation plugin.\n * Text fields must have 'postal-germany' css class to be validated as postal code\n */\n$.validator.addMethod('postal-germany', function (value) {\n    return validateZipCountryCode(value, 'DE');\n}, Resources.INVALID_ZIP_CODE);\n\n/**\n * Add postal code validation method to jQuery validation plugin.\n * Text fields must have 'postal-italy' css class to be validated as postal code\n */\n$.validator.addMethod('postal-italy', function (value) {\n    return validateZipCountryCode(value, 'IT');\n}, Resources.INVALID_ZIP_CODE);\n\n/**\n * Add CCOwner validation method to jQuery validation plugin.\n * Text fields must have 'owner' css class to be validated as not a credit card\n */\n$.validator.addMethod('owner', function (value, el) {\n    return validateOwner(value, el);\n}, Resources.INVALID_OWNER);\n\n/**\n * Add gift cert amount validation method to jQuery validation plugin.\n * Text fields must have 'gift-cert-amont' css class to be validated\n */\n$.validator.addMethod('gift-cert-amount', function (value, el) {\n    var isOptional = this.optional(el);\n    var isValid = (!isNaN(value)) && (parseFloat(value) >= 5) && (parseFloat(value) <= 5000);\n    return isOptional || isValid;\n}, Resources.GIFT_CERT_AMOUNT_INVALID);\n\n/**\n * Add positive number validation method to jQuery validation plugin.\n * Text fields must have 'positivenumber' css class to be validated as positivenumber\n */\n$.validator.addMethod('positivenumber', function (value) {\n    if ($.trim(value).length === 0) {\n        return true;\n    }\n    return (!isNaN(value) && Number(value) >= 0);\n}, ''); // '' should be replaced with error message if needed\n\n\n$.validator.addMethod('alphanumeric', function (value) {\n    return validateAlphanumeric(value);\n}, Resources.VALIDATE_ALPHANUMERIC);\n\n$.validator.addMethod('GBcityvalidator', function (value) {\n    return validateGBcityvalidator(value);\n}, Resources.VALIDATE_GBCITYVALIDATOR);\n\n$.validator.addMethod('EShouseNumberAdditionValidator', function (value) {\n    return validateEShouseNumberAdditionValidator(value);\n}, Resources.VALIDATE_ESHOUSENUMBERADDITIONVALIDATOR);\n\n$.validator.addMethod('ESAddressValidator', function (value) {\n    return validateESAddressValidator(value);\n}, Resources.VALIDATE_ESADDRESSVALIDATOR);\n\n$.validator.addMethod('alphanumericwithdot', function (value) {\n    return validateAlphanumericwithdot(value);\n}, Resources.VALIDATE_ALPHANUMERICWITHDOT);\n\n$.validator.addMethod('alphanumericwithslash', function (value) {\n    return validateAlphanumericwithslash(value);\n}, Resources.VALIDATE_ALPHANUMERICWITHSLASH);\n\n$.validator.addMethod('alphanumericwithslashand', function (value) {\n    return validateAlphanumericwithslashand(value);\n}, Resources.VALIDATE_ALPHANUMERICWITHSLASHAND);\n\n$.validator.addMethod('alphanumericwithcomma', function (value) {\n    return validateAlphanumericwithcomma(value);\n}, Resources.VALIDATE_ALPHANUMERICWITHCOMMA);\n\n$.validator.addMethod('alphanumericwithcommaslash', function (value) {\n    return validateAlphanumericwithcommaslash(value);\n}, Resources.VALIDATE_ALPHANUMERICWITHCOMMASLASH);\n\n$.validator.addMethod('alphanumericwithcommadotspace', function (value) {\n    return validateAlphanumericwithcommadotspace(value);\n}, Resources.VALIDATE_ALPHANUMERICWITHCOMMADOTSPACE);\n\n$.validator.addMethod('onlydigits', function (value) {\n    return validateOnlyDigits(value);\n}, Resources.VALIDATE_DIGITS);\n\n$.validator.addMethod('plusAndDigits', function (value) {\n    return validatePlusAndDIgits(value);\n}, Resources.VALIDATE_PLUSANDDIGITS);\n\n/*\nValidates all .js-fullnamelengthlimit inputs within container with class .js-address-container combined against regex nameLength.\n*/\n$.validator.addMethod('js-fullnamelengthlimit', function (value, element) {\n    var value = '';\n\n    //js-address-container groups all the child input (with .js-fullnamelengthlimit class) and validates them together (e.g. firstName+lastName on Shipping page)\n    $(element).parents('.js-address-container').find('.js-fullnamelengthlimit').each(function (i, el) {\n        value += $(el).val();\n    });\n\n    return validateFullNameLength(value);\n}, Resources.VALIDATE_FULLNAMELENGTH);
1002\n\n$.extend($.validator.messages, {\n    required: Resources.VALIDATE_REQUIRED,\n    remote: Resources.VALIDATE_REMOTE,\n    email: Resources.VALIDATE_EMAIL,\n    url: Resources.VALIDATE_URL,\n    date: Resources.VALIDATE_DATE,\n    dateISO: Resources.VALIDATE_DATEISO,\n    number: Resources.VALIDATE_NUMBER,\n    digits: Resources.VALIDATE_DIGITS,\n    plusAndDigits: Resources.VALIDATE_PLUSANDDIGITS,\n    creditcard: Resources.VALIDATE_CREDITCARD,\n    equalTo: Resources.VALIDATE_EQUALTO,\n    maxlength: $.validator.format(Resources.VALIDATE_MAXLENGTH),\n    minlength: $.validator.format(Resources.VALIDATE_MINLENGTH),\n    rangelength: $.validator.format(Resources.VALIDATE_RANGELENGTH),\n    range: $.validator.format(Resources.VALIDATE_RANGE),\n    max: $.validator.format(Resources.VALIDATE_MAX),\n    min: $.validator.format(Resources.VALIDATE_MIN)\n\n});\n\n\n/**\n * @function\n * @description update validations based on address selection\n */\nfunction updateFieldValidationsAfterAddressSelectionFR(selectors) {\n    var addressSelection = $(selectors.AddressSelector);\n    var countrySelector = selectors.countrySelector;\n    var addressField = selectors.addressField;\n    var root = selectors.root;\n\n    $(addressSelection).on(\"change\", function () {\n        setTimeout(function () {\n            const currentPlaceholder = $(addressField).attr(\"placeholder\");\n            var selectedCountry;\n            var countrySelectorElement = $(countrySelector)\n            if (countrySelectorElement) {\n                selectedCountry = countrySelectorElement.val();\n            }\n            if (selectedCountry === \"BE\") {\n                showAndRequireHouseNumber(root);\n                $(addressField).attr(\n                    \"placeholder\",\n                    currentPlaceholder.replace(\". 2\", \".\")\n                );\n            } else {\n                hideAndOptionalHouseNumber(root);\n                $(addressField).attr(\n                    \"placeholder\",\n                    currentPlaceholder.replace(\".\", \". 2\")\n                );\n            }\n        }, 0);\n    });\n}\n\n/**\n * @function\n * @description update validations based on country selection\n */\nfunction updateFieldValidationsAfterCountrySelectionFR(selectors) {\n    var countrySelector = selectors.countrySelector;\n    var addressField = selectors.addressField;\n    var root = selectors.root;\n\n    $(document).on(\"change\", countrySelector, function () {\n        const selectedCountry = $(this).val();\n        const currentPlaceholder = $(addressField).attr(\"placeholder\");\n        if (selectedCountry === \"BE\") {\n            showAndRequireHouseNumber(root);\n            $(addressField).attr(\n                \"placeholder\",\n                currentPlaceholder.replace(\". 2\", \".\")\n            );\n        } else {\n            hideAndOptionalHouseNumber(root);\n            $(addressField).attr(\n                \"placeholder\",\n                currentPlaceholder.replace(\".\", \". 2\")\n            );\n        }\n    });\n}\n\n/**\n * @function\n * @description update validations based on country selection or address selection on shipping form\n */\nfunction handleShippingCountrySelectionFR() {\n    var shippingSelectors = {\n        countrySelector:\n            \"#dwfrm_singleshipping_shippingAddress_addressFields_country\",\n        addressField:\n            \"#dwfrm_singleshipping_shippingAddress_addressFields_address1\",\n        root: \"#shipping-form\",\n        AddressSelector: \"#dwfrm_singleshipping_addressList\"\n    };\n    updateFieldValidationsAfterCountrySelectionFR(shippingSelectors);\n    updateFieldValidationsAfterAddressSelectionFR(shippingSelectors);\n}\n\n/**\n * @function\n * @description update validations based on country selection or address selection on billing form\n */\nfunction handleBillingCountrySelectionFR() {\n    var billingSelectors = {\n        countrySelector: \"#dwfrm_billing_billingAddress_addressFields_country\",\n        addressField: \"#dwfrm_billing_billingAddress_addressFields_address1\",\n        root: \"#billing-form\",\n        AddressSelector: \"#dwfrm_billing_addressList\"\n    };\n    updateFieldValidationsAfterCountrySelectionFR(billingSelectors);\n    updateFieldValidationsAfterAddressSelectionFR(billingSelectors);\n}\n\n/**\n * @function\n * @description update validations based on country selection during creating address on account page\n */\nfunction handleAccountCountrySelectionFR() {\n    var accountSelectors = {\n        countrySelector: \"#dwfrm_profile_address_country\",\n        addressField: \"#dwfrm_profile_address_address1\",\n        root: \"#edit-ad
1002dress-form\",\n    };\n    updateFieldValidationsAfterCountrySelectionFR(accountSelectors);\n}\n\nif (window.SitePreferences.COUNTRY === 'fr') {\n    handleShippingCountrySelectionFR();\n    handleBillingCountrySelectionFR();\n    handleAccountCountrySelectionFR();\n}\n\n\n/**\n * @function\n * @description making houseNumber visible and mandatory field\n * @param {String} root parent selector to make it more unique\n */\nfunction showAndRequireHouseNumber(root) {\n    $(`${root} .house-number`)\n        .addClass(\"is-visible\")\n        .addClass(\"required\")\n        .find(\"input\")\n        .addClass(\"required\");\n}\n\n/**\n * @function\n * @description making houseNumber non-visible and optional field\n * @param {String} root parent selector to make it more unique\n */\nfunction hideAndOptionalHouseNumber(root) {\n    $(`${root} .house-number`)\n        .removeClass(\"is-visible\")\n        .removeClass(\"required\")\n        .find(\"input\")\n        .removeClass(\"required\");\n}\n\n/**\n * @function\n * @description Validates email\n * @param {String} value The email address which will be validated\n */\nfunction validateEmail(value) {\n    var rgx = new RegExp(regex.email);\n    return rgx.test(value);\n}\n\n/**\n * @function\n * @description Validates date\n * @param {String} validator the validator object\n * @param {String} value The date which will be validated\n * @param {String} el The input field\n */\nfunction validateDate(validator, value, el) {\n    var date = $(el).closest('form').find('.date');\n    if (date.length === 0 || date.val().length === 0 || !regex.date) {\n        return true;\n    }\n\n    var rgx = new RegExp(regex.date);\n    var isOptional = validator.optional(el);\n    var isValid = rgx.test(value);\n\n    return isOptional || isValid;\n}\n\n/**\n * @function\n * @description Validates date\n * @param {String} validator the validator object\n * @param {String} value The date which will be validated\n * @param {String} el The input field\n */\nfunction validateDatewithmultiformat(validator, value, el) {\n    var date = $(el).closest('form').find('.datewithmultiformat');\n    if (date.length === 0 || date.val().length === 0) {\n        return true;\n    }\n\n    // regex rule accepts delimiters \"-\", \".\", \"/\" and 8 digits without delimiters\n    // examples \"01-01-2000\", \"01.01.2000\", \"01/01/2000\" (with and without starting zero on day and month)\n    // without delimiters, 8 digits like 12082001\n    var rgx = new RegExp(/^(?:(?:31(\\/|-|\\.)(?:0?[13578]|1[02]))\\1|(?:(?:29|30)(\\/|-|\\.)(?:0?[13-9]|1[0-2])\\2))(?:(?:1[8-9]|[2-9]\\d)\\d{2})$|^(?:29(\\/|-|\\.)0?2\\3(?:(?:(?:1[8-9]|[2-9]\\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\\d|2[0-8])(\\/|-|\\.)(?:(?:0?[1-9])|(?:1[0-2]))\\4(?:(?:1[8-9]|[2-9]\\d)\\d{2})$|^(0[1-9]|[1-2][0-9]|31(?!(?:0[2469]|11))|30(?!02))(0[1-9]|1[0-2])(?:(?:1[8-9]|[2-9]\\d)\\d{2})$/);\n    var isOptional = validator.optional(el);\n    var isValid = rgx.test(value);\n\n    return isOptional || isValid;\n}\n\n/**\n * @function\n * @description Validates a given string for only containing alphanumeric characters\n * @param {String} value The value which will be validated\n */\nfunction validateAlphanumeric(value) {\n    return value === '' || regex.alphanumeric.test($.trim(value));\n}\n\n/**\n * @function\n * @description Validates a given string for only containing alphanumeric characters and GB allowed cities\n * @param {String} value The value which will be validated\n */\nfunction validateGBcityvalidator(value) {\n    return value === '' || regex.GBcityvalidator.test($.trim(value));\n}\n/**\n * @function\n * @description Validates a given string for only containing alphanumeric characters and superscript e, o, a\n * @param {String} value The value which will be validated\n */\nfunction validateEShouseNumberAdditionValidator(value) {\n    return value === '' || regex.EShouseNumberAdditionValidator.test($.trim(value));\n}\n\n/**\n * @function\n * @description Validates a given string for only containing alphanumeric characters and slash\n * @param {String} value The value which will be validated\n */\nfunction validateESAddressValidator(value) {\n    return value === '' || regex.ESAddressValidator.test($.trim(value));\n}\n\n/**\n * @function\n * @description Validates a given string for only containing alphanumeric characters and dot\n * @param {String} value The value which will be validated\n */\nfunction validateAlphanumericwithdot(value) {\n    return value === '' || regex.alphanumericwithdot.test($.trim(value));\n}\n\n/**\n * @function\n * @description Validates a given string for only containing alphanumeric characters and slash\n * @param {String} value The value which will be validated\n */\nfunction validateAlphanumericwithslash(value) {\n    return value === '' || regex.alphanumericwithslash.test($.trim(value));\n}\n\n/**\n * @function\n * @description Validates a given string for only containing alphanumeric characters slash AND &\n * @param {String} value The value which will be validated\n */\nfunction validateAlphanumericwithslashand(value) {\n    return value === '' || regex.alphanumericwithslashand.test($.trim(value));\n}\n\n/**\n * @function\n * @description Validates a given string for only containing alphanumeric and comma characters and slash\n * @param {String} value The value which will be validated\n */\nfunction validateAlphanumericwithcomma(value) {\n    return value === '' || regex.alphanumericwithcomma.test($.trim(value));\n}\n\n\n/**\n * @function\n * @description Validates a given string for only containing alphanumeric and comma and slash characters and slash\n * @param {String} value The value which will be validated\n */\nfunction validateAlphanumericwithcommaslash(value) {\n    return value === '' || regex.alphanumericwithcommaslash.test($.trim(value));\n}\n\n/**\n * @function\n * @description Validates a given string for only containing alphanumeric, comma, dot or space\n * @param {String} value The value which will be validated\n */\nfunction validateAlphanumericwithcommadotspace(value) {\n    return value === '' || regex.alphanumericwithcommadotspace.test($.trim(value));\n}\n\n/**\n * @function\n * @description Validates a given string for only containing numbers\n * @param {String} value The value which will be validated\n */\nfunction validateOnlyDigits(value) {\n    return value === '' || regex.onlydigit.test($.trim(value));\n}\n\n/**\n * @function\n * @description Validates a given string for starting with a plus or number and having 8 to 14 additional numbers\n * @param {String} value The value which will be validated\n */\nfunction validatePlusAndDIgits(value) {\n    return value === '' || regex.plusAndDigits.test($.trim(value));\n}\n\n/**\n * @function\n * @description Validates full name length\n * @param {String} value The value which will be validated\n */\nfunction validateFullNameLength(value) {\n    return value === '' || regex.nameLength.test(value);\n}\n\n/**\n * @function\n * @description Validates a given phone number against the countries phone regex\n * @param {String} validator the validator object\n * @param {String} value The phone number which will be validated\n * @param {String} el The input field\n */\nfunction validatePhone(validator, value, el) {\n    var country = $(el).closest('form').find('.country');\n    if (country.length === 0 || country.val().length === 0 || !regex.phone[country.val().toLowerCase()]) {\n        return true;\n    }\n\n    var rgx = new RegExp(regex.phone[country.val().toLowerCase()]);\n    var isOptional = validator.optional(el);\n    var isValid = rgx.test($.trim(value));\n\n    return isOptional || isValid;\n}\n\n/**\n * @function\n * @description Validates a given postal code\n * @param {String} value The postal code which will be validated\n * @param {String} el The input field\n */\nfunction validateZip(value, el) {\n    var required = $(el).data('required');\n    var country = $(el).closest('fieldset').find('select[id$=_country]').val();\n    var isOptional = !required;\n    if (!regex.postal) {\n        return true;\n    }\n    var rgx = '';\n    if (country !== null) {\n        rgx = new RegExp(regex.postal[country]);\n    }\n\n    var isValid = rgx.test($.trim(value)) || (value !== null && rgx.test($.trim(value.toUpperCase())));\n\n    return ($(el).val().length > 0) ? isValid : isOptional;\n}\n\n/**\n * @function\n * @description Validates that a credit card owner is not a Credit card number\n * @param {String} value The owner field which will be validated\n */\nfunction validateOwner(value) {\n    var isValid = regex.notCC.test($.trim(value));\n    return isValid;\n}\n\nfunction preventPhoneTextandHouseNumber() {\n    $(\"input[name$=phone],input[name$=houseNumber]\").keydown(function (e) {\n        if ($(this).attr(\"name\").indexOf(\"ph
1002one\") > -1) {\n            // phone field accepts + (107) as first character (and shift + =)\n            if ($(this).val().length === 0 && (e.keyCode === 107 || (e.shiftKey && e.keyCode === 187))) {\n                return;\n            }\n        }\n\n        if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 ||\n            (e.keyCode === 65 && (e.ctrlKey === true || e.metaKey === true)) ||\n            (e.keyCode >= 35 && e.keyCode <= 40)) {\n            return;\n        }\n\n        if ((e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105)) {\n            e.preventDefault();\n        }\n    });\n}\n\nfunction checkPostalRequirement() {\n    $('[id$=\"_shippingAddress_addressFields_postal\"]').removeClass('postal-spain'); // if class was added but country was changed\n\n    if ($('input.postal').is(':visible')) {\n        $('input.postal').prop('required', true);\n        $('.form-row.postal').find('.optional-indicator').hide();\n    }\n\n    var countrySelect = $('#dwfrm_singleshipping_shippingAddress_addressFields_country');\n\n    if (window.SitePreferences.LOCALE === 'en' && countrySelect.val() == 'ES') {\n        $('[id$=\"_shippingAddress_addressFields_postal\"]').addClass('postal-spain');\n    }\n}\n\nfunction validateMonacoZip(value) {\n    var mcRegex = new RegExp(regex.postal['MC']);\n    var frRegex = new RegExp(regex.postal['FR']);\n    var frdepRegex = new RegExp(regex.postal['FR-DEP']);\n\n    if (mcRegex.test(value)) {\n        return value = '';\n    } else if (frdepRegex.test(value)) {\n        return value = '';\n    } else if (frRegex.test(value)) {\n        return value;\n    }\n}\n\nfunction validateZipCountryCode(value, countryCode) {\n    var resourcesCountry = 'postalCodeRestriction_' + countryCode;\n    var postalCodeRestriction = Resources[resourcesCountry];\n\n    if (postalCodeRestriction) {\n        var postalCodeRestrictionArray = postalCodeRestriction.split(',');\n\n        if (postalCodeRestrictionArray.length > 0) {\n            var hasRestrictionForCountry = postalCodeRestrictionArray.some(function (postalCodeRestrict) {\n                return postalCodeRestrict.trim() === value || postalCodeRestrict.trim().toUpperCase() === value.toUpperCase();\n            })\n\n            if (hasRestrictionForCountry) {\n                return value = '';\n            } else {\n                return value;\n            }\n        }\n    }\n}\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/validator.js?\n}");
1003
1004/***/ }),
1005
1006/***/ "./cartridges/app_paulaschoice/cartridge/js/video-dialog.js":
1007/*!******************************************************************!*\
1008  !*** ./cartridges/app_paulaschoice/cartridge/js/video-dialog.js ***!
1009  \******************************************************************/
1010/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1011
1012eval("{var youtubeProvider = __webpack_require__(/*! ./youtube-provider */ \"./cartridges/app_paulaschoice/cartridge/js/youtube-provider.js\");\n\nmodule.exports = function () {\n    $.fn.youtubeDialog = function (options) {\n        var settings = $.extend({\n            autoplay: true,\n            width: '400',\n            height: '300',\n            controls: 1,\n            modestbranding: 1,\n            rel: 0,\n            showinfo: 0,\n            dialogClass: 'video-dialog',\n            closeText : '',\n            modal: true,\n            stoponclose: false,\n            show: {\n                effect: 'fade',\n                duration: 200\n            },\n            hide: {\n                effect: 'fade',\n                duration: 200\n            }\n        }, options);\n\n        return this.each(function () {\n            var videoId = $(this).attr('data-video-id');\n            var dialog = new YoutubeDialog(videoId, settings);\n\n            $(this).on('click', function () {\n                dialog.dialog('open');\n            });\n\n            return dialog;\n        });\n    };\n};\n\nfunction YoutubeDialog(videoId, settings) {\n    var dialog;\n    var player;\n    var dialogContainer = '<div class=\"dialog\"><div class=\"player\"></div></div>';\n\n    dialog = $(dialogContainer).appendTo('body').dialog({\n        autoOpen: false,\n        width: 'auto',\n        height: 'auto',\n        resizable: false,\n        modal: settings.modal,\n        dialogClass: settings.dialogClass,\n        show: settings.show,\n        hide: settings.hide,\n        closeText : '',\n        beforeClose: function(){\n            if ($.isFunction(settings.beforeClose)){\n                settings.beforeClose(dialog);\n            }\n        },\n        create: function () {\n            var playerObject = $(this).find('.player').first();\n\n            youtubeProvider.loadYoutube(function (youtubeAPI) {\n                player = new youtubeAPI.Player(playerObject[0], {\n                    videoId: videoId,\n                    width: settings.width,\n                    height: settings.height,\n                    playerVars: {\n                        autoplay: (videoId===window.location.hash.substr(1)) ? 1 : 0,\n                        controls: settings.controls,\n                        modestbranding: settings.modestbranding,\n                        rel: settings.rel,\n                        showinfo: settings.showinfo\n                    }\n                });\n            });\n\n            if ($.isFunction(settings.create)) {\n                settings.create(dialog);\n            }\n        },\n        open: function (settings) {\n        \tplayer.playVideo();\n\n            $('.ui-widget-overlay').bind('click', function () {\n                dialog.dialog('close');\n            });\n\n            if ($.isFunction(settings.open)){\n                settings.open(dialog);\n            }\n        },\n        close: function () {\n            if (settings.stoponclose) {\n                player.stopVideo();\n            } else {\n                player.pauseVideo();\n            }\n\n            if ($.isFunction(settings.close)) {\n                settings.close(dialog);\n            }\n        }\n    });\n\n    return dialog;\n}\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/video-dialog.js?\n}");
1013
1014/***/ }),
1015
1016/***/ "./cartridges/app_paulaschoice/cartridge/js/videoplayer.js":
1017/*!*****************************************************************!*\
1018  !*** ./cartridges/app_paulaschoice/cartridge/js/videoplayer.js ***!
1019  \*****************************************************************/
1020/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1021
1022eval("{__webpack_require__(/*! ./video-dialog */ \"./cartridges/app_paulaschoice/cartridge/js/video-dialog.js\")();\n\nvar videoPlayer = {\n    init: function () {\n        $('.js-video-button').each(function(){\n            var button = $(this);\n\n            button.youtubeDialog({\n                width: '1200',\n                height: '800',\n                beforeClose: function(dialog){\n                    dialog.effect('transfer', {\n                        to: button,\n                        className: 'ui-effects-transfer'\n                        }, 500, null);\n                    return true;\n                },\n                open: function (dialog){\n                    button.effect('transfer', {\n                        to: dialog,\n                        className: 'ui-effects-transfer'\n                        }, 500, null);\n                    return true;\n                },\n                show: {\n                    effect: 'fade',\n                    duration: 500\n                },\n                hide: {\n                    effect: 'fade',\n                    duration: 500\n                }\n            });\n        });\n\n        $(document).on('click', '.js-cloudinary-video-button', function() {\n            var button = $(this);\n            var thumbVideo = button.find('.js-cloudinary-thumb-video').length ? button.find('.js-cloudinary-thumb-video') : $('.js-cloudinary-video-dialog').find('.js-cloudinary-thumb-video');\n            var videoDialog;\n            var player = thumbVideo.find('.video-js')[0].player;\n\n            videoDialog = thumbVideo.dialog({\n                autoOpen: false,\n                width: '450',\n                height: '580',\n                modal: true,\n                draggable: false,\n                autoReposition: true,\n                dialogClass: 'cloudinary-video-dialog js-cloudinary-video-dialog',\n                closeText : '',\n                position: {\n                    my: \"center\",\n                    at: \"center\",\n                    of: window\n                },\n                open: function() {\n                    if (player) player.play();\n\n                    $(document).on('click', '.ui-widget-overlay, .js-dialog-close, .js-add-to-cart', function (e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        if (videoDialog.dialog('isOpen')) {\n                            videoDialog.dialog('close');\n                        }\n                    });\n                },\n                beforeClose: function(){\n                    if (player) player.pause();\n                },\n            });\n\n            videoDialog.dialog('open');\n        });\n\n        $(window).on('resize', function () {\n            $(\".cloudinary-video-dialog\").position({\n                my: \"center\", at: \"center\", of: window\n            });\n        });\n    }\n};\n\nmodule.exports = videoPlayer;\n\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/videoplayer.js?\n}");
1023
1024/***/ }),
1025
1026/***/ "./cartridges/app_paulaschoice/cartridge/js/youtube-provider.js":
1027/*!**********************************************************************!*\
1028  !*** ./cartridges/app_paulaschoice/cartridge/js/youtube-provider.js ***!
1029  \**********************************************************************/
1030/***/ (function(module) {
1031
1032eval("{/* global YT */\n\nvar callbacks = [];\n\nwindow.onYouTubeIframeAPIReady = function() {\n    for (var i=0; i < callbacks.length; i++) {\n        callbacks[i](YT);\n    }\n};\n\nmodule.exports = {\n    loadYoutube: function(callback) {\n        return loadYoutube(callback);\n    }\n};\n\nfunction loadYoutube(callback) {\n    if (typeof (YT) === 'undefined' || typeof (YT.Player) === 'undefined') {\n        $.getScript('https://www.youtube.com/iframe_api');\n        callbacks.push(callback);\n    } else {\n        callback(YT);\n    }\n}\n\n//# sourceURL=webpack://webpack-starter/./cartridges/app_paulaschoice/cartridge/js/youtube-provider.js?\n}");
1033
1034/***/ }),
1035
vendor: 2,678 bytes, lines 1036-1046
1036/***/ "./node_modules/asap/browser-asap.js":
1037/*!*******************************************!*\
1038  !*** ./node_modules/asap/browser-asap.js ***!
1039  \*******************************************/
1040/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1041
1042"use strict";
1043eval("{\n\n// rawAsap provides everything we need except exception management.\nvar rawAsap = __webpack_require__(/*! ./raw */ \"./node_modules/asap/browser-raw.js\");\n// RawTasks are recycled to reduce GC churn.\nvar freeTasks = [];\n// We queue errors to ensure they are thrown in right order (FIFO).\n// Array-as-queue is good enough here, since we are just dealing with exceptions.\nvar pendingErrors = [];\nvar requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError);\n\nfunction throwFirstError() {\n    if (pendingErrors.length) {\n        throw pendingErrors.shift();\n    }\n}\n\n/**\n * Calls a task as soon as possible after returning, in its own event, with priority\n * over other events like animation, reflow, and repaint. An error thrown from an\n * event will not interrupt, nor even substantially slow down the processing of\n * other events, but will be rather postponed to a lower priority event.\n * @param {{call}} task A callable object, typically a function that takes no\n * arguments.\n */\nmodule.exports = asap;\nfunction asap(task) {\n    var rawTask;\n    if (freeTasks.length) {\n        rawTask = freeTasks.pop();\n    } else {\n        rawTask = new RawTask();\n    }\n    rawTask.task = task;\n    rawAsap(rawTask);\n}\n\n// We wrap tasks with recyclable task objects.  A task object implements\n// `call`, just like a function.\nfunction RawTask() {\n    this.task = null;\n}\n\n// The sole purpose of wrapping the task is to catch the exception and recycle\n// the task object after its single use.\nRawTask.prototype.call = function () {\n    try {\n        this.task.call();\n    } catch (error) {\n        if (asap.onerror) {\n            // This hook exists purely for testing purposes.\n            // Its name will be periodically randomized to break any code that\n            // depends on its existence.\n            asap.onerror(error);\n        } else {\n            // In a web browser, exceptions are not fatal. However, to avoid\n            // slowing down the queue of pending tasks, we rethrow the error in a\n            // lower priority turn.\n            pendingErrors.push(error);\n            requestErrorThrow();\n        }\n    } finally {\n        this.task = null;\n        freeTasks[freeTasks.length] = this;\n    }\n};\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/asap/browser-asap.js?\n}");
1044
1045/***/ }),
1046
vendor: 10,246 bytes, lines 1047-1057
1047/***/ "./node_modules/asap/browser-raw.js":
1048/*!******************************************!*\
1049  !*** ./node_modules/asap/browser-raw.js ***!
1050  \******************************************/
1051/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1052
1053"use strict";
1054eval("{\n\n// Use the fastest means possible to execute a task in its own turn, with\n// priority over other events including IO, animation, reflow, and redraw\n// events in browsers.\n//\n// An exception thrown by a task will permanently interrupt the processing of\n// subsequent tasks. The higher level `asap` function ensures that if an\n// exception is thrown by a task, that the task queue will continue flushing as\n// soon as possible, but if you use `rawAsap` directly, you are responsible to\n// either ensure that no exceptions are thrown from your task, or to manually\n// call `rawAsap.requestFlush` if an exception is thrown.\nmodule.exports = rawAsap;\nfunction rawAsap(task) {\n    if (!queue.length) {\n        requestFlush();\n        flushing = true;\n    }\n    // Equivalent to push, but avoids a function call.\n    queue[queue.length] = task;\n}\n\nvar queue = [];\n// Once a flush has been requested, no further calls to `requestFlush` are\n// necessary until the next `flush` completes.\nvar flushing = false;\n// `requestFlush` is an implementation-specific method that attempts to kick\n// off a `flush` event as quickly as possible. `flush` will attempt to exhaust\n// the event queue before yielding to the browser's own event loop.\nvar requestFlush;\n// The position of the next task to execute in the task queue. This is\n// preserved between calls to `flush` so that it can be resumed if\n// a task throws an exception.\nvar index = 0;\n// If a task schedules additional tasks recursively, the task queue can grow\n// unbounded. To prevent memory exhaustion, the task queue will periodically\n// truncate already-completed tasks.\nvar capacity = 1024;\n\n// The flush function processes all tasks that have been scheduled with\n// `rawAsap` unless and until one of those tasks throws an exception.\n// If a task throws an exception, `flush` ensures that its state will remain\n// consistent and will resume where it left off when called again.\n// However, `flush` does not make any arrangements to be called again if an\n// exception is thrown.\nfunction flush() {\n    while (index < queue.length) {\n        var currentIndex = index;\n        // Advance the index before calling the task. This ensures that we will\n        // begin flushing on the next task the task throws an error.\n        index = index + 1;\n        queue[currentIndex].call();\n        // Prevent leaking memory for long chains of recursive calls to `asap`.\n        // If we call `asap` within tasks scheduled by `asap`, the queue will\n        // grow, but to avoid an O(n) walk for every task we execute, we don't\n        // shift tasks off the queue after they have been executed.\n        // Instead, we periodically shift 1024 tasks off the queue.\n        if (index > capacity) {\n            // Manually shift all values starting at the index back to the\n            // beginning of the queue.\n            for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {\n                queue[scan] = queue[scan + index];\n            }\n            queue.length -= index;\n            index = 0;\n        }\n    }\n    queue.length = 0;\n    index = 0;\n    flushing = false;\n}\n\n// `requestFlush` is implemented using a strategy based on data collected from\n// every available SauceLabs Selenium web driver worker at time of writing.\n// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593\n\n// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that\n// have WebKitMutationObserver but not un-prefixed MutationObserver.\n// Must use `global` or `self` instead of `window` to work in both frames and web\n// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.\n\n/* globals self */\nvar scope = typeof __webpack_require__.g !== \"undefined\" ? __webpack_require__.g : self;\nvar BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver;\n\n// MutationObservers are desirable because they have high priority and work\n// reliably everywhere they are implemented.\n// They are implemented in all modern browsers.\n//\n// - Android 4-4.3\n// - Chrome 26-34\n// - Firefox 14-29\n// - Internet Explorer 11\n// - iPad Safari 6-7.1\n// - iPhone Safari 7-7.1\n// - Safari 6-7\nif (typeof BrowserMutationObserver === \"function\") {\n    requestFlush = makeRequestCallFromMutationObserver(flush);\n\n// MessageChannels are desirable because they give direct access to the HTML\n// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera\n// 11-12, and in web workers in many engines.\n// Although message channels yield to any queued rendering and IO tasks, they\n// would be better than imposing the 4ms delay of timers.\n// However, they do not work reliably in Internet Explorer or Safari.\n\n// Internet Explorer 10 is the only browser that has setImmediate but does\n// not have MutationObservers.\n// Although setImmediate yields to the browser's renderer, it would be\n// preferrable to falling back to setTimeout since it does not have\n// the minimum 4ms penalty.\n// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and\n// Desktop to a lesser extent) that renders both setImmediate and\n// MessageChannel useless for the purposes of ASAP.\n// https://github.com/kriskowal/q/issues/396\n\n// Timers are implemented universally.\n// We fall back to timers in workers in most engines, and in foreground\n// contexts in the following browsers.\n// However, note that even this simple case requires nuances to operate in a\n// broad spectrum of browsers.\n//\n// - Firefox 3-13\n// - Internet Explorer 6-9\n// - iPad Safari 4.3\n// - Lynx 2.8.7\n} else {\n    requestFlush = makeRequestCallFromTimer(flush);\n}\n\n// `requestFlush` requests that the high priority event queue be flushed as\n// soon as possible.\n// This is useful to prevent an error thrown in a task from stalling the event\n// queue if the exception handled by Node.js’s\n// `process.on(\"uncaughtException\")` or by a domain.\nrawAsap.requestFlush = requestFlush;\n\n// To request a high priority event, we induce a mutation observer by toggling\n// the text of a text node between \"1\" and \"-1\".\nfunction makeRequestCallFromMutationObserver(callback) {\n    var toggle = 1;\n    var observer = new BrowserMutationObserver(callback);\n    var node = document.createTextNode(\"\");\n    observer.observe(node, {characterData: true});\n    return function requestCall() {\n        toggle = -toggle;\n        node.data = toggle;\n    };\n}\n\n// The message channel technique was discovered by Malte Ubl and was the\n// original foundation for this library.\n// http://www.nonblocking.io/2011/06/windownexttick.html\n\n// Safari 6.0.5 (at least) intermittently fails to create message ports on a\n// page's first load. Thankfully, this version of Safari supports\n// MutationObservers, so we don't need to fall back in that case.\n\n// function makeRequestCallFromMessageChannel(callback) {\n//     var channel = new MessageChannel();\n//     channel.port1.onmessage = callback;\n//     return function requestCall() {\n//         channel.port2.postMessage(0);\n//     };\n// }\n\n// For reasons explained above, we are also unable to use `setImmediate`\n// under any circumstances.\n// Even if we were, there is another bug in Internet Explorer 10.\n// It is not sufficient to assign `setImmediate` to `requestFlush` because\n// `setImmediate` must be called *by name* and therefore must be wrapped in a\n// closure.\n// Never forget.\n\n// function makeRequestCallFromSetImmediate(callback) {\n//     return function requestCall() {\n//         setImmediate(callback);\n//     };\n// }\n\n// Safari 6.0 has a problem where timers will get lost while the user is\n// scrolling. This problem does not impact ASAP because Safari 6.0 supports\n// mutation observers, so that implementation is used instead.\n// However, if we ever elect to use timers in Safari, the prevalent work-around\n// is to add a scroll event listener that calls for a flush.\n\n// `setTimeout` does not call the passed callback if the delay is less than\n// approximately 7 in web workers in Firefox 8 through 18, and sometimes not\n// even then.\n\nfunction makeRequestCallFromTimer(callback) {\n    return function requestCall() {\n        // We dispatch a timeout with a specified delay of 0 for engines that\n        // can reliably accommodate that request. This will usually be snapped\n        // to a 4 milisecond delay, but once we're flushing, there's no delay\n        // between events.\n        var timeoutHandle = setTimeout(handleTimer, 0);\n        // However, since this timer gets frequently dropped in Firefox\n        // workers, we enlist an interval handle that will try to fire\n        // an event 20 times per second until it succeeds.\n        var intervalHandle = setInterval(handleTimer, 50);\n\n        function handleTimer() {\n            // Whichever timer succeeds will cancel both timers and\n            // execute the callback.\n            clearTimeout(timeoutHandle);\n            clearInterval(intervalHandle);\n            callback();\n        }\n    };\n}\n\n// This is for `asap.js` only.\n// Its name will be periodically randomized to break any code that depends on\n// its existence.\nrawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;\n\n// ASAP was originally a nextTick shim included in Q. This was factored out\n// into this ASAP package. It was later adapted to RSVP which made further\n// amendments. These decisions, particularly to marginalize MessageChannel and\n// to capture the MutationObserver implementation in a closure, were integrated\n// back into ASAP proper.\n// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/asap/browser-raw.js?\n}");
1055
1056/***/ }),
1057
vendor: 8,247 bytes, lines 1058-1068
1058/***/ "./node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js":
1059/*!*****************************************************************!*\
1060  !*** ./node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js ***!
1061  \*****************************************************************/
1062/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1063
1064"use strict";
1065eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   clearAllBodyScrollLocks: function() { return /* binding */ clearAllBodyScrollLocks; },\n/* harmony export */   disableBodyScroll: function() { return /* binding */ disableBodyScroll; },\n/* harmony export */   enableBodyScroll: function() { return /* binding */ enableBodyScroll; }\n/* harmony export */ });\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n// Older browsers don't support event options, feature detect it.\n\n// Adopted and modified solution from Bohdan Didukh (2017)\n// https://stackoverflow.com/questions/41594997/ios-10-safari-prevent-scrolling-behind-a-fixed-overlay-and-maintain-scroll-posi\n\nvar hasPassiveEvents = false;\nif (typeof window !== 'undefined') {\n  var passiveTestOptions = {\n    get passive() {\n      hasPassiveEvents = true;\n      return undefined;\n    }\n  };\n  window.addEventListener('testPassive', null, passiveTestOptions);\n  window.removeEventListener('testPassive', null, passiveTestOptions);\n}\n\nvar isIosDevice = typeof window !== 'undefined' && window.navigator && window.navigator.platform && (/iP(ad|hone|od)/.test(window.navigator.platform) || window.navigator.platform === 'MacIntel' && window.navigator.maxTouchPoints > 1);\n\n\nvar locks = [];\nvar documentListenerAdded = false;\nvar initialClientY = -1;\nvar previousBodyOverflowSetting = void 0;\nvar previousBodyPaddingRight = void 0;\n\n// returns true if `el` should be allowed to receive touchmove events.\nvar allowTouchMove = function allowTouchMove(el) {\n  return locks.some(function (lock) {\n    if (lock.options.allowTouchMove && lock.options.allowTouchMove(el)) {\n      return true;\n    }\n\n    return false;\n  });\n};\n\nvar preventDefault = function preventDefault(rawEvent) {\n  var e = rawEvent || window.event;\n\n  // For the case whereby consumers adds a touchmove event listener to document.\n  // Recall that we do document.addEventListener('touchmove', preventDefault, { passive: false })\n  // in disableBodyScroll - so if we provide this opportunity to allowTouchMove, then\n  // the touchmove event on document will break.\n  if (allowTouchMove(e.target)) {\n    return true;\n  }\n\n  // Do not prevent if the event has more than one touch (usually meaning this is a multi touch gesture like pinch to zoom).\n  if (e.touches.length > 1) return true;\n\n  if (e.preventDefault) e.preventDefault();\n\n  return false;\n};\n\nvar setOverflowHidden = function setOverflowHidden(options) {\n  // If previousBodyPaddingRight is already set, don't set it again.\n  if (previousBodyPaddingRight === undefined) {\n    var _reserveScrollBarGap = !!options && options.reserveScrollBarGap === true;\n    var scrollBarGap = window.innerWidth - document.documentElement.clientWidth;\n\n    if (_reserveScrollBarGap && scrollBarGap > 0) {\n      previousBodyPaddingRight = document.body.style.paddingRight;\n      document.body.style.paddingRight = scrollBarGap + 'px';\n    }\n  }\n\n  // If previousBodyOverflowSetting is already set, don't set it again.\n  if (previousBodyOverflowSetting === undefined) {\n    previousBodyOverflowSetting = document.body.style.overflow;\n    document.body.style.overflow = 'hidden';\n  }\n};\n\nvar restoreOverflowSetting = function restoreOverflowSetting() {\n  if (previousBodyPaddingRight !== undefined) {\n    document.body.style.paddingRight = previousBodyPaddingRight;\n\n    // Restore previousBodyPaddingRight to undefined so setOverflowHidden knows it\n    // can be set again.\n    previousBodyPaddingRight = undefined;\n  }\n\n  if (previousBodyOverflowSetting !== undefined) {\n    document.body.style.overflow = previousBodyOverflowSetting;\n\n    // Restore previousBodyOverflowSetting to undefined\n    // so setOverflowHidden knows it can be set again.\n    previousBodyOverflowSetting = undefined;\n  }\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#Problems_and_solutions\nvar isTargetElementTotallyScrolled = function isTargetElementTotallyScrolled(targetElement) {\n  return targetElement ? targetElement.scrollHeight - targetElement.scrollTop <= targetElement.clientHeight : false;\n};\n\nvar handleScroll = function handleScroll(event, targetElement) {\n  var clientY = event.targetTouches[0].clientY - initialClientY;\n\n  if (allowTouchMove(event.target)) {\n    return false;\n  }\n\n  if (targetElement && targetElement.scrollTop === 0 && clientY > 0) {\n    // element is at the top of its scroll.\n    return preventDefault(event);\n  }\n\n  if (isTargetElementTotallyScrolled(targetElement) && clientY < 0) {\n    // element is at the bottom of its scroll.\n    return preventDefault(event);\n  }\n\n  event.stopPropagation();\n  return true;\n};\n\nvar disableBodyScroll = function disableBodyScroll(targetElement, options) {\n  // targetElement must be provided\n  if (!targetElement) {\n    // eslint-disable-next-line no-console\n    console.error('disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.');\n    return;\n  }\n\n  // disableBodyScroll must not have been called on this targetElement before\n  if (locks.some(function (lock) {\n    return lock.targetElement === targetElement;\n  })) {\n    return;\n  }\n\n  var lock = {\n    targetElement: targetElement,\n    options: options || {}\n  };\n\n  locks = [].concat(_toConsumableArray(locks), [lock]);\n\n  if (isIosDevice) {\n    targetElement.ontouchstart = function (event) {\n      if (event.targetTouches.length === 1) {\n        // detect single touch.\n        initialClientY = event.targetTouches[0].clientY;\n      }\n    };\n    targetElement.ontouchmove = function (event) {\n      if (event.targetTouches.length === 1) {\n        // detect single touch.\n        handleScroll(event, targetElement);\n      }\n    };\n\n    if (!documentListenerAdded) {\n      document.addEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);\n      documentListenerAdded = true;\n    }\n  } else {\n    setOverflowHidden(options);\n  }\n};\n\nvar clearAllBodyScrollLocks = function clearAllBodyScrollLocks() {\n  if (isIosDevice) {\n    // Clear all locks ontouchstart/ontouchmove handlers, and the references.\n    locks.forEach(function (lock) {\n      lock.targetElement.ontouchstart = null;\n      lock.targetElement.ontouchmove = null;\n    });\n\n    if (documentListenerAdded) {\n      document.removeEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);\n      documentListenerAdded = false;\n    }\n\n    // Reset initial clientY.\n    initialClientY = -1;\n  } else {\n    restoreOverflowSetting();\n  }\n\n  locks = [];\n};\n\nvar enableBodyScroll = function enableBodyScroll(targetElement) {\n  if (!targetElement) {\n    // eslint-disable-next-line no-console\n    console.error('enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.');\n    return;\n  }\n\n  locks = locks.filter(function (lock) {\n    return lock.targetElement !== targetElement;\n  });\n\n  if (isIosDevice) {\n    targetElement.ontouchstart = null;\n    targetElement.ontouchmove = null;\n\n    if (documentListenerAdded && locks.length === 0) {\n      document.removeEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);\n      documentListenerAdded = false;\n    }\n  } else if (!locks.length) {\n    restoreOverflowSetting();\n  }\n};\n\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js?\n}");
1066
1067/***/ }),
1068
vendor: 564,284 bytes, lines 1069-1078
1069/***/ "./node_modules/lodash/lodash.js":
1070/*!***************************************!*\
1071  !*** ./node_modules/lodash/lodash.js ***!
1072  \***************************************/
1073/***/ (function(module, exports, __webpack_require__) {
1074
1075eval("{/* module decorator */ module = __webpack_require__.nmd(module);\nvar __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.18.1';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`',\n      INVALID_TEMPL_IMPORTS_ERROR_TEXT = 'Invalid `imports` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports =  true && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && \"object\" == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * **Security:** See\n     * [threat model](https://github.com/lodash/lodash/blob/main/threat-model.md)\n     * — `_.template` is insecure and will be removed in v5.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            };\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n\n      // Prevent prototype pollution:\n      // https://github.com/lodash/lodash/security/advisories/GHSA-xxjr-mmjv-4gpg\n      // https://github.com/lodash/lodash/security/advisories/GHSA-f23m-r3pf-42rh\n      var index = -1,\n          length = path.length;\n\n      if (!length) {\n        return true;\n      }\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n\n        // Always block \"__proto__\" anywhere in the path if it's not expected\n        if (key === '__proto__' && !hasOwnProperty.call(object, '__proto__')) {\n          return false;\n        }\n\n        // Block constructor/prototype as non-terminal traversal keys to prevent\n        // escaping the object graph into built-in constructors and prototypes.\n        if ((key === 'constructor' || key === 'prototype') && index < length - 1) {\n          return false;\n        }\n      }\n\n      var obj = parent(object, path);\n      return obj == null || delete obj[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `-0`, `0n`, `\"\"`, `undefined`, and `NaN` are falsy.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        baseAssignValue(result, pair[0], pair[1]);\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * **Note:** If `lower` is greater than `upper`, the values are swapped.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * // when lower is greater than upper the values are swapped\n     * _.random(5, 0);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(-5);\n     * // => an integer between -5 and 0\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Security:** `_.template` is insecure and should not be used. It will be\n     * removed in Lodash v5. Avoid untrusted input. See\n     * [threat model](https://github.com/lodash/lodash/blob/main/threat-model.md).\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      arrayEach(importsKeys, function(key) {\n        if (reForbiddenIdentifierChars.test(key)) {\n          throw new Error(INVALID_TEMPL_IMPORTS_ERROR_TEXT);\n        }\n      });\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (true) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n      return _;\n    }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else // removed by dead control flow\n{}\n}.call(this));\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/lodash/lodash.js?\n}");
1076
1077/***/ }),
1078
vendor: 461 bytes, lines 1079-1089
1079/***/ "./node_modules/promise/index.js":
1080/*!***************************************!*\
1081  !*** ./node_modules/promise/index.js ***!
1082  \***************************************/
1083/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1084
1085"use strict";
1086eval("{\n\nmodule.exports = __webpack_require__(/*! ./lib */ \"./node_modules/promise/lib/index.js\")\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/promise/index.js?\n}");
1087
1088/***/ }),
1089
vendor: 5,459 bytes, lines 1090-1100
1090/***/ "./node_modules/promise/lib/core.js":
1091/*!******************************************!*\
1092  !*** ./node_modules/promise/lib/core.js ***!
1093  \******************************************/
1094/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1095
1096"use strict";
1097eval("{\n\nvar asap = __webpack_require__(/*! asap/raw */ \"./node_modules/asap/browser-raw.js\");\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n  try {\n    return obj.then;\n  } catch (ex) {\n    LAST_ERROR = ex;\n    return IS_ERROR;\n  }\n}\n\nfunction tryCallOne(fn, a) {\n  try {\n    return fn(a);\n  } catch (ex) {\n    LAST_ERROR = ex;\n    return IS_ERROR;\n  }\n}\nfunction tryCallTwo(fn, a, b) {\n  try {\n    fn(a, b);\n  } catch (ex) {\n    LAST_ERROR = ex;\n    return IS_ERROR;\n  }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n  if (typeof this !== 'object') {\n    throw new TypeError('Promises must be constructed via new');\n  }\n  if (typeof fn !== 'function') {\n    throw new TypeError('Promise constructor\\'s argument is not a function');\n  }\n  this._x = 0;\n  this._y = 0;\n  this._z = null;\n  this._A = null;\n  if (fn === noop) return;\n  doResolve(fn, this);\n}\nPromise._B = null;\nPromise._C = null;\nPromise._D = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n  if (this.constructor !== Promise) {\n    return safeThen(this, onFulfilled, onRejected);\n  }\n  var res = new Promise(noop);\n  handle(this, new Handler(onFulfilled, onRejected, res));\n  return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n  return new self.constructor(function (resolve, reject) {\n    var res = new Promise(noop);\n    res.then(resolve, reject);\n    handle(self, new Handler(onFulfilled, onRejected, res));\n  });\n}\nfunction handle(self, deferred) {\n  while (self._y === 3) {\n    self = self._z;\n  }\n  if (Promise._B) {\n    Promise._B(self);\n  }\n  if (self._y === 0) {\n    if (self._x === 0) {\n      self._x = 1;\n      self._A = deferred;\n      return;\n    }\n    if (self._x === 1) {\n      self._x = 2;\n      self._A = [self._A, deferred];\n      return;\n    }\n    self._A.push(deferred);\n    return;\n  }\n  handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n  asap(function() {\n    var cb = self._y === 1 ? deferred.onFulfilled : deferred.onRejected;\n    if (cb === null) {\n      if (self._y === 1) {\n        resolve(deferred.promise, self._z);\n      } else {\n        reject(deferred.promise, self._z);\n      }\n      return;\n    }\n    var ret = tryCallOne(cb, self._z);\n    if (ret === IS_ERROR) {\n      reject(deferred.promise, LAST_ERROR);\n    } else {\n      resolve(deferred.promise, ret);\n    }\n  });\n}\nfunction resolve(self, newValue) {\n  // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n  if (newValue === self) {\n    return reject(\n      self,\n      new TypeError('A promise cannot be resolved with itself.')\n    );\n  }\n  if (\n    newValue &&\n    (typeof newValue === 'object' || typeof newValue === 'function')\n  ) {\n    var then = getThen(newValue);\n    if (then === IS_ERROR) {\n      return reject(self, LAST_ERROR);\n    }\n    if (\n      then === self.then &&\n      newValue instanceof Promise\n    ) {\n      self._y = 3;\n      self._z = newValue;\n      finale(self);\n      return;\n    } else if (typeof then === 'function') {\n      doResolve(then.bind(newValue), self);\n      return;\n    }\n  }\n  self._y = 1;\n  self._z = newValue;\n  finale(self);\n}\n\nfunction reject(self, newValue) {\n  self._y = 2;\n  self._z = newValue;\n  if (Promise._C) {\n    Promise._C(self, newValue);\n  }\n  finale(self);\n}\nfunction finale(self) {\n  if (self._x === 1) {\n    handle(self, self._A);\n    self._A = null;\n  }\n  if (self._x === 2) {\n    for (var i = 0; i < self._A.length; i++) {\n      handle(self, self._A[i]);\n    }\n    self._A = null;\n  }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n  this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n  this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n  this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n  var done = false;\n  var res = tryCallTwo(fn, function (value) {\n    if (done) return;\n    done = true;\n    resolve(promise, value);\n  }, function (reason) {\n    if (done) return;\n    done = true;\n    reject(promise, reason);\n  });\n  if (!done && res === IS_ERROR) {\n    done = true;\n    reject(promise, LAST_ERROR);\n  }\n}\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/promise/lib/core.js?\n}");
1098
1099/***/ }),
1100
vendor: 750 bytes, lines 1101-1111
1101/***/ "./node_modules/promise/lib/done.js":
1102/*!******************************************!*\
1103  !*** ./node_modules/promise/lib/done.js ***!
1104  \******************************************/
1105/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1106
1107"use strict";
1108eval("{\n\nvar Promise = __webpack_require__(/*! ./core.js */ \"./node_modules/promise/lib/core.js\");\n\nmodule.exports = Promise;\nPromise.prototype.done = function (onFulfilled, onRejected) {\n  var self = arguments.length ? this.then.apply(this, arguments) : this;\n  self.then(null, function (err) {\n    setTimeout(function () {\n      throw err;\n    }, 0);\n  });\n};\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/promise/lib/done.js?\n}");
1109
1110/***/ }),
1111
vendor: 5,449 bytes, lines 1112-1122
1112/***/ "./node_modules/promise/lib/es6-extensions.js":
1113/*!****************************************************!*\
1114  !*** ./node_modules/promise/lib/es6-extensions.js ***!
1115  \****************************************************/
1116/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1117
1118"use strict";
1119eval("{\n\n//This file contains the ES6 extensions to the core Promises/A+ API\n\nvar Promise = __webpack_require__(/*! ./core.js */ \"./node_modules/promise/lib/core.js\");\n\nmodule.exports = Promise;\n\n/* Static Functions */\n\nvar TRUE = valuePromise(true);\nvar FALSE = valuePromise(false);\nvar NULL = valuePromise(null);\nvar UNDEFINED = valuePromise(undefined);\nvar ZERO = valuePromise(0);\nvar EMPTYSTRING = valuePromise('');\n\nfunction valuePromise(value) {\n  var p = new Promise(Promise._D);\n  p._y = 1;\n  p._z = value;\n  return p;\n}\nPromise.resolve = function (value) {\n  if (value instanceof Promise) return value;\n\n  if (value === null) return NULL;\n  if (value === undefined) return UNDEFINED;\n  if (value === true) return TRUE;\n  if (value === false) return FALSE;\n  if (value === 0) return ZERO;\n  if (value === '') return EMPTYSTRING;\n\n  if (typeof value === 'object' || typeof value === 'function') {\n    try {\n      var then = value.then;\n      if (typeof then === 'function') {\n        return new Promise(then.bind(value));\n      }\n    } catch (ex) {\n      return new Promise(function (resolve, reject) {\n        reject(ex);\n      });\n    }\n  }\n  return valuePromise(value);\n};\n\nvar iterableToArray = function (iterable) {\n  if (typeof Array.from === 'function') {\n    // ES2015+, iterables exist\n    iterableToArray = Array.from;\n    return Array.from(iterable);\n  }\n\n  // ES5, only arrays and array-likes exist\n  iterableToArray = function (x) { return Array.prototype.slice.call(x); };\n  return Array.prototype.slice.call(iterable);\n}\n\nPromise.all = function (arr) {\n  var args = iterableToArray(arr);\n\n  return new Promise(function (resolve, reject) {\n    if (args.length === 0) return resolve([]);\n    var remaining = args.length;\n    function res(i, val) {\n      if (val && (typeof val === 'object' || typeof val === 'function')) {\n        if (val instanceof Promise && val.then === Promise.prototype.then) {\n          while (val._y === 3) {\n            val = val._z;\n          }\n          if (val._y === 1) return res(i, val._z);\n          if (val._y === 2) reject(val._z);\n          val.then(function (val) {\n            res(i, val);\n          }, reject);\n          return;\n        } else {\n          var then = val.then;\n          if (typeof then === 'function') {\n            var p = new Promise(then.bind(val));\n            p.then(function (val) {\n              res(i, val);\n            }, reject);\n            return;\n          }\n        }\n      }\n      args[i] = val;\n      if (--remaining === 0) {\n        resolve(args);\n      }\n    }\n    for (var i = 0; i < args.length; i++) {\n      res(i, args[i]);\n    }\n  });\n};\n\nfunction onSettledFulfill(value) {\n  return { status: 'fulfilled', value: value };\n}\nfunction onSettledReject(reason) {\n  return { status: 'rejected', reason: reason };\n}\nfunction mapAllSettled(item) {\n  if(item && (typeof item === 'object' || typeof item === 'function')){\n    if(item instanceof Promise && item.then === Promise.prototype.then){\n      return item.then(onSettledFulfill, onSettledReject);\n    }\n    var then = item.then;\n    if (typeof then === 'function') {\n      return new Promise(then.bind(item)).then(onSettledFulfill, onSettledReject)\n    }\n  }\n\n  return onSettledFulfill(item);\n}\nPromise.allSettled = function (iterable) {\n  return Promise.all(iterableToArray(iterable).map(mapAllSettled));\n};\n\nPromise.reject = function (value) {\n  return new Promise(function (resolve, reject) {\n    reject(value);\n  });\n};\n\nPromise.race = function (values) {\n  return new Promise(function (resolve, reject) {\n    iterableToArray(values).forEach(function(value){\n      Promise.resolve(value).then(resolve, reject);\n    });\n  });\n};\n\n/* Prototype Methods */\n\nPromise.prototype['catch'] = function (onRejected) {\n  return this.then(null, onRejected);\n};\n\nfunction getAggregateError(errors){\n  if(typeof AggregateError === 'function'){\n    return new AggregateError(errors,'All promises were rejected');\n  }\n\n  var error = new Error('All promises were rejected');\n\n  error.name = 'AggregateError';\n  error.errors = errors;\n\n  return error;\n}\n\nPromise.any = function promiseAny(values) {\n  return new Promise(function(resolve, reject) {\n    var promises = iterableToArray(values);\n    var hasResolved = false;\n    var rejectionReasons = [];\n\n    function resolveOnce(value) {\n      if (!hasResolved) {\n        hasResolved = true;\n        resolve(value);\n      }\n    }\n\n    function rejectionCheck(reason) {\n      rejectionReasons.push(reason);\n\n      if (rejectionReasons.length === promises.length) {\n        reject(getAggregateError(rejectionReasons));\n      }\n    }\n\n    if(promises.length === 0){\n      reject(getAggregateError(rejectionReasons));\n    } else {\n      promises.forEach(function(value){\n        Promise.resolve(value).then(resolveOnce, rejectionCheck);\n      });\n    }\n  });\n};\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/promise/lib/es6-extensions.js?\n}");
1120
1121/***/ }),
1122
vendor: 799 bytes, lines 1123-1133
1123/***/ "./node_modules/promise/lib/finally.js":
1124/*!*********************************************!*\
1125  !*** ./node_modules/promise/lib/finally.js ***!
1126  \*********************************************/
1127/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1128
1129"use strict";
1130eval("{\n\nvar Promise = __webpack_require__(/*! ./core.js */ \"./node_modules/promise/lib/core.js\");\n\nmodule.exports = Promise;\nPromise.prototype.finally = function (f) {\n  return this.then(function (value) {\n    return Promise.resolve(f()).then(function () {\n      return value;\n    });\n  }, function (err) {\n    return Promise.resolve(f()).then(function () {\n      throw err;\n    });\n  });\n};\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/promise/lib/finally.js?\n}");
1131
1132/***/ }),
1133
vendor: 942 bytes, lines 1134-1144
1134/***/ "./node_modules/promise/lib/index.js":
1135/*!*******************************************!*\
1136  !*** ./node_modules/promise/lib/index.js ***!
1137  \*******************************************/
1138/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1139
1140"use strict";
1141eval("{\n\nmodule.exports = __webpack_require__(/*! ./core.js */ \"./node_modules/promise/lib/core.js\");\n__webpack_require__(/*! ./done.js */ \"./node_modules/promise/lib/done.js\");\n__webpack_require__(/*! ./finally.js */ \"./node_modules/promise/lib/finally.js\");\n__webpack_require__(/*! ./es6-extensions.js */ \"./node_modules/promise/lib/es6-extensions.js\");\n__webpack_require__(/*! ./node-extensions.js */ \"./node_modules/promise/lib/node-extensions.js\");\n__webpack_require__(/*! ./synchronous.js */ \"./node_modules/promise/lib/synchronous.js\");\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/promise/lib/index.js?\n}");
1142
1143/***/ }),
1144
vendor: 3,948 bytes, lines 1145-1155
1145/***/ "./node_modules/promise/lib/node-extensions.js":
1146/*!*****************************************************!*\
1147  !*** ./node_modules/promise/lib/node-extensions.js ***!
1148  \*****************************************************/
1149/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1150
1151"use strict";
1152eval("{\n\n// This file contains then/promise specific extensions that are only useful\n// for node.js interop\n\nvar Promise = __webpack_require__(/*! ./core.js */ \"./node_modules/promise/lib/core.js\");\nvar asap = __webpack_require__(/*! asap */ \"./node_modules/asap/browser-asap.js\");\n\nmodule.exports = Promise;\n\n/* Static Functions */\n\nPromise.denodeify = function (fn, argumentCount) {\n  if (\n    typeof argumentCount === 'number' && argumentCount !== Infinity\n  ) {\n    return denodeifyWithCount(fn, argumentCount);\n  } else {\n    return denodeifyWithoutCount(fn);\n  }\n};\n\nvar callbackFn = (\n  'function (err, res) {' +\n  'if (err) { rj(err); } else { rs(res); }' +\n  '}'\n);\nfunction denodeifyWithCount(fn, argumentCount) {\n  var args = [];\n  for (var i = 0; i < argumentCount; i++) {\n    args.push('a' + i);\n  }\n  var body = [\n    'return function (' + args.join(',') + ') {',\n    'var self = this;',\n    'return new Promise(function (rs, rj) {',\n    'var res = fn.call(',\n    ['self'].concat(args).concat([callbackFn]).join(','),\n    ');',\n    'if (res &&',\n    '(typeof res === \"object\" || typeof res === \"function\") &&',\n    'typeof res.then === \"function\"',\n    ') {rs(res);}',\n    '});',\n    '};'\n  ].join('');\n  return Function(['Promise', 'fn'], body)(Promise, fn);\n}\nfunction denodeifyWithoutCount(fn) {\n  var fnLength = Math.max(fn.length - 1, 3);\n  var args = [];\n  for (var i = 0; i < fnLength; i++) {\n    args.push('a' + i);\n  }\n  var body = [\n    'return function (' + args.join(',') + ') {',\n    'var self = this;',\n    'var args;',\n    'var argLength = arguments.length;',\n    'if (arguments.length > ' + fnLength + ') {',\n    'args = new Array(arguments.length + 1);',\n    'for (var i = 0; i < arguments.length; i++) {',\n    'args[i] = arguments[i];',\n    '}',\n    '}',\n    'return new Promise(function (rs, rj) {',\n    'var cb = ' + callbackFn + ';',\n    'var res;',\n    'switch (argLength) {',\n    args.concat(['extra']).map(function (_, index) {\n      return (\n        'case ' + (index) + ':' +\n        'res = fn.call(' + ['self'].concat(args.slice(0, index)).concat('cb').join(',') + ');' +\n        'break;'\n      );\n    }).join(''),\n    'default:',\n    'args[argLength] = cb;',\n    'res = fn.apply(self, args);',\n    '}',\n    \n    'if (res &&',\n    '(typeof res === \"object\" || typeof res === \"function\") &&',\n    'typeof res.then === \"function\"',\n    ') {rs(res);}',\n    '});',\n    '};'\n  ].join('');\n\n  return Function(\n    ['Promise', 'fn'],\n    body\n  )(Promise, fn);\n}\n\nPromise.nodeify = function (fn) {\n  return function () {\n    var args = Array.prototype.slice.call(arguments);\n    var callback =\n      typeof args[args.length - 1] === 'function' ? args.pop() : null;\n    var ctx = this;\n    try {\n      return fn.apply(this, arguments).nodeify(callback, ctx);\n    } catch (ex) {\n      if (callback === null || typeof callback == 'undefined') {\n        return new Promise(function (resolve, reject) {\n          reject(ex);\n        });\n      } else {\n        asap(function () {\n          callback.call(ctx, ex);\n        })\n      }\n    }\n  }\n};\n\nPromise.prototype.nodeify = function (callback, ctx) {\n  if (typeof callback != 'function') return this;\n\n  this.then(function (value) {\n    asap(function () {\n      callback.call(ctx, null, value);\n    });\n  }, function (err) {\n    asap(function () {\n      callback.call(ctx, err);\n    });\n  });\n};\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/promise/lib/node-extensions.js?\n}");
1153
1154/***/ }),
1155
vendor: 1,908 bytes, lines 1156-1166
1156/***/ "./node_modules/promise/lib/synchronous.js":
1157/*!*************************************************!*\
1158  !*** ./node_modules/promise/lib/synchronous.js ***!
1159  \*************************************************/
1160/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
1161
1162"use strict";
1163eval("{\n\nvar Promise = __webpack_require__(/*! ./core.js */ \"./node_modules/promise/lib/core.js\");\n\nmodule.exports = Promise;\nPromise.enableSynchronous = function () {\n  Promise.prototype.isPending = function() {\n    return this.getState() == 0;\n  };\n\n  Promise.prototype.isFulfilled = function() {\n    return this.getState() == 1;\n  };\n\n  Promise.prototype.isRejected = function() {\n    return this.getState() == 2;\n  };\n\n  Promise.prototype.getValue = function () {\n    if (this._y === 3) {\n      return this._z.getValue();\n    }\n\n    if (!this.isFulfilled()) {\n      throw new Error('Cannot get a value of an unfulfilled promise.');\n    }\n\n    return this._z;\n  };\n\n  Promise.prototype.getReason = function () {\n    if (this._y === 3) {\n      return this._z.getReason();\n    }\n\n    if (!this.isRejected()) {\n      throw new Error('Cannot get a rejection reason of a non-rejected promise.');\n    }\n\n    return this._z;\n  };\n\n  Promise.prototype.getState = function () {\n    if (this._y === 3) {\n      return this._z.getState();\n    }\n    if (this._y === -1 || this._y === -2) {\n      return 0;\n    }\n\n    return this._y;\n  };\n};\n\nPromise.disableSynchronous = function() {\n  Promise.prototype.isPending = undefined;\n  Promise.prototype.isFulfilled = undefined;\n  Promise.prototype.isRejected = undefined;\n  Promise.prototype.getValue = undefined;\n  Promise.prototype.getReason = undefined;\n  Promise.prototype.getState = undefined;\n};\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/promise/lib/synchronous.js?\n}");
1164
1165/***/ }),
1166
vendor: 9,347 bytes, lines 1167-1176
1167/***/ "./node_modules/vanilla-lazyload/dist/lazyload.min.js":
1168/*!************************************************************!*\
1169  !*** ./node_modules/vanilla-lazyload/dist/lazyload.min.js ***!
1170  \************************************************************/
1171/***/ (function(module) {
1172
1173eval("{!function(n,t){ true?module.exports=t():0}(this,(function(){\"use strict\";function n(){return n=Object.assign||function(n){for(var t=1;t<arguments.length;t++){var e=arguments[t];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(n[i]=e[i])}return n},n.apply(this,arguments)}var t=\"undefined\"!=typeof window,e=t&&!(\"onscroll\"in window)||\"undefined\"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),i=t&&\"IntersectionObserver\"in window,o=t&&\"classList\"in document.createElement(\"p\"),a=t&&window.devicePixelRatio>1,r={elements_selector:\".lazy\",container:e||t?document:null,threshold:300,thresholds:null,data_src:\"src\",data_srcset:\"srcset\",data_sizes:\"sizes\",data_bg:\"bg\",data_bg_hidpi:\"bg-hidpi\",data_bg_multi:\"bg-multi\",data_bg_multi_hidpi:\"bg-multi-hidpi\",data_bg_set:\"bg-set\",data_poster:\"poster\",class_applied:\"applied\",class_loading:\"loading\",class_loaded:\"loaded\",class_error:\"error\",class_entered:\"entered\",class_exited:\"exited\",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1,restore_on_error:!1},c=function(t){return n({},r,t)},l=function(n,t){var e,i=\"LazyLoad::Initialized\",o=new n(t);try{e=new CustomEvent(i,{detail:{instance:o}})}catch(n){(e=document.createEvent(\"CustomEvent\")).initCustomEvent(i,!1,!1,{instance:o})}window.dispatchEvent(e)},u=\"src\",s=\"srcset\",d=\"sizes\",f=\"poster\",_=\"llOriginalAttrs\",g=\"data\",v=\"loading\",b=\"loaded\",p=\"applied\",m=\"error\",h=\"native\",E=\"data-\",I=\"ll-status\",y=function(n,t){return n.getAttribute(E+t)},k=function(n){return y(n,I)},w=function(n,t){return function(n,t,e){var i=\"data-ll-status\";null!==e?n.setAttribute(i,e):n.removeAttribute(i)}(n,0,t)},A=function(n){return w(n,null)},L=function(n){return null===k(n)},O=function(n){return k(n)===h},x=[v,b,p,m],C=function(n,t,e,i){n&&\"function\"==typeof n&&(void 0===i?void 0===e?n(t):n(t,e):n(t,e,i))},N=function(n,t){\"\"!==t&&(o?n.classList.add(t):n.className+=(n.className?\" \":\"\")+t)},M=function(n,t){\"\"!==t&&(o?n.classList.remove(t):n.className=n.className.replace(new RegExp(\"(^|\\\\s+)\"+t+\"(\\\\s+|$)\"),\" \").replace(/^\\s+/,\"\").replace(/\\s+$/,\"\"))},z=function(n){return n.llTempImage},T=function(n,t){if(t){var e=t._observer;e&&e.unobserve(n)}},R=function(n,t){n&&(n.loadingCount+=t)},G=function(n,t){n&&(n.toLoadCount=t)},j=function(n){for(var t,e=[],i=0;t=n.children[i];i+=1)\"SOURCE\"===t.tagName&&e.push(t);return e},D=function(n,t){var e=n.parentNode;e&&\"PICTURE\"===e.tagName&&j(e).forEach(t)},H=function(n,t){j(n).forEach(t)},V=[u],F=[u,f],B=[u,s,d],J=[g],P=function(n){return!!n[_]},S=function(n){return n[_]},U=function(n){return delete n[_]},$=function(n,t){if(!P(n)){var e={};t.forEach((function(t){e[t]=n.getAttribute(t)})),n[_]=e}},q=function(n,t){if(P(n)){var e=S(n);t.forEach((function(t){!function(n,t,e){e?n.setAttribute(t,e):n.removeAttribute(t)}(n,t,e[t])}))}},K=function(n,t,e){N(n,t.class_applied),w(n,p),e&&(t.unobserve_completed&&T(n,t),C(t.callback_applied,n,e))},Q=function(n,t,e){N(n,t.class_loading),w(n,v),e&&(R(e,1),C(t.callback_loading,n,e))},W=function(n,t,e){e&&n.setAttribute(t,e)},X=function(n,t){W(n,d,y(n,t.data_sizes)),W(n,s,y(n,t.data_srcset)),W(n,u,y(n,t.data_src))},Y={IMG:function(n,t){D(n,(function(n){$(n,B),X(n,t)})),$(n,B),X(n,t)},IFRAME:function(n,t){$(n,V),W(n,u,y(n,t.data_src))},VIDEO:function(n,t){H(n,(function(n){$(n,V),W(n,u,y(n,t.data_src))})),$(n,F),W(n,f,y(n,t.data_poster)),W(n,u,y(n,t.data_src)),n.load()},OBJECT:function(n,t){$(n,J),W(n,g,y(n,t.data_src))}},Z=[\"IMG\",\"IFRAME\",\"VIDEO\",\"OBJECT\"],nn=function(n,t){!t||function(n){return n.loadingCount>0}(t)||function(n){return n.toLoadCount>0}(t)||C(n.callback_finish,t)},tn=function(n,t,e){n.addEventListener(t,e),n.llEvLisnrs[t]=e},en=function(n,t,e){n.removeEventListener(t,e)},on=function(n){return!!n.llEvLisnrs},an=function(n){if(on(n)){var t=n.llEvLisnrs;for(var e in t){var i=t[e];en(n,e,i)}delete n.llEvLisnrs}},rn=function(n,t,e){!function(n){delete n.llTempImage}(n),R(e,-1),function(n){n&&(n.toLoadCount-=1)}(e),M(n,t.class_loading),t.unobserve_completed&&T(n,e)},cn=function(n,t,e){var i=z(n)||n;on(i)||function(n,t,e){on(n)||(n.llEvLisnrs={});var i=\"VIDEO\"===n.tagName?\"loadeddata\":\"load\";tn(n,i,t),tn(n,\"error\",e)}(i,(function(o){!function(n,t,e,i){var o=O(t);rn(t,e,i),N(t,e.class_loaded),w(t,b),C(e.callback_loaded,t,i),o||nn(e,i)}(0,n,t,e),an(i)}),(function(o){!function(n,t,e,i){var o=O(t);rn(t,e,i),N(t,e.class_error),w(t,m),C(e.callback_error,t,i),e.restore_on_error&&q(t,B),o||nn(e,i)}(0,n,t,e),an(i)}))},ln=function(n,t,e){!function(n){return Z.indexOf(n.tagName)>-1}(n)?function(n,t,e){!function(n){n.llTempImage=document.createElement(\"IMG\")}(n),cn(n,t,e),function(n){P(n)||(n[_]={backgroundImage:n.style.backgroundImage})}(n),function(n,t,e){var i=y(n,t.data_bg),o=y(n,t.data_bg_hidpi),r=a&&o?o:i;r&&(n.style.backgroundImage='url(\"'.concat(r,'\")'),z(n).setAttribute(u,r),Q(n,t,e))}(n,t,e),function(n,t,e){var i=y(n,t.data_bg_multi),o=y(n,t.data_bg_multi_hidpi),r=a&&o?o:i;r&&(n.style.backgroundImage=r,K(n,t,e))}(n,t,e),function(n,t,e){var i=y(n,t.data_bg_set);if(i){var o=i.split(\"|\"),a=o.map((function(n){return\"image-set(\".concat(n,\")\")}));n.style.backgroundImage=a.join(),\"\"===n.style.backgroundImage&&(a=o.map((function(n){return\"-webkit-image-set(\".concat(n,\")\")})),n.style.backgroundImage=a.join()),K(n,t,e)}}(n,t,e)}(n,t,e):function(n,t,e){cn(n,t,e),function(n,t,e){var i=Y[n.tagName];i&&(i(n,t),Q(n,t,e))}(n,t,e)}(n,t,e)},un=function(n){n.removeAttribute(u),n.removeAttribute(s),n.removeAttribute(d)},sn=function(n){D(n,(function(n){q(n,B)})),q(n,B)},dn={IMG:sn,IFRAME:function(n){q(n,V)},VIDEO:function(n){H(n,(function(n){q(n,V)})),q(n,F),n.load()},OBJECT:function(n){q(n,J)}},fn=function(n,t){(function(n){var t=dn[n.tagName];t?t(n):function(n){if(P(n)){var t=S(n);n.style.backgroundImage=t.backgroundImage}}(n)})(n),function(n,t){L(n)||O(n)||(M(n,t.class_entered),M(n,t.class_exited),M(n,t.class_applied),M(n,t.class_loading),M(n,t.class_loaded),M(n,t.class_error))}(n,t),A(n),U(n)},_n=[\"IMG\",\"IFRAME\",\"VIDEO\"],gn=function(n){return n.use_native&&\"loading\"in HTMLImageElement.prototype},vn=function(n,t,e){n.forEach((function(n){return function(n){return n.isIntersecting||n.intersectionRatio>0}(n)?function(n,t,e,i){var o=function(n){return x.indexOf(k(n))>=0}(n);w(n,\"entered\"),N(n,e.class_entered),M(n,e.class_exited),function(n,t,e){t.unobserve_entered&&T(n,e)}(n,e,i),C(e.callback_enter,n,t,i),o||ln(n,e,i)}(n.target,n,t,e):function(n,t,e,i){L(n)||(N(n,e.class_exited),function(n,t,e,i){e.cancel_on_exit&&function(n){return k(n)===v}(n)&&\"IMG\"===n.tagName&&(an(n),function(n){D(n,(function(n){un(n)})),un(n)}(n),sn(n),M(n,e.class_loading),R(i,-1),A(n),C(e.callback_cancel,n,t,i))}(n,t,e,i),C(e.callback_exit,n,t,i))}(n.target,n,t,e)}))},bn=function(n){return Array.prototype.slice.call(n)},pn=function(n){return n.container.querySelectorAll(n.elements_selector)},mn=function(n){return function(n){return k(n)===m}(n)},hn=function(n,t){return function(n){return bn(n).filter(L)}(n||pn(t))},En=function(n,e){var o=c(n);this._settings=o,this.loadingCount=0,function(n,t){i&&!gn(n)&&(t._observer=new IntersectionObserver((function(e){vn(e,n,t)}),function(n){return{root:n.container===document?null:n.container,rootMargin:n.thresholds||n.threshold+\"px\"}}(n)))}(o,this),function(n,e){t&&(e._onlineHandler=function(){!function(n,t){var e;(e=pn(n),bn(e).filter(mn)).forEach((function(t){M(t,n.class_error),A(t)})),t.update()}(n,e)},window.addEventListener(\"online\",e._onlineHandler))}(o,this),this.update(e)};return En.prototype={update:function(n){var t,o,a=this._settings,r=hn(n,a);G(this,r.length),!e&&i?gn(a)?function(n,t,e){n.forEach((function(n){-1!==_n.indexOf(n.tagName)&&function(n,t,e){n.setAttribute(\"loading\",\"lazy\"),cn(n,t,e),function(n,t){var e=Y[n.tagName];e&&e(n,t)}(n,t),w(n,h)}(n,t,e)})),G(e,0)}(r,a,this):(o=r,function(n){n.disconnect()}(t=this._observer),function(n,t){t.forEach((function(t){n.observe(t)}))}(t,o)):this.loadAll(r)},destroy:function(){this._observer&&this._observer.disconnect(),t&&window.removeEventListener(\"online\",this._onlineHandler),pn(this._settings).forEach((function(n){U(n)})),delete this._observer,delete this._settings,delete this._onlineHandler,delete this.loadingCount,delete this.toLoadCount},loadAll:function(n){var t=this,e=this._settings;hn(n,e).forEach((function(n){T(n,t),ln(n,e,t)}))},restoreAll:function(){var n=this._settings;pn(n).forEach((function(t){fn(t,n)}))}},En.load=function(n,t){var e=c(t);ln(n,e)},En.resetStatus=function(n){A(n)},t&&function(n,t){if(t)if(t.length)for(var e,i=0;e=t[i];i+=1)l(n,e);else l(n,t)}(En,window.lazyLoadOptions),En}));\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/vanilla-lazyload/dist/lazyload.min.js?\n}");
1174
1175/***/ }),
1176
vendor: 2,932 bytes, lines 1177-1187
1177/***/ "./node_modules/check-password-strength/dist/index.mjs":
1178/*!*************************************************************!*\
1179  !*** ./node_modules/check-password-strength/dist/index.mjs ***!
1180  \*************************************************************/
1181/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1182
1183"use strict";
1184eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   passwordStrength: function() { return /* binding */ passwordStrength_1; }\n/* harmony export */ });\n/* unused harmony exports default, defaultOptions */\nfunction getDefaultExportFromCjs (x) {\r\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\r\n}\r\n\r\nvar src = {exports: {}};\r\n\r\nconst defaultOptions = [\r\n  {\r\n    id: 0,\r\n    value: \"Too weak\",\r\n    minDiversity: 0,\r\n    minLength: 0\r\n  },\r\n  {\r\n    id: 1,\r\n    value: \"Weak\",\r\n    minDiversity: 2,\r\n    minLength: 6\r\n  },\r\n  {\r\n    id: 2,\r\n    value: \"Medium\",\r\n    minDiversity: 4,\r\n    minLength: 8\r\n  },\r\n  {\r\n    id: 3,\r\n    value: \"Strong\",\r\n    minDiversity: 4,\r\n    minLength: 10\r\n  }\r\n];\r\n\r\nconst passwordStrength = (password, options = defaultOptions, allowedSymbols = \"!\\\"#\\$%&'\\(\\)\\*\\+,-\\./:;<=>\\?@\\[\\\\\\\\\\\\]\\^_`\\{|\\}~\") => {\r\n\r\n  let passwordCopy = password || '';\r\n\r\n  options[0].minDiversity = 0,\r\n    options[0].minLength = 0;\r\n\r\n  const rules = [\r\n    {\r\n      regex: \"[a-z]\",\r\n      message: 'lowercase'\r\n    },\r\n    {\r\n      regex: '[A-Z]',\r\n      message: 'uppercase'\r\n    },\r\n    {\r\n      regex: '[0-9]',\r\n      message: 'number'\r\n    },\r\n  ];\r\n\r\n  if (allowedSymbols) {\r\n    rules.push({\r\n      regex: `[${allowedSymbols}]`,\r\n      message: 'symbol'\r\n    });\r\n  }\r\n\r\n  let strength = {};\r\n\r\n  strength.contains = rules\r\n    .filter(rule => new RegExp(`${rule.regex}`).test(passwordCopy))\r\n    .map(rule => rule.message);\r\n\r\n  strength.length = passwordCopy.length;\r\n\r\n  let fulfilledOptions = options\r\n    .filter(option => strength.contains.length >= option.minDiversity)\r\n    .filter(option => strength.length >= option.minLength)\r\n    .sort((o1, o2) => o2.id - o1.id)\r\n    .map(option => ({ id: option.id, value: option.value }));\r\n\r\n  Object.assign(strength, fulfilledOptions[0]);\r\n\r\n  return strength;\r\n};\r\n\r\nsrc.exports = { passwordStrength, defaultOptions };\r\nvar passwordStrength_1 = src.exports.passwordStrength = passwordStrength;\r\nvar defaultOptions_1 = src.exports.defaultOptions = defaultOptions;\r\n\r\nvar srcExports = src.exports;\r\nvar index = /*@__PURE__*/getDefaultExportFromCjs(srcExports);\r\n\r\n\r\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/check-password-strength/dist/index.mjs?\n}");
1185
1186/***/ }),
1187
vendor: 40,944 bytes, lines 1188-1198
1188/***/ "./node_modules/dom7/dom7.esm.js":
1189/*!***************************************!*\
1190  !*** ./node_modules/dom7/dom7.esm.js ***!
1191  \***************************************/
1192/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1193
1194"use strict";
1195eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   $: function() { return /* binding */ $; },\n/* harmony export */   addClass: function() { return /* binding */ addClass; },\n/* harmony export */   append: function() { return /* binding */ append; },\n/* harmony export */   attr: function() { return /* binding */ attr; },\n/* harmony export */   children: function() { return /* binding */ children; },\n/* harmony export */   closest: function() { return /* binding */ closest; },\n/* harmony export */   css: function() { return /* binding */ css; },\n/* harmony export */   each: function() { return /* binding */ each; },\n/* harmony export */   eq: function() { return /* binding */ eq; },\n/* harmony export */   filter: function() { return /* binding */ filter; },\n/* harmony export */   find: function() { return /* binding */ find; },\n/* harmony export */   hasClass: function() { return /* binding */ hasClass; },\n/* harmony export */   html: function() { return /* binding */ html; },\n/* harmony export */   index: function() { return /* binding */ index; },\n/* harmony export */   is: function() { return /* binding */ is; },\n/* harmony export */   next: function() { return /* binding */ next; },\n/* harmony export */   nextAll: function() { return /* binding */ nextAll; },\n/* harmony export */   off: function() { return /* binding */ off; },\n/* harmony export */   offset: function() { return /* binding */ offset; },\n/* harmony export */   on: function() { return /* binding */ on; },\n/* harmony export */   outerHeight: function() { return /* binding */ outerHeight; },\n/* harmony export */   outerWidth: function() { return /* binding */ outerWidth; },\n/* harmony export */   parent: function() { return /* binding */ parent; },\n/* harmony export */   parents: function() { return /* binding */ parents; },\n/* harmony export */   prepend: function() { return /* binding */ prepend; },\n/* harmony export */   prev: function() { return /* binding */ prev; },\n/* harmony export */   prevAll: function() { return /* binding */ prevAll; },\n/* harmony export */   remove: function() { return /* binding */ remove; },\n/* harmony export */   removeAttr: function() { return /* binding */ removeAttr; },\n/* harmony export */   removeClass: function() { return /* binding */ removeClass; },\n/* harmony export */   styles: function() { return /* binding */ styles; },\n/* harmony export */   text: function() { return /* binding */ text; },\n/* harmony export */   toggleClass: function() { return /* binding */ toggleClass; },\n/* harmony export */   transform: function() { return /* binding */ transform; },\n/* harmony export */   transition: function() { return /* binding */ transition; },\n/* harmony export */   transitionEnd: function() { return /* binding */ transitionEnd; },\n/* harmony export */   trigger: function() { return /* binding */ trigger; }\n/* harmony export */ });\n/* unused harmony exports add, animate, animationEnd, appendTo, blur, change, click, data, dataset, detach, empty, focus, focusin, focusout, height, hide, insertAfter, insertBefore, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, once, prependTo, prop, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, submit, touchend, touchmove, touchstart, transitionStart, val, value, width */\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/**\n * Dom7 4.0.6\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * https://framework7.io/docs/dom7.html\n *\n * Copyright 2023, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: February 2, 2023\n */\n\n\n/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n  const proto = obj.__proto__;\n  Object.defineProperty(obj, '__proto__', {\n    get() {\n      return proto;\n    },\n\n    set(value) {\n      proto.__proto__ = value;\n    }\n\n  });\n}\n\nclass Dom7 extends Array {\n  constructor(items) {\n    if (typeof items === 'number') {\n      super(items);\n    } else {\n      super(...(items || []));\n      makeReactive(this);\n    }\n  }\n\n}\n\nfunction arrayFlat(arr = []) {\n  const res = [];\n  arr.forEach(el => {\n    if (Array.isArray(el)) {\n      res.push(...arrayFlat(el));\n    } else {\n      res.push(el);\n    }\n  });\n  return res;\n}\nfunction arrayFilter(arr, callback) {\n  return Array.prototype.filter.call(arr, callback);\n}\nfunction arrayUnique(arr) {\n  const uniqueArray = [];\n\n  for (let i = 0; i < arr.length; i += 1) {\n    if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n  }\n\n  return uniqueArray;\n}\nfunction toCamelCase(string) {\n  return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n\n// eslint-disable-next-line\n\nfunction qsa(selector, context) {\n  if (typeof selector !== 'string') {\n    return [selector];\n  }\n\n  const a = [];\n  const res = context.querySelectorAll(selector);\n\n  for (let i = 0; i < res.length; i += 1) {\n    a.push(res[i]);\n  }\n\n  return a;\n}\n\nfunction $(selector, context) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  let arr = [];\n\n  if (!context && selector instanceof Dom7) {\n    return selector;\n  }\n\n  if (!selector) {\n    return new Dom7(arr);\n  }\n\n  if (typeof selector === 'string') {\n    const html = selector.trim();\n\n    if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n      let toCreate = 'div';\n      if (html.indexOf('<li') === 0) toCreate = 'ul';\n      if (html.indexOf('<tr') === 0) toCreate = 'tbody';\n      if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr';\n      if (html.indexOf('<tbody') === 0) toCreate = 'table';\n      if (html.indexOf('<option') === 0) toCreate = 'select';\n      const tempParent = document.createElement(toCreate);\n      tempParent.innerHTML = html;\n\n      for (let i = 0; i < tempParent.childNodes.length; i += 1) {\n        arr.push(tempParent.childNodes[i]);\n      }\n    } else {\n      arr = qsa(selector.trim(), context || document);\n    } // arr = qsa(selector, document);\n\n  } else if (selector.nodeType || selector === window || selector === document) {\n    arr.push(selector);\n  } else if (Array.isArray(selector)) {\n    if (selector instanceof Dom7) return selector;\n    arr = selector;\n  }\n\n  return new Dom7(arrayUnique(arr));\n}\n\n$.fn = Dom7.prototype;\n\n// eslint-disable-next-line\n\nfunction addClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    el.classList.add(...classNames);\n  });\n  return this;\n}\n\nfunction removeClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    el.classList.remove(...classNames);\n  });\n  return this;\n}\n\nfunction toggleClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    classNames.forEach(className => {\n      el.classList.toggle(className);\n    });\n  });\n}\n\nfunction hasClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  return arrayFilter(this, el => {\n    return classNames.filter(className => el.classList.contains(className)).length > 0;\n  }).length > 0;\n}\n\nfunction attr(attrs, value) {\n  if (arguments.length === 1 && typeof attrs === 'string') {\n    // Get attr\n    if (this[0]) return this[0].getAttribute(attrs);\n    return undefined;\n  } // Set attrs\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (arguments.length === 2) {\n      // String\n      this[i].setAttribute(attrs, value);\n    } else {\n      // Object\n      for (const attrName in attrs) {\n        this[i][attrName] = attrs[attrName];\n        this[i].setAttribute(attrName, attrs[attrName]);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction removeAttr(attr) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].removeAttribute(attr);\n  }\n\n  return this;\n}\n\nfunction prop(props, value) {\n  if (arguments.length === 1 && typeof props === 'string') {\n    // Get prop\n    if (this[0]) return this[0][props];\n  } else {\n    // Set props\n    for (let i = 0; i < this.length; i += 1) {\n      if (arguments.length === 2) {\n        // String\n        this[i][props] = value;\n      } else {\n        // Object\n        for (const propName in props) {\n          this[i][propName] = props[propName];\n        }\n      }\n    }\n\n    return this;\n  }\n\n  return this;\n}\n\nfunction data(key, value) {\n  let el;\n\n  if (typeof value === 'undefined') {\n    el = this[0];\n    if (!el) return undefined; // Get value\n\n    if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n      return el.dom7ElementDataStorage[key];\n    }\n\n    const dataKey = el.getAttribute(`data-${key}`);\n\n    if (dataKey) {\n      return dataKey;\n    }\n\n    return undefined;\n  } // Set value\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    el = this[i];\n    if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n    el.dom7ElementDataStorage[key] = value;\n  }\n\n  return this;\n}\n\nfunction removeData(key) {\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n      el.dom7ElementDataStorage[key] = null;\n      delete el.dom7ElementDataStorage[key];\n    }\n  }\n}\n\nfunction dataset() {\n  const el = this[0];\n  if (!el) return undefined;\n  const dataset = {}; // eslint-disable-line\n\n  if (el.dataset) {\n    for (const dataKey in el.dataset) {\n      dataset[dataKey] = el.dataset[dataKey];\n    }\n  } else {\n    for (let i = 0; i < el.attributes.length; i += 1) {\n      const attr = el.attributes[i];\n\n      if (attr.name.indexOf('data-') >= 0) {\n        dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n      }\n    }\n  }\n\n  for (const key in dataset) {\n    if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n  }\n\n  return dataset;\n}\n\nfunction val(value) {\n  if (typeof value === 'undefined') {\n    // get value\n    const el = this[0];\n    if (!el) return undefined;\n\n    if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n      const values = [];\n\n      for (let i = 0; i < el.selectedOptions.length; i += 1) {\n        values.push(el.selectedOptions[i].value);\n      }\n\n      return values;\n    }\n\n    return el.value;\n  } // set value\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {\n      for (let j = 0; j < el.options.length; j += 1) {\n        el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n      }\n    } else {\n      el.value = value;\n    }\n  }\n\n  return this;\n}\n\nfunction value(value) {\n  return this.val(value);\n}\n\nfunction transform(transform) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.transform = transform;\n  }\n\n  return this;\n}\n\nfunction transition(duration) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration;\n  }\n\n  return this;\n}\n\nfunction on(...args) {\n  let [eventType, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventType, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  if (!capture) capture = false;\n\n  function handleLiveEvent(e) {\n    const target = e.target;\n    if (!target) return;\n    const eventData = e.target.dom7EventData || [];\n\n    if (eventData.indexOf(e) < 0) {\n      eventData.unshift(e);\n    }\n\n    if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n      const parents = $(target).parents(); // eslint-disable-line\n\n      for (let k = 0; k < parents.length; k += 1) {\n        if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData);\n      }\n    }\n  }\n\n  function handleEvent(e) {\n    const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n    if (eventData.indexOf(e) < 0) {\n      eventData.unshift(e);\n    }\n\n    listener.apply(this, eventData);\n  }\n\n  const events = eventType.split(' ');\n  let j;\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (!targetSelector) {\n      for (j = 0; j < events.length; j += 1) {\n        const event = events[j];\n        if (!el.dom7Listeners) el.dom7Listeners = {};\n        if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n        el.dom7Listeners[event].push({\n          listener,\n          proxyListener: handleEvent\n        });\n        el.addEventListener(event, handleEvent, capture);\n      }\n    } else {\n      // Live events\n      for (j = 0; j < events.length; j += 1) {\n        const event = events[j];\n        if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n        if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n        el.dom7LiveListeners[event].push({\n          listener,\n          proxyListener: handleLiveEvent\n        });\n        el.addEventListener(event, handleLiveEvent, capture);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction off(...args) {\n  let [eventType, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventType, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  if (!capture) capture = false;\n  const events = eventType.split(' ');\n\n  for (let i = 0; i < events.length; i += 1) {\n    const event = events[i];\n\n    for (let j = 0; j < this.length; j += 1) {\n      const el = this[j];\n      let handlers;\n\n      if (!targetSelector && el.dom7Listeners) {\n        handlers = el.dom7Listeners[event];\n      } else if (targetSelector && el.dom7LiveListeners) {\n        handlers = el.dom7LiveListeners[event];\n      }\n\n      if (handlers && handlers.length) {\n        for (let k = handlers.length - 1; k >= 0; k -= 1) {\n          const handler = handlers[k];\n\n          if (listener && handler.listener === listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          } else if (!listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          }\n        }\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction once(...args) {\n  const dom = this;\n  let [eventName, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventName, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  function onceHandler(...eventArgs) {\n    listener.apply(this, eventArgs);\n    dom.off(eventName, targetSelector, onceHandler, capture);\n\n    if (onceHandler.dom7proxy) {\n      delete onceHandler.dom7proxy;\n    }\n  }\n\n  onceHandler.dom7proxy = listener;\n  return dom.on(eventName, targetSelector, onceHandler, capture);\n}\n\nfunction trigger(...args) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  const events = args[0].split(' ');\n  const eventData = args[1];\n\n  for (let i = 0; i < events.length; i += 1) {\n    const event = events[i];\n\n    for (let j = 0; j < this.length; j += 1) {\n      const el = this[j];\n\n      if (window.CustomEvent) {\n        const evt = new window.CustomEvent(event, {\n          detail: eventData,\n          bubbles: true,\n          cancelable: true\n        });\n        el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n        el.dispatchEvent(evt);\n        el.dom7EventData = [];\n        delete el.dom7EventData;\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction transitionStart(callback) {\n  const dom = this;\n\n  function fireCallBack(e) {\n    if (e.target !== this) return;\n    callback.call(this, e);\n    dom.off('transitionstart', fireCallBack);\n  }\n\n  if (callback) {\n    dom.on('transitionstart', fireCallBack);\n  }\n\n  return this;\n}\n\nfunction transitionEnd(callback) {\n  const dom = this;\n\n  function fireCallBack(e) {\n    if (e.target !== this) return;\n    callback.call(this, e);\n    dom.off('transitionend', fireCallBack);\n  }\n\n  if (callback) {\n    dom.on('transitionend', fireCallBack);\n  }\n\n  return this;\n}\n\nfunction animationEnd(callback) {\n  const dom = this;\n\n  function fireCallBack(e) {\n    if (e.target !== this) return;\n    callback.call(this, e);\n    dom.off('animationend', fireCallBack);\n  }\n\n  if (callback) {\n    dom.on('animationend', fireCallBack);\n  }\n\n  return this;\n}\n\nfunction width() {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n\n  if (this[0] === window) {\n    return window.innerWidth;\n  }\n\n  if (this.length > 0) {\n    return parseFloat(this.css('width'));\n  }\n\n  return null;\n}\n\nfunction outerWidth(includeMargins) {\n  if (this.length > 0) {\n    if (includeMargins) {\n      const styles = this.styles();\n      return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n    }\n\n    return this[0].offsetWidth;\n  }\n\n  return null;\n}\n\nfunction height() {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n\n  if (this[0] === window) {\n    return window.innerHeight;\n  }\n\n  if (this.length > 0) {\n    return parseFloat(this.css('height'));\n  }\n\n  return null;\n}\n\nfunction outerHeight(includeMargins) {\n  if (this.length > 0) {\n    if (includeMargins) {\n      const styles = this.styles();\n      return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n    }\n\n    return this[0].offsetHeight;\n  }\n\n  return null;\n}\n\nfunction offset() {\n  if (this.length > 0) {\n    const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n    const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n    const el = this[0];\n    const box = el.getBoundingClientRect();\n    const body = document.body;\n    const clientTop = el.clientTop || body.clientTop || 0;\n    const clientLeft = el.clientLeft || body.clientLeft || 0;\n    const scrollTop = el === window ? window.scrollY : el.scrollTop;\n    const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n    return {\n      top: box.top + scrollTop - clientTop,\n      left: box.left + scrollLeft - clientLeft\n    };\n  }\n\n  return null;\n}\n\nfunction hide() {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.display = 'none';\n  }\n\n  return this;\n}\n\nfunction show() {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.style.display === 'none') {\n      el.style.display = '';\n    }\n\n    if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n      // Still not visible\n      el.style.display = 'block';\n    }\n  }\n\n  return this;\n}\n\nfunction styles() {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  if (this[0]) return window.getComputedStyle(this[0], null);\n  return {};\n}\n\nfunction css(props, value) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  let i;\n\n  if (arguments.length === 1) {\n    if (typeof props === 'string') {\n      // .css('width')\n      if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n    } else {\n      // .css({ width: '100px' })\n      for (i = 0; i < this.length; i += 1) {\n        for (const prop in props) {\n          this[i].style[prop] = props[prop];\n        }\n      }\n\n      return this;\n    }\n  }\n\n  if (arguments.length === 2 && typeof props === 'string') {\n    // .css('width', '100px')\n    for (i = 0; i < this.length; i += 1) {\n      this[i].style[props] = value;\n    }\n\n    return this;\n  }\n\n  return this;\n}\n\nfunction each(callback) {\n  if (!callback) return this;\n  this.forEach((el, index) => {\n    callback.apply(el, [el, index]);\n  });\n  return this;\n}\n\nfunction filter(callback) {\n  const result = arrayFilter(this, callback);\n  return $(result);\n}\n\nfunction html(html) {\n  if (typeof html === 'undefined') {\n    return this[0] ? this[0].innerHTML : null;\n  }\n\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].innerHTML = html;\n  }\n\n  return this;\n}\n\nfunction text(text) {\n  if (typeof text === 'undefined') {\n    return this[0] ? this[0].textContent.trim() : null;\n  }\n\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].textContent = text;\n  }\n\n  return this;\n}\n\nfunction is(selector) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  const el = this[0];\n  let compareWith;\n  let i;\n  if (!el || typeof selector === 'undefined') return false;\n\n  if (typeof selector === 'string') {\n    if (el.matches) return el.matches(selector);\n    if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n    if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n    compareWith = $(selector);\n\n    for (i = 0; i < compareWith.length; i += 1) {\n      if (compareWith[i] === el) return true;\n    }\n\n    return false;\n  }\n\n  if (selector === document) {\n    return el === document;\n  }\n\n  if (selector === window) {\n    return el === window;\n  }\n\n  if (selector.nodeType || selector instanceof Dom7) {\n    compareWith = selector.nodeType ? [selector] : selector;\n\n    for (i = 0; i < compareWith.length; i += 1) {\n      if (compareWith[i] === el) return true;\n    }\n\n    return false;\n  }\n\n  return false;\n}\n\nfunction index() {\n  let child = this[0];\n  let i;\n\n  if (child) {\n    i = 0; // eslint-disable-next-line\n\n    while ((child = child.previousSibling) !== null) {\n      if (child.nodeType === 1) i += 1;\n    }\n\n    return i;\n  }\n\n  return undefined;\n}\n\nfunction eq(index) {\n  if (typeof index === 'undefined') return this;\n  const length = this.length;\n\n  if (index > length - 1) {\n    return $([]);\n  }\n\n  if (index < 0) {\n    const returnIndex = length + index;\n    if (returnIndex < 0) return $([]);\n    return $([this[returnIndex]]);\n  }\n\n  return $([this[index]]);\n}\n\nfunction append(...els) {\n  let newChild;\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n\n  for (let k = 0; k < els.length; k += 1) {\n    newChild = els[k];\n\n    for (let i = 0; i < this.length; i += 1) {\n      if (typeof newChild === 'string') {\n        const tempDiv = document.createElement('div');\n        tempDiv.innerHTML = newChild;\n\n        while (tempDiv.firstChild) {\n          this[i].appendChild(tempDiv.firstChild);\n        }\n      } else if (newChild instanceof Dom7) {\n        for (let j = 0; j < newChild.length; j += 1) {\n          this[i].appendChild(newChild[j]);\n        }\n      } else {\n        this[i].appendChild(newChild);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction appendTo(parent) {\n  $(parent).append(this);\n  return this;\n}\n\nfunction prepend(newChild) {\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  let i;\n  let j;\n\n  for (i = 0; i < this.length; i += 1) {\n    if (typeof newChild === 'string') {\n      const tempDiv = document.createElement('div');\n      tempDiv.innerHTML = newChild;\n\n      for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n        this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n      }\n    } else if (newChild instanceof Dom7) {\n      for (j = 0; j < newChild.length; j += 1) {\n        this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n      }\n    } else {\n      this[i].insertBefore(newChild, this[i].childNodes[0]);\n    }\n  }\n\n  return this;\n}\n\nfunction prependTo(parent) {\n  $(parent).prepend(this);\n  return this;\n}\n\nfunction insertBefore(selector) {\n  const before = $(selector);\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (before.length === 1) {\n      before[0].parentNode.insertBefore(this[i], before[0]);\n    } else if (before.length > 1) {\n      for (let j = 0; j < before.length; j += 1) {\n        before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n      }\n    }\n  }\n}\n\nfunction insertAfter(selector) {\n  const after = $(selector);\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (after.length === 1) {\n      after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n    } else if (after.length > 1) {\n      for (let j = 0; j < after.length; j += 1) {\n        after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n      }\n    }\n  }\n}\n\nfunction next(selector) {\n  if (this.length > 0) {\n    if (selector) {\n      if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n        return $([this[0].nextElementSibling]);\n      }\n\n      return $([]);\n    }\n\n    if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n    return $([]);\n  }\n\n  return $([]);\n}\n\nfunction nextAll(selector) {\n  const nextEls = [];\n  let el = this[0];\n  if (!el) return $([]);\n\n  while (el.nextElementSibling) {\n    const next = el.nextElementSibling; // eslint-disable-line\n\n    if (selector) {\n      if ($(next).is(selector)) nextEls.push(next);\n    } else nextEls.push(next);\n\n    el = next;\n  }\n\n  return $(nextEls);\n}\n\nfunction prev(selector) {\n  if (this.length > 0) {\n    const el = this[0];\n\n    if (selector) {\n      if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n        return $([el.previousElementSibling]);\n      }\n\n      return $([]);\n    }\n\n    if (el.previousElementSibling) return $([el.previousElementSibling]);\n    return $([]);\n  }\n\n  return $([]);\n}\n\nfunction prevAll(selector) {\n  const prevEls = [];\n  let el = this[0];\n  if (!el) return $([]);\n\n  while (el.previousElementSibling) {\n    const prev = el.previousElementSibling; // eslint-disable-line\n\n    if (selector) {\n      if ($(prev).is(selector)) prevEls.push(prev);\n    } else prevEls.push(prev);\n\n    el = prev;\n  }\n\n  return $(prevEls);\n}\n\nfunction siblings(selector) {\n  return this.nextAll(selector).add(this.prevAll(selector));\n}\n\nfunction parent(selector) {\n  const parents = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (this[i].parentNode !== null) {\n      if (selector) {\n        if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n      } else {\n        parents.push(this[i].parentNode);\n      }\n    }\n  }\n\n  return $(parents);\n}\n\nfunction parents(selector) {\n  const parents = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    let parent = this[i].parentNode; // eslint-disable-line\n\n    while (parent) {\n      if (selector) {\n        if ($(parent).is(selector)) parents.push(parent);\n      } else {\n        parents.push(parent);\n      }\n\n      parent = parent.parentNode;\n    }\n  }\n\n  return $(parents);\n}\n\nfunction closest(selector) {\n  let closest = this; // eslint-disable-line\n\n  if (typeof selector === 'undefined') {\n    return $([]);\n  }\n\n  if (!closest.is(selector)) {\n    closest = closest.parents(selector).eq(0);\n  }\n\n  return closest;\n}\n\nfunction find(selector) {\n  const foundElements = [];\n\n  for (let i = 0; i < this.length; i += 1) {\n    const found = this[i].querySelectorAll(selector);\n\n    for (let j = 0; j < found.length; j += 1) {\n      foundElements.push(found[j]);\n    }\n  }\n\n  return $(foundElements);\n}\n\nfunction children(selector) {\n  const children = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    const childNodes = this[i].children;\n\n    for (let j = 0; j < childNodes.length; j += 1) {\n      if (!selector || $(childNodes[j]).is(selector)) {\n        children.push(childNodes[j]);\n      }\n    }\n  }\n\n  return $(children);\n}\n\nfunction remove() {\n  for (let i = 0; i < this.length; i += 1) {\n    if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n  }\n\n  return this;\n}\n\nfunction detach() {\n  return this.remove();\n}\n\nfunction add(...els) {\n  const dom = this;\n  let i;\n  let j;\n\n  for (i = 0; i < els.length; i += 1) {\n    const toAdd = $(els[i]);\n\n    for (j = 0; j < toAdd.length; j += 1) {\n      dom.push(toAdd[j]);\n    }\n  }\n\n  return dom;\n}\n\nfunction empty() {\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.nodeType === 1) {\n      for (let j = 0; j < el.childNodes.length; j += 1) {\n        if (el.childNodes[j].parentNode) {\n          el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n        }\n      }\n\n      el.textContent = '';\n    }\n  }\n\n  return this;\n}\n\n// eslint-disable-next-line\n\nfunction scrollTo(...args) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  let [left, top, duration, easing, callback] = args;\n\n  if (args.length === 4 && typeof easing === 'function') {\n    callback = easing;\n    [left, top, duration, callback, easing] = args;\n  }\n\n  if (typeof easing === 'undefined') easing = 'swing';\n  return this.each(function animate() {\n    const el = this;\n    let currentTop;\n    let currentLeft;\n    let maxTop;\n    let maxLeft;\n    let newTop;\n    let newLeft;\n    let scrollTop; // eslint-disable-line\n\n    let scrollLeft; // eslint-disable-line\n\n    let animateTop = top > 0 || top === 0;\n    let animateLeft = left > 0 || left === 0;\n\n    if (typeof easing === 'undefined') {\n      easing = 'swing';\n    }\n\n    if (animateTop) {\n      currentTop = el.scrollTop;\n\n      if (!duration) {\n        el.scrollTop = top;\n      }\n    }\n\n    if (animateLeft) {\n      currentLeft = el.scrollLeft;\n\n      if (!duration) {\n        el.scrollLeft = left;\n      }\n    }\n\n    if (!duration) return;\n\n    if (animateTop) {\n      maxTop = el.scrollHeight - el.offsetHeight;\n      newTop = Math.max(Math.min(top, maxTop), 0);\n    }\n\n    if (animateLeft) {\n      maxLeft = el.scrollWidth - el.offsetWidth;\n      newLeft = Math.max(Math.min(left, maxLeft), 0);\n    }\n\n    let startTime = null;\n    if (animateTop && newTop === currentTop) animateTop = false;\n    if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n    function render(time = new Date().getTime()) {\n      if (startTime === null) {\n        startTime = time;\n      }\n\n      const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n      const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n      let done;\n      if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n      if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n      if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n        el.scrollTop = newTop;\n        done = true;\n      }\n\n      if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n        el.scrollTop = newTop;\n        done = true;\n      }\n\n      if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n        el.scrollLeft = newLeft;\n        done = true;\n      }\n\n      if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n        el.scrollLeft = newLeft;\n        done = true;\n      }\n\n      if (done) {\n        if (callback) callback();\n        return;\n      }\n\n      if (animateTop) el.scrollTop = scrollTop;\n      if (animateLeft) el.scrollLeft = scrollLeft;\n      window.requestAnimationFrame(render);\n    }\n\n    window.requestAnimationFrame(render);\n  });\n} // scrollTop(top, duration, easing, callback) {\n\n\nfunction scrollTop(...args) {\n  let [top, duration, easing, callback] = args;\n\n  if (args.length === 3 && typeof easing === 'function') {\n    [top, duration, callback, easing] = args;\n  }\n\n  const dom = this;\n\n  if (typeof top === 'undefined') {\n    if (dom.length > 0) return dom[0].scrollTop;\n    return null;\n  }\n\n  return dom.scrollTo(undefined, top, duration, easing, callback);\n}\n\nfunction scrollLeft(...args) {\n  let [left, duration, easing, callback] = args;\n\n  if (args.length === 3 && typeof easing === 'function') {\n    [left, duration, callback, easing] = args;\n  }\n\n  const dom = this;\n\n  if (typeof left === 'undefined') {\n    if (dom.length > 0) return dom[0].scrollLeft;\n    return null;\n  }\n\n  return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\n// eslint-disable-next-line\n\nfunction animate(initialProps, initialParams) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  const els = this;\n  const a = {\n    props: Object.assign({}, initialProps),\n    params: Object.assign({\n      duration: 300,\n      easing: 'swing' // or 'linear'\n\n      /* Callbacks\n      begin(elements)\n      complete(elements)\n      progress(elements, complete, remaining, start, tweenValue)\n      */\n\n    }, initialParams),\n    elements: els,\n    animating: false,\n    que: [],\n\n    easingProgress(easing, progress) {\n      if (easing === 'swing') {\n        return 0.5 - Math.cos(progress * Math.PI) / 2;\n      }\n\n      if (typeof easing === 'function') {\n        return easing(progress);\n      }\n\n      return progress;\n    },\n\n    stop() {\n      if (a.frameId) {\n        window.cancelAnimationFrame(a.frameId);\n      }\n\n      a.animating = false;\n      a.elements.each(el => {\n        const element = el;\n        delete element.dom7AnimateInstance;\n      });\n      a.que = [];\n    },\n\n    done(complete) {\n      a.animating = false;\n      a.elements.each(el => {\n        const element = el;\n        delete element.dom7AnimateInstance;\n      });\n      if (complete) complete(els);\n\n      if (a.que.length > 0) {\n        const que = a.que.shift();\n        a.animate(que[0], que[1]);\n      }\n    },\n\n    animate(props, params) {\n      if (a.animating) {\n        a.que.push([props, params]);\n        return a;\n      }\n\n      const elements = []; // Define & Cache Initials & Units\n\n      a.elements.each((el, index) => {\n        let initialFullValue;\n        let initialValue;\n        let unit;\n        let finalValue;\n        let finalFullValue;\n        if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n        elements[index] = {\n          container: el\n        };\n        Object.keys(props).forEach(prop => {\n          initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n          initialValue = parseFloat(initialFullValue);\n          unit = initialFullValue.replace(initialValue, '');\n          finalValue = parseFloat(props[prop]);\n          finalFullValue = props[prop] + unit;\n          elements[index][prop] = {\n            initialFullValue,\n            initialValue,\n            unit,\n            finalValue,\n            finalFullValue,\n            currentValue: initialValue\n          };\n        });\n      });\n      let startTime = null;\n      let time;\n      let elementsDone = 0;\n      let propsDone = 0;\n      let done;\n      let began = false;\n      a.animating = true;\n\n      function render() {\n        time = new Date().getTime();\n        let progress;\n        let easeProgress; // let el;\n\n        if (!began) {\n          began = true;\n          if (params.begin) params.begin(els);\n        }\n\n        if (startTime === null) {\n          startTime = time;\n        }\n\n        if (params.progress) {\n          // eslint-disable-next-line\n          params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n        }\n\n        elements.forEach(element => {\n          const el = element;\n          if (done || el.done) return;\n          Object.keys(props).forEach(prop => {\n            if (done || el.done) return;\n            progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n            easeProgress = a.easingProgress(params.easing, progress);\n            const {\n              initialValue,\n              finalValue,\n              unit\n            } = el[prop];\n            el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n            const currentValue = el[prop].currentValue;\n\n            if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n              el.container.style[prop] = finalValue + unit;\n              propsDone += 1;\n\n              if (propsDone === Object.keys(props).length) {\n                el.done = true;\n                elementsDone += 1;\n              }\n\n              if (elementsDone === elements.length) {\n                done = true;\n              }\n            }\n\n            if (done) {\n              a.done(params.complete);\n              return;\n            }\n\n            el.container.style[prop] = currentValue + unit;\n          });\n        });\n        if (done) return; // Then call\n\n        a.frameId = window.requestAnimationFrame(render);\n      }\n\n      a.frameId = window.requestAnimationFrame(render);\n      return a;\n    }\n\n  };\n\n  if (a.elements.length === 0) {\n    return els;\n  }\n\n  let animateInstance;\n\n  for (let i = 0; i < a.elements.length; i += 1) {\n    if (a.elements[i].dom7AnimateInstance) {\n      animateInstance = a.elements[i].dom7AnimateInstance;\n    } else a.elements[i].dom7AnimateInstance = a;\n  }\n\n  if (!animateInstance) {\n    animateInstance = a;\n  }\n\n  if (initialProps === 'stop') {\n    animateInstance.stop();\n  } else {\n    animateInstance.animate(a.props, a.params);\n  }\n\n  return els;\n}\n\nfunction stop() {\n  const els = this;\n\n  for (let i = 0; i < els.length; i += 1) {\n    if (els[i].dom7AnimateInstance) {\n      els[i].dom7AnimateInstance.stop();\n    }\n  }\n}\n\nconst noTrigger = 'resize scroll'.split(' ');\n\nfunction shortcut(name) {\n  function eventHandler(...args) {\n    if (typeof args[0] === 'undefined') {\n      for (let i = 0; i < this.length; i += 1) {\n        if (noTrigger.indexOf(name) < 0) {\n          if (name in this[i]) this[i][name]();else {\n            $(this[i]).trigger(name);\n          }\n        }\n      }\n\n      return this;\n    }\n\n    return this.on(name, ...args);\n  }\n\n  return eventHandler;\n}\n\nconst click = shortcut('click');\nconst blur = shortcut('blur');\nconst focus = shortcut('focus');\nconst focusin = shortcut('focusin');\nconst focusout = shortcut('focusout');\nconst keyup = shortcut('keyup');\nconst keydown = shortcut('keydown');\nconst keypress = shortcut('keypress');\nconst submit = shortcut('submit');\nconst change = shortcut('change');\nconst mousedown = shortcut('mousedown');\nconst mousemove = shortcut('mousemove');\nconst mouseup = shortcut('mouseup');\nconst mouseenter = shortcut('mouseenter');\nconst mouseleave = shortcut('mouseleave');\nconst mouseout = shortcut('mouseout');\nconst mouseover = shortcut('mouseover');\nconst touchstart = shortcut('touchstart');\nconst touchend = shortcut('touchend');\nconst touchmove = shortcut('touchmove');\nconst resize = shortcut('resize');\nconst scroll = shortcut('scroll');\n\n/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = ($);\n\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/dom7/dom7.esm.js?\n}");
1196
1197/***/ }),
1198
vendor: 4,039 bytes, lines 1199-1209
1199/***/ "./node_modules/ssr-window/ssr-window.esm.js":
1200/*!***************************************************!*\
1201  !*** ./node_modules/ssr-window/ssr-window.esm.js ***!
1202  \***************************************************/
1203/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1204
1205"use strict";
1206eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getDocument: function() { return /* binding */ getDocument; },\n/* harmony export */   getWindow: function() { return /* binding */ getWindow; }\n/* harmony export */ });\n/* unused harmony exports extend, ssrDocument, ssrWindow */\n/**\n * SSR Window 4.0.2\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: December 13, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n    return (obj !== null &&\n        typeof obj === 'object' &&\n        'constructor' in obj &&\n        obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n    Object.keys(src).forEach((key) => {\n        if (typeof target[key] === 'undefined')\n            target[key] = src[key];\n        else if (isObject(src[key]) &&\n            isObject(target[key]) &&\n            Object.keys(src[key]).length > 0) {\n            extend(target[key], src[key]);\n        }\n    });\n}\n\nconst ssrDocument = {\n    body: {},\n    addEventListener() { },\n    removeEventListener() { },\n    activeElement: {\n        blur() { },\n        nodeName: '',\n    },\n    querySelector() {\n        return null;\n    },\n    querySelectorAll() {\n        return [];\n    },\n    getElementById() {\n        return null;\n    },\n    createEvent() {\n        return {\n            initEvent() { },\n        };\n    },\n    createElement() {\n        return {\n            children: [],\n            childNodes: [],\n            style: {},\n            setAttribute() { },\n            getElementsByTagName() {\n                return [];\n            },\n        };\n    },\n    createElementNS() {\n        return {};\n    },\n    importNode() {\n        return null;\n    },\n    location: {\n        hash: '',\n        host: '',\n        hostname: '',\n        href: '',\n        origin: '',\n        pathname: '',\n        protocol: '',\n        search: '',\n    },\n};\nfunction getDocument() {\n    const doc = typeof document !== 'undefined' ? document : {};\n    extend(doc, ssrDocument);\n    return doc;\n}\n\nconst ssrWindow = {\n    document: ssrDocument,\n    navigator: {\n        userAgent: '',\n    },\n    location: {\n        hash: '',\n        host: '',\n        hostname: '',\n        href: '',\n        origin: '',\n        pathname: '',\n        protocol: '',\n        search: '',\n    },\n    history: {\n        replaceState() { },\n        pushState() { },\n        go() { },\n        back() { },\n    },\n    CustomEvent: function CustomEvent() {\n        return this;\n    },\n    addEventListener() { },\n    removeEventListener() { },\n    getComputedStyle() {\n        return {\n            getPropertyValue() {\n                return '';\n            },\n        };\n    },\n    Image() { },\n    Date() { },\n    screen: {},\n    setTimeout() { },\n    clearTimeout() { },\n    matchMedia() {\n        return {};\n    },\n    requestAnimationFrame(callback) {\n        if (typeof setTimeout === 'undefined') {\n            callback();\n            return null;\n        }\n        return setTimeout(callback, 0);\n    },\n    cancelAnimationFrame(id) {\n        if (typeof setTimeout === 'undefined') {\n            return;\n        }\n        clearTimeout(id);\n    },\n};\nfunction getWindow() {\n    const win = typeof window !== 'undefined' ? window : {};\n    extend(win, ssrWindow);\n    return win;\n}\n\n\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/ssr-window/ssr-window.esm.js?\n}");
1207
1208/***/ }),
1209
vendor: 1,988 bytes, lines 1210-1220
1210/***/ "./node_modules/swiper/core/breakpoints/getBreakpoint.js":
1211/*!***************************************************************!*\
1212  !*** ./node_modules/swiper/core/breakpoints/getBreakpoint.js ***!
1213  \***************************************************************/
1214/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1215
1216"use strict";
1217eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ getBreakpoint; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n\nfunction getBreakpoint(breakpoints, base = 'window', containerEl) {\n  if (!breakpoints || base === 'container' && !containerEl) return undefined;\n  let breakpoint = false;\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n  const points = Object.keys(breakpoints).map(point => {\n    if (typeof point === 'string' && point.indexOf('@') === 0) {\n      const minRatio = parseFloat(point.substr(1));\n      const value = currentHeight * minRatio;\n      return {\n        value,\n        point\n      };\n    }\n\n    return {\n      value: point,\n      point\n    };\n  });\n  points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n\n  for (let i = 0; i < points.length; i += 1) {\n    const {\n      point,\n      value\n    } = points[i];\n\n    if (base === 'window') {\n      if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n        breakpoint = point;\n      }\n    } else if (value <= containerEl.clientWidth) {\n      breakpoint = point;\n    }\n  }\n\n  return breakpoint || 'max';\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/breakpoints/getBreakpoint.js?\n}");
1218
1219/***/ }),
1220
vendor: 1,067 bytes, lines 1221-1231
1221/***/ "./node_modules/swiper/core/breakpoints/index.js":
1222/*!*******************************************************!*\
1223  !*** ./node_modules/swiper/core/breakpoints/index.js ***!
1224  \*******************************************************/
1225/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1226
1227"use strict";
1228eval("{/* harmony import */ var _setBreakpoint_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setBreakpoint.js */ \"./node_modules/swiper/core/breakpoints/setBreakpoint.js\");\n/* harmony import */ var _getBreakpoint_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getBreakpoint.js */ \"./node_modules/swiper/core/breakpoints/getBreakpoint.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  setBreakpoint: _setBreakpoint_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n  getBreakpoint: _getBreakpoint_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/breakpoints/index.js?\n}");
1229
1230/***/ }),
1231
vendor: 3,933 bytes, lines 1232-1242
1232/***/ "./node_modules/swiper/core/breakpoints/setBreakpoint.js":
1233/*!***************************************************************!*\
1234  !*** ./node_modules/swiper/core/breakpoints/setBreakpoint.js ***!
1235  \***************************************************************/
1236/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1237
1238"use strict";
1239eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ setBreakpoint; }\n/* harmony export */ });\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\n\nconst isGridEnabled = (swiper, params) => {\n  return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nfunction setBreakpoint() {\n  const swiper = this;\n  const {\n    activeIndex,\n    initialized,\n    loopedSlides = 0,\n    params,\n    $el\n  } = swiper;\n  const breakpoints = params.breakpoints;\n  if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return; // Get breakpoint for window width and update parameters\n\n  const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n  if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n  const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n  const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n  const wasMultiRow = isGridEnabled(swiper, params);\n  const isMultiRow = isGridEnabled(swiper, breakpointParams);\n  const wasEnabled = params.enabled;\n\n  if (wasMultiRow && !isMultiRow) {\n    $el.removeClass(`${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`);\n    swiper.emitContainerClasses();\n  } else if (!wasMultiRow && isMultiRow) {\n    $el.addClass(`${params.containerModifierClass}grid`);\n\n    if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {\n      $el.addClass(`${params.containerModifierClass}grid-column`);\n    }\n\n    swiper.emitContainerClasses();\n  } // Toggle navigation, pagination, scrollbar\n\n\n  ['navigation', 'pagination', 'scrollbar'].forEach(prop => {\n    const wasModuleEnabled = params[prop] && params[prop].enabled;\n    const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;\n\n    if (wasModuleEnabled && !isModuleEnabled) {\n      swiper[prop].disable();\n    }\n\n    if (!wasModuleEnabled && isModuleEnabled) {\n      swiper[prop].enable();\n    }\n  });\n  const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;\n  const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n  if (directionChanged && initialized) {\n    swiper.changeDirection();\n  }\n\n  ;(0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.extend)(swiper.params, breakpointParams);\n  const isEnabled = swiper.params.enabled;\n  Object.assign(swiper, {\n    allowTouchMove: swiper.params.allowTouchMove,\n    allowSlideNext: swiper.params.allowSlideNext,\n    allowSlidePrev: swiper.params.allowSlidePrev\n  });\n\n  if (wasEnabled && !isEnabled) {\n    swiper.disable();\n  } else if (!wasEnabled && isEnabled) {\n    swiper.enable();\n  }\n\n  swiper.currentBreakpoint = breakpoint;\n  swiper.emit('_beforeBreakpoint', breakpointParams);\n\n  if (needsReLoop && initialized) {\n    swiper.loopDestroy();\n    swiper.loopCreate();\n    swiper.updateSlides();\n    swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);\n  }\n\n  swiper.emit('breakpoint', breakpointParams);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/breakpoints/setBreakpoint.js?\n}");
1240
1241/***/ }),
1242
vendor: 1,446 bytes, lines 1243-1253
1243/***/ "./node_modules/swiper/core/check-overflow/index.js":
1244/*!**********************************************************!*\
1245  !*** ./node_modules/swiper/core/check-overflow/index.js ***!
1246  \**********************************************************/
1247/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__) {
1248
1249"use strict";
1250eval("{function checkOverflow() {\n  const swiper = this;\n  const {\n    isLocked: wasLocked,\n    params\n  } = swiper;\n  const {\n    slidesOffsetBefore\n  } = params;\n\n  if (slidesOffsetBefore) {\n    const lastSlideIndex = swiper.slides.length - 1;\n    const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;\n    swiper.isLocked = swiper.size > lastSlideRightEdge;\n  } else {\n    swiper.isLocked = swiper.snapGrid.length === 1;\n  }\n\n  if (params.allowSlideNext === true) {\n    swiper.allowSlideNext = !swiper.isLocked;\n  }\n\n  if (params.allowSlidePrev === true) {\n    swiper.allowSlidePrev = !swiper.isLocked;\n  }\n\n  if (wasLocked && wasLocked !== swiper.isLocked) {\n    swiper.isEnd = false;\n  }\n\n  if (wasLocked !== swiper.isLocked) {\n    swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n  }\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  checkOverflow\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/check-overflow/index.js?\n}");
1251
1252/***/ }),
1253
vendor: 2,041 bytes, lines 1254-1264
1254/***/ "./node_modules/swiper/core/classes/addClasses.js":
1255/*!********************************************************!*\
1256  !*** ./node_modules/swiper/core/classes/addClasses.js ***!
1257  \********************************************************/
1258/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1259
1260"use strict";
1261eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ addClasses; }\n/* harmony export */ });\nfunction prepareClasses(entries, prefix) {\n  const resultClasses = [];\n  entries.forEach(item => {\n    if (typeof item === 'object') {\n      Object.keys(item).forEach(classNames => {\n        if (item[classNames]) {\n          resultClasses.push(prefix + classNames);\n        }\n      });\n    } else if (typeof item === 'string') {\n      resultClasses.push(prefix + item);\n    }\n  });\n  return resultClasses;\n}\n\nfunction addClasses() {\n  const swiper = this;\n  const {\n    classNames,\n    params,\n    rtl,\n    $el,\n    device,\n    support\n  } = swiper; // prettier-ignore\n\n  const suffixes = prepareClasses(['initialized', params.direction, {\n    'pointer-events': !support.touch\n  }, {\n    'free-mode': swiper.params.freeMode && params.freeMode.enabled\n  }, {\n    'autoheight': params.autoHeight\n  }, {\n    'rtl': rtl\n  }, {\n    'grid': params.grid && params.grid.rows > 1\n  }, {\n    'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'\n  }, {\n    'android': device.android\n  }, {\n    'ios': device.ios\n  }, {\n    'css-mode': params.cssMode\n  }, {\n    'centered': params.cssMode && params.centeredSlides\n  }, {\n    'watch-progress': params.watchSlidesProgress\n  }], params.containerModifierClass);\n  classNames.push(...suffixes);\n  $el.addClass([...classNames].join(' '));\n  swiper.emitContainerClasses();\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/classes/addClasses.js?\n}");
1262
1263/***/ }),
1264
vendor: 1,024 bytes, lines 1265-1275
1265/***/ "./node_modules/swiper/core/classes/index.js":
1266/*!***************************************************!*\
1267  !*** ./node_modules/swiper/core/classes/index.js ***!
1268  \***************************************************/
1269/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1270
1271"use strict";
1272eval("{/* harmony import */ var _addClasses_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./addClasses.js */ \"./node_modules/swiper/core/classes/addClasses.js\");\n/* harmony import */ var _removeClasses_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./removeClasses.js */ \"./node_modules/swiper/core/classes/removeClasses.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  addClasses: _addClasses_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n  removeClasses: _removeClasses_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/classes/index.js?\n}");
1273
1274/***/ }),
1275
vendor: 851 bytes, lines 1276-1286
1276/***/ "./node_modules/swiper/core/classes/removeClasses.js":
1277/*!***********************************************************!*\
1278  !*** ./node_modules/swiper/core/classes/removeClasses.js ***!
1279  \***********************************************************/
1280/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1281
1282"use strict";
1283eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ removeClasses; }\n/* harmony export */ });\nfunction removeClasses() {\n  const swiper = this;\n  const {\n    $el,\n    classNames\n  } = swiper;\n  $el.removeClass(classNames.join(' '));\n  swiper.emitContainerClasses();\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/classes/removeClasses.js?\n}");
1284
1285/***/ }),
1286
vendor: 23,292 bytes, lines 1287-1297
1287/***/ "./node_modules/swiper/core/core.js":
1288/*!******************************************!*\
1289  !*** ./node_modules/swiper/core/core.js ***!
1290  \******************************************/
1291/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1292
1293"use strict";
1294eval("{/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n/* harmony import */ var _shared_get_support_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shared/get-support.js */ \"./node_modules/swiper/shared/get-support.js\");\n/* harmony import */ var _shared_get_device_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../shared/get-device.js */ \"./node_modules/swiper/shared/get-device.js\");\n/* harmony import */ var _shared_get_browser_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../shared/get-browser.js */ \"./node_modules/swiper/shared/get-browser.js\");\n/* harmony import */ var _modules_resize_resize_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/resize/resize.js */ \"./node_modules/swiper/core/modules/resize/resize.js\");\n/* harmony import */ var _modules_observer_observer_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modules/observer/observer.js */ \"./node_modules/swiper/core/modules/observer/observer.js\");\n/* harmony import */ var _events_emitter_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./events-emitter.js */ \"./node_modules/swiper/core/events-emitter.js\");\n/* harmony import */ var _update_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./update/index.js */ \"./node_modules/swiper/core/update/index.js\");\n/* harmony import */ var _translate_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./translate/index.js */ \"./node_modules/swiper/core/translate/index.js\");\n/* harmony import */ var _transition_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./transition/index.js */ \"./node_modules/swiper/core/transition/index.js\");\n/* harmony import */ var _slide_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./slide/index.js */ \"./node_modules/swiper/core/slide/index.js\");\n/* harmony import */ var _loop_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./loop/index.js */ \"./node_modules/swiper/core/loop/index.js\");\n/* harmony import */ var _grab_cursor_index_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./grab-cursor/index.js */ \"./node_modules/swiper/core/grab-cursor/index.js\");\n/* harmony import */ var _events_index_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./events/index.js */ \"./node_modules/swiper/core/events/index.js\");\n/* harmony import */ var _breakpoints_index_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./breakpoints/index.js */ \"./node_modules/swiper/core/breakpoints/index.js\");\n/* harmony import */ var _classes_index_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./classes/index.js */ \"./node_modules/swiper/core/classes/index.js\");\n/* harmony import */ var _images_index_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./images/index.js */ \"./node_modules/swiper/core/images/index.js\");\n/* harmony import */ var _check_overflow_index_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./check-overflow/index.js */ \"./node_modules/swiper/core/check-overflow/index.js\");\n/* harmony import */ var _defaults_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./defaults.js */ \"./node_modules/swiper/core/defaults.js\");\n/* harmony import */ var _moduleExtendParams_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./moduleExtendParams.js */ \"./node_modules/swiper/core/moduleExtendParams.js\");\n/* eslint no-param-reassign: \"off\" */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst prototypes = {\n  eventsEmitter: _events_emitter_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n  update: _update_index_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n  translate: _translate_index_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n  transition: _transition_index_js__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n  slide: _slide_index_js__WEBPACK_IMPORTED_MODULE_12__[\"default\"],\n  loop: _loop_index_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n  grabCursor: _grab_cursor_index_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n  events: _events_index_js__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n  breakpoints: _breakpoints_index_js__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n  checkOverflow: _check_overflow_index_js__WEBPACK_IMPORTED_MODULE_19__[\"default\"],\n  classes: _classes_index_js__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n  images: _images_index_js__WEBPACK_IMPORTED_MODULE_18__[\"default\"]\n};\nconst extendedDefaults = {};\n\nclass Swiper {\n  constructor(...args) {\n    let el;\n    let params;\n\n    if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {\n      params = args[0];\n    } else {\n      [el, params] = args;\n    }\n\n    if (!params) params = {};\n    params = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.extend)({}, params);\n    if (el && !params.el) params.el = el;\n\n    if (params.el && (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params.el).length > 1) {\n      const swipers = [];\n      (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params.el).each(containerEl => {\n        const newParams = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.extend)({}, params, {\n          el: containerEl\n        });\n        swipers.push(new Swiper(newParams));\n      }); // eslint-disable-next-line no-constructor-return\n\n      return swipers;\n    } // Swiper Instance\n\n\n    const swiper = this;\n    swiper.__swiper__ = true;\n    swiper.support = (0,_shared_get_support_js__WEBPACK_IMPORTED_MODULE_3__.getSupport)();\n    swiper.device = (0,_shared_get_device_js__WEBPACK_IMPORTED_MODULE_4__.getDevice)({\n      userAgent: params.userAgent\n    });\n    swiper.browser = (0,_shared_get_browser_js__WEBPACK_IMPORTED_MODULE_5__.getBrowser)();\n    swiper.eventsListeners = {};\n    swiper.eventsAnyListeners = [];\n    swiper.modules = [...swiper.__modules__];\n\n    if (params.modules && Array.isArray(params.modules)) {\n      swiper.modules.push(...params.modules);\n    }\n\n    const allModulesParams = {};\n    swiper.modules.forEach(mod => {\n      mod({\n        swiper,\n        extendParams: (0,_moduleExtendParams_js__WEBPACK_IMPORTED_MODULE_21__[\"default\"])(params, allModulesParams),\n        on: swiper.on.bind(swiper),\n        once: swiper.once.bind(swiper),\n        off: swiper.off.bind(swiper),\n        emit: swiper.emit.bind(swiper)\n      });\n    }); // Extend defaults with modules params\n\n    const swiperParams = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.extend)({}, _defaults_js__WEBPACK_IMPORTED_MODULE_20__[\"default\"], allModulesParams); // Extend defaults with passed params\n\n    swiper.params = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.extend)({}, swiperParams, extendedDefaults, params);\n    swiper.originalParams = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.extend)({}, swiper.params);\n    swiper.passedParams = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.extend)({}, params); // add event listeners\n\n    if (swiper.params && swiper.params.on) {\n      Object.keys(swiper.params.on).forEach(eventName => {\n        swiper.on(eventName, swiper.params.on[eventName]);\n      });\n    }\n\n    if (swiper.params && swiper.params.onAny) {\n      swiper.onAny(swiper.params.onAny);\n    } // Save Dom lib\n\n\n    swiper.$ = _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; // Extend Swiper\n\n    Object.assign(swiper, {\n      enabled: swiper.params.enabled,\n      el,\n      // Classes\n      classNames: [],\n      // Slides\n      slides: (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(),\n      slidesGrid: [],\n      snapGrid: [],\n      slidesSizesGrid: [],\n\n      // isDirection\n      isHorizontal() {\n        return swiper.params.direction === 'horizontal';\n      },\n\n      isVertical() {\n        return swiper.params.direction === 'vertical';\n      },\n\n      // Indexes\n      activeIndex: 0,\n      realIndex: 0,\n      //\n      isBeginning: true,\n      isEnd: false,\n      // Props\n      translate: 0,\n      previousTranslate: 0,\n      progress: 0,\n      velocity: 0,\n      animating: false,\n      // Locks\n      allowSlideNext: swiper.params.allowSlideNext,\n      allowSlidePrev: swiper.params.allowSlidePrev,\n      // Touch Events\n      touchEvents: function touchEvents() {\n        const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];\n        const desktop = ['pointerdown', 'pointermove', 'pointerup'];\n        swiper.touchEventsTouch = {\n          start: touch[0],\n          move: touch[1],\n          end: touch[2],\n          cancel: touch[3]\n        };\n        swiper.touchEventsDesktop = {\n          start: desktop[0],\n          move: desktop[1],\n          end: desktop[2]\n        };\n        return swiper.support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;\n      }(),\n      touchEventsData: {\n        isTouched: undefined,\n        isMoved: undefined,\n        allowTouchCallbacks: undefined,\n        touchStartTime: undefined,\n        isScrolling: undefined,\n        currentTranslate: undefined,\n        startTranslate: undefined,\n        allowThresholdMove: undefined,\n        // Form elements to match\n        focusableElements: swiper.params.focusableElements,\n        // Last click time\n        lastClickTime: (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.now)(),\n        clickTimeout: undefined,\n        // Velocities\n        velocities: [],\n        allowMomentumBounce: undefined,\n        isTouchEvent: undefined,\n        startMoving: undefined\n      },\n      // Clicks\n      allowClick: true,\n      // Touches\n      allowTouchMove: swiper.params.allowTouchMove,\n      touches: {\n        startX: 0,\n        startY: 0,\n        currentX: 0,\n        currentY: 0,\n        diff: 0\n      },\n      // Images\n      imagesToLoad: [],\n      imagesLoaded: 0\n    });\n    swiper.emit('_swiper'); // Init\n\n    if (swiper.params.init) {\n      swiper.init();\n    } // Return app instance\n    // eslint-disable-next-line no-constructor-return\n\n\n    return swiper;\n  }\n\n  enable() {\n    const swiper = this;\n    if (swiper.enabled) return;\n    swiper.enabled = true;\n\n    if (swiper.params.grabCursor) {\n      swiper.setGrabCursor();\n    }\n\n    swiper.emit('enable');\n  }\n\n  disable() {\n    const swiper = this;\n    if (!swiper.enabled) return;\n    swiper.enabled = false;\n\n    if (swiper.params.grabCursor) {\n      swiper.unsetGrabCursor();\n    }\n\n    swiper.emit('disable');\n  }\n\n  setProgress(progress, speed) {\n    const swiper = this;\n    progress = Math.min(Math.max(progress, 0), 1);\n    const min = swiper.minTranslate();\n    const max = swiper.maxTranslate();\n    const current = (max - min) * progress + min;\n    swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  emitContainerClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const cls = swiper.el.className.split(' ').filter(className => {\n      return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;\n    });\n    swiper.emit('_containerClasses', cls.join(' '));\n  }\n\n  getSlideClasses(slideEl) {\n    const swiper = this;\n    if (swiper.destroyed) return '';\n    return slideEl.className.split(' ').filter(className => {\n      return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;\n    }).join(' ');\n  }\n\n  emitSlidesClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const updates = [];\n    swiper.slides.each(slideEl => {\n      const classNames = swiper.getSlideClasses(slideEl);\n      updates.push({\n        slideEl,\n        classNames\n      });\n      swiper.emit('_slideClass', slideEl, classNames);\n    });\n    swiper.emit('_slideClasses', updates);\n  }\n\n  slidesPerViewDynamic(view = 'current', exact = false) {\n    const swiper = this;\n    const {\n      params,\n      slides,\n      slidesGrid,\n      slidesSizesGrid,\n      size: swiperSize,\n      activeIndex\n    } = swiper;\n    let spv = 1;\n\n    if (params.centeredSlides) {\n      let slideSize = slides[activeIndex].swiperSlideSize;\n      let breakLoop;\n\n      for (let i = activeIndex + 1; i < slides.length; i += 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += slides[i].swiperSlideSize;\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n\n      for (let i = activeIndex - 1; i >= 0; i -= 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += slides[i].swiperSlideSize;\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n    } else {\n      // eslint-disable-next-line\n      if (view === 'current') {\n        for (let i = activeIndex + 1; i < slides.length; i += 1) {\n          const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      } else {\n        // previous\n        for (let i = activeIndex - 1; i >= 0; i -= 1) {\n          const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      }\n    }\n\n    return spv;\n  }\n\n  update() {\n    const swiper = this;\n    if (!swiper || swiper.destroyed) return;\n    const {\n      snapGrid,\n      params\n    } = swiper; // Breakpoints\n\n    if (params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n\n    swiper.updateSize();\n    swiper.updateSlides();\n    swiper.updateProgress();\n    swiper.updateSlidesClasses();\n\n    function setTranslate() {\n      const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n      const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());\n      swiper.setTranslate(newTranslate);\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n\n    let translated;\n\n    if (swiper.params.freeMode && swiper.params.freeMode.enabled) {\n      setTranslate();\n\n      if (swiper.params.autoHeight) {\n        swiper.updateAutoHeight();\n      }\n    } else {\n      if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n        translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n      } else {\n        translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n      }\n\n      if (!translated) {\n        setTranslate();\n      }\n    }\n\n    if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n      swiper.checkOverflow();\n    }\n\n    swiper.emit('update');\n  }\n\n  changeDirection(newDirection, needUpdate = true) {\n    const swiper = this;\n    const currentDirection = swiper.params.direction;\n\n    if (!newDirection) {\n      // eslint-disable-next-line\n      newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n    }\n\n    if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {\n      return swiper;\n    }\n\n    swiper.$el.removeClass(`${swiper.params.containerModifierClass}${currentDirection}`).addClass(`${swiper.params.containerModifierClass}${newDirection}`);\n    swiper.emitContainerClasses();\n    swiper.params.direction = newDirection;\n    swiper.slides.each(slideEl => {\n      if (newDirection === 'vertical') {\n        slideEl.style.width = '';\n      } else {\n        slideEl.style.height = '';\n      }\n    });\n    swiper.emit('changeDirection');\n    if (needUpdate) swiper.update();\n    return swiper;\n  }\n\n  changeLanguageDirection(direction) {\n    const swiper = this;\n    if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return;\n    swiper.rtl = direction === 'rtl';\n    swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl;\n\n    if (swiper.rtl) {\n      swiper.$el.addClass(`${swiper.params.containerModifierClass}rtl`);\n      swiper.el.dir = 'rtl';\n    } else {\n      swiper.$el.removeClass(`${swiper.params.containerModifierClass}rtl`);\n      swiper.el.dir = 'ltr';\n    }\n\n    swiper.update();\n  }\n\n  mount(el) {\n    const swiper = this;\n    if (swiper.mounted) return true; // Find el\n\n    const $el = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(el || swiper.params.el);\n    el = $el[0];\n\n    if (!el) {\n      return false;\n    }\n\n    el.swiper = swiper;\n\n    const getWrapperSelector = () => {\n      return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n    };\n\n    const getWrapper = () => {\n      if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n        const res = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(el.shadowRoot.querySelector(getWrapperSelector())); // Children needs to return slot items\n\n        res.children = options => $el.children(options);\n\n        return res;\n      }\n\n      if (!$el.children) {\n        return (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])($el).children(getWrapperSelector());\n      }\n\n      return $el.children(getWrapperSelector());\n    }; // Find Wrapper\n\n\n    let $wrapperEl = getWrapper();\n\n    if ($wrapperEl.length === 0 && swiper.params.createElements) {\n      const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n      const wrapper = document.createElement('div');\n      $wrapperEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(wrapper);\n      wrapper.className = swiper.params.wrapperClass;\n      $el.append(wrapper);\n      $el.children(`.${swiper.params.slideClass}`).each(slideEl => {\n        $wrapperEl.append(slideEl);\n      });\n    }\n\n    Object.assign(swiper, {\n      $el,\n      el,\n      $wrapperEl,\n      wrapperEl: $wrapperEl[0],\n      mounted: true,\n      // RTL\n      rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',\n      rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n      wrongRTL: $wrapperEl.css('display') === '-webkit-box'\n    });\n    return true;\n  }\n\n  init(el) {\n    const swiper = this;\n    if (swiper.initialized) return swiper;\n    const mounted = swiper.mount(el);\n    if (mounted === false) return swiper;\n    swiper.emit('beforeInit'); // Set breakpoint\n\n    if (swiper.params.breakpoints) {\n      swiper.setBreakpoint();\n    } // Add Classes\n\n\n    swiper.addClasses(); // Create loop\n\n    if (swiper.params.loop) {\n      swiper.loopCreate();\n    } // Update size\n\n\n    swiper.updateSize(); // Update slides\n\n    swiper.updateSlides();\n\n    if (swiper.params.watchOverflow) {\n      swiper.checkOverflow();\n    } // Set Grab Cursor\n\n\n    if (swiper.params.grabCursor && swiper.enabled) {\n      swiper.setGrabCursor();\n    }\n\n    if (swiper.params.preloadImages) {\n      swiper.preloadImages();\n    } // Slide To Initial Slide\n\n\n    if (swiper.params.loop) {\n      swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit, false, true);\n    } else {\n      swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n    } // Attach events\n\n\n    swiper.attachEvents(); // Init Flag\n\n    swiper.initialized = true; // Emit\n\n    swiper.emit('init');\n    swiper.emit('afterInit');\n    return swiper;\n  }\n\n  destroy(deleteInstance = true, cleanStyles = true) {\n    const swiper = this;\n    const {\n      params,\n      $el,\n      $wrapperEl,\n      slides\n    } = swiper;\n\n    if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n      return null;\n    }\n\n    swiper.emit('beforeDestroy'); // Init Flag\n\n    swiper.initialized = false; // Detach events\n\n    swiper.detachEvents(); // Destroy loop\n\n    if (params.loop) {\n      swiper.loopDestroy();\n    } // Cleanup styles\n\n\n    if (cleanStyles) {\n      swiper.removeClasses();\n      $el.removeAttr('style');\n      $wrapperEl.removeAttr('style');\n\n      if (slides && slides.length) {\n        slides.removeClass([params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass].join(' ')).removeAttr('style').removeAttr('data-swiper-slide-index');\n      }\n    }\n\n    swiper.emit('destroy'); // Detach emitter events\n\n    Object.keys(swiper.eventsListeners).forEach(eventName => {\n      swiper.off(eventName);\n    });\n\n    if (deleteInstance !== false) {\n      swiper.$el[0].swiper = null;\n      (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.deleteProps)(swiper);\n    }\n\n    swiper.destroyed = true;\n    return null;\n  }\n\n  static extendDefaults(newDefaults) {\n    ;(0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.extend)(extendedDefaults, newDefaults);\n  }\n\n  static get extendedDefaults() {\n    return extendedDefaults;\n  }\n\n  static get defaults() {\n    return _defaults_js__WEBPACK_IMPORTED_MODULE_20__[\"default\"];\n  }\n\n  static installModule(mod) {\n    if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n    const modules = Swiper.prototype.__modules__;\n\n    if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n      modules.push(mod);\n    }\n  }\n\n  static use(module) {\n    if (Array.isArray(module)) {\n      module.forEach(m => Swiper.installModule(m));\n      return Swiper;\n    }\n\n    Swiper.installModule(module);\n    return Swiper;\n  }\n\n}\n\nObject.keys(prototypes).forEach(prototypeGroup => {\n  Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {\n    Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n  });\n});\nSwiper.use([_modules_resize_resize_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"], _modules_observer_observer_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"]]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (Swiper);\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/core.js?\n}");
1295
1296/***/ }),
1297
vendor: 3,755 bytes, lines 1298-1308
1298/***/ "./node_modules/swiper/core/defaults.js":
1299/*!**********************************************!*\
1300  !*** ./node_modules/swiper/core/defaults.js ***!
1301  \**********************************************/
1302/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__) {
1303
1304"use strict";
1305eval("{/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  init: true,\n  direction: 'horizontal',\n  touchEventsTarget: 'wrapper',\n  initialSlide: 0,\n  speed: 300,\n  cssMode: false,\n  updateOnWindowResize: true,\n  resizeObserver: true,\n  nested: false,\n  createElements: false,\n  enabled: true,\n  focusableElements: 'input, select, option, textarea, button, video, label',\n  // Overrides\n  width: null,\n  height: null,\n  //\n  preventInteractionOnTransition: false,\n  // ssr\n  userAgent: null,\n  url: null,\n  // To support iOS's swipe-to-go-back gesture (when being used in-app).\n  edgeSwipeDetection: false,\n  edgeSwipeThreshold: 20,\n  // Autoheight\n  autoHeight: false,\n  // Set wrapper width\n  setWrapperSize: false,\n  // Virtual Translate\n  virtualTranslate: false,\n  // Effects\n  effect: 'slide',\n  // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n  // Breakpoints\n  breakpoints: undefined,\n  breakpointsBase: 'window',\n  // Slides grid\n  spaceBetween: 0,\n  slidesPerView: 1,\n  slidesPerGroup: 1,\n  slidesPerGroupSkip: 0,\n  slidesPerGroupAuto: false,\n  centeredSlides: false,\n  centeredSlidesBounds: false,\n  slidesOffsetBefore: 0,\n  // in px\n  slidesOffsetAfter: 0,\n  // in px\n  normalizeSlideIndex: true,\n  centerInsufficientSlides: false,\n  // Disable swiper and hide navigation when container not overflow\n  watchOverflow: true,\n  // Round length\n  roundLengths: false,\n  // Touches\n  touchRatio: 1,\n  touchAngle: 45,\n  simulateTouch: true,\n  shortSwipes: true,\n  longSwipes: true,\n  longSwipesRatio: 0.5,\n  longSwipesMs: 300,\n  followFinger: true,\n  allowTouchMove: true,\n  threshold: 0,\n  touchMoveStopPropagation: false,\n  touchStartPreventDefault: true,\n  touchStartForcePreventDefault: false,\n  touchReleaseOnEdges: false,\n  // Unique Navigation Elements\n  uniqueNavElements: true,\n  // Resistance\n  resistance: true,\n  resistanceRatio: 0.85,\n  // Progress\n  watchSlidesProgress: false,\n  // Cursor\n  grabCursor: false,\n  // Clicks\n  preventClicks: true,\n  preventClicksPropagation: true,\n  slideToClickedSlide: false,\n  // Images\n  preloadImages: true,\n  updateOnImagesReady: true,\n  // loop\n  loop: false,\n  loopAdditionalSlides: 0,\n  loopedSlides: null,\n  loopedSlidesLimit: true,\n  loopFillGroupWithBlank: false,\n  loopPreventsSlide: true,\n  // rewind\n  rewind: false,\n  // Swiping/no swiping\n  allowSlidePrev: true,\n  allowSlideNext: true,\n  swipeHandler: null,\n  // '.swipe-handler',\n  noSwiping: true,\n  noSwipingClass: 'swiper-no-swiping',\n  noSwipingSelector: null,\n  // Passive Listeners\n  passiveListeners: true,\n  maxBackfaceHiddenSlides: 10,\n  // NS\n  containerModifierClass: 'swiper-',\n  // NEW\n  slideClass: 'swiper-slide',\n  slideBlankClass: 'swiper-slide-invisible-blank',\n  slideActiveClass: 'swiper-slide-active',\n  slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n  slideVisibleClass: 'swiper-slide-visible',\n  slideDuplicateClass: 'swiper-slide-duplicate',\n  slideNextClass: 'swiper-slide-next',\n  slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n  slidePrevClass: 'swiper-slide-prev',\n  slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n  wrapperClass: 'swiper-wrapper',\n  // Callbacks\n  runCallbacksOnInit: true,\n  // Internals\n  _emitClasses: false\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/defaults.js?\n}");
1306
1307/***/ }),
1308
vendor: 3,890 bytes, lines 1309-1319
1309/***/ "./node_modules/swiper/core/events-emitter.js":
1310/*!****************************************************!*\
1311  !*** ./node_modules/swiper/core/events-emitter.js ***!
1312  \****************************************************/
1313/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__) {
1314
1315"use strict";
1316eval("{/* eslint-disable no-underscore-dangle */\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  on(events, handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n    events.split(' ').forEach(event => {\n      if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n      self.eventsListeners[event][method](handler);\n    });\n    return self;\n  },\n\n  once(events, handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n\n    function onceHandler(...args) {\n      self.off(events, onceHandler);\n\n      if (onceHandler.__emitterProxy) {\n        delete onceHandler.__emitterProxy;\n      }\n\n      handler.apply(self, args);\n    }\n\n    onceHandler.__emitterProxy = handler;\n    return self.on(events, onceHandler, priority);\n  },\n\n  onAny(handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n\n    if (self.eventsAnyListeners.indexOf(handler) < 0) {\n      self.eventsAnyListeners[method](handler);\n    }\n\n    return self;\n  },\n\n  offAny(handler) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsAnyListeners) return self;\n    const index = self.eventsAnyListeners.indexOf(handler);\n\n    if (index >= 0) {\n      self.eventsAnyListeners.splice(index, 1);\n    }\n\n    return self;\n  },\n\n  off(events, handler) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsListeners) return self;\n    events.split(' ').forEach(event => {\n      if (typeof handler === 'undefined') {\n        self.eventsListeners[event] = [];\n      } else if (self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach((eventHandler, index) => {\n          if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {\n            self.eventsListeners[event].splice(index, 1);\n          }\n        });\n      }\n    });\n    return self;\n  },\n\n  emit(...args) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsListeners) return self;\n    let events;\n    let data;\n    let context;\n\n    if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n      events = args[0];\n      data = args.slice(1, args.length);\n      context = self;\n    } else {\n      events = args[0].events;\n      data = args[0].data;\n      context = args[0].context || self;\n    }\n\n    data.unshift(context);\n    const eventsArray = Array.isArray(events) ? events : events.split(' ');\n    eventsArray.forEach(event => {\n      if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n        self.eventsAnyListeners.forEach(eventHandler => {\n          eventHandler.apply(context, [event, ...data]);\n        });\n      }\n\n      if (self.eventsListeners && self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach(eventHandler => {\n          eventHandler.apply(context, data);\n        });\n      }\n    });\n    return self;\n  }\n\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/events-emitter.js?\n}");
1317
1318/***/ }),
1319
vendor: 4,593 bytes, lines 1320-1330
1320/***/ "./node_modules/swiper/core/events/index.js":
1321/*!**************************************************!*\
1322  !*** ./node_modules/swiper/core/events/index.js ***!
1323  \**************************************************/
1324/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1325
1326"use strict";
1327eval("{/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _onTouchStart_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./onTouchStart.js */ \"./node_modules/swiper/core/events/onTouchStart.js\");\n/* harmony import */ var _onTouchMove_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./onTouchMove.js */ \"./node_modules/swiper/core/events/onTouchMove.js\");\n/* harmony import */ var _onTouchEnd_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./onTouchEnd.js */ \"./node_modules/swiper/core/events/onTouchEnd.js\");\n/* harmony import */ var _onResize_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./onResize.js */ \"./node_modules/swiper/core/events/onResize.js\");\n/* harmony import */ var _onClick_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./onClick.js */ \"./node_modules/swiper/core/events/onClick.js\");\n/* harmony import */ var _onScroll_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./onScroll.js */ \"./node_modules/swiper/core/events/onScroll.js\");\n\n\n\n\n\n\n\nlet dummyEventAttached = false;\n\nfunction dummyEventListener() {}\n\nconst events = (swiper, method) => {\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  const {\n    params,\n    touchEvents,\n    el,\n    wrapperEl,\n    device,\n    support\n  } = swiper;\n  const capture = !!params.nested;\n  const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n  const swiperMethod = method; // Touch Events\n\n  if (!support.touch) {\n    el[domMethod](touchEvents.start, swiper.onTouchStart, false);\n    document[domMethod](touchEvents.move, swiper.onTouchMove, capture);\n    document[domMethod](touchEvents.end, swiper.onTouchEnd, false);\n  } else {\n    const passiveListener = touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n    el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener);\n    el[domMethod](touchEvents.move, swiper.onTouchMove, support.passiveListener ? {\n      passive: false,\n      capture\n    } : capture);\n    el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener);\n\n    if (touchEvents.cancel) {\n      el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener);\n    }\n  } // Prevent Links Clicks\n\n\n  if (params.preventClicks || params.preventClicksPropagation) {\n    el[domMethod]('click', swiper.onClick, true);\n  }\n\n  if (params.cssMode) {\n    wrapperEl[domMethod]('scroll', swiper.onScroll);\n  } // Resize handler\n\n\n  if (params.updateOnWindowResize) {\n    swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', _onResize_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"], true);\n  } else {\n    swiper[swiperMethod]('observerUpdate', _onResize_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"], true);\n  }\n};\n\nfunction attachEvents() {\n  const swiper = this;\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  const {\n    params,\n    support\n  } = swiper;\n  swiper.onTouchStart = _onTouchStart_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].bind(swiper);\n  swiper.onTouchMove = _onTouchMove_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].bind(swiper);\n  swiper.onTouchEnd = _onTouchEnd_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].bind(swiper);\n\n  if (params.cssMode) {\n    swiper.onScroll = _onScroll_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].bind(swiper);\n  }\n\n  swiper.onClick = _onClick_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].bind(swiper);\n\n  if (support.touch && !dummyEventAttached) {\n    document.addEventListener('touchstart', dummyEventListener);\n    dummyEventAttached = true;\n  }\n\n  events(swiper, 'on');\n}\n\nfunction detachEvents() {\n  const swiper = this;\n  events(swiper, 'off');\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  attachEvents,\n  detachEvents\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/events/index.js?\n}");
1328
1329/***/ }),
1330
vendor: 948 bytes, lines 1331-1341
1331/***/ "./node_modules/swiper/core/events/onClick.js":
1332/*!****************************************************!*\
1333  !*** ./node_modules/swiper/core/events/onClick.js ***!
1334  \****************************************************/
1335/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1336
1337"use strict";
1338eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ onClick; }\n/* harmony export */ });\nfunction onClick(e) {\n  const swiper = this;\n  if (!swiper.enabled) return;\n\n  if (!swiper.allowClick) {\n    if (swiper.params.preventClicks) e.preventDefault();\n\n    if (swiper.params.preventClicksPropagation && swiper.animating) {\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    }\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/events/onClick.js?\n}");
1339
1340/***/ }),
1341
vendor: 1,753 bytes, lines 1342-1352
1342/***/ "./node_modules/swiper/core/events/onResize.js":
1343/*!*****************************************************!*\
1344  !*** ./node_modules/swiper/core/events/onResize.js ***!
1345  \*****************************************************/
1346/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1347
1348"use strict";
1349eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ onResize; }\n/* harmony export */ });\nfunction onResize() {\n  const swiper = this;\n  const {\n    params,\n    el\n  } = swiper;\n  if (el && el.offsetWidth === 0) return; // Breakpoints\n\n  if (params.breakpoints) {\n    swiper.setBreakpoint();\n  } // Save locks\n\n\n  const {\n    allowSlideNext,\n    allowSlidePrev,\n    snapGrid\n  } = swiper; // Disable locks on resize\n\n  swiper.allowSlideNext = true;\n  swiper.allowSlidePrev = true;\n  swiper.updateSize();\n  swiper.updateSlides();\n  swiper.updateSlidesClasses();\n\n  if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides) {\n    swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n  } else {\n    swiper.slideTo(swiper.activeIndex, 0, false, true);\n  }\n\n  if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n    swiper.autoplay.run();\n  } // Return locks after resize\n\n\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n\n  if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n    swiper.checkOverflow();\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/events/onResize.js?\n}");
1350
1351/***/ }),
1352
vendor: 1,557 bytes, lines 1353-1363
1353/***/ "./node_modules/swiper/core/events/onScroll.js":
1354/*!*****************************************************!*\
1355  !*** ./node_modules/swiper/core/events/onScroll.js ***!
1356  \*****************************************************/
1357/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1358
1359"use strict";
1360eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ onScroll; }\n/* harmony export */ });\nfunction onScroll() {\n  const swiper = this;\n  const {\n    wrapperEl,\n    rtlTranslate,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  swiper.previousTranslate = swiper.translate;\n\n  if (swiper.isHorizontal()) {\n    swiper.translate = -wrapperEl.scrollLeft;\n  } else {\n    swiper.translate = -wrapperEl.scrollTop;\n  } // eslint-disable-next-line\n\n\n  if (swiper.translate === 0) swiper.translate = 0;\n  swiper.updateActiveIndex();\n  swiper.updateSlidesClasses();\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n  }\n\n  if (newProgress !== swiper.progress) {\n    swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n  }\n\n  swiper.emit('setTranslate', swiper.translate, false);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/events/onScroll.js?\n}");
1361
1362/***/ }),
1363
vendor: 5,765 bytes, lines 1364-1374
1364/***/ "./node_modules/swiper/core/events/onTouchEnd.js":
1365/*!*******************************************************!*\
1366  !*** ./node_modules/swiper/core/events/onTouchEnd.js ***!
1367  \*******************************************************/
1368/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1369
1370"use strict";
1371eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ onTouchEnd; }\n/* harmony export */ });\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\nfunction onTouchEnd(event) {\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    slidesGrid,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchEnd', e);\n  }\n\n  data.allowTouchCallbacks = false;\n\n  if (!data.isTouched) {\n    if (data.isMoved && params.grabCursor) {\n      swiper.setGrabCursor(false);\n    }\n\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  } // Return Grab Cursor\n\n\n  if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n    swiper.setGrabCursor(false);\n  } // Time diff\n\n\n  const touchEndTime = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.now)();\n  const timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click\n\n  if (swiper.allowClick) {\n    const pathTree = e.path || e.composedPath && e.composedPath();\n    swiper.updateClickedSlide(pathTree && pathTree[0] || e.target);\n    swiper.emit('tap click', e);\n\n    if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n      swiper.emit('doubleTap doubleClick', e);\n    }\n  }\n\n  data.lastClickTime = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.now)();\n  (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => {\n    if (!swiper.destroyed) swiper.allowClick = true;\n  });\n\n  if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {\n    data.isTouched = false;\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  }\n\n  data.isTouched = false;\n  data.isMoved = false;\n  data.startMoving = false;\n  let currentPos;\n\n  if (params.followFinger) {\n    currentPos = rtl ? swiper.translate : -swiper.translate;\n  } else {\n    currentPos = -data.currentTranslate;\n  }\n\n  if (params.cssMode) {\n    return;\n  }\n\n  if (swiper.params.freeMode && params.freeMode.enabled) {\n    swiper.freeMode.onTouchEnd({\n      currentPos\n    });\n    return;\n  } // Find current slide\n\n\n  let stopIndex = 0;\n  let groupSize = swiper.slidesSizesGrid[0];\n\n  for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {\n    const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n    if (typeof slidesGrid[i + increment] !== 'undefined') {\n      if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n        stopIndex = i;\n        groupSize = slidesGrid[i + increment] - slidesGrid[i];\n      }\n    } else if (currentPos >= slidesGrid[i]) {\n      stopIndex = i;\n      groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n    }\n  }\n\n  let rewindFirstIndex = null;\n  let rewindLastIndex = null;\n\n  if (params.rewind) {\n    if (swiper.isBeginning) {\n      rewindLastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;\n    } else if (swiper.isEnd) {\n      rewindFirstIndex = 0;\n    }\n  } // Find current slide size\n\n\n  const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n  const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n  if (timeDiff > params.longSwipesMs) {\n    // Long touches\n    if (!params.longSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n\n    if (swiper.swipeDirection === 'next') {\n      if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);\n    }\n\n    if (swiper.swipeDirection === 'prev') {\n      if (ratio > 1 - params.longSwipesRatio) {\n        swiper.slideTo(stopIndex + increment);\n      } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {\n        swiper.slideTo(rewindLastIndex);\n      } else {\n        swiper.slideTo(stopIndex);\n      }\n    }\n  } else {\n    // Short swipes\n    if (!params.shortSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n\n    const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n\n    if (!isNavButtonTarget) {\n      if (swiper.swipeDirection === 'next') {\n        swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);\n      }\n\n      if (swiper.swipeDirection === 'prev') {\n        swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);\n      }\n    } else if (e.target === swiper.navigation.nextEl) {\n      swiper.slideTo(stopIndex + increment);\n    } else {\n      swiper.slideTo(stopIndex);\n    }\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/events/onTouchEnd.js?\n}");
1372
1373/***/ }),
1374
vendor: 8,146 bytes, lines 1375-1385
1375/***/ "./node_modules/swiper/core/events/onTouchMove.js":
1376/*!********************************************************!*\
1377  !*** ./node_modules/swiper/core/events/onTouchMove.js ***!
1378  \********************************************************/
1379/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1380
1381"use strict";
1382eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ onTouchMove; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\n\n\nfunction onTouchMove(event) {\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n\n  if (!data.isTouched) {\n    if (data.startMoving && data.isScrolling) {\n      swiper.emit('touchMoveOpposite', e);\n    }\n\n    return;\n  }\n\n  if (data.isTouchEvent && e.type !== 'touchmove') return;\n  const targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);\n  const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;\n  const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;\n\n  if (e.preventedByNestedSwiper) {\n    touches.startX = pageX;\n    touches.startY = pageY;\n    return;\n  }\n\n  if (!swiper.allowTouchMove) {\n    if (!(0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(e.target).is(data.focusableElements)) {\n      swiper.allowClick = false;\n    }\n\n    if (data.isTouched) {\n      Object.assign(touches, {\n        startX: pageX,\n        startY: pageY,\n        currentX: pageX,\n        currentY: pageY\n      });\n      data.touchStartTime = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.now)();\n    }\n\n    return;\n  }\n\n  if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n    if (swiper.isVertical()) {\n      // Vertical\n      if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {\n        data.isTouched = false;\n        data.isMoved = false;\n        return;\n      }\n    } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {\n      return;\n    }\n  }\n\n  if (data.isTouchEvent && document.activeElement) {\n    if (e.target === document.activeElement && (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(e.target).is(data.focusableElements)) {\n      data.isMoved = true;\n      swiper.allowClick = false;\n      return;\n    }\n  }\n\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchMove', e);\n  }\n\n  if (e.targetTouches && e.targetTouches.length > 1) return;\n  touches.currentX = pageX;\n  touches.currentY = pageY;\n  const diffX = touches.currentX - touches.startX;\n  const diffY = touches.currentY - touches.startY;\n  if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;\n\n  if (typeof data.isScrolling === 'undefined') {\n    let touchAngle;\n\n    if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {\n      data.isScrolling = false;\n    } else {\n      // eslint-disable-next-line\n      if (diffX * diffX + diffY * diffY >= 25) {\n        touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;\n        data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;\n      }\n    }\n  }\n\n  if (data.isScrolling) {\n    swiper.emit('touchMoveOpposite', e);\n  }\n\n  if (typeof data.startMoving === 'undefined') {\n    if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n      data.startMoving = true;\n    }\n  }\n\n  if (data.isScrolling) {\n    data.isTouched = false;\n    return;\n  }\n\n  if (!data.startMoving) {\n    return;\n  }\n\n  swiper.allowClick = false;\n\n  if (!params.cssMode && e.cancelable) {\n    e.preventDefault();\n  }\n\n  if (params.touchMoveStopPropagation && !params.nested) {\n    e.stopPropagation();\n  }\n\n  if (!data.isMoved) {\n    if (params.loop && !params.cssMode) {\n      swiper.loopFix();\n    }\n\n    data.startTranslate = swiper.getTranslate();\n    swiper.setTransition(0);\n\n    if (swiper.animating) {\n      swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n    }\n\n    data.allowMomentumBounce = false; // Grab Cursor\n\n    if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n      swiper.setGrabCursor(true);\n    }\n\n    swiper.emit('sliderFirstMove', e);\n  }\n\n  swiper.emit('sliderMove', e);\n  data.isMoved = true;\n  let diff = swiper.isHorizontal() ? diffX : diffY;\n  touches.diff = diff;\n  diff *= params.touchRatio;\n  if (rtl) diff = -diff;\n  swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n  data.currentTranslate = diff + data.startTranslate;\n  let disableParentSwiper = true;\n  let resistanceRatio = params.resistanceRatio;\n\n  if (params.touchReleaseOnEdges) {\n    resistanceRatio = 0;\n  }\n\n  if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {\n    disableParentSwiper = false;\n    if (params.resistance) data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n  } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n    disableParentSwiper = false;\n    if (params.resistance) data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n  }\n\n  if (disableParentSwiper) {\n    e.preventedByNestedSwiper = true;\n  } // Directions locks\n\n\n  if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n\n  if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n\n  if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n    data.currentTranslate = data.startTranslate;\n  } // Threshold\n\n\n  if (params.threshold > 0) {\n    if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n      if (!data.allowThresholdMove) {\n        data.allowThresholdMove = true;\n        touches.startX = touches.currentX;\n        touches.startY = touches.currentY;\n        data.currentTranslate = data.startTranslate;\n        touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;\n        return;\n      }\n    } else {\n      data.currentTranslate = data.startTranslate;\n      return;\n    }\n  }\n\n  if (!params.followFinger || params.cssMode) return; // Update active index in free mode\n\n  if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n    swiper.freeMode.onTouchMove();\n  } // Update progress\n\n\n  swiper.updateProgress(data.currentTranslate); // Update translate\n\n  swiper.setTranslate(data.currentTranslate);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/events/onTouchMove.js?\n}");
1383
1384/***/ }),
1385
vendor: 5,979 bytes, lines 1386-1396
1386/***/ "./node_modules/swiper/core/events/onTouchStart.js":
1387/*!*********************************************************!*\
1388  !*** ./node_modules/swiper/core/events/onTouchStart.js ***!
1389  \*********************************************************/
1390/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1391
1392"use strict";
1393eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ onTouchStart; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\n\n // Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\n\nfunction closestElement(selector, base = this) {\n  function __closestFrom(el) {\n    if (!el || el === (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)() || el === (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)()) return null;\n    if (el.assignedSlot) el = el.assignedSlot;\n    const found = el.closest(selector);\n\n    if (!found && !el.getRootNode) {\n      return null;\n    }\n\n    return found || __closestFrom(el.getRootNode().host);\n  }\n\n  return __closestFrom(base);\n}\n\nfunction onTouchStart(event) {\n  const swiper = this;\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return;\n  }\n\n  if (!swiper.animating && params.cssMode && params.loop) {\n    swiper.loopFix();\n  }\n\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  let $targetEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(e.target);\n\n  if (params.touchEventsTarget === 'wrapper') {\n    if (!$targetEl.closest(swiper.wrapperEl).length) return;\n  }\n\n  data.isTouchEvent = e.type === 'touchstart';\n  if (!data.isTouchEvent && 'which' in e && e.which === 3) return;\n  if (!data.isTouchEvent && 'button' in e && e.button > 0) return;\n  if (data.isTouched && data.isMoved) return; // change target el for shadow root component\n\n  const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== ''; // eslint-disable-next-line\n\n  const eventPath = event.composedPath ? event.composedPath() : event.path;\n\n  if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {\n    $targetEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(eventPath[0]);\n  }\n\n  const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;\n  const isTargetShadow = !!(e.target && e.target.shadowRoot); // use closestElement for shadow root element to get the actual closest for nested shadow root element\n\n  if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, $targetEl[0]) : $targetEl.closest(noSwipingSelector)[0])) {\n    swiper.allowClick = true;\n    return;\n  }\n\n  if (params.swipeHandler) {\n    if (!$targetEl.closest(params.swipeHandler)[0]) return;\n  }\n\n  touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n  touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n  const startX = touches.currentX;\n  const startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n  const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n  const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n\n  if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {\n    if (edgeSwipeDetection === 'prevent') {\n      event.preventDefault();\n    } else {\n      return;\n    }\n  }\n\n  Object.assign(data, {\n    isTouched: true,\n    isMoved: false,\n    allowTouchCallbacks: true,\n    isScrolling: undefined,\n    startMoving: undefined\n  });\n  touches.startX = startX;\n  touches.startY = startY;\n  data.touchStartTime = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.now)();\n  swiper.allowClick = true;\n  swiper.updateSize();\n  swiper.swipeDirection = undefined;\n  if (params.threshold > 0) data.allowThresholdMove = false;\n\n  if (e.type !== 'touchstart') {\n    let preventDefault = true;\n\n    if ($targetEl.is(data.focusableElements)) {\n      preventDefault = false;\n\n      if ($targetEl[0].nodeName === 'SELECT') {\n        data.isTouched = false;\n      }\n    }\n\n    if (document.activeElement && (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(document.activeElement).is(data.focusableElements) && document.activeElement !== $targetEl[0]) {\n      document.activeElement.blur();\n    }\n\n    const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n\n    if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !$targetEl[0].isContentEditable) {\n      e.preventDefault();\n    }\n  }\n\n  if (swiper.params.freeMode && swiper.params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {\n    swiper.freeMode.onTouchStart();\n  }\n\n  swiper.emit('touchStart', e);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/events/onTouchStart.js?\n}");
1394
1395/***/ }),
1396
vendor: 1,077 bytes, lines 1397-1407
1397/***/ "./node_modules/swiper/core/grab-cursor/index.js":
1398/*!*******************************************************!*\
1399  !*** ./node_modules/swiper/core/grab-cursor/index.js ***!
1400  \*******************************************************/
1401/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1402
1403"use strict";
1404eval("{/* harmony import */ var _setGrabCursor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setGrabCursor.js */ \"./node_modules/swiper/core/grab-cursor/setGrabCursor.js\");\n/* harmony import */ var _unsetGrabCursor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./unsetGrabCursor.js */ \"./node_modules/swiper/core/grab-cursor/unsetGrabCursor.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  setGrabCursor: _setGrabCursor_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n  unsetGrabCursor: _unsetGrabCursor_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/grab-cursor/index.js?\n}");
1405
1406/***/ }),
1407
vendor: 1,067 bytes, lines 1408-1418
1408/***/ "./node_modules/swiper/core/grab-cursor/setGrabCursor.js":
1409/*!***************************************************************!*\
1410  !*** ./node_modules/swiper/core/grab-cursor/setGrabCursor.js ***!
1411  \***************************************************************/
1412/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1413
1414"use strict";
1415eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ setGrabCursor; }\n/* harmony export */ });\nfunction setGrabCursor(moving) {\n  const swiper = this;\n  if (swiper.support.touch || !swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;\n  const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n  el.style.cursor = 'move';\n  el.style.cursor = moving ? 'grabbing' : 'grab';\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/grab-cursor/setGrabCursor.js?\n}");
1416
1417/***/ }),
1418
vendor: 984 bytes, lines 1419-1429
1419/***/ "./node_modules/swiper/core/grab-cursor/unsetGrabCursor.js":
1420/*!*****************************************************************!*\
1421  !*** ./node_modules/swiper/core/grab-cursor/unsetGrabCursor.js ***!
1422  \*****************************************************************/
1423/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1424
1425"use strict";
1426eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ unsetGrabCursor; }\n/* harmony export */ });\nfunction unsetGrabCursor() {\n  const swiper = this;\n\n  if (swiper.support.touch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {\n    return;\n  }\n\n  swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/grab-cursor/unsetGrabCursor.js?\n}");
1427
1428/***/ }),
1429
vendor: 1,012 bytes, lines 1430-1440
1430/***/ "./node_modules/swiper/core/images/index.js":
1431/*!**************************************************!*\
1432  !*** ./node_modules/swiper/core/images/index.js ***!
1433  \**************************************************/
1434/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1435
1436"use strict";
1437eval("{/* harmony import */ var _loadImage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loadImage.js */ \"./node_modules/swiper/core/images/loadImage.js\");\n/* harmony import */ var _preloadImages_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./preloadImages.js */ \"./node_modules/swiper/core/images/preloadImages.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  loadImage: _loadImage_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n  preloadImages: _preloadImages_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/images/index.js?\n}");
1438
1439/***/ }),
1440
vendor: 1,773 bytes, lines 1441-1451
1441/***/ "./node_modules/swiper/core/images/loadImage.js":
1442/*!******************************************************!*\
1443  !*** ./node_modules/swiper/core/images/loadImage.js ***!
1444  \******************************************************/
1445/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1446
1447"use strict";
1448eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ loadImage; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\n\nfunction loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  let image;\n\n  function onReady() {\n    if (callback) callback();\n  }\n\n  const isPicture = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(imageEl).parent('picture')[0];\n\n  if (!isPicture && (!imageEl.complete || !checkForComplete)) {\n    if (src) {\n      image = new window.Image();\n      image.onload = onReady;\n      image.onerror = onReady;\n\n      if (sizes) {\n        image.sizes = sizes;\n      }\n\n      if (srcset) {\n        image.srcset = srcset;\n      }\n\n      if (src) {\n        image.src = src;\n      }\n    } else {\n      onReady();\n    }\n  } else {\n    // image already loaded...\n    onReady();\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/images/loadImage.js?\n}");
1449
1450/***/ }),
1451
vendor: 1,445 bytes, lines 1452-1462
1452/***/ "./node_modules/swiper/core/images/preloadImages.js":
1453/*!**********************************************************!*\
1454  !*** ./node_modules/swiper/core/images/preloadImages.js ***!
1455  \**********************************************************/
1456/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1457
1458"use strict";
1459eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ preloadImages; }\n/* harmony export */ });\nfunction preloadImages() {\n  const swiper = this;\n  swiper.imagesToLoad = swiper.$el.find('img');\n\n  function onReady() {\n    if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;\n    if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;\n\n    if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n      if (swiper.params.updateOnImagesReady) swiper.update();\n      swiper.emit('imagesReady');\n    }\n  }\n\n  for (let i = 0; i < swiper.imagesToLoad.length; i += 1) {\n    const imageEl = swiper.imagesToLoad[i];\n    swiper.loadImage(imageEl, imageEl.currentSrc || imageEl.getAttribute('src'), imageEl.srcset || imageEl.getAttribute('srcset'), imageEl.sizes || imageEl.getAttribute('sizes'), true, onReady);\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/images/preloadImages.js?\n}");
1460
1461/***/ }),
1462
vendor: 1,220 bytes, lines 1463-1473
1463/***/ "./node_modules/swiper/core/loop/index.js":
1464/*!************************************************!*\
1465  !*** ./node_modules/swiper/core/loop/index.js ***!
1466  \************************************************/
1467/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1468
1469"use strict";
1470eval("{/* harmony import */ var _loopCreate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loopCreate.js */ \"./node_modules/swiper/core/loop/loopCreate.js\");\n/* harmony import */ var _loopFix_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loopFix.js */ \"./node_modules/swiper/core/loop/loopFix.js\");\n/* harmony import */ var _loopDestroy_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./loopDestroy.js */ \"./node_modules/swiper/core/loop/loopDestroy.js\");\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  loopCreate: _loopCreate_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n  loopFix: _loopFix_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  loopDestroy: _loopDestroy_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/loop/index.js?\n}");
1471
1472/***/ }),
1473
vendor: 3,334 bytes, lines 1474-1484
1474/***/ "./node_modules/swiper/core/loop/loopCreate.js":
1475/*!*****************************************************!*\
1476  !*** ./node_modules/swiper/core/loop/loopCreate.js ***!
1477  \*****************************************************/
1478/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1479
1480"use strict";
1481eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ loopCreate; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\n\nfunction loopCreate() {\n  const swiper = this;\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  const {\n    params,\n    $wrapperEl\n  } = swiper; // Remove duplicated slides\n\n  const $selector = $wrapperEl.children().length > 0 ? (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])($wrapperEl.children()[0].parentNode) : $wrapperEl;\n  $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove();\n  let slides = $selector.children(`.${params.slideClass}`);\n\n  if (params.loopFillGroupWithBlank) {\n    const blankSlidesNum = params.slidesPerGroup - slides.length % params.slidesPerGroup;\n\n    if (blankSlidesNum !== params.slidesPerGroup) {\n      for (let i = 0; i < blankSlidesNum; i += 1) {\n        const blankNode = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(document.createElement('div')).addClass(`${params.slideClass} ${params.slideBlankClass}`);\n        $selector.append(blankNode);\n      }\n\n      slides = $selector.children(`.${params.slideClass}`);\n    }\n  }\n\n  if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;\n  swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));\n  swiper.loopedSlides += params.loopAdditionalSlides;\n\n  if (swiper.loopedSlides > slides.length && swiper.params.loopedSlidesLimit) {\n    swiper.loopedSlides = slides.length;\n  }\n\n  const prependSlides = [];\n  const appendSlides = [];\n  slides.each((el, index) => {\n    const slide = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(el);\n    slide.attr('data-swiper-slide-index', index);\n  });\n\n  for (let i = 0; i < swiper.loopedSlides; i += 1) {\n    const index = i - Math.floor(i / slides.length) * slides.length;\n    appendSlides.push(slides.eq(index)[0]);\n    prependSlides.unshift(slides.eq(slides.length - index - 1)[0]);\n  }\n\n  for (let i = 0; i < appendSlides.length; i += 1) {\n    $selector.append((0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n  }\n\n  for (let i = prependSlides.length - 1; i >= 0; i -= 1) {\n    $selector.prepend((0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/loop/loopCreate.js?\n}");
1482
1483/***/ }),
1484
vendor: 947 bytes, lines 1485-1495
1485/***/ "./node_modules/swiper/core/loop/loopDestroy.js":
1486/*!******************************************************!*\
1487  !*** ./node_modules/swiper/core/loop/loopDestroy.js ***!
1488  \******************************************************/
1489/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1490
1491"use strict";
1492eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ loopDestroy; }\n/* harmony export */ });\nfunction loopDestroy() {\n  const swiper = this;\n  const {\n    $wrapperEl,\n    params,\n    slides\n  } = swiper;\n  $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`).remove();\n  slides.removeAttr('data-swiper-slide-index');\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/loop/loopDestroy.js?\n}");
1493
1494/***/ }),
1495
vendor: 1,912 bytes, lines 1496-1506
1496/***/ "./node_modules/swiper/core/loop/loopFix.js":
1497/*!**************************************************!*\
1498  !*** ./node_modules/swiper/core/loop/loopFix.js ***!
1499  \**************************************************/
1500/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1501
1502"use strict";
1503eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ loopFix; }\n/* harmony export */ });\nfunction loopFix() {\n  const swiper = this;\n  swiper.emit('beforeLoopFix');\n  const {\n    activeIndex,\n    slides,\n    loopedSlides,\n    allowSlidePrev,\n    allowSlideNext,\n    snapGrid,\n    rtlTranslate: rtl\n  } = swiper;\n  let newIndex;\n  swiper.allowSlidePrev = true;\n  swiper.allowSlideNext = true;\n  const snapTranslate = -snapGrid[activeIndex];\n  const diff = snapTranslate - swiper.getTranslate(); // Fix For Negative Oversliding\n\n  if (activeIndex < loopedSlides) {\n    newIndex = slides.length - loopedSlides * 3 + activeIndex;\n    newIndex += loopedSlides;\n    const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n\n    if (slideChanged && diff !== 0) {\n      swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n    }\n  } else if (activeIndex >= slides.length - loopedSlides) {\n    // Fix For Positive Oversliding\n    newIndex = -slides.length + activeIndex + loopedSlides;\n    newIndex += loopedSlides;\n    const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n\n    if (slideChanged && diff !== 0) {\n      swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n    }\n  }\n\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n  swiper.emit('loopFix');\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/loop/loopFix.js?\n}");
1504
1505/***/ }),
1506
vendor: 2,048 bytes, lines 1507-1517
1507/***/ "./node_modules/swiper/core/moduleExtendParams.js":
1508/*!********************************************************!*\
1509  !*** ./node_modules/swiper/core/moduleExtendParams.js ***!
1510  \********************************************************/
1511/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1512
1513"use strict";
1514eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ moduleExtendParams; }\n/* harmony export */ });\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\nfunction moduleExtendParams(params, allModulesParams) {\n  return function extendParams(obj = {}) {\n    const moduleParamName = Object.keys(obj)[0];\n    const moduleParams = obj[moduleParamName];\n\n    if (typeof moduleParams !== 'object' || moduleParams === null) {\n      (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.extend)(allModulesParams, obj);\n      return;\n    }\n\n    if (['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] === true) {\n      params[moduleParamName] = {\n        auto: true\n      };\n    }\n\n    if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n      (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.extend)(allModulesParams, obj);\n      return;\n    }\n\n    if (params[moduleParamName] === true) {\n      params[moduleParamName] = {\n        enabled: true\n      };\n    }\n\n    if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n      params[moduleParamName].enabled = true;\n    }\n\n    if (!params[moduleParamName]) params[moduleParamName] = {\n      enabled: false\n    };\n    (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.extend)(allModulesParams, obj);\n  };\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/moduleExtendParams.js?\n}");
1515
1516/***/ }),
1517
vendor: 2,943 bytes, lines 1518-1528
1518/***/ "./node_modules/swiper/core/modules/observer/observer.js":
1519/*!***************************************************************!*\
1520  !*** ./node_modules/swiper/core/modules/observer/observer.js ***!
1521  \***************************************************************/
1522/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1523
1524"use strict";
1525eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ Observer; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n\nfunction Observer({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const observers = [];\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n\n  const attach = (target, options = {}) => {\n    const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n    const observer = new ObserverFunc(mutations => {\n      // The observerUpdate event should only be triggered\n      // once despite the number of mutations.  Additional\n      // triggers are redundant and are very costly\n      if (mutations.length === 1) {\n        emit('observerUpdate', mutations[0]);\n        return;\n      }\n\n      const observerUpdate = function observerUpdate() {\n        emit('observerUpdate', mutations[0]);\n      };\n\n      if (window.requestAnimationFrame) {\n        window.requestAnimationFrame(observerUpdate);\n      } else {\n        window.setTimeout(observerUpdate, 0);\n      }\n    });\n    observer.observe(target, {\n      attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n      childList: typeof options.childList === 'undefined' ? true : options.childList,\n      characterData: typeof options.characterData === 'undefined' ? true : options.characterData\n    });\n    observers.push(observer);\n  };\n\n  const init = () => {\n    if (!swiper.params.observer) return;\n\n    if (swiper.params.observeParents) {\n      const containerParents = swiper.$el.parents();\n\n      for (let i = 0; i < containerParents.length; i += 1) {\n        attach(containerParents[i]);\n      }\n    } // Observe container\n\n\n    attach(swiper.$el[0], {\n      childList: swiper.params.observeSlideChildren\n    }); // Observe wrapper\n\n    attach(swiper.$wrapperEl[0], {\n      attributes: false\n    });\n  };\n\n  const destroy = () => {\n    observers.forEach(observer => {\n      observer.disconnect();\n    });\n    observers.splice(0, observers.length);\n  };\n\n  extendParams({\n    observer: false,\n    observeParents: false,\n    observeSlideChildren: false\n  });\n  on('init', init);\n  on('destroy', destroy);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/modules/observer/observer.js?\n}");
1526
1527/***/ }),
1528
vendor: 2,969 bytes, lines 1529-1539
1529/***/ "./node_modules/swiper/core/modules/resize/resize.js":
1530/*!***********************************************************!*\
1531  !*** ./node_modules/swiper/core/modules/resize/resize.js ***!
1532  \***********************************************************/
1533/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1534
1535"use strict";
1536eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ Resize; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n\nfunction Resize({\n  swiper,\n  on,\n  emit\n}) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  let observer = null;\n  let animationFrame = null;\n\n  const resizeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('beforeResize');\n    emit('resize');\n  };\n\n  const createObserver = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    observer = new ResizeObserver(entries => {\n      animationFrame = window.requestAnimationFrame(() => {\n        const {\n          width,\n          height\n        } = swiper;\n        let newWidth = width;\n        let newHeight = height;\n        entries.forEach(({\n          contentBoxSize,\n          contentRect,\n          target\n        }) => {\n          if (target && target !== swiper.el) return;\n          newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;\n          newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;\n        });\n\n        if (newWidth !== width || newHeight !== height) {\n          resizeHandler();\n        }\n      });\n    });\n    observer.observe(swiper.el);\n  };\n\n  const removeObserver = () => {\n    if (animationFrame) {\n      window.cancelAnimationFrame(animationFrame);\n    }\n\n    if (observer && observer.unobserve && swiper.el) {\n      observer.unobserve(swiper.el);\n      observer = null;\n    }\n  };\n\n  const orientationChangeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('orientationchange');\n  };\n\n  on('init', () => {\n    if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n      createObserver();\n      return;\n    }\n\n    window.addEventListener('resize', resizeHandler);\n    window.addEventListener('orientationchange', orientationChangeHandler);\n  });\n  on('destroy', () => {\n    removeObserver();\n    window.removeEventListener('resize', resizeHandler);\n    window.removeEventListener('orientationchange', orientationChangeHandler);\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/modules/resize/resize.js?\n}");
1537
1538/***/ }),
1539
vendor: 2,255 bytes, lines 1540-1550
1540/***/ "./node_modules/swiper/core/slide/index.js":
1541/*!*************************************************!*\
1542  !*** ./node_modules/swiper/core/slide/index.js ***!
1543  \*************************************************/
1544/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1545
1546"use strict";
1547eval("{/* harmony import */ var _slideTo_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./slideTo.js */ \"./node_modules/swiper/core/slide/slideTo.js\");\n/* harmony import */ var _slideToLoop_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./slideToLoop.js */ \"./node_modules/swiper/core/slide/slideToLoop.js\");\n/* harmony import */ var _slideNext_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./slideNext.js */ \"./node_modules/swiper/core/slide/slideNext.js\");\n/* harmony import */ var _slidePrev_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./slidePrev.js */ \"./node_modules/swiper/core/slide/slidePrev.js\");\n/* harmony import */ var _slideReset_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./slideReset.js */ \"./node_modules/swiper/core/slide/slideReset.js\");\n/* harmony import */ var _slideToClosest_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./slideToClosest.js */ \"./node_modules/swiper/core/slide/slideToClosest.js\");\n/* harmony import */ var _slideToClickedSlide_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./slideToClickedSlide.js */ \"./node_modules/swiper/core/slide/slideToClickedSlide.js\");\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  slideTo: _slideTo_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n  slideToLoop: _slideToLoop_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  slideNext: _slideNext_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n  slidePrev: _slidePrev_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n  slideReset: _slideReset_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n  slideToClosest: _slideToClosest_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n  slideToClickedSlide: _slideToClickedSlide_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"]\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/slide/index.js?\n}");
1548
1549/***/ }),
1550
vendor: 1,593 bytes, lines 1551-1561
1551/***/ "./node_modules/swiper/core/slide/slideNext.js":
1552/*!*****************************************************!*\
1553  !*** ./node_modules/swiper/core/slide/slideNext.js ***!
1554  \*****************************************************/
1555/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1556
1557"use strict";
1558eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ slideNext; }\n/* harmony export */ });\n/* eslint no-unused-vars: \"off\" */\nfunction slideNext(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const {\n    animating,\n    enabled,\n    params\n  } = swiper;\n  if (!enabled) return swiper;\n  let perGroup = params.slidesPerGroup;\n\n  if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n    perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n  }\n\n  const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n\n  if (params.loop) {\n    if (animating && params.loopPreventsSlide) return false;\n    swiper.loopFix(); // eslint-disable-next-line\n\n    swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n  }\n\n  if (params.rewind && swiper.isEnd) {\n    return swiper.slideTo(0, speed, runCallbacks, internal);\n  }\n\n  return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/slide/slideNext.js?\n}");
1559
1560/***/ }),
1561
vendor: 2,702 bytes, lines 1562-1572
1562/***/ "./node_modules/swiper/core/slide/slidePrev.js":
1563/*!*****************************************************!*\
1564  !*** ./node_modules/swiper/core/slide/slidePrev.js ***!
1565  \*****************************************************/
1566/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1567
1568"use strict";
1569eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ slidePrev; }\n/* harmony export */ });\n/* eslint no-unused-vars: \"off\" */\nfunction slidePrev(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const {\n    params,\n    animating,\n    snapGrid,\n    slidesGrid,\n    rtlTranslate,\n    enabled\n  } = swiper;\n  if (!enabled) return swiper;\n\n  if (params.loop) {\n    if (animating && params.loopPreventsSlide) return false;\n    swiper.loopFix(); // eslint-disable-next-line\n\n    swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n  }\n\n  const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\n  function normalize(val) {\n    if (val < 0) return -Math.floor(Math.abs(val));\n    return Math.floor(val);\n  }\n\n  const normalizedTranslate = normalize(translate);\n  const normalizedSnapGrid = snapGrid.map(val => normalize(val));\n  let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n\n  if (typeof prevSnap === 'undefined' && params.cssMode) {\n    let prevSnapIndex;\n    snapGrid.forEach((snap, snapIndex) => {\n      if (normalizedTranslate >= snap) {\n        // prevSnap = snap;\n        prevSnapIndex = snapIndex;\n      }\n    });\n\n    if (typeof prevSnapIndex !== 'undefined') {\n      prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n    }\n  }\n\n  let prevIndex = 0;\n\n  if (typeof prevSnap !== 'undefined') {\n    prevIndex = slidesGrid.indexOf(prevSnap);\n    if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n\n    if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n      prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n      prevIndex = Math.max(prevIndex, 0);\n    }\n  }\n\n  if (params.rewind && swiper.isBeginning) {\n    const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;\n    return swiper.slideTo(lastIndex, speed, runCallbacks, internal);\n  }\n\n  return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/slide/slidePrev.js?\n}");
1570
1571/***/ }),
1572
vendor: 863 bytes, lines 1573-1583
1573/***/ "./node_modules/swiper/core/slide/slideReset.js":
1574/*!******************************************************!*\
1575  !*** ./node_modules/swiper/core/slide/slideReset.js ***!
1576  \******************************************************/
1577/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1578
1579"use strict";
1580eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ slideReset; }\n/* harmony export */ });\n/* eslint no-unused-vars: \"off\" */\nfunction slideReset(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/slide/slideReset.js?\n}");
1581
1582/***/ }),
1583
vendor: 6,746 bytes, lines 1584-1594
1584/***/ "./node_modules/swiper/core/slide/slideTo.js":
1585/*!***************************************************!*\
1586  !*** ./node_modules/swiper/core/slide/slideTo.js ***!
1587  \***************************************************/
1588/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1589
1590"use strict";
1591eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ slideTo; }\n/* harmony export */ });\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\nfunction slideTo(index = 0, speed = this.params.speed, runCallbacks = true, internal, initial) {\n  if (typeof index !== 'number' && typeof index !== 'string') {\n    throw new Error(`The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`);\n  }\n\n  if (typeof index === 'string') {\n    /**\n     * The `index` argument converted from `string` to `number`.\n     * @type {number}\n     */\n    const indexAsNumber = parseInt(index, 10);\n    /**\n     * Determines whether the `index` argument is a valid `number`\n     * after being converted from the `string` type.\n     * @type {boolean}\n     */\n\n    const isValidNumber = isFinite(indexAsNumber);\n\n    if (!isValidNumber) {\n      throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`);\n    } // Knowing that the converted `index` is a valid number,\n    // we can update the original argument's value.\n\n\n    index = indexAsNumber;\n  }\n\n  const swiper = this;\n  let slideIndex = index;\n  if (slideIndex < 0) slideIndex = 0;\n  const {\n    params,\n    snapGrid,\n    slidesGrid,\n    previousIndex,\n    activeIndex,\n    rtlTranslate: rtl,\n    wrapperEl,\n    enabled\n  } = swiper;\n\n  if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) {\n    return false;\n  }\n\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n  let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n  const translate = -snapGrid[snapIndex]; // Normalize slideIndex\n\n  if (params.normalizeSlideIndex) {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      const normalizedTranslate = -Math.floor(translate * 100);\n      const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n      const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {\n          slideIndex = i;\n        } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {\n          slideIndex = i + 1;\n        }\n      } else if (normalizedTranslate >= normalizedGrid) {\n        slideIndex = i;\n      }\n    }\n  } // Directions locks\n\n\n  if (swiper.initialized && slideIndex !== activeIndex) {\n    if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {\n      return false;\n    }\n\n    if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {\n      if ((activeIndex || 0) !== slideIndex) return false;\n    }\n  }\n\n  if (slideIndex !== (previousIndex || 0) && runCallbacks) {\n    swiper.emit('beforeSlideChangeStart');\n  } // Update progress\n\n\n  swiper.updateProgress(translate);\n  let direction;\n  if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset'; // Update Index\n\n  if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {\n    swiper.updateActiveIndex(slideIndex); // Update Height\n\n    if (params.autoHeight) {\n      swiper.updateAutoHeight();\n    }\n\n    swiper.updateSlidesClasses();\n\n    if (params.effect !== 'slide') {\n      swiper.setTranslate(translate);\n    }\n\n    if (direction !== 'reset') {\n      swiper.transitionStart(runCallbacks, direction);\n      swiper.transitionEnd(runCallbacks, direction);\n    }\n\n    return false;\n  }\n\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n    const t = rtl ? translate : -translate;\n\n    if (speed === 0) {\n      const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n      if (isVirtual) {\n        swiper.wrapperEl.style.scrollSnapType = 'none';\n        swiper._immediateVirtual = true;\n      }\n\n      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n\n      if (isVirtual) {\n        requestAnimationFrame(() => {\n          swiper.wrapperEl.style.scrollSnapType = '';\n          swiper._swiperImmediateVirtual = false;\n        });\n      }\n    } else {\n      if (!swiper.support.smoothScroll) {\n        (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.animateCSSModeScroll)({\n          swiper,\n          targetPosition: t,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: t,\n        behavior: 'smooth'\n      });\n    }\n\n    return true;\n  }\n\n  swiper.setTransition(speed);\n  swiper.setTranslate(translate);\n  swiper.updateActiveIndex(slideIndex);\n  swiper.updateSlidesClasses();\n  swiper.emit('beforeTransitionStart', speed, internal);\n  swiper.transitionStart(runCallbacks, direction);\n\n  if (speed === 0) {\n    swiper.transitionEnd(runCallbacks, direction);\n  } else if (!swiper.animating) {\n    swiper.animating = true;\n\n    if (!swiper.onSlideToWrapperTransitionEnd) {\n      swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n        if (!swiper || swiper.destroyed) return;\n        if (e.target !== this) return;\n        swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n        swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n        swiper.onSlideToWrapperTransitionEnd = null;\n        delete swiper.onSlideToWrapperTransitionEnd;\n        swiper.transitionEnd(runCallbacks, direction);\n      };\n    }\n\n    swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n    swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n  }\n\n  return true;\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/slide/slideTo.js?\n}");
1592
1593/***/ }),
1594
vendor: 2,580 bytes, lines 1595-1605
1595/***/ "./node_modules/swiper/core/slide/slideToClickedSlide.js":
1596/*!***************************************************************!*\
1597  !*** ./node_modules/swiper/core/slide/slideToClickedSlide.js ***!
1598  \***************************************************************/
1599/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1600
1601"use strict";
1602eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ slideToClickedSlide; }\n/* harmony export */ });\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\n\nfunction slideToClickedSlide() {\n  const swiper = this;\n  const {\n    params,\n    $wrapperEl\n  } = swiper;\n  const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n  let slideToIndex = swiper.clickedIndex;\n  let realIndex;\n\n  if (params.loop) {\n    if (swiper.animating) return;\n    realIndex = parseInt((0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n\n    if (params.centeredSlides) {\n      if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {\n        swiper.loopFix();\n        slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`).eq(0).index();\n        (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_1__.nextTick)(() => {\n          swiper.slideTo(slideToIndex);\n        });\n      } else {\n        swiper.slideTo(slideToIndex);\n      }\n    } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n      swiper.loopFix();\n      slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`).eq(0).index();\n      (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_1__.nextTick)(() => {\n        swiper.slideTo(slideToIndex);\n      });\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  } else {\n    swiper.slideTo(slideToIndex);\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/slide/slideToClickedSlide.js?\n}");
1603
1604/***/ }),
1605
vendor: 2,077 bytes, lines 1606-1616
1606/***/ "./node_modules/swiper/core/slide/slideToClosest.js":
1607/*!**********************************************************!*\
1608  !*** ./node_modules/swiper/core/slide/slideToClosest.js ***!
1609  \**********************************************************/
1610/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1611
1612"use strict";
1613eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ slideToClosest; }\n/* harmony export */ });\n/* eslint no-unused-vars: \"off\" */\nfunction slideToClosest(speed = this.params.speed, runCallbacks = true, internal, threshold = 0.5) {\n  const swiper = this;\n  let index = swiper.activeIndex;\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n  const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n  if (translate >= swiper.snapGrid[snapIndex]) {\n    // The current translate is on or after the current snap index, so the choice\n    // is between the current index and the one after it.\n    const currentSnap = swiper.snapGrid[snapIndex];\n    const nextSnap = swiper.snapGrid[snapIndex + 1];\n\n    if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n      index += swiper.params.slidesPerGroup;\n    }\n  } else {\n    // The current translate is before the current snap index, so the choice\n    // is between the current index and the one before it.\n    const prevSnap = swiper.snapGrid[snapIndex - 1];\n    const currentSnap = swiper.snapGrid[snapIndex];\n\n    if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n      index -= swiper.params.slidesPerGroup;\n    }\n  }\n\n  index = Math.max(index, 0);\n  index = Math.min(index, swiper.slidesGrid.length - 1);\n  return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/slide/slideToClosest.js?\n}");
1614
1615/***/ }),
1616
vendor: 1,639 bytes, lines 1617-1627
1617/***/ "./node_modules/swiper/core/slide/slideToLoop.js":
1618/*!*******************************************************!*\
1619  !*** ./node_modules/swiper/core/slide/slideToLoop.js ***!
1620  \*******************************************************/
1621/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1622
1623"use strict";
1624eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ slideToLoop; }\n/* harmony export */ });\nfunction slideToLoop(index = 0, speed = this.params.speed, runCallbacks = true, internal) {\n  if (typeof index === 'string') {\n    /**\n     * The `index` argument converted from `string` to `number`.\n     * @type {number}\n     */\n    const indexAsNumber = parseInt(index, 10);\n    /**\n     * Determines whether the `index` argument is a valid `number`\n     * after being converted from the `string` type.\n     * @type {boolean}\n     */\n\n    const isValidNumber = isFinite(indexAsNumber);\n\n    if (!isValidNumber) {\n      throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`);\n    } // Knowing that the converted `index` is a valid number,\n    // we can update the original argument's value.\n\n\n    index = indexAsNumber;\n  }\n\n  const swiper = this;\n  let newIndex = index;\n\n  if (swiper.params.loop) {\n    newIndex += swiper.loopedSlides;\n  }\n\n  return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/slide/slideToLoop.js?\n}");
1625
1626/***/ }),
1627
vendor: 1,333 bytes, lines 1628-1638
1628/***/ "./node_modules/swiper/core/transition/index.js":
1629/*!******************************************************!*\
1630  !*** ./node_modules/swiper/core/transition/index.js ***!
1631  \******************************************************/
1632/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1633
1634"use strict";
1635eval("{/* harmony import */ var _setTransition_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setTransition.js */ \"./node_modules/swiper/core/transition/setTransition.js\");\n/* harmony import */ var _transitionStart_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transitionStart.js */ \"./node_modules/swiper/core/transition/transitionStart.js\");\n/* harmony import */ var _transitionEnd_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./transitionEnd.js */ \"./node_modules/swiper/core/transition/transitionEnd.js\");\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  setTransition: _setTransition_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n  transitionStart: _transitionStart_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  transitionEnd: _transitionEnd_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/transition/index.js?\n}");
1636
1637/***/ }),
1638
vendor: 904 bytes, lines 1639-1649
1639/***/ "./node_modules/swiper/core/transition/setTransition.js":
1640/*!**************************************************************!*\
1641  !*** ./node_modules/swiper/core/transition/setTransition.js ***!
1642  \**************************************************************/
1643/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1644
1645"use strict";
1646eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ setTransition; }\n/* harmony export */ });\nfunction setTransition(duration, byController) {\n  const swiper = this;\n\n  if (!swiper.params.cssMode) {\n    swiper.$wrapperEl.transition(duration);\n  }\n\n  swiper.emit('setTransition', duration, byController);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/transition/setTransition.js?\n}");
1647
1648/***/ }),
1649
vendor: 1,411 bytes, lines 1650-1660
1650/***/ "./node_modules/swiper/core/transition/transitionEmit.js":
1651/*!***************************************************************!*\
1652  !*** ./node_modules/swiper/core/transition/transitionEmit.js ***!
1653  \***************************************************************/
1654/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1655
1656"use strict";
1657eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ transitionEmit; }\n/* harmony export */ });\nfunction transitionEmit({\n  swiper,\n  runCallbacks,\n  direction,\n  step\n}) {\n  const {\n    activeIndex,\n    previousIndex\n  } = swiper;\n  let dir = direction;\n\n  if (!dir) {\n    if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';\n  }\n\n  swiper.emit(`transition${step}`);\n\n  if (runCallbacks && activeIndex !== previousIndex) {\n    if (dir === 'reset') {\n      swiper.emit(`slideResetTransition${step}`);\n      return;\n    }\n\n    swiper.emit(`slideChangeTransition${step}`);\n\n    if (dir === 'next') {\n      swiper.emit(`slideNextTransition${step}`);\n    } else {\n      swiper.emit(`slidePrevTransition${step}`);\n    }\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/transition/transitionEmit.js?\n}");
1658
1659/***/ }),
1660
vendor: 1,223 bytes, lines 1661-1671
1661/***/ "./node_modules/swiper/core/transition/transitionEnd.js":
1662/*!**************************************************************!*\
1663  !*** ./node_modules/swiper/core/transition/transitionEnd.js ***!
1664  \**************************************************************/
1665/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1666
1667"use strict";
1668eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ transitionEnd; }\n/* harmony export */ });\n/* harmony import */ var _transitionEmit_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transitionEmit.js */ \"./node_modules/swiper/core/transition/transitionEmit.js\");\n\nfunction transitionEnd(runCallbacks = true, direction) {\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  swiper.animating = false;\n  if (params.cssMode) return;\n  swiper.setTransition(0);\n  (0,_transitionEmit_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'End'\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/transition/transitionEnd.js?\n}");
1669
1670/***/ }),
1671
vendor: 1,252 bytes, lines 1672-1682
1672/***/ "./node_modules/swiper/core/transition/transitionStart.js":
1673/*!****************************************************************!*\
1674  !*** ./node_modules/swiper/core/transition/transitionStart.js ***!
1675  \****************************************************************/
1676/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1677
1678"use strict";
1679eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ transitionStart; }\n/* harmony export */ });\n/* harmony import */ var _transitionEmit_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transitionEmit.js */ \"./node_modules/swiper/core/transition/transitionEmit.js\");\n\nfunction transitionStart(runCallbacks = true, direction) {\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  if (params.cssMode) return;\n\n  if (params.autoHeight) {\n    swiper.updateAutoHeight();\n  }\n\n  ;(0,_transitionEmit_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'Start'\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/transition/transitionStart.js?\n}");
1680
1681/***/ }),
1682
vendor: 1,374 bytes, lines 1683-1693
1683/***/ "./node_modules/swiper/core/translate/getTranslate.js":
1684/*!************************************************************!*\
1685  !*** ./node_modules/swiper/core/translate/getTranslate.js ***!
1686  \************************************************************/
1687/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1688
1689"use strict";
1690eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ getSwiperTranslate; }\n/* harmony export */ });\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\nfunction getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n  const swiper = this;\n  const {\n    params,\n    rtlTranslate: rtl,\n    translate,\n    $wrapperEl\n  } = swiper;\n\n  if (params.virtualTranslate) {\n    return rtl ? -translate : translate;\n  }\n\n  if (params.cssMode) {\n    return translate;\n  }\n\n  let currentTranslate = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.getTranslate)($wrapperEl[0], axis);\n  if (rtl) currentTranslate = -currentTranslate;\n  return currentTranslate || 0;\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/translate/getTranslate.js?\n}");
1691
1692/***/ }),
1693
vendor: 1,809 bytes, lines 1694-1704
1694/***/ "./node_modules/swiper/core/translate/index.js":
1695/*!*****************************************************!*\
1696  !*** ./node_modules/swiper/core/translate/index.js ***!
1697  \*****************************************************/
1698/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1699
1700"use strict";
1701eval("{/* harmony import */ var _getTranslate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getTranslate.js */ \"./node_modules/swiper/core/translate/getTranslate.js\");\n/* harmony import */ var _setTranslate_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./setTranslate.js */ \"./node_modules/swiper/core/translate/setTranslate.js\");\n/* harmony import */ var _minTranslate_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./minTranslate.js */ \"./node_modules/swiper/core/translate/minTranslate.js\");\n/* harmony import */ var _maxTranslate_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./maxTranslate.js */ \"./node_modules/swiper/core/translate/maxTranslate.js\");\n/* harmony import */ var _translateTo_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./translateTo.js */ \"./node_modules/swiper/core/translate/translateTo.js\");\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  getTranslate: _getTranslate_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n  setTranslate: _setTranslate_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  minTranslate: _minTranslate_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n  maxTranslate: _maxTranslate_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n  translateTo: _translateTo_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/translate/index.js?\n}");
1702
1703/***/ }),
1704
vendor: 754 bytes, lines 1705-1715
1705/***/ "./node_modules/swiper/core/translate/maxTranslate.js":
1706/*!************************************************************!*\
1707  !*** ./node_modules/swiper/core/translate/maxTranslate.js ***!
1708  \************************************************************/
1709/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1710
1711"use strict";
1712eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ maxTranslate; }\n/* harmony export */ });\nfunction maxTranslate() {\n  return -this.snapGrid[this.snapGrid.length - 1];\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/translate/maxTranslate.js?\n}");
1713
1714/***/ }),
1715
vendor: 731 bytes, lines 1716-1726
1716/***/ "./node_modules/swiper/core/translate/minTranslate.js":
1717/*!************************************************************!*\
1718  !*** ./node_modules/swiper/core/translate/minTranslate.js ***!
1719  \************************************************************/
1720/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1721
1722"use strict";
1723eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ minTranslate; }\n/* harmony export */ });\nfunction minTranslate() {\n  return -this.snapGrid[0];\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/translate/minTranslate.js?\n}");
1724
1725/***/ }),
1726
vendor: 1,869 bytes, lines 1727-1737
1727/***/ "./node_modules/swiper/core/translate/setTranslate.js":
1728/*!************************************************************!*\
1729  !*** ./node_modules/swiper/core/translate/setTranslate.js ***!
1730  \************************************************************/
1731/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1732
1733"use strict";
1734eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ setTranslate; }\n/* harmony export */ });\nfunction setTranslate(translate, byController) {\n  const swiper = this;\n  const {\n    rtlTranslate: rtl,\n    params,\n    $wrapperEl,\n    wrapperEl,\n    progress\n  } = swiper;\n  let x = 0;\n  let y = 0;\n  const z = 0;\n\n  if (swiper.isHorizontal()) {\n    x = rtl ? -translate : translate;\n  } else {\n    y = translate;\n  }\n\n  if (params.roundLengths) {\n    x = Math.floor(x);\n    y = Math.floor(y);\n  }\n\n  if (params.cssMode) {\n    wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n  } else if (!params.virtualTranslate) {\n    $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`);\n  }\n\n  swiper.previousTranslate = swiper.translate;\n  swiper.translate = swiper.isHorizontal() ? x : y; // Check if we need to update progress\n\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n  }\n\n  if (newProgress !== progress) {\n    swiper.updateProgress(translate);\n  }\n\n  swiper.emit('setTranslate', swiper.translate, byController);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/translate/setTranslate.js?\n}");
1735
1736/***/ }),
1737
vendor: 3,546 bytes, lines 1738-1748
1738/***/ "./node_modules/swiper/core/translate/translateTo.js":
1739/*!***********************************************************!*\
1740  !*** ./node_modules/swiper/core/translate/translateTo.js ***!
1741  \***********************************************************/
1742/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1743
1744"use strict";
1745eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ translateTo; }\n/* harmony export */ });\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\nfunction translateTo(translate = 0, speed = this.params.speed, runCallbacks = true, translateBounds = true, internal) {\n  const swiper = this;\n  const {\n    params,\n    wrapperEl\n  } = swiper;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return false;\n  }\n\n  const minTranslate = swiper.minTranslate();\n  const maxTranslate = swiper.maxTranslate();\n  let newTranslate;\n  if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate; // Update progress\n\n  swiper.updateProgress(newTranslate);\n\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n\n    if (speed === 0) {\n      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n    } else {\n      if (!swiper.support.smoothScroll) {\n        (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.animateCSSModeScroll)({\n          swiper,\n          targetPosition: -newTranslate,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: -newTranslate,\n        behavior: 'smooth'\n      });\n    }\n\n    return true;\n  }\n\n  if (speed === 0) {\n    swiper.setTransition(0);\n    swiper.setTranslate(newTranslate);\n\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionEnd');\n    }\n  } else {\n    swiper.setTransition(speed);\n    swiper.setTranslate(newTranslate);\n\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionStart');\n    }\n\n    if (!swiper.animating) {\n      swiper.animating = true;\n\n      if (!swiper.onTranslateToWrapperTransitionEnd) {\n        swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n          if (!swiper || swiper.destroyed) return;\n          if (e.target !== this) return;\n          swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n          swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);\n          swiper.onTranslateToWrapperTransitionEnd = null;\n          delete swiper.onTranslateToWrapperTransitionEnd;\n\n          if (runCallbacks) {\n            swiper.emit('transitionEnd');\n          }\n        };\n      }\n\n      swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n      swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);\n    }\n  }\n\n  return true;\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/translate/translateTo.js?\n}");
1746
1747/***/ }),
1748
vendor: 2,980 bytes, lines 1749-1759
1749/***/ "./node_modules/swiper/core/update/index.js":
1750/*!**************************************************!*\
1751  !*** ./node_modules/swiper/core/update/index.js ***!
1752  \**************************************************/
1753/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1754
1755"use strict";
1756eval("{/* harmony import */ var _updateSize_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./updateSize.js */ \"./node_modules/swiper/core/update/updateSize.js\");\n/* harmony import */ var _updateSlides_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./updateSlides.js */ \"./node_modules/swiper/core/update/updateSlides.js\");\n/* harmony import */ var _updateAutoHeight_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updateAutoHeight.js */ \"./node_modules/swiper/core/update/updateAutoHeight.js\");\n/* harmony import */ var _updateSlidesOffset_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./updateSlidesOffset.js */ \"./node_modules/swiper/core/update/updateSlidesOffset.js\");\n/* harmony import */ var _updateSlidesProgress_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./updateSlidesProgress.js */ \"./node_modules/swiper/core/update/updateSlidesProgress.js\");\n/* harmony import */ var _updateProgress_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./updateProgress.js */ \"./node_modules/swiper/core/update/updateProgress.js\");\n/* harmony import */ var _updateSlidesClasses_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./updateSlidesClasses.js */ \"./node_modules/swiper/core/update/updateSlidesClasses.js\");\n/* harmony import */ var _updateActiveIndex_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./updateActiveIndex.js */ \"./node_modules/swiper/core/update/updateActiveIndex.js\");\n/* harmony import */ var _updateClickedSlide_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./updateClickedSlide.js */ \"./node_modules/swiper/core/update/updateClickedSlide.js\");\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  updateSize: _updateSize_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n  updateSlides: _updateSlides_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  updateAutoHeight: _updateAutoHeight_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n  updateSlidesOffset: _updateSlidesOffset_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n  updateSlidesProgress: _updateSlidesProgress_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n  updateProgress: _updateProgress_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n  updateSlidesClasses: _updateSlidesClasses_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n  updateActiveIndex: _updateActiveIndex_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n  updateClickedSlide: _updateClickedSlide_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"]\n});\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/update/index.js?\n}");
1757
1758/***/ }),
1759
vendor: 2,769 bytes, lines 1760-1770
1760/***/ "./node_modules/swiper/core/update/updateActiveIndex.js":
1761/*!**************************************************************!*\
1762  !*** ./node_modules/swiper/core/update/updateActiveIndex.js ***!
1763  \**************************************************************/
1764/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1765
1766"use strict";
1767eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ updateActiveIndex; }\n/* harmony export */ });\nfunction updateActiveIndex(newActiveIndex) {\n  const swiper = this;\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  const {\n    slidesGrid,\n    snapGrid,\n    params,\n    activeIndex: previousIndex,\n    realIndex: previousRealIndex,\n    snapIndex: previousSnapIndex\n  } = swiper;\n  let activeIndex = newActiveIndex;\n  let snapIndex;\n\n  if (typeof activeIndex === 'undefined') {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {\n          activeIndex = i;\n        } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n          activeIndex = i + 1;\n        }\n      } else if (translate >= slidesGrid[i]) {\n        activeIndex = i;\n      }\n    } // Normalize slideIndex\n\n\n    if (params.normalizeSlideIndex) {\n      if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n    }\n  }\n\n  if (snapGrid.indexOf(translate) >= 0) {\n    snapIndex = snapGrid.indexOf(translate);\n  } else {\n    const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n    snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n  }\n\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n  if (activeIndex === previousIndex) {\n    if (snapIndex !== previousSnapIndex) {\n      swiper.snapIndex = snapIndex;\n      swiper.emit('snapIndexChange');\n    }\n\n    return;\n  } // Get real index\n\n\n  const realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);\n  Object.assign(swiper, {\n    snapIndex,\n    realIndex,\n    previousIndex,\n    activeIndex\n  });\n  swiper.emit('activeIndexChange');\n  swiper.emit('snapIndexChange');\n\n  if (previousRealIndex !== realIndex) {\n    swiper.emit('realIndexChange');\n  }\n\n  if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n    swiper.emit('slideChange');\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/update/updateActiveIndex.js?\n}");
1768
1769/***/ }),
1770
vendor: 2,474 bytes, lines 1771-1781
1771/***/ "./node_modules/swiper/core/update/updateAutoHeight.js":
1772/*!*************************************************************!*\
1773  !*** ./node_modules/swiper/core/update/updateAutoHeight.js ***!
1774  \*************************************************************/
1775/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1776
1777"use strict";
1778eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ updateAutoHeight; }\n/* harmony export */ });\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\nfunction updateAutoHeight(speed) {\n  const swiper = this;\n  const activeSlides = [];\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n  let newHeight = 0;\n  let i;\n\n  if (typeof speed === 'number') {\n    swiper.setTransition(speed);\n  } else if (speed === true) {\n    swiper.setTransition(swiper.params.speed);\n  }\n\n  const getSlideByIndex = index => {\n    if (isVirtual) {\n      return swiper.slides.filter(el => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index)[0];\n    }\n\n    return swiper.slides.eq(index)[0];\n  }; // Find slides currently in view\n\n\n  if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n    if (swiper.params.centeredSlides) {\n      (swiper.visibleSlides || (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])([])).each(slide => {\n        activeSlides.push(slide);\n      });\n    } else {\n      for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n        const index = swiper.activeIndex + i;\n        if (index > swiper.slides.length && !isVirtual) break;\n        activeSlides.push(getSlideByIndex(index));\n      }\n    }\n  } else {\n    activeSlides.push(getSlideByIndex(swiper.activeIndex));\n  } // Find new height from highest slide in view\n\n\n  for (i = 0; i < activeSlides.length; i += 1) {\n    if (typeof activeSlides[i] !== 'undefined') {\n      const height = activeSlides[i].offsetHeight;\n      newHeight = height > newHeight ? height : newHeight;\n    }\n  } // Update Height\n\n\n  if (newHeight || newHeight === 0) swiper.$wrapperEl.css('height', `${newHeight}px`);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/update/updateAutoHeight.js?\n}");
1779
1780/***/ }),
1781
vendor: 1,922 bytes, lines 1782-1792
1782/***/ "./node_modules/swiper/core/update/updateClickedSlide.js":
1783/*!***************************************************************!*\
1784  !*** ./node_modules/swiper/core/update/updateClickedSlide.js ***!
1785  \***************************************************************/
1786/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1787
1788"use strict";
1789eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ updateClickedSlide; }\n/* harmony export */ });\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\nfunction updateClickedSlide(e) {\n  const swiper = this;\n  const params = swiper.params;\n  const slide = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(e).closest(`.${params.slideClass}`)[0];\n  let slideFound = false;\n  let slideIndex;\n\n  if (slide) {\n    for (let i = 0; i < swiper.slides.length; i += 1) {\n      if (swiper.slides[i] === slide) {\n        slideFound = true;\n        slideIndex = i;\n        break;\n      }\n    }\n  }\n\n  if (slide && slideFound) {\n    swiper.clickedSlide = slide;\n\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      swiper.clickedIndex = parseInt((0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(slide).attr('data-swiper-slide-index'), 10);\n    } else {\n      swiper.clickedIndex = slideIndex;\n    }\n  } else {\n    swiper.clickedSlide = undefined;\n    swiper.clickedIndex = undefined;\n    return;\n  }\n\n  if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {\n    swiper.slideToClickedSlide();\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/update/updateClickedSlide.js?\n}");
1790
1791/***/ }),
1792
vendor: 1,931 bytes, lines 1793-1803
1793/***/ "./node_modules/swiper/core/update/updateProgress.js":
1794/*!***********************************************************!*\
1795  !*** ./node_modules/swiper/core/update/updateProgress.js ***!
1796  \***********************************************************/
1797/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1798
1799"use strict";
1800eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ updateProgress; }\n/* harmony export */ });\nfunction updateProgress(translate) {\n  const swiper = this;\n\n  if (typeof translate === 'undefined') {\n    const multiplier = swiper.rtlTranslate ? -1 : 1; // eslint-disable-next-line\n\n    translate = swiper && swiper.translate && swiper.translate * multiplier || 0;\n  }\n\n  const params = swiper.params;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  let {\n    progress,\n    isBeginning,\n    isEnd\n  } = swiper;\n  const wasBeginning = isBeginning;\n  const wasEnd = isEnd;\n\n  if (translatesDiff === 0) {\n    progress = 0;\n    isBeginning = true;\n    isEnd = true;\n  } else {\n    progress = (translate - swiper.minTranslate()) / translatesDiff;\n    isBeginning = progress <= 0;\n    isEnd = progress >= 1;\n  }\n\n  Object.assign(swiper, {\n    progress,\n    isBeginning,\n    isEnd\n  });\n  if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);\n\n  if (isBeginning && !wasBeginning) {\n    swiper.emit('reachBeginning toEdge');\n  }\n\n  if (isEnd && !wasEnd) {\n    swiper.emit('reachEnd toEdge');\n  }\n\n  if (wasBeginning && !isBeginning || wasEnd && !isEnd) {\n    swiper.emit('fromEdge');\n  }\n\n  swiper.emit('progress', progress);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/update/updateProgress.js?\n}");
1801
1802/***/ }),
1803
vendor: 1,641 bytes, lines 1804-1814
1804/***/ "./node_modules/swiper/core/update/updateSize.js":
1805/*!*******************************************************!*\
1806  !*** ./node_modules/swiper/core/update/updateSize.js ***!
1807  \*******************************************************/
1808/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1809
1810"use strict";
1811eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ updateSize; }\n/* harmony export */ });\nfunction updateSize() {\n  const swiper = this;\n  let width;\n  let height;\n  const $el = swiper.$el;\n\n  if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n    width = swiper.params.width;\n  } else {\n    width = $el[0].clientWidth;\n  }\n\n  if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n    height = swiper.params.height;\n  } else {\n    height = $el[0].clientHeight;\n  }\n\n  if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {\n    return;\n  } // Subtract paddings\n\n\n  width = width - parseInt($el.css('padding-left') || 0, 10) - parseInt($el.css('padding-right') || 0, 10);\n  height = height - parseInt($el.css('padding-top') || 0, 10) - parseInt($el.css('padding-bottom') || 0, 10);\n  if (Number.isNaN(width)) width = 0;\n  if (Number.isNaN(height)) height = 0;\n  Object.assign(swiper, {\n    width,\n    height,\n    size: swiper.isHorizontal() ? width : height\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/update/updateSize.js?\n}");
1812
1813/***/ }),
1814
vendor: 11,789 bytes, lines 1815-1825
1815/***/ "./node_modules/swiper/core/update/updateSlides.js":
1816/*!*********************************************************!*\
1817  !*** ./node_modules/swiper/core/update/updateSlides.js ***!
1818  \*********************************************************/
1819/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1820
1821"use strict";
1822eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ updateSlides; }\n/* harmony export */ });\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\nfunction updateSlides() {\n  const swiper = this;\n\n  function getDirectionLabel(property) {\n    if (swiper.isHorizontal()) {\n      return property;\n    } // prettier-ignore\n\n\n    return {\n      'width': 'height',\n      'margin-top': 'margin-left',\n      'margin-bottom ': 'margin-right',\n      'margin-left': 'margin-top',\n      'margin-right': 'margin-bottom',\n      'padding-left': 'padding-top',\n      'padding-right': 'padding-bottom',\n      'marginRight': 'marginBottom'\n    }[property];\n  }\n\n  function getDirectionPropertyValue(node, label) {\n    return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n  }\n\n  const params = swiper.params;\n  const {\n    $wrapperEl,\n    size: swiperSize,\n    rtlTranslate: rtl,\n    wrongRTL\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n  const slides = $wrapperEl.children(`.${swiper.params.slideClass}`);\n  const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n  let snapGrid = [];\n  const slidesGrid = [];\n  const slidesSizesGrid = [];\n  let offsetBefore = params.slidesOffsetBefore;\n\n  if (typeof offsetBefore === 'function') {\n    offsetBefore = params.slidesOffsetBefore.call(swiper);\n  }\n\n  let offsetAfter = params.slidesOffsetAfter;\n\n  if (typeof offsetAfter === 'function') {\n    offsetAfter = params.slidesOffsetAfter.call(swiper);\n  }\n\n  const previousSnapGridLength = swiper.snapGrid.length;\n  const previousSlidesGridLength = swiper.slidesGrid.length;\n  let spaceBetween = params.spaceBetween;\n  let slidePosition = -offsetBefore;\n  let prevSlideSize = 0;\n  let index = 0;\n\n  if (typeof swiperSize === 'undefined') {\n    return;\n  }\n\n  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n    spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;\n  }\n\n  swiper.virtualSize = -spaceBetween; // reset margins\n\n  if (rtl) slides.css({\n    marginLeft: '',\n    marginBottom: '',\n    marginTop: ''\n  });else slides.css({\n    marginRight: '',\n    marginBottom: '',\n    marginTop: ''\n  }); // reset cssMode offsets\n\n  if (params.centeredSlides && params.cssMode) {\n    (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.setCSSProperty)(swiper.wrapperEl, '--swiper-centered-offset-before', '');\n    (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.setCSSProperty)(swiper.wrapperEl, '--swiper-centered-offset-after', '');\n  }\n\n  const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n\n  if (gridEnabled) {\n    swiper.grid.initSlides(slidesLength);\n  } // Calc slides\n\n\n  let slideSize;\n  const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {\n    return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n  }).length > 0;\n\n  for (let i = 0; i < slidesLength; i += 1) {\n    slideSize = 0;\n    const slide = slides.eq(i);\n\n    if (gridEnabled) {\n      swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n    }\n\n    if (slide.css('display') === 'none') continue; // eslint-disable-line\n\n    if (params.slidesPerView === 'auto') {\n      if (shouldResetSlideSize) {\n        slides[i].style[getDirectionLabel('width')] = ``;\n      }\n\n      const slideStyles = getComputedStyle(slide[0]);\n      const currentTransform = slide[0].style.transform;\n      const currentWebKitTransform = slide[0].style.webkitTransform;\n\n      if (currentTransform) {\n        slide[0].style.transform = 'none';\n      }\n\n      if (currentWebKitTransform) {\n        slide[0].style.webkitTransform = 'none';\n      }\n\n      if (params.roundLengths) {\n        slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);\n      } else {\n        // eslint-disable-next-line\n        const width = getDirectionPropertyValue(slideStyles, 'width');\n        const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n        const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n        const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n        const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n        const boxSizing = slideStyles.getPropertyValue('box-sizing');\n\n        if (boxSizing && boxSizing === 'border-box') {\n          slideSize = width + marginLeft + marginRight;\n        } else {\n          const {\n            clientWidth,\n            offsetWidth\n          } = slide[0];\n          slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);\n        }\n      }\n\n      if (currentTransform) {\n        slide[0].style.transform = currentTransform;\n      }\n\n      if (currentWebKitTransform) {\n        slide[0].style.webkitTransform = currentWebKitTransform;\n      }\n\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n    } else {\n      slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n      if (slides[i]) {\n        slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n      }\n    }\n\n    if (slides[i]) {\n      slides[i].swiperSlideSize = slideSize;\n    }\n\n    slidesSizesGrid.push(slideSize);\n\n    if (params.centeredSlides) {\n      slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n      if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n    } else {\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n      slidePosition = slidePosition + slideSize + spaceBetween;\n    }\n\n    swiper.virtualSize += slideSize + spaceBetween;\n    prevSlideSize = slideSize;\n    index += 1;\n  }\n\n  swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n  if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n    $wrapperEl.css({\n      width: `${swiper.virtualSize + params.spaceBetween}px`\n    });\n  }\n\n  if (params.setWrapperSize) {\n    $wrapperEl.css({\n      [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px`\n    });\n  }\n\n  if (gridEnabled) {\n    swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\n  } // Remove last grid elements depending on width\n\n\n  if (!params.centeredSlides) {\n    const newSlidesGrid = [];\n\n    for (let i = 0; i < snapGrid.length; i += 1) {\n      let slidesGridItem = snapGrid[i];\n      if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n\n      if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n        newSlidesGrid.push(slidesGridItem);\n      }\n    }\n\n    snapGrid = newSlidesGrid;\n\n    if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {\n      snapGrid.push(swiper.virtualSize - swiperSize);\n    }\n  }\n\n  if (snapGrid.length === 0) snapGrid = [0];\n\n  if (params.spaceBetween !== 0) {\n    const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n    slides.filter((_, slideIndex) => {\n      if (!params.cssMode) return true;\n\n      if (slideIndex === slides.length - 1) {\n        return false;\n      }\n\n      return true;\n    }).css({\n      [key]: `${spaceBetween}px`\n    });\n  }\n\n  if (params.centeredSlides && params.centeredSlidesBounds) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n    });\n    allSlidesSize -= params.spaceBetween;\n    const maxSnap = allSlidesSize - swiperSize;\n    snapGrid = snapGrid.map(snap => {\n      if (snap < 0) return -offsetBefore;\n      if (snap > maxSnap) return maxSnap + offsetAfter;\n      return snap;\n    });\n  }\n\n  if (params.centerInsufficientSlides) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n    });\n    allSlidesSize -= params.spaceBetween;\n\n    if (allSlidesSize < swiperSize) {\n      const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n      snapGrid.forEach((snap, snapIndex) => {\n        snapGrid[snapIndex] = snap - allSlidesOffset;\n      });\n      slidesGrid.forEach((snap, snapIndex) => {\n        slidesGrid[snapIndex] = snap + allSlidesOffset;\n      });\n    }\n  }\n\n  Object.assign(swiper, {\n    slides,\n    snapGrid,\n    slidesGrid,\n    slidesSizesGrid\n  });\n\n  if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n    (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.setCSSProperty)(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n    (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.setCSSProperty)(swiper.wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);\n    const addToSnapGrid = -swiper.snapGrid[0];\n    const addToSlidesGrid = -swiper.slidesGrid[0];\n    swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);\n    swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);\n  }\n\n  if (slidesLength !== previousSlidesLength) {\n    swiper.emit('slidesLengthChange');\n  }\n\n  if (snapGrid.length !== previousSnapGridLength) {\n    if (swiper.params.watchOverflow) swiper.checkOverflow();\n    swiper.emit('snapGridLengthChange');\n  }\n\n  if (slidesGrid.length !== previousSlidesGridLength) {\n    swiper.emit('slidesGridLengthChange');\n  }\n\n  if (params.watchSlidesProgress) {\n    swiper.updateSlidesOffset();\n  }\n\n  if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {\n    const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;\n    const hasClassBackfaceClassAdded = swiper.$el.hasClass(backFaceHiddenClass);\n\n    if (slidesLength <= params.maxBackfaceHiddenSlides) {\n      if (!hasClassBackfaceClassAdded) swiper.$el.addClass(backFaceHiddenClass);\n    } else if (hasClassBackfaceClassAdded) {\n      swiper.$el.removeClass(backFaceHiddenClass);\n    }\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/update/updateSlides.js?\n}");
1823
1824/***/ }),
1825
vendor: 3,488 bytes, lines 1826-1836
1826/***/ "./node_modules/swiper/core/update/updateSlidesClasses.js":
1827/*!****************************************************************!*\
1828  !*** ./node_modules/swiper/core/update/updateSlidesClasses.js ***!
1829  \****************************************************************/
1830/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1831
1832"use strict";
1833eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ updateSlidesClasses; }\n/* harmony export */ });\nfunction updateSlidesClasses() {\n  const swiper = this;\n  const {\n    slides,\n    params,\n    $wrapperEl,\n    activeIndex,\n    realIndex\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  slides.removeClass(`${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`);\n  let activeSlide;\n\n  if (isVirtual) {\n    activeSlide = swiper.$wrapperEl.find(`.${params.slideClass}[data-swiper-slide-index=\"${activeIndex}\"]`);\n  } else {\n    activeSlide = slides.eq(activeIndex);\n  } // Active classes\n\n\n  activeSlide.addClass(params.slideActiveClass);\n\n  if (params.loop) {\n    // Duplicate to all looped slides\n    if (activeSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${realIndex}\"]`).addClass(params.slideDuplicateActiveClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${realIndex}\"]`).addClass(params.slideDuplicateActiveClass);\n    }\n  } // Next Slide\n\n\n  let nextSlide = activeSlide.nextAll(`.${params.slideClass}`).eq(0).addClass(params.slideNextClass);\n\n  if (params.loop && nextSlide.length === 0) {\n    nextSlide = slides.eq(0);\n    nextSlide.addClass(params.slideNextClass);\n  } // Prev Slide\n\n\n  let prevSlide = activeSlide.prevAll(`.${params.slideClass}`).eq(0).addClass(params.slidePrevClass);\n\n  if (params.loop && prevSlide.length === 0) {\n    prevSlide = slides.eq(-1);\n    prevSlide.addClass(params.slidePrevClass);\n  }\n\n  if (params.loop) {\n    // Duplicate to all looped slides\n    if (nextSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicateNextClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicateNextClass);\n    }\n\n    if (prevSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicatePrevClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicatePrevClass);\n    }\n  }\n\n  swiper.emitSlidesClasses();\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/update/updateSlidesClasses.js?\n}");
1834
1835/***/ }),
1836
vendor: 944 bytes, lines 1837-1847
1837/***/ "./node_modules/swiper/core/update/updateSlidesOffset.js":
1838/*!***************************************************************!*\
1839  !*** ./node_modules/swiper/core/update/updateSlidesOffset.js ***!
1840  \***************************************************************/
1841/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1842
1843"use strict";
1844eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ updateSlidesOffset; }\n/* harmony export */ });\nfunction updateSlidesOffset() {\n  const swiper = this;\n  const slides = swiper.slides;\n\n  for (let i = 0; i < slides.length; i += 1) {\n    slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/update/updateSlidesOffset.js?\n}");
1845
1846/***/ }),
1847
vendor: 2,719 bytes, lines 1848-1858
1848/***/ "./node_modules/swiper/core/update/updateSlidesProgress.js":
1849/*!*****************************************************************!*\
1850  !*** ./node_modules/swiper/core/update/updateSlidesProgress.js ***!
1851  \*****************************************************************/
1852/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1853
1854"use strict";
1855eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ updateSlidesProgress; }\n/* harmony export */ });\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\nfunction updateSlidesProgress(translate = this && this.translate || 0) {\n  const swiper = this;\n  const params = swiper.params;\n  const {\n    slides,\n    rtlTranslate: rtl,\n    snapGrid\n  } = swiper;\n  if (slides.length === 0) return;\n  if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n  let offsetCenter = -translate;\n  if (rtl) offsetCenter = translate; // Visible Slides\n\n  slides.removeClass(params.slideVisibleClass);\n  swiper.visibleSlidesIndexes = [];\n  swiper.visibleSlides = [];\n\n  for (let i = 0; i < slides.length; i += 1) {\n    const slide = slides[i];\n    let slideOffset = slide.swiperSlideOffset;\n\n    if (params.cssMode && params.centeredSlides) {\n      slideOffset -= slides[0].swiperSlideOffset;\n    }\n\n    const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween);\n    const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween);\n    const slideBefore = -(offsetCenter - slideOffset);\n    const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n    const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;\n\n    if (isVisible) {\n      swiper.visibleSlides.push(slide);\n      swiper.visibleSlidesIndexes.push(i);\n      slides.eq(i).addClass(params.slideVisibleClass);\n    }\n\n    slide.progress = rtl ? -slideProgress : slideProgress;\n    slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n  }\n\n  swiper.visibleSlides = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(swiper.visibleSlides);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/core/update/updateSlidesProgress.js?\n}");
1856
1857/***/ }),
1858
vendor: 11,407 bytes, lines 1859-1869
1859/***/ "./node_modules/swiper/modules/a11y/a11y.js":
1860/*!**************************************************!*\
1861  !*** ./node_modules/swiper/modules/a11y/a11y.js ***!
1862  \**************************************************/
1863/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
1864
1865"use strict";
1866eval("{/* unused harmony export default */\n/* harmony import */ var _shared_classes_to_selector_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/classes-to-selector.js */ \"./node_modules/swiper/shared/classes-to-selector.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\n\nfunction A11y({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    a11y: {\n      enabled: true,\n      notificationClass: 'swiper-notification',\n      prevSlideMessage: 'Previous slide',\n      nextSlideMessage: 'Next slide',\n      firstSlideMessage: 'This is the first slide',\n      lastSlideMessage: 'This is the last slide',\n      paginationBulletMessage: 'Go to slide {{index}}',\n      slideLabelMessage: '{{index}} / {{slidesLength}}',\n      containerMessage: null,\n      containerRoleDescriptionMessage: null,\n      itemRoleDescriptionMessage: null,\n      slideRole: 'group',\n      id: null\n    }\n  });\n  swiper.a11y = {\n    clicked: false\n  };\n  let liveRegion = null;\n\n  function notify(message) {\n    const notification = liveRegion;\n    if (notification.length === 0) return;\n    notification.html('');\n    notification.html(message);\n  }\n\n  function getRandomNumber(size = 16) {\n    const randomChar = () => Math.round(16 * Math.random()).toString(16);\n\n    return 'x'.repeat(size).replace(/x/g, randomChar);\n  }\n\n  function makeElFocusable($el) {\n    $el.attr('tabIndex', '0');\n  }\n\n  function makeElNotFocusable($el) {\n    $el.attr('tabIndex', '-1');\n  }\n\n  function addElRole($el, role) {\n    $el.attr('role', role);\n  }\n\n  function addElRoleDescription($el, description) {\n    $el.attr('aria-roledescription', description);\n  }\n\n  function addElControls($el, controls) {\n    $el.attr('aria-controls', controls);\n  }\n\n  function addElLabel($el, label) {\n    $el.attr('aria-label', label);\n  }\n\n  function addElId($el, id) {\n    $el.attr('id', id);\n  }\n\n  function addElLive($el, live) {\n    $el.attr('aria-live', live);\n  }\n\n  function disableEl($el) {\n    $el.attr('aria-disabled', true);\n  }\n\n  function enableEl($el) {\n    $el.attr('aria-disabled', false);\n  }\n\n  function onEnterOrSpaceKey(e) {\n    if (e.keyCode !== 13 && e.keyCode !== 32) return;\n    const params = swiper.params.a11y;\n    const $targetEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(e.target);\n\n    if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n      if (!(swiper.isEnd && !swiper.params.loop)) {\n        swiper.slideNext();\n      }\n\n      if (swiper.isEnd) {\n        notify(params.lastSlideMessage);\n      } else {\n        notify(params.nextSlideMessage);\n      }\n    }\n\n    if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n      if (!(swiper.isBeginning && !swiper.params.loop)) {\n        swiper.slidePrev();\n      }\n\n      if (swiper.isBeginning) {\n        notify(params.firstSlideMessage);\n      } else {\n        notify(params.prevSlideMessage);\n      }\n    }\n\n    if (swiper.pagination && $targetEl.is((0,_shared_classes_to_selector_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(swiper.params.pagination.bulletClass))) {\n      $targetEl[0].click();\n    }\n  }\n\n  function updateNavigation() {\n    if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) return;\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n\n    if ($prevEl && $prevEl.length > 0) {\n      if (swiper.isBeginning) {\n        disableEl($prevEl);\n        makeElNotFocusable($prevEl);\n      } else {\n        enableEl($prevEl);\n        makeElFocusable($prevEl);\n      }\n    }\n\n    if ($nextEl && $nextEl.length > 0) {\n      if (swiper.isEnd) {\n        disableEl($nextEl);\n        makeElNotFocusable($nextEl);\n      } else {\n        enableEl($nextEl);\n        makeElFocusable($nextEl);\n      }\n    }\n  }\n\n  function hasPagination() {\n    return swiper.pagination && swiper.pagination.bullets && swiper.pagination.bullets.length;\n  }\n\n  function hasClickablePagination() {\n    return hasPagination() && swiper.params.pagination.clickable;\n  }\n\n  function updatePagination() {\n    const params = swiper.params.a11y;\n    if (!hasPagination()) return;\n    swiper.pagination.bullets.each(bulletEl => {\n      const $bulletEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(bulletEl);\n\n      if (swiper.params.pagination.clickable) {\n        makeElFocusable($bulletEl);\n\n        if (!swiper.params.pagination.renderBullet) {\n          addElRole($bulletEl, 'button');\n          addElLabel($bulletEl, params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, $bulletEl.index() + 1));\n        }\n      }\n\n      if ($bulletEl.is(`.${swiper.params.pagination.bulletActiveClass}`)) {\n        $bulletEl.attr('aria-current', 'true');\n      } else {\n        $bulletEl.removeAttr('aria-current');\n      }\n    });\n  }\n\n  const initNavEl = ($el, wrapperId, message) => {\n    makeElFocusable($el);\n\n    if ($el[0].tagName !== 'BUTTON') {\n      addElRole($el, 'button');\n      $el.on('keydown', onEnterOrSpaceKey);\n    }\n\n    addElLabel($el, message);\n    addElControls($el, wrapperId);\n  };\n\n  const handlePointerDown = () => {\n    swiper.a11y.clicked = true;\n  };\n\n  const handlePointerUp = () => {\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        if (!swiper.destroyed) {\n          swiper.a11y.clicked = false;\n        }\n      });\n    });\n  };\n\n  const handleFocus = e => {\n    if (swiper.a11y.clicked) return;\n    const slideEl = e.target.closest(`.${swiper.params.slideClass}`);\n    if (!slideEl || !swiper.slides.includes(slideEl)) return;\n    const isActive = swiper.slides.indexOf(slideEl) === swiper.activeIndex;\n    const isVisible = swiper.params.watchSlidesProgress && swiper.visibleSlides && swiper.visibleSlides.includes(slideEl);\n    if (isActive || isVisible) return;\n    if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;\n\n    if (swiper.isHorizontal()) {\n      swiper.el.scrollLeft = 0;\n    } else {\n      swiper.el.scrollTop = 0;\n    }\n\n    swiper.slideTo(swiper.slides.indexOf(slideEl), 0);\n  };\n\n  const initSlides = () => {\n    const params = swiper.params.a11y;\n\n    if (params.itemRoleDescriptionMessage) {\n      addElRoleDescription((0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(swiper.slides), params.itemRoleDescriptionMessage);\n    }\n\n    if (params.slideRole) {\n      addElRole((0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(swiper.slides), params.slideRole);\n    }\n\n    const slidesLength = swiper.params.loop ? swiper.slides.filter(el => !el.classList.contains(swiper.params.slideDuplicateClass)).length : swiper.slides.length;\n\n    if (params.slideLabelMessage) {\n      swiper.slides.each((slideEl, index) => {\n        const $slideEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(slideEl);\n        const slideIndex = swiper.params.loop ? parseInt($slideEl.attr('data-swiper-slide-index'), 10) : index;\n        const ariaLabelMessage = params.slideLabelMessage.replace(/\\{\\{index\\}\\}/, slideIndex + 1).replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n        addElLabel($slideEl, ariaLabelMessage);\n      });\n    }\n  };\n\n  const init = () => {\n    const params = swiper.params.a11y;\n    swiper.$el.append(liveRegion); // Container\n\n    const $containerEl = swiper.$el;\n\n    if (params.containerRoleDescriptionMessage) {\n      addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);\n    }\n\n    if (params.containerMessage) {\n      addElLabel($containerEl, params.containerMessage);\n    } // Wrapper\n\n\n    const $wrapperEl = swiper.$wrapperEl;\n    const wrapperId = params.id || $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n    const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n    addElId($wrapperEl, wrapperId);\n    addElLive($wrapperEl, live); // Slide\n\n    initSlides(); // Navigation\n\n    let $nextEl;\n    let $prevEl;\n\n    if (swiper.navigation && swiper.navigation.$nextEl) {\n      $nextEl = swiper.navigation.$nextEl;\n    }\n\n    if (swiper.navigation && swiper.navigation.$prevEl) {\n      $prevEl = swiper.navigation.$prevEl;\n    }\n\n    if ($nextEl && $nextEl.length) {\n      initNavEl($nextEl, wrapperId, params.nextSlideMessage);\n    }\n\n    if ($prevEl && $prevEl.length) {\n      initNavEl($prevEl, wrapperId, params.prevSlideMessage);\n    } // Pagination\n\n\n    if (hasClickablePagination()) {\n      swiper.pagination.$el.on('keydown', (0,_shared_classes_to_selector_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(swiper.params.pagination.bulletClass), onEnterOrSpaceKey);\n    } // Tab focus\n\n\n    swiper.$el.on('focus', handleFocus, true);\n    swiper.$el.on('pointerdown', handlePointerDown, true);\n    swiper.$el.on('pointerup', handlePointerUp, true);\n  };\n\n  function destroy() {\n    if (liveRegion && liveRegion.length > 0) liveRegion.remove();\n    let $nextEl;\n    let $prevEl;\n\n    if (swiper.navigation && swiper.navigation.$nextEl) {\n      $nextEl = swiper.navigation.$nextEl;\n    }\n\n    if (swiper.navigation && swiper.navigation.$prevEl) {\n      $prevEl = swiper.navigation.$prevEl;\n    }\n\n    if ($nextEl) {\n      $nextEl.off('keydown', onEnterOrSpaceKey);\n    }\n\n    if ($prevEl) {\n      $prevEl.off('keydown', onEnterOrSpaceKey);\n    } // Pagination\n\n\n    if (hasClickablePagination()) {\n      swiper.pagination.$el.off('keydown', (0,_shared_classes_to_selector_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(swiper.params.pagination.bulletClass), onEnterOrSpaceKey);\n    } // Tab focus\n\n\n    swiper.$el.off('focus', handleFocus, true);\n    swiper.$el.off('pointerdown', handlePointerDown, true);\n    swiper.$el.off('pointerup', handlePointerUp, true);\n  }\n\n  on('beforeInit', () => {\n    liveRegion = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(`<span class=\"${swiper.params.a11y.notificationClass}\" aria-live=\"assertive\" aria-atomic=\"true\"></span>`);\n  });\n  on('afterInit', () => {\n    if (!swiper.params.a11y.enabled) return;\n    init();\n  });\n  on('slidesLengthChange snapGridLengthChange slidesGridLengthChange', () => {\n    if (!swiper.params.a11y.enabled) return;\n    initSlides();\n  });\n  on('fromEdge toEdge afterInit lock unlock', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updateNavigation();\n  });\n  on('paginationUpdate', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updatePagination();\n  });\n  on('destroy', () => {\n    if (!swiper.params.a11y.enabled) return;\n    destroy();\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/a11y/a11y.js?\n}");
1867
1868/***/ }),
1869
vendor: 7,159 bytes, lines 1870-1880
1870/***/ "./node_modules/swiper/modules/autoplay/autoplay.js":
1871/*!**********************************************************!*\
1872  !*** ./node_modules/swiper/modules/autoplay/autoplay.js ***!
1873  \**********************************************************/
1874/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
1875
1876"use strict";
1877eval("{/* unused harmony export default */\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n/* eslint no-underscore-dangle: \"off\" */\n\n/* eslint no-use-before-define: \"off\" */\n\n\nfunction Autoplay({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  let timeout;\n  swiper.autoplay = {\n    running: false,\n    paused: false\n  };\n  extendParams({\n    autoplay: {\n      enabled: false,\n      delay: 3000,\n      waitForTransition: true,\n      disableOnInteraction: true,\n      stopOnLastSlide: false,\n      reverseDirection: false,\n      pauseOnMouseEnter: false\n    }\n  });\n\n  function run() {\n    if (!swiper.size) {\n      swiper.autoplay.running = false;\n      swiper.autoplay.paused = false;\n      return;\n    }\n\n    const $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n    let delay = swiper.params.autoplay.delay;\n\n    if ($activeSlideEl.attr('data-swiper-autoplay')) {\n      delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n    }\n\n    clearTimeout(timeout);\n    timeout = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_1__.nextTick)(() => {\n      let autoplayResult;\n\n      if (swiper.params.autoplay.reverseDirection) {\n        if (swiper.params.loop) {\n          swiper.loopFix();\n          autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.isBeginning) {\n          autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.params.autoplay.stopOnLastSlide) {\n          autoplayResult = swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);\n          emit('autoplay');\n        } else {\n          stop();\n        }\n      } else if (swiper.params.loop) {\n        swiper.loopFix();\n        autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n        emit('autoplay');\n      } else if (!swiper.isEnd) {\n        autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n        emit('autoplay');\n      } else if (!swiper.params.autoplay.stopOnLastSlide) {\n        autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);\n        emit('autoplay');\n      } else {\n        stop();\n      }\n\n      if (swiper.params.cssMode && swiper.autoplay.running) run();else if (autoplayResult === false) {\n        run();\n      }\n    }, delay);\n  }\n\n  function start() {\n    if (typeof timeout !== 'undefined') return false;\n    if (swiper.autoplay.running) return false;\n    swiper.autoplay.running = true;\n    emit('autoplayStart');\n    run();\n    return true;\n  }\n\n  function stop() {\n    if (!swiper.autoplay.running) return false;\n    if (typeof timeout === 'undefined') return false;\n\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = undefined;\n    }\n\n    swiper.autoplay.running = false;\n    emit('autoplayStop');\n    return true;\n  }\n\n  function pause(speed) {\n    if (!swiper.autoplay.running) return;\n    if (swiper.autoplay.paused) return;\n    if (timeout) clearTimeout(timeout);\n    swiper.autoplay.paused = true;\n\n    if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n      swiper.autoplay.paused = false;\n      run();\n    } else {\n      ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n        swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd);\n      });\n    }\n  }\n\n  function onVisibilityChange() {\n    const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n\n    if (document.visibilityState === 'hidden' && swiper.autoplay.running) {\n      pause();\n    }\n\n    if (document.visibilityState === 'visible' && swiper.autoplay.paused) {\n      run();\n      swiper.autoplay.paused = false;\n    }\n  }\n\n  function onTransitionEnd(e) {\n    if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;\n    if (e.target !== swiper.$wrapperEl[0]) return;\n    ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n      swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n    });\n    swiper.autoplay.paused = false;\n\n    if (!swiper.autoplay.running) {\n      stop();\n    } else {\n      run();\n    }\n  }\n\n  function onMouseEnter() {\n    if (swiper.params.autoplay.disableOnInteraction) {\n      stop();\n    } else {\n      emit('autoplayPause');\n      pause();\n    }\n\n    ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n      swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n    });\n  }\n\n  function onMouseLeave() {\n    if (swiper.params.autoplay.disableOnInteraction) {\n      return;\n    }\n\n    swiper.autoplay.paused = false;\n    emit('autoplayResume');\n    run();\n  }\n\n  function attachMouseEvents() {\n    if (swiper.params.autoplay.pauseOnMouseEnter) {\n      swiper.$el.on('mouseenter', onMouseEnter);\n      swiper.$el.on('mouseleave', onMouseLeave);\n    }\n  }\n\n  function detachMouseEvents() {\n    swiper.$el.off('mouseenter', onMouseEnter);\n    swiper.$el.off('mouseleave', onMouseLeave);\n  }\n\n  on('init', () => {\n    if (swiper.params.autoplay.enabled) {\n      start();\n      const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n      document.addEventListener('visibilitychange', onVisibilityChange);\n      attachMouseEvents();\n    }\n  });\n  on('beforeTransitionStart', (_s, speed, internal) => {\n    if (swiper.autoplay.running) {\n      if (internal || !swiper.params.autoplay.disableOnInteraction) {\n        swiper.autoplay.pause(speed);\n      } else {\n        stop();\n      }\n    }\n  });\n  on('sliderFirstMove', () => {\n    if (swiper.autoplay.running) {\n      if (swiper.params.autoplay.disableOnInteraction) {\n        stop();\n      } else {\n        pause();\n      }\n    }\n  });\n  on('touchEnd', () => {\n    if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) {\n      run();\n    }\n  });\n  on('destroy', () => {\n    detachMouseEvents();\n\n    if (swiper.autoplay.running) {\n      stop();\n    }\n\n    const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n    document.removeEventListener('visibilitychange', onVisibilityChange);\n  });\n  Object.assign(swiper.autoplay, {\n    pause,\n    run,\n    start,\n    stop\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/autoplay/autoplay.js?\n}");
1878
1879/***/ }),
1880
vendor: 6,570 bytes, lines 1881-1891
1881/***/ "./node_modules/swiper/modules/controller/controller.js":
1882/*!**************************************************************!*\
1883  !*** ./node_modules/swiper/modules/controller/controller.js ***!
1884  \**************************************************************/
1885/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
1886
1887"use strict";
1888eval("{/* unused harmony export default */\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\n\nfunction Controller({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    controller: {\n      control: undefined,\n      inverse: false,\n      by: 'slide' // or 'container'\n\n    }\n  });\n  swiper.controller = {\n    control: undefined\n  };\n\n  function LinearSpline(x, y) {\n    const binarySearch = function search() {\n      let maxIndex;\n      let minIndex;\n      let guess;\n      return (array, val) => {\n        minIndex = -1;\n        maxIndex = array.length;\n\n        while (maxIndex - minIndex > 1) {\n          guess = maxIndex + minIndex >> 1;\n\n          if (array[guess] <= val) {\n            minIndex = guess;\n          } else {\n            maxIndex = guess;\n          }\n        }\n\n        return maxIndex;\n      };\n    }();\n\n    this.x = x;\n    this.y = y;\n    this.lastIndex = x.length - 1; // Given an x value (x2), return the expected y2 value:\n    // (x1,y1) is the known point before given value,\n    // (x3,y3) is the known point after given value.\n\n    let i1;\n    let i3;\n\n    this.interpolate = function interpolate(x2) {\n      if (!x2) return 0; // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n\n      i3 = binarySearch(this.x, x2);\n      i1 = i3 - 1; // We have our indexes i1 & i3, so we can calculate already:\n      // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n\n      return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1];\n    };\n\n    return this;\n  } // xxx: for now i will just save one spline function to to\n\n\n  function getInterpolateFunction(c) {\n    if (!swiper.controller.spline) {\n      swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid);\n    }\n  }\n\n  function setTranslate(_t, byController) {\n    const controlled = swiper.controller.control;\n    let multiplier;\n    let controlledTranslate;\n    const Swiper = swiper.constructor;\n\n    function setControlledTranslate(c) {\n      // this will create an Interpolate function based on the snapGrids\n      // x is the Grid of the scrolled scroller and y will be the controlled scroller\n      // it makes sense to create this only once and recall it for the interpolation\n      // the function does a lot of value caching for performance\n      const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n\n      if (swiper.params.controller.by === 'slide') {\n        getInterpolateFunction(c); // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n        // but it did not work out\n\n        controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n      }\n\n      if (!controlledTranslate || swiper.params.controller.by === 'container') {\n        multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n        controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();\n      }\n\n      if (swiper.params.controller.inverse) {\n        controlledTranslate = c.maxTranslate() - controlledTranslate;\n      }\n\n      c.updateProgress(controlledTranslate);\n      c.setTranslate(controlledTranslate, swiper);\n      c.updateActiveIndex();\n      c.updateSlidesClasses();\n    }\n\n    if (Array.isArray(controlled)) {\n      for (let i = 0; i < controlled.length; i += 1) {\n        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n          setControlledTranslate(controlled[i]);\n        }\n      }\n    } else if (controlled instanceof Swiper && byController !== controlled) {\n      setControlledTranslate(controlled);\n    }\n  }\n\n  function setTransition(duration, byController) {\n    const Swiper = swiper.constructor;\n    const controlled = swiper.controller.control;\n    let i;\n\n    function setControlledTransition(c) {\n      c.setTransition(duration, swiper);\n\n      if (duration !== 0) {\n        c.transitionStart();\n\n        if (c.params.autoHeight) {\n          (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => {\n            c.updateAutoHeight();\n          });\n        }\n\n        c.$wrapperEl.transitionEnd(() => {\n          if (!controlled) return;\n\n          if (c.params.loop && swiper.params.controller.by === 'slide') {\n            c.loopFix();\n          }\n\n          c.transitionEnd();\n        });\n      }\n    }\n\n    if (Array.isArray(controlled)) {\n      for (i = 0; i < controlled.length; i += 1) {\n        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n          setControlledTransition(controlled[i]);\n        }\n      }\n    } else if (controlled instanceof Swiper && byController !== controlled) {\n      setControlledTransition(controlled);\n    }\n  }\n\n  function removeSpline() {\n    if (!swiper.controller.control) return;\n\n    if (swiper.controller.spline) {\n      swiper.controller.spline = undefined;\n      delete swiper.controller.spline;\n    }\n  }\n\n  on('beforeInit', () => {\n    swiper.controller.control = swiper.params.controller.control;\n  });\n  on('update', () => {\n    removeSpline();\n  });\n  on('resize', () => {\n    removeSpline();\n  });\n  on('observerUpdate', () => {\n    removeSpline();\n  });\n  on('setTranslate', (_s, translate, byController) => {\n    if (!swiper.controller.control) return;\n    swiper.controller.setTranslate(translate, byController);\n  });\n  on('setTransition', (_s, duration, byController) => {\n    if (!swiper.controller.control) return;\n    swiper.controller.setTransition(duration, byController);\n  });\n  Object.assign(swiper.controller, {\n    setTranslate,\n    setTransition\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/controller/controller.js?\n}");
1889
1890/***/ }),
1891
vendor: 5,708 bytes, lines 1892-1902
1892/***/ "./node_modules/swiper/modules/effect-cards/effect-cards.js":
1893/*!******************************************************************!*\
1894  !*** ./node_modules/swiper/modules/effect-cards/effect-cards.js ***!
1895  \******************************************************************/
1896/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
1897
1898"use strict";
1899eval("{/* unused harmony export default */\n/* harmony import */ var _shared_create_shadow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/create-shadow.js */ \"./node_modules/swiper/shared/create-shadow.js\");\n/* harmony import */ var _shared_effect_init_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/effect-init.js */ \"./node_modules/swiper/shared/effect-init.js\");\n/* harmony import */ var _shared_effect_target_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/effect-target.js */ \"./node_modules/swiper/shared/effect-target.js\");\n/* harmony import */ var _shared_effect_virtual_transition_end_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../shared/effect-virtual-transition-end.js */ \"./node_modules/swiper/shared/effect-virtual-transition-end.js\");\n\n\n\n\nfunction EffectCards({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    cardsEffect: {\n      slideShadows: true,\n      transformEl: null,\n      rotate: true,\n      perSlideRotate: 2,\n      perSlideOffset: 8\n    }\n  });\n\n  const setTranslate = () => {\n    const {\n      slides,\n      activeIndex\n    } = swiper;\n    const params = swiper.params.cardsEffect;\n    const {\n      startTranslate,\n      isTouched\n    } = swiper.touchEventsData;\n    const currentTranslate = swiper.translate;\n\n    for (let i = 0; i < slides.length; i += 1) {\n      const $slideEl = slides.eq(i);\n      const slideProgress = $slideEl[0].progress;\n      const progress = Math.min(Math.max(slideProgress, -4), 4);\n      let offset = $slideEl[0].swiperSlideOffset;\n\n      if (swiper.params.centeredSlides && !swiper.params.cssMode) {\n        swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`);\n      }\n\n      if (swiper.params.centeredSlides && swiper.params.cssMode) {\n        offset -= slides[0].swiperSlideOffset;\n      }\n\n      let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n      let tY = 0;\n      const tZ = -100 * Math.abs(progress);\n      let scale = 1;\n      let rotate = -params.perSlideRotate * progress;\n      let tXAdd = params.perSlideOffset - Math.abs(progress) * 0.75;\n      const slideIndex = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.from + i : i;\n      const isSwipeToNext = (slideIndex === activeIndex || slideIndex === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate;\n      const isSwipeToPrev = (slideIndex === activeIndex || slideIndex === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate;\n\n      if (isSwipeToNext || isSwipeToPrev) {\n        const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;\n        rotate += -28 * progress * subProgress;\n        scale += -0.5 * subProgress;\n        tXAdd += 96 * subProgress;\n        tY = `${-25 * subProgress * Math.abs(progress)}%`;\n      }\n\n      if (progress < 0) {\n        // next\n        tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`;\n      } else if (progress > 0) {\n        // prev\n        tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`;\n      } else {\n        tX = `${tX}px`;\n      }\n\n      if (!swiper.isHorizontal()) {\n        const prevY = tY;\n        tY = tX;\n        tX = prevY;\n      }\n\n      const scaleString = progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;\n      const transform = `\n        translate3d(${tX}, ${tY}, ${tZ}px)\n        rotateZ(${params.rotate ? rotate : 0}deg)\n        scale(${scaleString})\n      `;\n\n      if (params.slideShadows) {\n        // Set shadows\n        let $shadowEl = $slideEl.find('.swiper-slide-shadow');\n\n        if ($shadowEl.length === 0) {\n          $shadowEl = (0,_shared_create_shadow_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(params, $slideEl);\n        }\n\n        if ($shadowEl.length) $shadowEl[0].style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);\n      }\n\n      $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n      const $targetEl = (0,_shared_effect_target_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(params, $slideEl);\n      $targetEl.transform(transform);\n    }\n  };\n\n  const setTransition = duration => {\n    const {\n      transformEl\n    } = swiper.params.cardsEffect;\n    const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n    $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n    (0,_shared_effect_virtual_transition_end_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])({\n      swiper,\n      duration,\n      transformEl\n    });\n  };\n\n  (0,_shared_effect_init_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    effect: 'cards',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => true,\n    overwriteParams: () => ({\n      watchSlidesProgress: true,\n      virtualTranslate: !swiper.params.cssMode\n    })\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/effect-cards/effect-cards.js?\n}");
1900
1901/***/ }),
1902
vendor: 5,668 bytes, lines 1903-1913
1903/***/ "./node_modules/swiper/modules/effect-coverflow/effect-coverflow.js":
1904/*!**************************************************************************!*\
1905  !*** ./node_modules/swiper/modules/effect-coverflow/effect-coverflow.js ***!
1906  \**************************************************************************/
1907/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
1908
1909"use strict";
1910eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ EffectCoverflow; }\n/* harmony export */ });\n/* harmony import */ var _shared_create_shadow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/create-shadow.js */ \"./node_modules/swiper/shared/create-shadow.js\");\n/* harmony import */ var _shared_effect_init_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/effect-init.js */ \"./node_modules/swiper/shared/effect-init.js\");\n/* harmony import */ var _shared_effect_target_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/effect-target.js */ \"./node_modules/swiper/shared/effect-target.js\");\n\n\n\nfunction EffectCoverflow({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    coverflowEffect: {\n      rotate: 50,\n      stretch: 0,\n      depth: 100,\n      scale: 1,\n      modifier: 1,\n      slideShadows: true,\n      transformEl: null\n    }\n  });\n\n  const setTranslate = () => {\n    const {\n      width: swiperWidth,\n      height: swiperHeight,\n      slides,\n      slidesSizesGrid\n    } = swiper;\n    const params = swiper.params.coverflowEffect;\n    const isHorizontal = swiper.isHorizontal();\n    const transform = swiper.translate;\n    const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;\n    const rotate = isHorizontal ? params.rotate : -params.rotate;\n    const translate = params.depth; // Each slide offset from center\n\n    for (let i = 0, length = slides.length; i < length; i += 1) {\n      const $slideEl = slides.eq(i);\n      const slideSize = slidesSizesGrid[i];\n      const slideOffset = $slideEl[0].swiperSlideOffset;\n      const centerOffset = (center - slideOffset - slideSize / 2) / slideSize;\n      const offsetMultiplier = typeof params.modifier === 'function' ? params.modifier(centerOffset) : centerOffset * params.modifier;\n      let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n      let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier; // var rotateZ = 0\n\n      let translateZ = -translate * Math.abs(offsetMultiplier);\n      let stretch = params.stretch; // Allow percentage to make a relative stretch for responsive sliders\n\n      if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {\n        stretch = parseFloat(params.stretch) / 100 * slideSize;\n      }\n\n      let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;\n      let translateX = isHorizontal ? stretch * offsetMultiplier : 0;\n      let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier); // Fix for ultra small values\n\n      if (Math.abs(translateX) < 0.001) translateX = 0;\n      if (Math.abs(translateY) < 0.001) translateY = 0;\n      if (Math.abs(translateZ) < 0.001) translateZ = 0;\n      if (Math.abs(rotateY) < 0.001) rotateY = 0;\n      if (Math.abs(rotateX) < 0.001) rotateX = 0;\n      if (Math.abs(scale) < 0.001) scale = 0;\n      const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px)  rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;\n      const $targetEl = (0,_shared_effect_target_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(params, $slideEl);\n      $targetEl.transform(slideTransform);\n      $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n\n      if (params.slideShadows) {\n        // Set shadows\n        let $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n        let $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n\n        if ($shadowBeforeEl.length === 0) {\n          $shadowBeforeEl = (0,_shared_create_shadow_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(params, $slideEl, isHorizontal ? 'left' : 'top');\n        }\n\n        if ($shadowAfterEl.length === 0) {\n          $shadowAfterEl = (0,_shared_create_shadow_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(params, $slideEl, isHorizontal ? 'right' : 'bottom');\n        }\n\n        if ($shadowBeforeEl.length) $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n        if ($shadowAfterEl.length) $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;\n      }\n    }\n  };\n\n  const setTransition = duration => {\n    const {\n      transformEl\n    } = swiper.params.coverflowEffect;\n    const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n    $transitionElements.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);\n  };\n\n  (0,_shared_effect_init_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    effect: 'coverflow',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => true,\n    overwriteParams: () => ({\n      watchSlidesProgress: true\n    })\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/effect-coverflow/effect-coverflow.js?\n}");
1911
1912/***/ }),
1913
vendor: 6,317 bytes, lines 1914-1924
1914/***/ "./node_modules/swiper/modules/effect-creative/effect-creative.js":
1915/*!************************************************************************!*\
1916  !*** ./node_modules/swiper/modules/effect-creative/effect-creative.js ***!
1917  \************************************************************************/
1918/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
1919
1920"use strict";
1921eval("{/* unused harmony export default */\n/* harmony import */ var _shared_create_shadow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/create-shadow.js */ \"./node_modules/swiper/shared/create-shadow.js\");\n/* harmony import */ var _shared_effect_init_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/effect-init.js */ \"./node_modules/swiper/shared/effect-init.js\");\n/* harmony import */ var _shared_effect_target_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/effect-target.js */ \"./node_modules/swiper/shared/effect-target.js\");\n/* harmony import */ var _shared_effect_virtual_transition_end_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../shared/effect-virtual-transition-end.js */ \"./node_modules/swiper/shared/effect-virtual-transition-end.js\");\n\n\n\n\nfunction EffectCreative({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    creativeEffect: {\n      transformEl: null,\n      limitProgress: 1,\n      shadowPerProgress: false,\n      progressMultiplier: 1,\n      perspective: true,\n      prev: {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        opacity: 1,\n        scale: 1\n      },\n      next: {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        opacity: 1,\n        scale: 1\n      }\n    }\n  });\n\n  const getTranslateValue = value => {\n    if (typeof value === 'string') return value;\n    return `${value}px`;\n  };\n\n  const setTranslate = () => {\n    const {\n      slides,\n      $wrapperEl,\n      slidesSizesGrid\n    } = swiper;\n    const params = swiper.params.creativeEffect;\n    const {\n      progressMultiplier: multiplier\n    } = params;\n    const isCenteredSlides = swiper.params.centeredSlides;\n\n    if (isCenteredSlides) {\n      const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;\n      $wrapperEl.transform(`translateX(calc(50% - ${margin}px))`);\n    }\n\n    for (let i = 0; i < slides.length; i += 1) {\n      const $slideEl = slides.eq(i);\n      const slideProgress = $slideEl[0].progress;\n      const progress = Math.min(Math.max($slideEl[0].progress, -params.limitProgress), params.limitProgress);\n      let originalProgress = progress;\n\n      if (!isCenteredSlides) {\n        originalProgress = Math.min(Math.max($slideEl[0].originalProgress, -params.limitProgress), params.limitProgress);\n      }\n\n      const offset = $slideEl[0].swiperSlideOffset;\n      const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];\n      const r = [0, 0, 0];\n      let custom = false;\n\n      if (!swiper.isHorizontal()) {\n        t[1] = t[0];\n        t[0] = 0;\n      }\n\n      let data = {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        scale: 1,\n        opacity: 1\n      };\n\n      if (progress < 0) {\n        data = params.next;\n        custom = true;\n      } else if (progress > 0) {\n        data = params.prev;\n        custom = true;\n      } // set translate\n\n\n      t.forEach((value, index) => {\n        t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(progress * multiplier)}))`;\n      }); // set rotates\n\n      r.forEach((value, index) => {\n        r[index] = data.rotate[index] * Math.abs(progress * multiplier);\n      });\n      $slideEl[0].style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n      const translateString = t.join(', ');\n      const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`;\n      const scaleString = originalProgress < 0 ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})` : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;\n      const opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier;\n      const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`; // Set shadows\n\n      if (custom && data.shadow || !custom) {\n        let $shadowEl = $slideEl.children('.swiper-slide-shadow');\n\n        if ($shadowEl.length === 0 && data.shadow) {\n          $shadowEl = (0,_shared_create_shadow_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(params, $slideEl);\n        }\n\n        if ($shadowEl.length) {\n          const shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress;\n          $shadowEl[0].style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);\n        }\n      }\n\n      const $targetEl = (0,_shared_effect_target_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(params, $slideEl);\n      $targetEl.transform(transform).css({\n        opacity: opacityString\n      });\n\n      if (data.origin) {\n        $targetEl.css('transform-origin', data.origin);\n      }\n    }\n  };\n\n  const setTransition = duration => {\n    const {\n      transformEl\n    } = swiper.params.creativeEffect;\n    const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n    $transitionElements.transition(duration).find('.swiper-slide-shadow').transition(duration);\n    (0,_shared_effect_virtual_transition_end_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])({\n      swiper,\n      duration,\n      transformEl,\n      allSlides: true\n    });\n  };\n\n  (0,_shared_effect_init_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    effect: 'creative',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => swiper.params.creativeEffect.perspective,\n    overwriteParams: () => ({\n      watchSlidesProgress: true,\n      virtualTranslate: !swiper.params.cssMode\n    })\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/effect-creative/effect-creative.js?\n}");
1922
1923/***/ }),
1924
vendor: 7,577 bytes, lines 1925-1935
1925/***/ "./node_modules/swiper/modules/effect-cube/effect-cube.js":
1926/*!****************************************************************!*\
1927  !*** ./node_modules/swiper/modules/effect-cube/effect-cube.js ***!
1928  \****************************************************************/
1929/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
1930
1931"use strict";
1932eval("{/* unused harmony export default */\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* harmony import */ var _shared_effect_init_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/effect-init.js */ \"./node_modules/swiper/shared/effect-init.js\");\n\n\nfunction EffectCube({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    cubeEffect: {\n      slideShadows: true,\n      shadow: true,\n      shadowOffset: 20,\n      shadowScale: 0.94\n    }\n  });\n\n  const createSlideShadows = ($slideEl, progress, isHorizontal) => {\n    let shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n    let shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n\n    if (shadowBefore.length === 0) {\n      shadowBefore = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(`<div class=\"swiper-slide-shadow-${isHorizontal ? 'left' : 'top'}\"></div>`);\n      $slideEl.append(shadowBefore);\n    }\n\n    if (shadowAfter.length === 0) {\n      shadowAfter = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(`<div class=\"swiper-slide-shadow-${isHorizontal ? 'right' : 'bottom'}\"></div>`);\n      $slideEl.append(shadowAfter);\n    }\n\n    if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n    if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n  };\n\n  const recreateShadows = () => {\n    // create new ones\n    const isHorizontal = swiper.isHorizontal();\n    swiper.slides.each(slideEl => {\n      const progress = Math.max(Math.min(slideEl.progress, 1), -1);\n      createSlideShadows((0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(slideEl), progress, isHorizontal);\n    });\n  };\n\n  const setTranslate = () => {\n    const {\n      $el,\n      $wrapperEl,\n      slides,\n      width: swiperWidth,\n      height: swiperHeight,\n      rtlTranslate: rtl,\n      size: swiperSize,\n      browser\n    } = swiper;\n    const params = swiper.params.cubeEffect;\n    const isHorizontal = swiper.isHorizontal();\n    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n    let wrapperRotate = 0;\n    let $cubeShadowEl;\n\n    if (params.shadow) {\n      if (isHorizontal) {\n        $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');\n\n        if ($cubeShadowEl.length === 0) {\n          $cubeShadowEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('<div class=\"swiper-cube-shadow\"></div>');\n          $wrapperEl.append($cubeShadowEl);\n        }\n\n        $cubeShadowEl.css({\n          height: `${swiperWidth}px`\n        });\n      } else {\n        $cubeShadowEl = $el.find('.swiper-cube-shadow');\n\n        if ($cubeShadowEl.length === 0) {\n          $cubeShadowEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('<div class=\"swiper-cube-shadow\"></div>');\n          $el.append($cubeShadowEl);\n        }\n      }\n    }\n\n    for (let i = 0; i < slides.length; i += 1) {\n      const $slideEl = slides.eq(i);\n      let slideIndex = i;\n\n      if (isVirtual) {\n        slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);\n      }\n\n      let slideAngle = slideIndex * 90;\n      let round = Math.floor(slideAngle / 360);\n\n      if (rtl) {\n        slideAngle = -slideAngle;\n        round = Math.floor(-slideAngle / 360);\n      }\n\n      const progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n      let tx = 0;\n      let ty = 0;\n      let tz = 0;\n\n      if (slideIndex % 4 === 0) {\n        tx = -round * 4 * swiperSize;\n        tz = 0;\n      } else if ((slideIndex - 1) % 4 === 0) {\n        tx = 0;\n        tz = -round * 4 * swiperSize;\n      } else if ((slideIndex - 2) % 4 === 0) {\n        tx = swiperSize + round * 4 * swiperSize;\n        tz = swiperSize;\n      } else if ((slideIndex - 3) % 4 === 0) {\n        tx = -swiperSize;\n        tz = 3 * swiperSize + swiperSize * 4 * round;\n      }\n\n      if (rtl) {\n        tx = -tx;\n      }\n\n      if (!isHorizontal) {\n        ty = tx;\n        tx = 0;\n      }\n\n      const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${isHorizontal ? slideAngle : 0}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;\n\n      if (progress <= 1 && progress > -1) {\n        wrapperRotate = slideIndex * 90 + progress * 90;\n        if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;\n      }\n\n      $slideEl.transform(transform);\n\n      if (params.slideShadows) {\n        createSlideShadows($slideEl, progress, isHorizontal);\n      }\n    }\n\n    $wrapperEl.css({\n      '-webkit-transform-origin': `50% 50% -${swiperSize / 2}px`,\n      'transform-origin': `50% 50% -${swiperSize / 2}px`\n    });\n\n    if (params.shadow) {\n      if (isHorizontal) {\n        $cubeShadowEl.transform(`translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`);\n      } else {\n        const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n        const multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);\n        const scale1 = params.shadowScale;\n        const scale2 = params.shadowScale / multiplier;\n        const offset = params.shadowOffset;\n        $cubeShadowEl.transform(`scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-90deg)`);\n      }\n    }\n\n    const zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0;\n    $wrapperEl.transform(`translate3d(0px,0,${zFactor}px) rotateX(${swiper.isHorizontal() ? 0 : wrapperRotate}deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`);\n    $wrapperEl[0].style.setProperty('--swiper-cube-translate-z', `${zFactor}px`);\n  };\n\n  const setTransition = duration => {\n    const {\n      $el,\n      slides\n    } = swiper;\n    slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);\n\n    if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n      $el.find('.swiper-cube-shadow').transition(duration);\n    }\n  };\n\n  (0,_shared_effect_init_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    effect: 'cube',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    recreateShadows,\n    getEffectParams: () => swiper.params.cubeEffect,\n    perspective: () => true,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      resistanceRatio: 0,\n      spaceBetween: 0,\n      centeredSlides: false,\n      virtualTranslate: true\n    })\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/effect-cube/effect-cube.js?\n}");
1933
1934/***/ }),
1935
vendor: 3,030 bytes, lines 1936-1946
1936/***/ "./node_modules/swiper/modules/effect-fade/effect-fade.js":
1937/*!****************************************************************!*\
1938  !*** ./node_modules/swiper/modules/effect-fade/effect-fade.js ***!
1939  \****************************************************************/
1940/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
1941
1942"use strict";
1943eval("{/* unused harmony export default */\n/* harmony import */ var _shared_effect_init_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/effect-init.js */ \"./node_modules/swiper/shared/effect-init.js\");\n/* harmony import */ var _shared_effect_target_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/effect-target.js */ \"./node_modules/swiper/shared/effect-target.js\");\n/* harmony import */ var _shared_effect_virtual_transition_end_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/effect-virtual-transition-end.js */ \"./node_modules/swiper/shared/effect-virtual-transition-end.js\");\n\n\n\nfunction EffectFade({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    fadeEffect: {\n      crossFade: false,\n      transformEl: null\n    }\n  });\n\n  const setTranslate = () => {\n    const {\n      slides\n    } = swiper;\n    const params = swiper.params.fadeEffect;\n\n    for (let i = 0; i < slides.length; i += 1) {\n      const $slideEl = swiper.slides.eq(i);\n      const offset = $slideEl[0].swiperSlideOffset;\n      let tx = -offset;\n      if (!swiper.params.virtualTranslate) tx -= swiper.translate;\n      let ty = 0;\n\n      if (!swiper.isHorizontal()) {\n        ty = tx;\n        tx = 0;\n      }\n\n      const slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs($slideEl[0].progress), 0) : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);\n      const $targetEl = (0,_shared_effect_target_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params, $slideEl);\n      $targetEl.css({\n        opacity: slideOpacity\n      }).transform(`translate3d(${tx}px, ${ty}px, 0px)`);\n    }\n  };\n\n  const setTransition = duration => {\n    const {\n      transformEl\n    } = swiper.params.fadeEffect;\n    const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n    $transitionElements.transition(duration);\n    (0,_shared_effect_virtual_transition_end_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n      swiper,\n      duration,\n      transformEl,\n      allSlides: true\n    });\n  };\n\n  (0,_shared_effect_init_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    effect: 'fade',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      spaceBetween: 0,\n      virtualTranslate: !swiper.params.cssMode\n    })\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/effect-fade/effect-fade.js?\n}");
1944
1945/***/ }),
1946
vendor: 5,468 bytes, lines 1947-1957
1947/***/ "./node_modules/swiper/modules/effect-flip/effect-flip.js":
1948/*!****************************************************************!*\
1949  !*** ./node_modules/swiper/modules/effect-flip/effect-flip.js ***!
1950  \****************************************************************/
1951/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
1952
1953"use strict";
1954eval("{/* unused harmony export default */\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* harmony import */ var _shared_create_shadow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/create-shadow.js */ \"./node_modules/swiper/shared/create-shadow.js\");\n/* harmony import */ var _shared_effect_init_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/effect-init.js */ \"./node_modules/swiper/shared/effect-init.js\");\n/* harmony import */ var _shared_effect_target_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../shared/effect-target.js */ \"./node_modules/swiper/shared/effect-target.js\");\n/* harmony import */ var _shared_effect_virtual_transition_end_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../shared/effect-virtual-transition-end.js */ \"./node_modules/swiper/shared/effect-virtual-transition-end.js\");\n\n\n\n\n\nfunction EffectFlip({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    flipEffect: {\n      slideShadows: true,\n      limitRotation: true,\n      transformEl: null\n    }\n  });\n\n  const createSlideShadows = ($slideEl, progress, params) => {\n    let shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');\n    let shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');\n\n    if (shadowBefore.length === 0) {\n      shadowBefore = (0,_shared_create_shadow_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top');\n    }\n\n    if (shadowAfter.length === 0) {\n      shadowAfter = (0,_shared_create_shadow_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom');\n    }\n\n    if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n    if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n  };\n\n  const recreateShadows = () => {\n    // Set shadows\n    const params = swiper.params.flipEffect;\n    swiper.slides.each(slideEl => {\n      const $slideEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(slideEl);\n      let progress = $slideEl[0].progress;\n\n      if (swiper.params.flipEffect.limitRotation) {\n        progress = Math.max(Math.min(slideEl.progress, 1), -1);\n      }\n\n      createSlideShadows($slideEl, progress, params);\n    });\n  };\n\n  const setTranslate = () => {\n    const {\n      slides,\n      rtlTranslate: rtl\n    } = swiper;\n    const params = swiper.params.flipEffect;\n\n    for (let i = 0; i < slides.length; i += 1) {\n      const $slideEl = slides.eq(i);\n      let progress = $slideEl[0].progress;\n\n      if (swiper.params.flipEffect.limitRotation) {\n        progress = Math.max(Math.min($slideEl[0].progress, 1), -1);\n      }\n\n      const offset = $slideEl[0].swiperSlideOffset;\n      const rotate = -180 * progress;\n      let rotateY = rotate;\n      let rotateX = 0;\n      let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n      let ty = 0;\n\n      if (!swiper.isHorizontal()) {\n        ty = tx;\n        tx = 0;\n        rotateX = -rotateY;\n        rotateY = 0;\n      } else if (rtl) {\n        rotateY = -rotateY;\n      }\n\n      $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n      if (params.slideShadows) {\n        createSlideShadows($slideEl, progress, params);\n      }\n\n      const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;\n      const $targetEl = (0,_shared_effect_target_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(params, $slideEl);\n      $targetEl.transform(transform);\n    }\n  };\n\n  const setTransition = duration => {\n    const {\n      transformEl\n    } = swiper.params.flipEffect;\n    const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;\n    $transitionElements.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);\n    (0,_shared_effect_virtual_transition_end_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"])({\n      swiper,\n      duration,\n      transformEl\n    });\n  };\n\n  (0,_shared_effect_init_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n    effect: 'flip',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    recreateShadows,\n    getEffectParams: () => swiper.params.flipEffect,\n    perspective: () => true,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      spaceBetween: 0,\n      virtualTranslate: !swiper.params.cssMode\n    })\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/effect-flip/effect-flip.js?\n}");
1955
1956/***/ }),
1957
vendor: 9,186 bytes, lines 1958-1968
1958/***/ "./node_modules/swiper/modules/free-mode/free-mode.js":
1959/*!************************************************************!*\
1960  !*** ./node_modules/swiper/modules/free-mode/free-mode.js ***!
1961  \************************************************************/
1962/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
1963
1964"use strict";
1965eval("{/* unused harmony export default */\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\nfunction freeMode({\n  swiper,\n  extendParams,\n  emit,\n  once\n}) {\n  extendParams({\n    freeMode: {\n      enabled: false,\n      momentum: true,\n      momentumRatio: 1,\n      momentumBounce: true,\n      momentumBounceRatio: 1,\n      momentumVelocityRatio: 1,\n      sticky: false,\n      minimumVelocity: 0.02\n    }\n  });\n\n  function onTouchStart() {\n    const translate = swiper.getTranslate();\n    swiper.setTranslate(translate);\n    swiper.setTransition(0);\n    swiper.touchEventsData.velocities.length = 0;\n    swiper.freeMode.onTouchEnd({\n      currentPos: swiper.rtl ? swiper.translate : -swiper.translate\n    });\n  }\n\n  function onTouchMove() {\n    const {\n      touchEventsData: data,\n      touches\n    } = swiper; // Velocity\n\n    if (data.velocities.length === 0) {\n      data.velocities.push({\n        position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n        time: data.touchStartTime\n      });\n    }\n\n    data.velocities.push({\n      position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n      time: (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.now)()\n    });\n  }\n\n  function onTouchEnd({\n    currentPos\n  }) {\n    const {\n      params,\n      $wrapperEl,\n      rtlTranslate: rtl,\n      snapGrid,\n      touchEventsData: data\n    } = swiper; // Time diff\n\n    const touchEndTime = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.now)();\n    const timeDiff = touchEndTime - data.touchStartTime;\n\n    if (currentPos < -swiper.minTranslate()) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n\n    if (currentPos > -swiper.maxTranslate()) {\n      if (swiper.slides.length < snapGrid.length) {\n        swiper.slideTo(snapGrid.length - 1);\n      } else {\n        swiper.slideTo(swiper.slides.length - 1);\n      }\n\n      return;\n    }\n\n    if (params.freeMode.momentum) {\n      if (data.velocities.length > 1) {\n        const lastMoveEvent = data.velocities.pop();\n        const velocityEvent = data.velocities.pop();\n        const distance = lastMoveEvent.position - velocityEvent.position;\n        const time = lastMoveEvent.time - velocityEvent.time;\n        swiper.velocity = distance / time;\n        swiper.velocity /= 2;\n\n        if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {\n          swiper.velocity = 0;\n        } // this implies that the user stopped moving a finger then released.\n        // There would be no events with distance zero, so the last event is stale.\n\n\n        if (time > 150 || (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.now)() - lastMoveEvent.time > 300) {\n          swiper.velocity = 0;\n        }\n      } else {\n        swiper.velocity = 0;\n      }\n\n      swiper.velocity *= params.freeMode.momentumVelocityRatio;\n      data.velocities.length = 0;\n      let momentumDuration = 1000 * params.freeMode.momentumRatio;\n      const momentumDistance = swiper.velocity * momentumDuration;\n      let newPosition = swiper.translate + momentumDistance;\n      if (rtl) newPosition = -newPosition;\n      let doBounce = false;\n      let afterBouncePosition;\n      const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;\n      let needsLoopFix;\n\n      if (newPosition < swiper.maxTranslate()) {\n        if (params.freeMode.momentumBounce) {\n          if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n            newPosition = swiper.maxTranslate() - bounceAmount;\n          }\n\n          afterBouncePosition = swiper.maxTranslate();\n          doBounce = true;\n          data.allowMomentumBounce = true;\n        } else {\n          newPosition = swiper.maxTranslate();\n        }\n\n        if (params.loop && params.centeredSlides) needsLoopFix = true;\n      } else if (newPosition > swiper.minTranslate()) {\n        if (params.freeMode.momentumBounce) {\n          if (newPosition - swiper.minTranslate() > bounceAmount) {\n            newPosition = swiper.minTranslate() + bounceAmount;\n          }\n\n          afterBouncePosition = swiper.minTranslate();\n          doBounce = true;\n          data.allowMomentumBounce = true;\n        } else {\n          newPosition = swiper.minTranslate();\n        }\n\n        if (params.loop && params.centeredSlides) needsLoopFix = true;\n      } else if (params.freeMode.sticky) {\n        let nextSlide;\n\n        for (let j = 0; j < snapGrid.length; j += 1) {\n          if (snapGrid[j] > -newPosition) {\n            nextSlide = j;\n            break;\n          }\n        }\n\n        if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {\n          newPosition = snapGrid[nextSlide];\n        } else {\n          newPosition = snapGrid[nextSlide - 1];\n        }\n\n        newPosition = -newPosition;\n      }\n\n      if (needsLoopFix) {\n        once('transitionEnd', () => {\n          swiper.loopFix();\n        });\n      } // Fix duration\n\n\n      if (swiper.velocity !== 0) {\n        if (rtl) {\n          momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n        } else {\n          momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n        }\n\n        if (params.freeMode.sticky) {\n          // If freeMode.sticky is active and the user ends a swipe with a slow-velocity\n          // event, then durations can be 20+ seconds to slide one (or zero!) slides.\n          // It's easy to see this when simulating touch with mouse events. To fix this,\n          // limit single-slide swipes to the default slide duration. This also has the\n          // nice side effect of matching slide speed if the user stopped moving before\n          // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.\n          // For faster swipes, also apply limits (albeit higher ones).\n          const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);\n          const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];\n\n          if (moveDistance < currentSlideSize) {\n            momentumDuration = params.speed;\n          } else if (moveDistance < 2 * currentSlideSize) {\n            momentumDuration = params.speed * 1.5;\n          } else {\n            momentumDuration = params.speed * 2.5;\n          }\n        }\n      } else if (params.freeMode.sticky) {\n        swiper.slideToClosest();\n        return;\n      }\n\n      if (params.freeMode.momentumBounce && doBounce) {\n        swiper.updateProgress(afterBouncePosition);\n        swiper.setTransition(momentumDuration);\n        swiper.setTranslate(newPosition);\n        swiper.transitionStart(true, swiper.swipeDirection);\n        swiper.animating = true;\n        $wrapperEl.transitionEnd(() => {\n          if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n          emit('momentumBounce');\n          swiper.setTransition(params.speed);\n          setTimeout(() => {\n            swiper.setTranslate(afterBouncePosition);\n            $wrapperEl.transitionEnd(() => {\n              if (!swiper || swiper.destroyed) return;\n              swiper.transitionEnd();\n            });\n          }, 0);\n        });\n      } else if (swiper.velocity) {\n        emit('_freeModeNoMomentumRelease');\n        swiper.updateProgress(newPosition);\n        swiper.setTransition(momentumDuration);\n        swiper.setTranslate(newPosition);\n        swiper.transitionStart(true, swiper.swipeDirection);\n\n        if (!swiper.animating) {\n          swiper.animating = true;\n          $wrapperEl.transitionEnd(() => {\n            if (!swiper || swiper.destroyed) return;\n            swiper.transitionEnd();\n          });\n        }\n      } else {\n        swiper.updateProgress(newPosition);\n      }\n\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    } else if (params.freeMode.sticky) {\n      swiper.slideToClosest();\n      return;\n    } else if (params.freeMode) {\n      emit('_freeModeNoMomentumRelease');\n    }\n\n    if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n      swiper.updateProgress();\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n  }\n\n  Object.assign(swiper, {\n    freeMode: {\n      onTouchStart,\n      onTouchMove,\n      onTouchEnd\n    }\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/free-mode/free-mode.js?\n}");
1966
1967/***/ }),
1968
vendor: 3,796 bytes, lines 1969-1979
1969/***/ "./node_modules/swiper/modules/grid/grid.js":
1970/*!**************************************************!*\
1971  !*** ./node_modules/swiper/modules/grid/grid.js ***!
1972  \**************************************************/
1973/***/ (function() {
1974
1975"use strict";
1976eval("{/* unused harmony export default */\nfunction Grid({\n  swiper,\n  extendParams\n}) {\n  extendParams({\n    grid: {\n      rows: 1,\n      fill: 'column'\n    }\n  });\n  let slidesNumberEvenToRows;\n  let slidesPerRow;\n  let numFullColumns;\n\n  const initSlides = slidesLength => {\n    const {\n      slidesPerView\n    } = swiper.params;\n    const {\n      rows,\n      fill\n    } = swiper.params.grid;\n    slidesPerRow = slidesNumberEvenToRows / rows;\n    numFullColumns = Math.floor(slidesLength / rows);\n\n    if (Math.floor(slidesLength / rows) === slidesLength / rows) {\n      slidesNumberEvenToRows = slidesLength;\n    } else {\n      slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;\n    }\n\n    if (slidesPerView !== 'auto' && fill === 'row') {\n      slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);\n    }\n  };\n\n  const updateSlide = (i, slide, slidesLength, getDirectionLabel) => {\n    const {\n      slidesPerGroup,\n      spaceBetween\n    } = swiper.params;\n    const {\n      rows,\n      fill\n    } = swiper.params.grid; // Set slides order\n\n    let newSlideOrderIndex;\n    let column;\n    let row;\n\n    if (fill === 'row' && slidesPerGroup > 1) {\n      const groupIndex = Math.floor(i / (slidesPerGroup * rows));\n      const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;\n      const columnsInGroup = groupIndex === 0 ? slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows), slidesPerGroup);\n      row = Math.floor(slideIndexInGroup / columnsInGroup);\n      column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;\n      newSlideOrderIndex = column + row * slidesNumberEvenToRows / rows;\n      slide.css({\n        '-webkit-order': newSlideOrderIndex,\n        order: newSlideOrderIndex\n      });\n    } else if (fill === 'column') {\n      column = Math.floor(i / rows);\n      row = i - column * rows;\n\n      if (column > numFullColumns || column === numFullColumns && row === rows - 1) {\n        row += 1;\n\n        if (row >= rows) {\n          row = 0;\n          column += 1;\n        }\n      }\n    } else {\n      row = Math.floor(i / slidesPerRow);\n      column = i - row * slidesPerRow;\n    }\n\n    slide.css(getDirectionLabel('margin-top'), row !== 0 ? spaceBetween && `${spaceBetween}px` : '');\n  };\n\n  const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => {\n    const {\n      spaceBetween,\n      centeredSlides,\n      roundLengths\n    } = swiper.params;\n    const {\n      rows\n    } = swiper.params.grid;\n    swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;\n    swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;\n    swiper.$wrapperEl.css({\n      [getDirectionLabel('width')]: `${swiper.virtualSize + spaceBetween}px`\n    });\n\n    if (centeredSlides) {\n      snapGrid.splice(0, snapGrid.length);\n      const newSlidesGrid = [];\n\n      for (let i = 0; i < snapGrid.length; i += 1) {\n        let slidesGridItem = snapGrid[i];\n        if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n        if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);\n      }\n\n      snapGrid.push(...newSlidesGrid);\n    }\n  };\n\n  swiper.grid = {\n    initSlides,\n    updateSlide,\n    updateWrapperSize\n  };\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/grid/grid.js?\n}");
1977
1978/***/ }),
1979
vendor: 3,878 bytes, lines 1980-1990
1980/***/ "./node_modules/swiper/modules/hash-navigation/hash-navigation.js":
1981/*!************************************************************************!*\
1982  !*** ./node_modules/swiper/modules/hash-navigation/hash-navigation.js ***!
1983  \************************************************************************/
1984/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
1985
1986"use strict";
1987eval("{/* unused harmony export default */\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\n\nfunction HashNavigation({\n  swiper,\n  extendParams,\n  emit,\n  on\n}) {\n  let initialized = false;\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  extendParams({\n    hashNavigation: {\n      enabled: false,\n      replaceState: false,\n      watchState: false\n    }\n  });\n\n  const onHashChange = () => {\n    emit('hashChange');\n    const newHash = document.location.hash.replace('#', '');\n    const activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');\n\n    if (newHash !== activeSlideHash) {\n      const newIndex = swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-hash=\"${newHash}\"]`).index();\n      if (typeof newIndex === 'undefined') return;\n      swiper.slideTo(newIndex);\n    }\n  };\n\n  const setHash = () => {\n    if (!initialized || !swiper.params.hashNavigation.enabled) return;\n\n    if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) {\n      window.history.replaceState(null, null, `#${swiper.slides.eq(swiper.activeIndex).attr('data-hash')}` || '');\n      emit('hashSet');\n    } else {\n      const slide = swiper.slides.eq(swiper.activeIndex);\n      const hash = slide.attr('data-hash') || slide.attr('data-history');\n      document.location.hash = hash || '';\n      emit('hashSet');\n    }\n  };\n\n  const init = () => {\n    if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return;\n    initialized = true;\n    const hash = document.location.hash.replace('#', '');\n\n    if (hash) {\n      const speed = 0;\n\n      for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n        const slide = swiper.slides.eq(i);\n        const slideHash = slide.attr('data-hash') || slide.attr('data-history');\n\n        if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n          const index = slide.index();\n          swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);\n        }\n      }\n    }\n\n    if (swiper.params.hashNavigation.watchState) {\n      (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(window).on('hashchange', onHashChange);\n    }\n  };\n\n  const destroy = () => {\n    if (swiper.params.hashNavigation.watchState) {\n      (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(window).off('hashchange', onHashChange);\n    }\n  };\n\n  on('init', () => {\n    if (swiper.params.hashNavigation.enabled) {\n      init();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.params.hashNavigation.enabled) {\n      destroy();\n    }\n  });\n  on('transitionEnd _freeModeNoMomentumRelease', () => {\n    if (initialized) {\n      setHash();\n    }\n  });\n  on('slideChange', () => {\n    if (initialized && swiper.params.cssMode) {\n      setHash();\n    }\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/hash-navigation/hash-navigation.js?\n}");
1988
1989/***/ }),
1990
vendor: 4,938 bytes, lines 1991-2001
1991/***/ "./node_modules/swiper/modules/history/history.js":
1992/*!********************************************************!*\
1993  !*** ./node_modules/swiper/modules/history/history.js ***!
1994  \********************************************************/
1995/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
1996
1997"use strict";
1998eval("{/* unused harmony export default */\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n\nfunction History({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    history: {\n      enabled: false,\n      root: '',\n      replaceState: false,\n      key: 'slides',\n      keepQuery: false\n    }\n  });\n  let initialized = false;\n  let paths = {};\n\n  const slugify = text => {\n    return text.toString().replace(/\\s+/g, '-').replace(/[^\\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, '');\n  };\n\n  const getPathValues = urlOverride => {\n    const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n    let location;\n\n    if (urlOverride) {\n      location = new URL(urlOverride);\n    } else {\n      location = window.location;\n    }\n\n    const pathArray = location.pathname.slice(1).split('/').filter(part => part !== '');\n    const total = pathArray.length;\n    const key = pathArray[total - 2];\n    const value = pathArray[total - 1];\n    return {\n      key,\n      value\n    };\n  };\n\n  const setHistory = (key, index) => {\n    const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n    if (!initialized || !swiper.params.history.enabled) return;\n    let location;\n\n    if (swiper.params.url) {\n      location = new URL(swiper.params.url);\n    } else {\n      location = window.location;\n    }\n\n    const slide = swiper.slides.eq(index);\n    let value = slugify(slide.attr('data-history'));\n\n    if (swiper.params.history.root.length > 0) {\n      let root = swiper.params.history.root;\n      if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);\n      value = `${root}/${key}/${value}`;\n    } else if (!location.pathname.includes(key)) {\n      value = `${key}/${value}`;\n    }\n\n    if (swiper.params.history.keepQuery) {\n      value += location.search;\n    }\n\n    const currentState = window.history.state;\n\n    if (currentState && currentState.value === value) {\n      return;\n    }\n\n    if (swiper.params.history.replaceState) {\n      window.history.replaceState({\n        value\n      }, null, value);\n    } else {\n      window.history.pushState({\n        value\n      }, null, value);\n    }\n  };\n\n  const scrollToSlide = (speed, value, runCallbacks) => {\n    if (value) {\n      for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n        const slide = swiper.slides.eq(i);\n        const slideHistory = slugify(slide.attr('data-history'));\n\n        if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {\n          const index = slide.index();\n          swiper.slideTo(index, speed, runCallbacks);\n        }\n      }\n    } else {\n      swiper.slideTo(0, speed, runCallbacks);\n    }\n  };\n\n  const setHistoryPopState = () => {\n    paths = getPathValues(swiper.params.url);\n    scrollToSlide(swiper.params.speed, paths.value, false);\n  };\n\n  const init = () => {\n    const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n    if (!swiper.params.history) return;\n\n    if (!window.history || !window.history.pushState) {\n      swiper.params.history.enabled = false;\n      swiper.params.hashNavigation.enabled = true;\n      return;\n    }\n\n    initialized = true;\n    paths = getPathValues(swiper.params.url);\n    if (!paths.key && !paths.value) return;\n    scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);\n\n    if (!swiper.params.history.replaceState) {\n      window.addEventListener('popstate', setHistoryPopState);\n    }\n  };\n\n  const destroy = () => {\n    const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n\n    if (!swiper.params.history.replaceState) {\n      window.removeEventListener('popstate', setHistoryPopState);\n    }\n  };\n\n  on('init', () => {\n    if (swiper.params.history.enabled) {\n      init();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.params.history.enabled) {\n      destroy();\n    }\n  });\n  on('transitionEnd _freeModeNoMomentumRelease', () => {\n    if (initialized) {\n      setHistory(swiper.params.history.key, swiper.activeIndex);\n    }\n  });\n  on('slideChange', () => {\n    if (initialized && swiper.params.cssMode) {\n      setHistory(swiper.params.history.key, swiper.activeIndex);\n    }\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/history/history.js?\n}");
1999
2000/***/ }),
2001
vendor: 5,301 bytes, lines 2002-2012
2002/***/ "./node_modules/swiper/modules/keyboard/keyboard.js":
2003/*!**********************************************************!*\
2004  !*** ./node_modules/swiper/modules/keyboard/keyboard.js ***!
2005  \**********************************************************/
2006/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
2007
2008"use strict";
2009eval("{/* unused harmony export default */\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* eslint-disable consistent-return */\n\n\nfunction Keyboard({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  swiper.keyboard = {\n    enabled: false\n  };\n  extendParams({\n    keyboard: {\n      enabled: false,\n      onlyInViewport: true,\n      pageUpDown: true\n    }\n  });\n\n  function handle(event) {\n    if (!swiper.enabled) return;\n    const {\n      rtlTranslate: rtl\n    } = swiper;\n    let e = event;\n    if (e.originalEvent) e = e.originalEvent; // jquery fix\n\n    const kc = e.keyCode || e.charCode;\n    const pageUpDown = swiper.params.keyboard.pageUpDown;\n    const isPageUp = pageUpDown && kc === 33;\n    const isPageDown = pageUpDown && kc === 34;\n    const isArrowLeft = kc === 37;\n    const isArrowRight = kc === 39;\n    const isArrowUp = kc === 38;\n    const isArrowDown = kc === 40; // Directions locks\n\n    if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) {\n      return false;\n    }\n\n    if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) {\n      return false;\n    }\n\n    if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n      return undefined;\n    }\n\n    if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) {\n      return undefined;\n    }\n\n    if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) {\n      let inView = false; // Check that swiper should be inside of visible area of window\n\n      if (swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 && swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0) {\n        return undefined;\n      }\n\n      const $el = swiper.$el;\n      const swiperWidth = $el[0].clientWidth;\n      const swiperHeight = $el[0].clientHeight;\n      const windowWidth = window.innerWidth;\n      const windowHeight = window.innerHeight;\n      const swiperOffset = swiper.$el.offset();\n      if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n      const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]];\n\n      for (let i = 0; i < swiperCoord.length; i += 1) {\n        const point = swiperCoord[i];\n\n        if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {\n          if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n\n          inView = true;\n        }\n      }\n\n      if (!inView) return undefined;\n    }\n\n    if (swiper.isHorizontal()) {\n      if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {\n        if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n      }\n\n      if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext();\n      if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev();\n    } else {\n      if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n        if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n      }\n\n      if (isPageDown || isArrowDown) swiper.slideNext();\n      if (isPageUp || isArrowUp) swiper.slidePrev();\n    }\n\n    emit('keyPress', kc);\n    return undefined;\n  }\n\n  function enable() {\n    if (swiper.keyboard.enabled) return;\n    (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(document).on('keydown', handle);\n    swiper.keyboard.enabled = true;\n  }\n\n  function disable() {\n    if (!swiper.keyboard.enabled) return;\n    (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(document).off('keydown', handle);\n    swiper.keyboard.enabled = false;\n  }\n\n  on('init', () => {\n    if (swiper.params.keyboard.enabled) {\n      enable();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.keyboard.enabled) {\n      disable();\n    }\n  });\n  Object.assign(swiper.keyboard, {\n    enable,\n    disable\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/keyboard/keyboard.js?\n}");
2010
2011/***/ }),
2012
vendor: 11,230 bytes, lines 2013-2023
2013/***/ "./node_modules/swiper/modules/lazy/lazy.js":
2014/*!**************************************************!*\
2015  !*** ./node_modules/swiper/modules/lazy/lazy.js ***!
2016  \**************************************************/
2017/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
2018
2019"use strict";
2020eval("{/* unused harmony export default */\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\n\nfunction Lazy({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  extendParams({\n    lazy: {\n      checkInView: false,\n      enabled: false,\n      loadPrevNext: false,\n      loadPrevNextAmount: 1,\n      loadOnTransitionStart: false,\n      scrollingElement: '',\n      elementClass: 'swiper-lazy',\n      loadingClass: 'swiper-lazy-loading',\n      loadedClass: 'swiper-lazy-loaded',\n      preloaderClass: 'swiper-lazy-preloader'\n    }\n  });\n  swiper.lazy = {};\n  let scrollHandlerAttached = false;\n  let initialImageLoaded = false;\n\n  function loadInSlide(index, loadInDuplicate = true) {\n    const params = swiper.params.lazy;\n    if (typeof index === 'undefined') return;\n    if (swiper.slides.length === 0) return;\n    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n    const $slideEl = isVirtual ? swiper.$wrapperEl.children(`.${swiper.params.slideClass}[data-swiper-slide-index=\"${index}\"]`) : swiper.slides.eq(index);\n    const $images = $slideEl.find(`.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`);\n\n    if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {\n      $images.push($slideEl[0]);\n    }\n\n    if ($images.length === 0) return;\n    $images.each(imageEl => {\n      const $imageEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(imageEl);\n      $imageEl.addClass(params.loadingClass);\n      const background = $imageEl.attr('data-background');\n      const src = $imageEl.attr('data-src');\n      const srcset = $imageEl.attr('data-srcset');\n      const sizes = $imageEl.attr('data-sizes');\n      const $pictureEl = $imageEl.parent('picture');\n      swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, () => {\n        if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper && !swiper.params || swiper.destroyed) return;\n\n        if (background) {\n          $imageEl.css('background-image', `url(\"${background}\")`);\n          $imageEl.removeAttr('data-background');\n        } else {\n          if (srcset) {\n            $imageEl.attr('srcset', srcset);\n            $imageEl.removeAttr('data-srcset');\n          }\n\n          if (sizes) {\n            $imageEl.attr('sizes', sizes);\n            $imageEl.removeAttr('data-sizes');\n          }\n\n          if ($pictureEl.length) {\n            $pictureEl.children('source').each(sourceEl => {\n              const $source = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(sourceEl);\n\n              if ($source.attr('data-srcset')) {\n                $source.attr('srcset', $source.attr('data-srcset'));\n                $source.removeAttr('data-srcset');\n              }\n            });\n          }\n\n          if (src) {\n            $imageEl.attr('src', src);\n            $imageEl.removeAttr('data-src');\n          }\n        }\n\n        $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);\n        $slideEl.find(`.${params.preloaderClass}`).remove();\n\n        if (swiper.params.loop && loadInDuplicate) {\n          const slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');\n\n          if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {\n            const originalSlide = swiper.$wrapperEl.children(`[data-swiper-slide-index=\"${slideOriginalIndex}\"]:not(.${swiper.params.slideDuplicateClass})`);\n            loadInSlide(originalSlide.index(), false);\n          } else {\n            const duplicatedSlide = swiper.$wrapperEl.children(`.${swiper.params.slideDuplicateClass}[data-swiper-slide-index=\"${slideOriginalIndex}\"]`);\n            loadInSlide(duplicatedSlide.index(), false);\n          }\n        }\n\n        emit('lazyImageReady', $slideEl[0], $imageEl[0]);\n\n        if (swiper.params.autoHeight) {\n          swiper.updateAutoHeight();\n        }\n      });\n      emit('lazyImageLoad', $slideEl[0], $imageEl[0]);\n    });\n  }\n\n  function load() {\n    const {\n      $wrapperEl,\n      params: swiperParams,\n      slides,\n      activeIndex\n    } = swiper;\n    const isVirtual = swiper.virtual && swiperParams.virtual.enabled;\n    const params = swiperParams.lazy;\n    let slidesPerView = swiperParams.slidesPerView;\n\n    if (slidesPerView === 'auto') {\n      slidesPerView = 0;\n    }\n\n    function slideExist(index) {\n      if (isVirtual) {\n        if ($wrapperEl.children(`.${swiperParams.slideClass}[data-swiper-slide-index=\"${index}\"]`).length) {\n          return true;\n        }\n      } else if (slides[index]) return true;\n\n      return false;\n    }\n\n    function slideIndex(slideEl) {\n      if (isVirtual) {\n        return (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(slideEl).attr('data-swiper-slide-index');\n      }\n\n      return (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(slideEl).index();\n    }\n\n    if (!initialImageLoaded) initialImageLoaded = true;\n\n    if (swiper.params.watchSlidesProgress) {\n      $wrapperEl.children(`.${swiperParams.slideVisibleClass}`).each(slideEl => {\n        const index = isVirtual ? (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(slideEl).attr('data-swiper-slide-index') : (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(slideEl).index();\n        loadInSlide(index);\n      });\n    } else if (slidesPerView > 1) {\n      for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) {\n        if (slideExist(i)) loadInSlide(i);\n      }\n    } else {\n      loadInSlide(activeIndex);\n    }\n\n    if (params.loadPrevNext) {\n      if (slidesPerView > 1 || params.loadPrevNextAmount && params.loadPrevNextAmount > 1) {\n        const amount = params.loadPrevNextAmount;\n        const spv = Math.ceil(slidesPerView);\n        const maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);\n        const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0); // Next Slides\n\n        for (let i = activeIndex + spv; i < maxIndex; i += 1) {\n          if (slideExist(i)) loadInSlide(i);\n        } // Prev Slides\n\n\n        for (let i = minIndex; i < activeIndex; i += 1) {\n          if (slideExist(i)) loadInSlide(i);\n        }\n      } else {\n        const nextSlide = $wrapperEl.children(`.${swiperParams.slideNextClass}`);\n        if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide));\n        const prevSlide = $wrapperEl.children(`.${swiperParams.slidePrevClass}`);\n        if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide));\n      }\n    }\n  }\n\n  function checkInViewOnLoad() {\n    const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n    if (!swiper || swiper.destroyed) return;\n    const $scrollElement = swiper.params.lazy.scrollingElement ? (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(swiper.params.lazy.scrollingElement) : (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(window);\n    const isWindow = $scrollElement[0] === window;\n    const scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth;\n    const scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight;\n    const swiperOffset = swiper.$el.offset();\n    const {\n      rtlTranslate: rtl\n    } = swiper;\n    let inView = false;\n    if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;\n    const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiper.width, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiper.height], [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height]];\n\n    for (let i = 0; i < swiperCoord.length; i += 1) {\n      const point = swiperCoord[i];\n\n      if (point[0] >= 0 && point[0] <= scrollElementWidth && point[1] >= 0 && point[1] <= scrollElementHeight) {\n        if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n\n        inView = true;\n      }\n    }\n\n    const passiveListener = swiper.touchEvents.start === 'touchstart' && swiper.support.passiveListener && swiper.params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n\n    if (inView) {\n      load();\n      $scrollElement.off('scroll', checkInViewOnLoad, passiveListener);\n    } else if (!scrollHandlerAttached) {\n      scrollHandlerAttached = true;\n      $scrollElement.on('scroll', checkInViewOnLoad, passiveListener);\n    }\n  }\n\n  on('beforeInit', () => {\n    if (swiper.params.lazy.enabled && swiper.params.preloadImages) {\n      swiper.params.preloadImages = false;\n    }\n  });\n  on('init', () => {\n    if (swiper.params.lazy.enabled) {\n      if (swiper.params.lazy.checkInView) {\n        checkInViewOnLoad();\n      } else {\n        load();\n      }\n    }\n  });\n  on('scroll', () => {\n    if (swiper.params.freeMode && swiper.params.freeMode.enabled && !swiper.params.freeMode.sticky) {\n      load();\n    }\n  });\n  on('scrollbarDragMove resize _freeModeNoMomentumRelease', () => {\n    if (swiper.params.lazy.enabled) {\n      if (swiper.params.lazy.checkInView) {\n        checkInViewOnLoad();\n      } else {\n        load();\n      }\n    }\n  });\n  on('transitionStart', () => {\n    if (swiper.params.lazy.enabled) {\n      if (swiper.params.lazy.loadOnTransitionStart || !swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded) {\n        if (swiper.params.lazy.checkInView) {\n          checkInViewOnLoad();\n        } else {\n          load();\n        }\n      }\n    }\n  });\n  on('transitionEnd', () => {\n    if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {\n      if (swiper.params.lazy.checkInView) {\n        checkInViewOnLoad();\n      } else {\n        load();\n      }\n    }\n  });\n  on('slideChange', () => {\n    const {\n      lazy,\n      cssMode,\n      watchSlidesProgress,\n      touchReleaseOnEdges,\n      resistanceRatio\n    } = swiper.params;\n\n    if (lazy.enabled && (cssMode || watchSlidesProgress && (touchReleaseOnEdges || resistanceRatio === 0))) {\n      load();\n    }\n  });\n  on('destroy', () => {\n    if (!swiper.$el) return;\n    swiper.$el.find(`.${swiper.params.lazy.loadingClass}`).removeClass(swiper.params.lazy.loadingClass);\n  });\n  Object.assign(swiper.lazy, {\n    load,\n    loadInSlide\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/lazy/lazy.js?\n}");
2021
2022/***/ }),
2023
vendor: 2,188 bytes, lines 2024-2034
2024/***/ "./node_modules/swiper/modules/manipulation/manipulation.js":
2025/*!******************************************************************!*\
2026  !*** ./node_modules/swiper/modules/manipulation/manipulation.js ***!
2027  \******************************************************************/
2028/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
2029
2030"use strict";
2031eval("{/* unused harmony export default */\n/* harmony import */ var _methods_appendSlide_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./methods/appendSlide.js */ \"./node_modules/swiper/modules/manipulation/methods/appendSlide.js\");\n/* harmony import */ var _methods_prependSlide_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./methods/prependSlide.js */ \"./node_modules/swiper/modules/manipulation/methods/prependSlide.js\");\n/* harmony import */ var _methods_addSlide_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./methods/addSlide.js */ \"./node_modules/swiper/modules/manipulation/methods/addSlide.js\");\n/* harmony import */ var _methods_removeSlide_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./methods/removeSlide.js */ \"./node_modules/swiper/modules/manipulation/methods/removeSlide.js\");\n/* harmony import */ var _methods_removeAllSlides_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./methods/removeAllSlides.js */ \"./node_modules/swiper/modules/manipulation/methods/removeAllSlides.js\");\n\n\n\n\n\nfunction Manipulation({\n  swiper\n}) {\n  Object.assign(swiper, {\n    appendSlide: _methods_appendSlide_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].bind(swiper),\n    prependSlide: _methods_prependSlide_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].bind(swiper),\n    addSlide: _methods_addSlide_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].bind(swiper),\n    removeSlide: _methods_removeSlide_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].bind(swiper),\n    removeAllSlides: _methods_removeAllSlides_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"].bind(swiper)\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/manipulation/manipulation.js?\n}");
2032
2033/***/ }),
2034
vendor: 2,266 bytes, lines 2035-2045
2035/***/ "./node_modules/swiper/modules/manipulation/methods/addSlide.js":
2036/*!**********************************************************************!*\
2037  !*** ./node_modules/swiper/modules/manipulation/methods/addSlide.js ***!
2038  \**********************************************************************/
2039/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2040
2041"use strict";
2042eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ addSlide; }\n/* harmony export */ });\nfunction addSlide(index, slides) {\n  const swiper = this;\n  const {\n    $wrapperEl,\n    params,\n    activeIndex\n  } = swiper;\n  let activeIndexBuffer = activeIndex;\n\n  if (params.loop) {\n    activeIndexBuffer -= swiper.loopedSlides;\n    swiper.loopDestroy();\n    swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n  }\n\n  const baseLength = swiper.slides.length;\n\n  if (index <= 0) {\n    swiper.prependSlide(slides);\n    return;\n  }\n\n  if (index >= baseLength) {\n    swiper.appendSlide(slides);\n    return;\n  }\n\n  let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n  const slidesBuffer = [];\n\n  for (let i = baseLength - 1; i >= index; i -= 1) {\n    const currentSlide = swiper.slides.eq(i);\n    currentSlide.remove();\n    slidesBuffer.unshift(currentSlide);\n  }\n\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) $wrapperEl.append(slides[i]);\n    }\n\n    newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n  } else {\n    $wrapperEl.append(slides);\n  }\n\n  for (let i = 0; i < slidesBuffer.length; i += 1) {\n    $wrapperEl.append(slidesBuffer[i]);\n  }\n\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n\n  if (!params.observer) {\n    swiper.update();\n  }\n\n  if (params.loop) {\n    swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n  } else {\n    swiper.slideTo(newActiveIndex, 0, false);\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/manipulation/methods/addSlide.js?\n}");
2043
2044/***/ }),
2045
vendor: 1,236 bytes, lines 2046-2056
2046/***/ "./node_modules/swiper/modules/manipulation/methods/appendSlide.js":
2047/*!*************************************************************************!*\
2048  !*** ./node_modules/swiper/modules/manipulation/methods/appendSlide.js ***!
2049  \*************************************************************************/
2050/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2051
2052"use strict";
2053eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ appendSlide; }\n/* harmony export */ });\nfunction appendSlide(slides) {\n  const swiper = this;\n  const {\n    $wrapperEl,\n    params\n  } = swiper;\n\n  if (params.loop) {\n    swiper.loopDestroy();\n  }\n\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) $wrapperEl.append(slides[i]);\n    }\n  } else {\n    $wrapperEl.append(slides);\n  }\n\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n\n  if (!params.observer) {\n    swiper.update();\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/manipulation/methods/appendSlide.js?\n}");
2054
2055/***/ }),
2056
vendor: 1,406 bytes, lines 2057-2067
2057/***/ "./node_modules/swiper/modules/manipulation/methods/prependSlide.js":
2058/*!**************************************************************************!*\
2059  !*** ./node_modules/swiper/modules/manipulation/methods/prependSlide.js ***!
2060  \**************************************************************************/
2061/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2062
2063"use strict";
2064eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ prependSlide; }\n/* harmony export */ });\nfunction prependSlide(slides) {\n  const swiper = this;\n  const {\n    params,\n    $wrapperEl,\n    activeIndex\n  } = swiper;\n\n  if (params.loop) {\n    swiper.loopDestroy();\n  }\n\n  let newActiveIndex = activeIndex + 1;\n\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) $wrapperEl.prepend(slides[i]);\n    }\n\n    newActiveIndex = activeIndex + slides.length;\n  } else {\n    $wrapperEl.prepend(slides);\n  }\n\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n\n  if (!params.observer) {\n    swiper.update();\n  }\n\n  swiper.slideTo(newActiveIndex, 0, false);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/manipulation/methods/prependSlide.js?\n}");
2065
2066/***/ }),
2067
vendor: 976 bytes, lines 2068-2078
2068/***/ "./node_modules/swiper/modules/manipulation/methods/removeAllSlides.js":
2069/*!*****************************************************************************!*\
2070  !*** ./node_modules/swiper/modules/manipulation/methods/removeAllSlides.js ***!
2071  \*****************************************************************************/
2072/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2073
2074"use strict";
2075eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ removeAllSlides; }\n/* harmony export */ });\nfunction removeAllSlides() {\n  const swiper = this;\n  const slidesIndexes = [];\n\n  for (let i = 0; i < swiper.slides.length; i += 1) {\n    slidesIndexes.push(i);\n  }\n\n  swiper.removeSlide(slidesIndexes);\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/manipulation/methods/removeAllSlides.js?\n}");
2076
2077/***/ }),
2078
vendor: 2,047 bytes, lines 2079-2089
2079/***/ "./node_modules/swiper/modules/manipulation/methods/removeSlide.js":
2080/*!*************************************************************************!*\
2081  !*** ./node_modules/swiper/modules/manipulation/methods/removeSlide.js ***!
2082  \*************************************************************************/
2083/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2084
2085"use strict";
2086eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ removeSlide; }\n/* harmony export */ });\nfunction removeSlide(slidesIndexes) {\n  const swiper = this;\n  const {\n    params,\n    $wrapperEl,\n    activeIndex\n  } = swiper;\n  let activeIndexBuffer = activeIndex;\n\n  if (params.loop) {\n    activeIndexBuffer -= swiper.loopedSlides;\n    swiper.loopDestroy();\n    swiper.slides = $wrapperEl.children(`.${params.slideClass}`);\n  }\n\n  let newActiveIndex = activeIndexBuffer;\n  let indexToRemove;\n\n  if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n    for (let i = 0; i < slidesIndexes.length; i += 1) {\n      indexToRemove = slidesIndexes[i];\n      if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n      if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n    }\n\n    newActiveIndex = Math.max(newActiveIndex, 0);\n  } else {\n    indexToRemove = slidesIndexes;\n    if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();\n    if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n    newActiveIndex = Math.max(newActiveIndex, 0);\n  }\n\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n\n  if (!params.observer) {\n    swiper.update();\n  }\n\n  if (params.loop) {\n    swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n  } else {\n    swiper.slideTo(newActiveIndex, 0, false);\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/manipulation/methods/removeSlide.js?\n}");
2087
2088/***/ }),
2089
vendor: 15,991 bytes, lines 2090-2100
2090/***/ "./node_modules/swiper/modules/mousewheel/mousewheel.js":
2091/*!**************************************************************!*\
2092  !*** ./node_modules/swiper/modules/mousewheel/mousewheel.js ***!
2093  \**************************************************************/
2094/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
2095
2096"use strict";
2097eval("{/* unused harmony export default */\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n/* eslint-disable consistent-return */\n\n\n\nfunction Mousewheel({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  extendParams({\n    mousewheel: {\n      enabled: false,\n      releaseOnEdges: false,\n      invert: false,\n      forceToAxis: false,\n      sensitivity: 1,\n      eventsTarget: 'container',\n      thresholdDelta: null,\n      thresholdTime: null\n    }\n  });\n  swiper.mousewheel = {\n    enabled: false\n  };\n  let timeout;\n  let lastScrollTime = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.now)();\n  let lastEventBeforeSnap;\n  const recentWheelEvents = [];\n\n  function normalize(e) {\n    // Reasonable defaults\n    const PIXEL_STEP = 10;\n    const LINE_HEIGHT = 40;\n    const PAGE_HEIGHT = 800;\n    let sX = 0;\n    let sY = 0; // spinX, spinY\n\n    let pX = 0;\n    let pY = 0; // pixelX, pixelY\n    // Legacy\n\n    if ('detail' in e) {\n      sY = e.detail;\n    }\n\n    if ('wheelDelta' in e) {\n      sY = -e.wheelDelta / 120;\n    }\n\n    if ('wheelDeltaY' in e) {\n      sY = -e.wheelDeltaY / 120;\n    }\n\n    if ('wheelDeltaX' in e) {\n      sX = -e.wheelDeltaX / 120;\n    } // side scrolling on FF with DOMMouseScroll\n\n\n    if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n      sX = sY;\n      sY = 0;\n    }\n\n    pX = sX * PIXEL_STEP;\n    pY = sY * PIXEL_STEP;\n\n    if ('deltaY' in e) {\n      pY = e.deltaY;\n    }\n\n    if ('deltaX' in e) {\n      pX = e.deltaX;\n    }\n\n    if (e.shiftKey && !pX) {\n      // if user scrolls with shift he wants horizontal scroll\n      pX = pY;\n      pY = 0;\n    }\n\n    if ((pX || pY) && e.deltaMode) {\n      if (e.deltaMode === 1) {\n        // delta in LINE units\n        pX *= LINE_HEIGHT;\n        pY *= LINE_HEIGHT;\n      } else {\n        // delta in PAGE units\n        pX *= PAGE_HEIGHT;\n        pY *= PAGE_HEIGHT;\n      }\n    } // Fall-back if spin cannot be determined\n\n\n    if (pX && !sX) {\n      sX = pX < 1 ? -1 : 1;\n    }\n\n    if (pY && !sY) {\n      sY = pY < 1 ? -1 : 1;\n    }\n\n    return {\n      spinX: sX,\n      spinY: sY,\n      pixelX: pX,\n      pixelY: pY\n    };\n  }\n\n  function handleMouseEnter() {\n    if (!swiper.enabled) return;\n    swiper.mouseEntered = true;\n  }\n\n  function handleMouseLeave() {\n    if (!swiper.enabled) return;\n    swiper.mouseEntered = false;\n  }\n\n  function animateSlider(newEvent) {\n    if (swiper.params.mousewheel.thresholdDelta && newEvent.delta < swiper.params.mousewheel.thresholdDelta) {\n      // Prevent if delta of wheel scroll delta is below configured threshold\n      return false;\n    }\n\n    if (swiper.params.mousewheel.thresholdTime && (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.now)() - lastScrollTime < swiper.params.mousewheel.thresholdTime) {\n      // Prevent if time between scrolls is below configured threshold\n      return false;\n    } // If the movement is NOT big enough and\n    // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):\n    //   Don't go any further (avoid insignificant scroll movement).\n\n\n    if (newEvent.delta >= 6 && (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.now)() - lastScrollTime < 60) {\n      // Return false as a default\n      return true;\n    } // If user is scrolling towards the end:\n    //   If the slider hasn't hit the latest slide or\n    //   if the slider is a loop and\n    //   if the slider isn't moving right now:\n    //     Go to next slide and\n    //     emit a scroll event.\n    // Else (the user is scrolling towards the beginning) and\n    // if the slider hasn't hit the first slide or\n    // if the slider is a loop and\n    // if the slider isn't moving right now:\n    //   Go to prev slide and\n    //   emit a scroll event.\n\n\n    if (newEvent.direction < 0) {\n      if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n        swiper.slideNext();\n        emit('scroll', newEvent.raw);\n      }\n    } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n      swiper.slidePrev();\n      emit('scroll', newEvent.raw);\n    } // If you got here is because an animation has been triggered so store the current time\n\n\n    lastScrollTime = new window.Date().getTime(); // Return false as a default\n\n    return false;\n  }\n\n  function releaseScroll(newEvent) {\n    const params = swiper.params.mousewheel;\n\n    if (newEvent.direction < 0) {\n      if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {\n        // Return true to animate scroll on edges\n        return true;\n      }\n    } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {\n      // Return true to animate scroll on edges\n      return true;\n    }\n\n    return false;\n  }\n\n  function handle(event) {\n    let e = event;\n    let disableParentSwiper = true;\n    if (!swiper.enabled) return;\n    const params = swiper.params.mousewheel;\n\n    if (swiper.params.cssMode) {\n      e.preventDefault();\n    }\n\n    let target = swiper.$el;\n\n    if (swiper.params.mousewheel.eventsTarget !== 'container') {\n      target = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(swiper.params.mousewheel.eventsTarget);\n    }\n\n    if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) return true;\n    if (e.originalEvent) e = e.originalEvent; // jquery fix\n\n    let delta = 0;\n    const rtlFactor = swiper.rtlTranslate ? -1 : 1;\n    const data = normalize(e);\n\n    if (params.forceToAxis) {\n      if (swiper.isHorizontal()) {\n        if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true;\n      } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true;\n    } else {\n      delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n    }\n\n    if (delta === 0) return true;\n    if (params.invert) delta = -delta; // Get the scroll positions\n\n    let positions = swiper.getTranslate() + delta * params.sensitivity;\n    if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();\n    if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate(); // When loop is true:\n    //     the disableParentSwiper will be true.\n    // When loop is false:\n    //     if the scroll positions is not on edge,\n    //     then the disableParentSwiper will be true.\n    //     if the scroll on edge positions,\n    //     then the disableParentSwiper will be false.\n\n    disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());\n    if (disableParentSwiper && swiper.params.nested) e.stopPropagation();\n\n    if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {\n      // Register the new event in a variable which stores the relevant data\n      const newEvent = {\n        time: (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.now)(),\n        delta: Math.abs(delta),\n        direction: Math.sign(delta),\n        raw: event\n      }; // Keep the most recent events\n\n      if (recentWheelEvents.length >= 2) {\n        recentWheelEvents.shift(); // only store the last N events\n      }\n\n      const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;\n      recentWheelEvents.push(newEvent); // If there is at least one previous recorded event:\n      //   If direction has changed or\n      //   if the scroll is quicker than the previous one:\n      //     Animate the slider.\n      // Else (this is the first time the wheel is moved):\n      //     Animate the slider.\n\n      if (prevEvent) {\n        if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {\n          animateSlider(newEvent);\n        }\n      } else {\n        animateSlider(newEvent);\n      } // If it's time to release the scroll:\n      //   Return now so you don't hit the preventDefault.\n\n\n      if (releaseScroll(newEvent)) {\n        return true;\n      }\n    } else {\n      // Freemode or scrollContainer:\n      // If we recently snapped after a momentum scroll, then ignore wheel events\n      // to give time for the deceleration to finish. Stop ignoring after 500 msecs\n      // or if it's a new scroll (larger delta or inverse sign as last event before\n      // an end-of-momentum snap).\n      const newEvent = {\n        time: (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.now)(),\n        delta: Math.abs(delta),\n        direction: Math.sign(delta)\n      };\n      const ignoreWheelEvents = lastEventBeforeSnap && newEvent.time < lastEventBeforeSnap.time + 500 && newEvent.delta <= lastEventBeforeSnap.delta && newEvent.direction === lastEventBeforeSnap.direction;\n\n      if (!ignoreWheelEvents) {\n        lastEventBeforeSnap = undefined;\n\n        if (swiper.params.loop) {\n          swiper.loopFix();\n        }\n\n        let position = swiper.getTranslate() + delta * params.sensitivity;\n        const wasBeginning = swiper.isBeginning;\n        const wasEnd = swiper.isEnd;\n        if (position >= swiper.minTranslate()) position = swiper.minTranslate();\n        if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();\n        swiper.setTransition(0);\n        swiper.setTranslate(position);\n        swiper.updateProgress();\n        swiper.updateActiveIndex();\n        swiper.updateSlidesClasses();\n\n        if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) {\n          swiper.updateSlidesClasses();\n        }\n\n        if (swiper.params.freeMode.sticky) {\n          // When wheel scrolling starts with sticky (aka snap) enabled, then detect\n          // the end of a momentum scroll by storing recent (N=15?) wheel events.\n          // 1. do all N events have decreasing or same (absolute value) delta?\n          // 2. did all N events arrive in the last M (M=500?) msecs?\n          // 3. does the earliest event have an (absolute value) delta that's\n          //    at least P (P=1?) larger than the most recent event's delta?\n          // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?\n          // If 1-4 are \"yes\" then we're near the end of a momentum scroll deceleration.\n          // Snap immediately and ignore remaining wheel events in this scroll.\n          // See comment above for \"remaining wheel events in this scroll\" determination.\n          // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.\n          clearTimeout(timeout);\n          timeout = undefined;\n\n          if (recentWheelEvents.length >= 15) {\n            recentWheelEvents.shift(); // only store the last N events\n          }\n\n          const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;\n          const firstEvent = recentWheelEvents[0];\n          recentWheelEvents.push(newEvent);\n\n          if (prevEvent && (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)) {\n            // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.\n            recentWheelEvents.splice(0);\n          } else if (recentWheelEvents.length >= 15 && newEvent.time - firstEvent.time < 500 && firstEvent.delta - newEvent.delta >= 1 && newEvent.delta <= 6) {\n            // We're at the end of the deceleration of a momentum scroll, so there's no need\n            // to wait for more events. Snap ASAP on the next tick.\n            // Also, because there's some remaining momentum we'll bias the snap in the\n            // direction of the ongoing scroll because it's better UX for the scroll to snap\n            // in the same direction as the scroll instead of reversing to snap.  Therefore,\n            // if it's already scrolled more than 20% in the current direction, keep going.\n            const snapToThreshold = delta > 0 ? 0.8 : 0.2;\n            lastEventBeforeSnap = newEvent;\n            recentWheelEvents.splice(0);\n            timeout = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.nextTick)(() => {\n              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n            }, 0); // no delay; move on next tick\n          }\n\n          if (!timeout) {\n            // if we get here, then we haven't detected the end of a momentum scroll, so\n            // we'll consider a scroll \"complete\" when there haven't been any wheel events\n            // for 500ms.\n            timeout = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.nextTick)(() => {\n              const snapToThreshold = 0.5;\n              lastEventBeforeSnap = newEvent;\n              recentWheelEvents.splice(0);\n              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n            }, 500);\n          }\n        } // Emit event\n\n\n        if (!ignoreWheelEvents) emit('scroll', e); // Stop autoplay\n\n        if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop(); // Return page scroll on edge positions\n\n        if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;\n      }\n    }\n\n    if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n    return false;\n  }\n\n  function events(method) {\n    let target = swiper.$el;\n\n    if (swiper.params.mousewheel.eventsTarget !== 'container') {\n      target = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(swiper.params.mousewheel.eventsTarget);\n    }\n\n    target[method]('mouseenter', handleMouseEnter);\n    target[method]('mouseleave', handleMouseLeave);\n    target[method]('wheel', handle);\n  }\n\n  function enable() {\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.removeEventListener('wheel', handle);\n      return true;\n    }\n\n    if (swiper.mousewheel.enabled) return false;\n    events('on');\n    swiper.mousewheel.enabled = true;\n    return true;\n  }\n\n  function disable() {\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.addEventListener(event, handle);\n      return true;\n    }\n\n    if (!swiper.mousewheel.enabled) return false;\n    events('off');\n    swiper.mousewheel.enabled = false;\n    return true;\n  }\n\n  on('init', () => {\n    if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {\n      disable();\n    }\n\n    if (swiper.params.mousewheel.enabled) enable();\n  });\n  on('destroy', () => {\n    if (swiper.params.cssMode) {\n      enable();\n    }\n\n    if (swiper.mousewheel.enabled) disable();\n  });\n  Object.assign(swiper.mousewheel, {\n    enable,\n    disable\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/mousewheel/mousewheel.js?\n}");
2098
2099/***/ }),
2100
vendor: 6,612 bytes, lines 2101-2111
2101/***/ "./node_modules/swiper/modules/navigation/navigation.js":
2102/*!**************************************************************!*\
2103  !*** ./node_modules/swiper/modules/navigation/navigation.js ***!
2104  \**************************************************************/
2105/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2106
2107"use strict";
2108eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ Navigation; }\n/* harmony export */ });\n/* harmony import */ var _shared_create_element_if_not_defined_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/create-element-if-not-defined.js */ \"./node_modules/swiper/shared/create-element-if-not-defined.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\n\nfunction Navigation({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  extendParams({\n    navigation: {\n      nextEl: null,\n      prevEl: null,\n      hideOnClick: false,\n      disabledClass: 'swiper-button-disabled',\n      hiddenClass: 'swiper-button-hidden',\n      lockClass: 'swiper-button-lock',\n      navigationDisabledClass: 'swiper-navigation-disabled'\n    }\n  });\n  swiper.navigation = {\n    nextEl: null,\n    $nextEl: null,\n    prevEl: null,\n    $prevEl: null\n  };\n\n  function getEl(el) {\n    let $el;\n\n    if (el) {\n      $el = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(el);\n\n      if (swiper.params.uniqueNavElements && typeof el === 'string' && $el.length > 1 && swiper.$el.find(el).length === 1) {\n        $el = swiper.$el.find(el);\n      }\n    }\n\n    return $el;\n  }\n\n  function toggleEl($el, disabled) {\n    const params = swiper.params.navigation;\n\n    if ($el && $el.length > 0) {\n      $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass);\n      if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;\n\n      if (swiper.params.watchOverflow && swiper.enabled) {\n        $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n      }\n    }\n  }\n\n  function update() {\n    // Update Navigation Buttons\n    if (swiper.params.loop) return;\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n    toggleEl($prevEl, swiper.isBeginning && !swiper.params.rewind);\n    toggleEl($nextEl, swiper.isEnd && !swiper.params.rewind);\n  }\n\n  function onPrevClick(e) {\n    e.preventDefault();\n    if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return;\n    swiper.slidePrev();\n    emit('navigationPrev');\n  }\n\n  function onNextClick(e) {\n    e.preventDefault();\n    if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return;\n    swiper.slideNext();\n    emit('navigationNext');\n  }\n\n  function init() {\n    const params = swiper.params.navigation;\n    swiper.params.navigation = (0,_shared_create_element_if_not_defined_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(swiper, swiper.originalParams.navigation, swiper.params.navigation, {\n      nextEl: 'swiper-button-next',\n      prevEl: 'swiper-button-prev'\n    });\n    if (!(params.nextEl || params.prevEl)) return;\n    const $nextEl = getEl(params.nextEl);\n    const $prevEl = getEl(params.prevEl);\n\n    if ($nextEl && $nextEl.length > 0) {\n      $nextEl.on('click', onNextClick);\n    }\n\n    if ($prevEl && $prevEl.length > 0) {\n      $prevEl.on('click', onPrevClick);\n    }\n\n    Object.assign(swiper.navigation, {\n      $nextEl,\n      nextEl: $nextEl && $nextEl[0],\n      $prevEl,\n      prevEl: $prevEl && $prevEl[0]\n    });\n\n    if (!swiper.enabled) {\n      if ($nextEl) $nextEl.addClass(params.lockClass);\n      if ($prevEl) $prevEl.addClass(params.lockClass);\n    }\n  }\n\n  function destroy() {\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n\n    if ($nextEl && $nextEl.length) {\n      $nextEl.off('click', onNextClick);\n      $nextEl.removeClass(swiper.params.navigation.disabledClass);\n    }\n\n    if ($prevEl && $prevEl.length) {\n      $prevEl.off('click', onPrevClick);\n      $prevEl.removeClass(swiper.params.navigation.disabledClass);\n    }\n  }\n\n  on('init', () => {\n    if (swiper.params.navigation.enabled === false) {\n      // eslint-disable-next-line\n      disable();\n    } else {\n      init();\n      update();\n    }\n  });\n  on('toEdge fromEdge lock unlock', () => {\n    update();\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n\n    if ($nextEl) {\n      $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n    }\n\n    if ($prevEl) {\n      $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n    }\n  });\n  on('click', (_s, e) => {\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n    const targetEl = e.target;\n\n    if (swiper.params.navigation.hideOnClick && !(0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(targetEl).is($prevEl) && !(0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(targetEl).is($nextEl)) {\n      if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;\n      let isHidden;\n\n      if ($nextEl) {\n        isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n      } else if ($prevEl) {\n        isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n      }\n\n      if (isHidden === true) {\n        emit('navigationShow');\n      } else {\n        emit('navigationHide');\n      }\n\n      if ($nextEl) {\n        $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n      }\n\n      if ($prevEl) {\n        $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n      }\n    }\n  });\n\n  const enable = () => {\n    swiper.$el.removeClass(swiper.params.navigation.navigationDisabledClass);\n    init();\n    update();\n  };\n\n  const disable = () => {\n    swiper.$el.addClass(swiper.params.navigation.navigationDisabledClass);\n    destroy();\n  };\n\n  Object.assign(swiper.navigation, {\n    enable,\n    disable,\n    update,\n    init,\n    destroy\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/navigation/navigation.js?\n}");
2109
2110/***/ }),
2111
vendor: 16,734 bytes, lines 2112-2122
2112/***/ "./node_modules/swiper/modules/pagination/pagination.js":
2113/*!**************************************************************!*\
2114  !*** ./node_modules/swiper/modules/pagination/pagination.js ***!
2115  \**************************************************************/
2116/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2117
2118"use strict";
2119eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ Pagination; }\n/* harmony export */ });\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* harmony import */ var _shared_classes_to_selector_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/classes-to-selector.js */ \"./node_modules/swiper/shared/classes-to-selector.js\");\n/* harmony import */ var _shared_create_element_if_not_defined_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/create-element-if-not-defined.js */ \"./node_modules/swiper/shared/create-element-if-not-defined.js\");\n\n\n\nfunction Pagination({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const pfx = 'swiper-pagination';\n  extendParams({\n    pagination: {\n      el: null,\n      bulletElement: 'span',\n      clickable: false,\n      hideOnClick: false,\n      renderBullet: null,\n      renderProgressbar: null,\n      renderFraction: null,\n      renderCustom: null,\n      progressbarOpposite: false,\n      type: 'bullets',\n      // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n      dynamicBullets: false,\n      dynamicMainBullets: 1,\n      formatFractionCurrent: number => number,\n      formatFractionTotal: number => number,\n      bulletClass: `${pfx}-bullet`,\n      bulletActiveClass: `${pfx}-bullet-active`,\n      modifierClass: `${pfx}-`,\n      currentClass: `${pfx}-current`,\n      totalClass: `${pfx}-total`,\n      hiddenClass: `${pfx}-hidden`,\n      progressbarFillClass: `${pfx}-progressbar-fill`,\n      progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n      clickableClass: `${pfx}-clickable`,\n      lockClass: `${pfx}-lock`,\n      horizontalClass: `${pfx}-horizontal`,\n      verticalClass: `${pfx}-vertical`,\n      paginationDisabledClass: `${pfx}-disabled`\n    }\n  });\n  swiper.pagination = {\n    el: null,\n    $el: null,\n    bullets: []\n  };\n  let bulletSize;\n  let dynamicBulletIndex = 0;\n\n  function isPaginationDisabled() {\n    return !swiper.params.pagination.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0;\n  }\n\n  function setSideBullets($bulletEl, position) {\n    const {\n      bulletActiveClass\n    } = swiper.params.pagination;\n    $bulletEl[position]().addClass(`${bulletActiveClass}-${position}`)[position]().addClass(`${bulletActiveClass}-${position}-${position}`);\n  }\n\n  function update() {\n    // Render || Update Pagination bullets/items\n    const rtl = swiper.rtl;\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n    const $el = swiper.pagination.$el; // Current/Total\n\n    let current;\n    const total = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n\n    if (swiper.params.loop) {\n      current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);\n\n      if (current > slidesLength - 1 - swiper.loopedSlides * 2) {\n        current -= slidesLength - swiper.loopedSlides * 2;\n      }\n\n      if (current > total - 1) current -= total;\n      if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;\n    } else if (typeof swiper.snapIndex !== 'undefined') {\n      current = swiper.snapIndex;\n    } else {\n      current = swiper.activeIndex || 0;\n    } // Types\n\n\n    if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {\n      const bullets = swiper.pagination.bullets;\n      let firstIndex;\n      let lastIndex;\n      let midIndex;\n\n      if (params.dynamicBullets) {\n        bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n        $el.css(swiper.isHorizontal() ? 'width' : 'height', `${bulletSize * (params.dynamicMainBullets + 4)}px`);\n\n        if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n          dynamicBulletIndex += current - (swiper.previousIndex - swiper.loopedSlides || 0);\n\n          if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n            dynamicBulletIndex = params.dynamicMainBullets - 1;\n          } else if (dynamicBulletIndex < 0) {\n            dynamicBulletIndex = 0;\n          }\n        }\n\n        firstIndex = Math.max(current - dynamicBulletIndex, 0);\n        lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n        midIndex = (lastIndex + firstIndex) / 2;\n      }\n\n      bullets.removeClass(['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`).join(' '));\n\n      if ($el.length > 1) {\n        bullets.each(bullet => {\n          const $bullet = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(bullet);\n          const bulletIndex = $bullet.index();\n\n          if (bulletIndex === current) {\n            $bullet.addClass(params.bulletActiveClass);\n          }\n\n          if (params.dynamicBullets) {\n            if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n              $bullet.addClass(`${params.bulletActiveClass}-main`);\n            }\n\n            if (bulletIndex === firstIndex) {\n              setSideBullets($bullet, 'prev');\n            }\n\n            if (bulletIndex === lastIndex) {\n              setSideBullets($bullet, 'next');\n            }\n          }\n        });\n      } else {\n        const $bullet = bullets.eq(current);\n        const bulletIndex = $bullet.index();\n        $bullet.addClass(params.bulletActiveClass);\n\n        if (params.dynamicBullets) {\n          const $firstDisplayedBullet = bullets.eq(firstIndex);\n          const $lastDisplayedBullet = bullets.eq(lastIndex);\n\n          for (let i = firstIndex; i <= lastIndex; i += 1) {\n            bullets.eq(i).addClass(`${params.bulletActiveClass}-main`);\n          }\n\n          if (swiper.params.loop) {\n            if (bulletIndex >= bullets.length) {\n              for (let i = params.dynamicMainBullets; i >= 0; i -= 1) {\n                bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`);\n              }\n\n              bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(`${params.bulletActiveClass}-prev`);\n            } else {\n              setSideBullets($firstDisplayedBullet, 'prev');\n              setSideBullets($lastDisplayedBullet, 'next');\n            }\n          } else {\n            setSideBullets($firstDisplayedBullet, 'prev');\n            setSideBullets($lastDisplayedBullet, 'next');\n          }\n        }\n      }\n\n      if (params.dynamicBullets) {\n        const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n        const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n        const offsetProp = rtl ? 'right' : 'left';\n        bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`);\n      }\n    }\n\n    if (params.type === 'fraction') {\n      $el.find((0,_shared_classes_to_selector_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params.currentClass)).text(params.formatFractionCurrent(current + 1));\n      $el.find((0,_shared_classes_to_selector_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params.totalClass)).text(params.formatFractionTotal(total));\n    }\n\n    if (params.type === 'progressbar') {\n      let progressbarDirection;\n\n      if (params.progressbarOpposite) {\n        progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n      } else {\n        progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n      }\n\n      const scale = (current + 1) / total;\n      let scaleX = 1;\n      let scaleY = 1;\n\n      if (progressbarDirection === 'horizontal') {\n        scaleX = scale;\n      } else {\n        scaleY = scale;\n      }\n\n      $el.find((0,_shared_classes_to_selector_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`).transition(swiper.params.speed);\n    }\n\n    if (params.type === 'custom' && params.renderCustom) {\n      $el.html(params.renderCustom(swiper, current + 1, total));\n      emit('paginationRender', $el[0]);\n    } else {\n      emit('paginationUpdate', $el[0]);\n    }\n\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n    }\n  }\n\n  function render() {\n    // Render Container\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n    const $el = swiper.pagination.$el;\n    let paginationHTML = '';\n\n    if (params.type === 'bullets') {\n      let numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n\n      if (swiper.params.freeMode && swiper.params.freeMode.enabled && !swiper.params.loop && numberOfBullets > slidesLength) {\n        numberOfBullets = slidesLength;\n      }\n\n      for (let i = 0; i < numberOfBullets; i += 1) {\n        if (params.renderBullet) {\n          paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n        } else {\n          paginationHTML += `<${params.bulletElement} class=\"${params.bulletClass}\"></${params.bulletElement}>`;\n        }\n      }\n\n      $el.html(paginationHTML);\n      swiper.pagination.bullets = $el.find((0,_shared_classes_to_selector_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params.bulletClass));\n    }\n\n    if (params.type === 'fraction') {\n      if (params.renderFraction) {\n        paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n      } else {\n        paginationHTML = `<span class=\"${params.currentClass}\"></span>` + ' / ' + `<span class=\"${params.totalClass}\"></span>`;\n      }\n\n      $el.html(paginationHTML);\n    }\n\n    if (params.type === 'progressbar') {\n      if (params.renderProgressbar) {\n        paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n      } else {\n        paginationHTML = `<span class=\"${params.progressbarFillClass}\"></span>`;\n      }\n\n      $el.html(paginationHTML);\n    }\n\n    if (params.type !== 'custom') {\n      emit('paginationRender', swiper.pagination.$el[0]);\n    }\n  }\n\n  function init() {\n    swiper.params.pagination = (0,_shared_create_element_if_not_defined_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(swiper, swiper.originalParams.pagination, swiper.params.pagination, {\n      el: 'swiper-pagination'\n    });\n    const params = swiper.params.pagination;\n    if (!params.el) return;\n    let $el = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(params.el);\n    if ($el.length === 0) return;\n\n    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {\n      $el = swiper.$el.find(params.el); // check if it belongs to another nested Swiper\n\n      if ($el.length > 1) {\n        $el = $el.filter(el => {\n          if ((0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(el).parents('.swiper')[0] !== swiper.el) return false;\n          return true;\n        });\n      }\n    }\n\n    if (params.type === 'bullets' && params.clickable) {\n      $el.addClass(params.clickableClass);\n    }\n\n    $el.addClass(params.modifierClass + params.type);\n    $el.addClass(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n\n    if (params.type === 'bullets' && params.dynamicBullets) {\n      $el.addClass(`${params.modifierClass}${params.type}-dynamic`);\n      dynamicBulletIndex = 0;\n\n      if (params.dynamicMainBullets < 1) {\n        params.dynamicMainBullets = 1;\n      }\n    }\n\n    if (params.type === 'progressbar' && params.progressbarOpposite) {\n      $el.addClass(params.progressbarOppositeClass);\n    }\n\n    if (params.clickable) {\n      $el.on('click', (0,_shared_classes_to_selector_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params.bulletClass), function onClick(e) {\n        e.preventDefault();\n        let index = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(this).index() * swiper.params.slidesPerGroup;\n        if (swiper.params.loop) index += swiper.loopedSlides;\n        swiper.slideTo(index);\n      });\n    }\n\n    Object.assign(swiper.pagination, {\n      $el,\n      el: $el[0]\n    });\n\n    if (!swiper.enabled) {\n      $el.addClass(params.lockClass);\n    }\n  }\n\n  function destroy() {\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const $el = swiper.pagination.$el;\n    $el.removeClass(params.hiddenClass);\n    $el.removeClass(params.modifierClass + params.type);\n    $el.removeClass(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n    if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass) swiper.pagination.bullets.removeClass(params.bulletActiveClass);\n\n    if (params.clickable) {\n      $el.off('click', (0,_shared_classes_to_selector_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params.bulletClass));\n    }\n  }\n\n  on('init', () => {\n    if (swiper.params.pagination.enabled === false) {\n      // eslint-disable-next-line\n      disable();\n    } else {\n      init();\n      render();\n      update();\n    }\n  });\n  on('activeIndexChange', () => {\n    if (swiper.params.loop) {\n      update();\n    } else if (typeof swiper.snapIndex === 'undefined') {\n      update();\n    }\n  });\n  on('snapIndexChange', () => {\n    if (!swiper.params.loop) {\n      update();\n    }\n  });\n  on('slidesLengthChange', () => {\n    if (swiper.params.loop) {\n      render();\n      update();\n    }\n  });\n  on('snapGridLengthChange', () => {\n    if (!swiper.params.loop) {\n      render();\n      update();\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    const {\n      $el\n    } = swiper.pagination;\n\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);\n    }\n  });\n  on('lock unlock', () => {\n    update();\n  });\n  on('click', (_s, e) => {\n    const targetEl = e.target;\n    const {\n      $el\n    } = swiper.pagination;\n\n    if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && $el && $el.length > 0 && !(0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(targetEl).hasClass(swiper.params.pagination.bulletClass)) {\n      if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;\n      const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass);\n\n      if (isHidden === true) {\n        emit('paginationShow');\n      } else {\n        emit('paginationHide');\n      }\n\n      $el.toggleClass(swiper.params.pagination.hiddenClass);\n    }\n  });\n\n  const enable = () => {\n    swiper.$el.removeClass(swiper.params.pagination.paginationDisabledClass);\n\n    if (swiper.pagination.$el) {\n      swiper.pagination.$el.removeClass(swiper.params.pagination.paginationDisabledClass);\n    }\n\n    init();\n    render();\n    update();\n  };\n\n  const disable = () => {\n    swiper.$el.addClass(swiper.params.pagination.paginationDisabledClass);\n\n    if (swiper.pagination.$el) {\n      swiper.pagination.$el.addClass(swiper.params.pagination.paginationDisabledClass);\n    }\n\n    destroy();\n  };\n\n  Object.assign(swiper.pagination, {\n    enable,\n    disable,\n    render,\n    update,\n    init,\n    destroy\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/pagination/pagination.js?\n}");
2120
2121/***/ }),
2122
vendor: 4,405 bytes, lines 2123-2133
2123/***/ "./node_modules/swiper/modules/parallax/parallax.js":
2124/*!**********************************************************!*\
2125  !*** ./node_modules/swiper/modules/parallax/parallax.js ***!
2126  \**********************************************************/
2127/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
2128
2129"use strict";
2130eval("{/* unused harmony export default */\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\nfunction Parallax({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    parallax: {\n      enabled: false\n    }\n  });\n\n  const setTransform = (el, progress) => {\n    const {\n      rtl\n    } = swiper;\n    const $el = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(el);\n    const rtlFactor = rtl ? -1 : 1;\n    const p = $el.attr('data-swiper-parallax') || '0';\n    let x = $el.attr('data-swiper-parallax-x');\n    let y = $el.attr('data-swiper-parallax-y');\n    const scale = $el.attr('data-swiper-parallax-scale');\n    const opacity = $el.attr('data-swiper-parallax-opacity');\n\n    if (x || y) {\n      x = x || '0';\n      y = y || '0';\n    } else if (swiper.isHorizontal()) {\n      x = p;\n      y = '0';\n    } else {\n      y = p;\n      x = '0';\n    }\n\n    if (x.indexOf('%') >= 0) {\n      x = `${parseInt(x, 10) * progress * rtlFactor}%`;\n    } else {\n      x = `${x * progress * rtlFactor}px`;\n    }\n\n    if (y.indexOf('%') >= 0) {\n      y = `${parseInt(y, 10) * progress}%`;\n    } else {\n      y = `${y * progress}px`;\n    }\n\n    if (typeof opacity !== 'undefined' && opacity !== null) {\n      const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));\n      $el[0].style.opacity = currentOpacity;\n    }\n\n    if (typeof scale === 'undefined' || scale === null) {\n      $el.transform(`translate3d(${x}, ${y}, 0px)`);\n    } else {\n      const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));\n      $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`);\n    }\n  };\n\n  const setTranslate = () => {\n    const {\n      $el,\n      slides,\n      progress,\n      snapGrid\n    } = swiper;\n    $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(el => {\n      setTransform(el, progress);\n    });\n    slides.each((slideEl, slideIndex) => {\n      let slideProgress = slideEl.progress;\n\n      if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n        slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);\n      }\n\n      slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n      (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(el => {\n        setTransform(el, slideProgress);\n      });\n    });\n  };\n\n  const setTransition = (duration = swiper.params.speed) => {\n    const {\n      $el\n    } = swiper;\n    $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(parallaxEl => {\n      const $parallaxEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(parallaxEl);\n      let parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;\n      if (duration === 0) parallaxDuration = 0;\n      $parallaxEl.transition(parallaxDuration);\n    });\n  };\n\n  on('beforeInit', () => {\n    if (!swiper.params.parallax.enabled) return;\n    swiper.params.watchSlidesProgress = true;\n    swiper.originalParams.watchSlidesProgress = true;\n  });\n  on('init', () => {\n    if (!swiper.params.parallax.enabled) return;\n    setTranslate();\n  });\n  on('setTranslate', () => {\n    if (!swiper.params.parallax.enabled) return;\n    setTranslate();\n  });\n  on('setTransition', (_swiper, duration) => {\n    if (!swiper.params.parallax.enabled) return;\n    setTransition(duration);\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/parallax/parallax.js?\n}");
2131
2132/***/ }),
2133
vendor: 12,279 bytes, lines 2134-2144
2134/***/ "./node_modules/swiper/modules/scrollbar/scrollbar.js":
2135/*!************************************************************!*\
2136  !*** ./node_modules/swiper/modules/scrollbar/scrollbar.js ***!
2137  \************************************************************/
2138/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2139
2140"use strict";
2141eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ Scrollbar; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n/* harmony import */ var _shared_create_element_if_not_defined_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../shared/create-element-if-not-defined.js */ \"./node_modules/swiper/shared/create-element-if-not-defined.js\");\n\n\n\n\nfunction Scrollbar({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  let isTouched = false;\n  let timeout = null;\n  let dragTimeout = null;\n  let dragStartPos;\n  let dragSize;\n  let trackSize;\n  let divider;\n  extendParams({\n    scrollbar: {\n      el: null,\n      dragSize: 'auto',\n      hide: false,\n      draggable: false,\n      snapOnRelease: true,\n      lockClass: 'swiper-scrollbar-lock',\n      dragClass: 'swiper-scrollbar-drag',\n      scrollbarDisabledClass: 'swiper-scrollbar-disabled',\n      horizontalClass: `swiper-scrollbar-horizontal`,\n      verticalClass: `swiper-scrollbar-vertical`\n    }\n  });\n  swiper.scrollbar = {\n    el: null,\n    dragEl: null,\n    $el: null,\n    $dragEl: null\n  };\n\n  function setTranslate() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const {\n      scrollbar,\n      rtlTranslate: rtl,\n      progress\n    } = swiper;\n    const {\n      $dragEl,\n      $el\n    } = scrollbar;\n    const params = swiper.params.scrollbar;\n    let newSize = dragSize;\n    let newPos = (trackSize - dragSize) * progress;\n\n    if (rtl) {\n      newPos = -newPos;\n\n      if (newPos > 0) {\n        newSize = dragSize - newPos;\n        newPos = 0;\n      } else if (-newPos + dragSize > trackSize) {\n        newSize = trackSize + newPos;\n      }\n    } else if (newPos < 0) {\n      newSize = dragSize + newPos;\n      newPos = 0;\n    } else if (newPos + dragSize > trackSize) {\n      newSize = trackSize - newPos;\n    }\n\n    if (swiper.isHorizontal()) {\n      $dragEl.transform(`translate3d(${newPos}px, 0, 0)`);\n      $dragEl[0].style.width = `${newSize}px`;\n    } else {\n      $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`);\n      $dragEl[0].style.height = `${newSize}px`;\n    }\n\n    if (params.hide) {\n      clearTimeout(timeout);\n      $el[0].style.opacity = 1;\n      timeout = setTimeout(() => {\n        $el[0].style.opacity = 0;\n        $el.transition(400);\n      }, 1000);\n    }\n  }\n\n  function setTransition(duration) {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    swiper.scrollbar.$dragEl.transition(duration);\n  }\n\n  function updateSize() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const {\n      scrollbar\n    } = swiper;\n    const {\n      $dragEl,\n      $el\n    } = scrollbar;\n    $dragEl[0].style.width = '';\n    $dragEl[0].style.height = '';\n    trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n    divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n\n    if (swiper.params.scrollbar.dragSize === 'auto') {\n      dragSize = trackSize * divider;\n    } else {\n      dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n    }\n\n    if (swiper.isHorizontal()) {\n      $dragEl[0].style.width = `${dragSize}px`;\n    } else {\n      $dragEl[0].style.height = `${dragSize}px`;\n    }\n\n    if (divider >= 1) {\n      $el[0].style.display = 'none';\n    } else {\n      $el[0].style.display = '';\n    }\n\n    if (swiper.params.scrollbar.hide) {\n      $el[0].style.opacity = 0;\n    }\n\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);\n    }\n  }\n\n  function getPointerPosition(e) {\n    if (swiper.isHorizontal()) {\n      return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientX : e.clientX;\n    }\n\n    return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientY : e.clientY;\n  }\n\n  function setDragPosition(e) {\n    const {\n      scrollbar,\n      rtlTranslate: rtl\n    } = swiper;\n    const {\n      $el\n    } = scrollbar;\n    let positionRatio;\n    positionRatio = (getPointerPosition(e) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);\n    positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n\n    if (rtl) {\n      positionRatio = 1 - positionRatio;\n    }\n\n    const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n    swiper.updateProgress(position);\n    swiper.setTranslate(position);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  function onDragStart(e) {\n    const params = swiper.params.scrollbar;\n    const {\n      scrollbar,\n      $wrapperEl\n    } = swiper;\n    const {\n      $el,\n      $dragEl\n    } = scrollbar;\n    isTouched = true;\n    dragStartPos = e.target === $dragEl[0] || e.target === $dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;\n    e.preventDefault();\n    e.stopPropagation();\n    $wrapperEl.transition(100);\n    $dragEl.transition(100);\n    setDragPosition(e);\n    clearTimeout(dragTimeout);\n    $el.transition(0);\n\n    if (params.hide) {\n      $el.css('opacity', 1);\n    }\n\n    if (swiper.params.cssMode) {\n      swiper.$wrapperEl.css('scroll-snap-type', 'none');\n    }\n\n    emit('scrollbarDragStart', e);\n  }\n\n  function onDragMove(e) {\n    const {\n      scrollbar,\n      $wrapperEl\n    } = swiper;\n    const {\n      $el,\n      $dragEl\n    } = scrollbar;\n    if (!isTouched) return;\n    if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n    setDragPosition(e);\n    $wrapperEl.transition(0);\n    $el.transition(0);\n    $dragEl.transition(0);\n    emit('scrollbarDragMove', e);\n  }\n\n  function onDragEnd(e) {\n    const params = swiper.params.scrollbar;\n    const {\n      scrollbar,\n      $wrapperEl\n    } = swiper;\n    const {\n      $el\n    } = scrollbar;\n    if (!isTouched) return;\n    isTouched = false;\n\n    if (swiper.params.cssMode) {\n      swiper.$wrapperEl.css('scroll-snap-type', '');\n      $wrapperEl.transition('');\n    }\n\n    if (params.hide) {\n      clearTimeout(dragTimeout);\n      dragTimeout = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.nextTick)(() => {\n        $el.css('opacity', 0);\n        $el.transition(400);\n      }, 1000);\n    }\n\n    emit('scrollbarDragEnd', e);\n\n    if (params.snapOnRelease) {\n      swiper.slideToClosest();\n    }\n  }\n\n  function events(method) {\n    const {\n      scrollbar,\n      touchEventsTouch,\n      touchEventsDesktop,\n      params,\n      support\n    } = swiper;\n    const $el = scrollbar.$el;\n    if (!$el) return;\n    const target = $el[0];\n    const activeListener = support.passiveListener && params.passiveListeners ? {\n      passive: false,\n      capture: false\n    } : false;\n    const passiveListener = support.passiveListener && params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n    if (!target) return;\n    const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n\n    if (!support.touch) {\n      target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener);\n      document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener);\n      document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener);\n    } else {\n      target[eventMethod](touchEventsTouch.start, onDragStart, activeListener);\n      target[eventMethod](touchEventsTouch.move, onDragMove, activeListener);\n      target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener);\n    }\n  }\n\n  function enableDraggable() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    events('on');\n  }\n\n  function disableDraggable() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    events('off');\n  }\n\n  function init() {\n    const {\n      scrollbar,\n      $el: $swiperEl\n    } = swiper;\n    swiper.params.scrollbar = (0,_shared_create_element_if_not_defined_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, {\n      el: 'swiper-scrollbar'\n    });\n    const params = swiper.params.scrollbar;\n    if (!params.el) return;\n    let $el = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(params.el);\n\n    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {\n      $el = $swiperEl.find(params.el);\n    }\n\n    $el.addClass(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n    let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`);\n\n    if ($dragEl.length === 0) {\n      $dragEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(`<div class=\"${swiper.params.scrollbar.dragClass}\"></div>`);\n      $el.append($dragEl);\n    }\n\n    Object.assign(scrollbar, {\n      $el,\n      el: $el[0],\n      $dragEl,\n      dragEl: $dragEl[0]\n    });\n\n    if (params.draggable) {\n      enableDraggable();\n    }\n\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n    }\n  }\n\n  function destroy() {\n    const params = swiper.params.scrollbar;\n    const $el = swiper.scrollbar.$el;\n\n    if ($el) {\n      $el.removeClass(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n    }\n\n    disableDraggable();\n  }\n\n  on('init', () => {\n    if (swiper.params.scrollbar.enabled === false) {\n      // eslint-disable-next-line\n      disable();\n    } else {\n      init();\n      updateSize();\n      setTranslate();\n    }\n  });\n  on('update resize observerUpdate lock unlock', () => {\n    updateSize();\n  });\n  on('setTranslate', () => {\n    setTranslate();\n  });\n  on('setTransition', (_s, duration) => {\n    setTransition(duration);\n  });\n  on('enable disable', () => {\n    const {\n      $el\n    } = swiper.scrollbar;\n\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n\n  const enable = () => {\n    swiper.$el.removeClass(swiper.params.scrollbar.scrollbarDisabledClass);\n\n    if (swiper.scrollbar.$el) {\n      swiper.scrollbar.$el.removeClass(swiper.params.scrollbar.scrollbarDisabledClass);\n    }\n\n    init();\n    updateSize();\n    setTranslate();\n  };\n\n  const disable = () => {\n    swiper.$el.addClass(swiper.params.scrollbar.scrollbarDisabledClass);\n\n    if (swiper.scrollbar.$el) {\n      swiper.scrollbar.$el.addClass(swiper.params.scrollbar.scrollbarDisabledClass);\n    }\n\n    destroy();\n  };\n\n  Object.assign(swiper.scrollbar, {\n    enable,\n    disable,\n    updateSize,\n    setTranslate,\n    init,\n    destroy\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/scrollbar/scrollbar.js?\n}");
2142
2143/***/ }),
2144
vendor: 8,697 bytes, lines 2145-2155
2145/***/ "./node_modules/swiper/modules/thumbs/thumbs.js":
2146/*!******************************************************!*\
2147  !*** ./node_modules/swiper/modules/thumbs/thumbs.js ***!
2148  \******************************************************/
2149/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
2150
2151"use strict";
2152eval("{/* unused harmony export default */\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\n\nfunction Thumb({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    thumbs: {\n      swiper: null,\n      multipleActiveThumbs: true,\n      autoScrollOffset: 0,\n      slideThumbActiveClass: 'swiper-slide-thumb-active',\n      thumbsContainerClass: 'swiper-thumbs'\n    }\n  });\n  let initialized = false;\n  let swiperCreated = false;\n  swiper.thumbs = {\n    swiper: null\n  };\n\n  function onThumbClick() {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    const clickedIndex = thumbsSwiper.clickedIndex;\n    const clickedSlide = thumbsSwiper.clickedSlide;\n    if (clickedSlide && (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) return;\n    if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n    let slideToIndex;\n\n    if (thumbsSwiper.params.loop) {\n      slideToIndex = parseInt((0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n    } else {\n      slideToIndex = clickedIndex;\n    }\n\n    if (swiper.params.loop) {\n      let currentIndex = swiper.activeIndex;\n\n      if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {\n        swiper.loopFix(); // eslint-disable-next-line\n\n        swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n        currentIndex = swiper.activeIndex;\n      }\n\n      const prevIndex = swiper.slides.eq(currentIndex).prevAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`).eq(0).index();\n      const nextIndex = swiper.slides.eq(currentIndex).nextAll(`[data-swiper-slide-index=\"${slideToIndex}\"]`).eq(0).index();\n      if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;else slideToIndex = prevIndex;\n    }\n\n    swiper.slideTo(slideToIndex);\n  }\n\n  function init() {\n    const {\n      thumbs: thumbsParams\n    } = swiper.params;\n    if (initialized) return false;\n    initialized = true;\n    const SwiperClass = swiper.constructor;\n\n    if (thumbsParams.swiper instanceof SwiperClass) {\n      swiper.thumbs.swiper = thumbsParams.swiper;\n      Object.assign(swiper.thumbs.swiper.originalParams, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false\n      });\n      Object.assign(swiper.thumbs.swiper.params, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false\n      });\n    } else if ((0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_0__.isObject)(thumbsParams.swiper)) {\n      const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);\n      Object.assign(thumbsSwiperParams, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false\n      });\n      swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);\n      swiperCreated = true;\n    }\n\n    swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);\n    swiper.thumbs.swiper.on('tap', onThumbClick);\n    return true;\n  }\n\n  function update(initial) {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView; // Activate thumbs\n\n    let thumbsToActivate = 1;\n    const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n    if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n      thumbsToActivate = swiper.params.slidesPerView;\n    }\n\n    if (!swiper.params.thumbs.multipleActiveThumbs) {\n      thumbsToActivate = 1;\n    }\n\n    thumbsToActivate = Math.floor(thumbsToActivate);\n    thumbsSwiper.slides.removeClass(thumbActiveClass);\n\n    if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) {\n      for (let i = 0; i < thumbsToActivate; i += 1) {\n        thumbsSwiper.$wrapperEl.children(`[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`).addClass(thumbActiveClass);\n      }\n    } else {\n      for (let i = 0; i < thumbsToActivate; i += 1) {\n        thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass);\n      }\n    }\n\n    const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n    const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n\n    if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n      let currentThumbsIndex = thumbsSwiper.activeIndex;\n      let newThumbsIndex;\n      let direction;\n\n      if (thumbsSwiper.params.loop) {\n        if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {\n          thumbsSwiper.loopFix(); // eslint-disable-next-line\n\n          thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;\n          currentThumbsIndex = thumbsSwiper.activeIndex;\n        } // Find actual thumbs index to slide to\n\n\n        const prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`).eq(0).index();\n        const nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(`[data-swiper-slide-index=\"${swiper.realIndex}\"]`).eq(0).index();\n\n        if (typeof prevThumbsIndex === 'undefined') {\n          newThumbsIndex = nextThumbsIndex;\n        } else if (typeof nextThumbsIndex === 'undefined') {\n          newThumbsIndex = prevThumbsIndex;\n        } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) {\n          newThumbsIndex = thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex;\n        } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) {\n          newThumbsIndex = nextThumbsIndex;\n        } else {\n          newThumbsIndex = prevThumbsIndex;\n        }\n\n        direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';\n      } else {\n        newThumbsIndex = swiper.realIndex;\n        direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';\n      }\n\n      if (useOffset) {\n        newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;\n      }\n\n      if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {\n        if (thumbsSwiper.params.centeredSlides) {\n          if (newThumbsIndex > currentThumbsIndex) {\n            newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n          } else {\n            newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n          }\n        } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) {// newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n        }\n\n        thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);\n      }\n    }\n  }\n\n  on('beforeInit', () => {\n    const {\n      thumbs\n    } = swiper.params;\n    if (!thumbs || !thumbs.swiper) return;\n    init();\n    update(true);\n  });\n  on('slideChange update resize observerUpdate', () => {\n    update();\n  });\n  on('setTransition', (_s, duration) => {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    thumbsSwiper.setTransition(duration);\n  });\n  on('beforeDestroy', () => {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n\n    if (swiperCreated) {\n      thumbsSwiper.destroy();\n    }\n  });\n  Object.assign(swiper.thumbs, {\n    init,\n    update\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/thumbs/thumbs.js?\n}");
2153
2154/***/ }),
2155
vendor: 9,347 bytes, lines 2156-2166
2156/***/ "./node_modules/swiper/modules/virtual/virtual.js":
2157/*!********************************************************!*\
2158  !*** ./node_modules/swiper/modules/virtual/virtual.js ***!
2159  \********************************************************/
2160/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
2161
2162"use strict";
2163eval("{/* unused harmony export default */\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\n\nfunction Virtual({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  extendParams({\n    virtual: {\n      enabled: false,\n      slides: [],\n      cache: true,\n      renderSlide: null,\n      renderExternal: null,\n      renderExternalUpdate: true,\n      addSlidesBefore: 0,\n      addSlidesAfter: 0\n    }\n  });\n  let cssModeTimeout;\n  swiper.virtual = {\n    cache: {},\n    from: undefined,\n    to: undefined,\n    slides: [],\n    offset: 0,\n    slidesGrid: []\n  };\n\n  function renderSlide(slide, index) {\n    const params = swiper.params.virtual;\n\n    if (params.cache && swiper.virtual.cache[index]) {\n      return swiper.virtual.cache[index];\n    }\n\n    const $slideEl = params.renderSlide ? (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(params.renderSlide.call(swiper, slide, index)) : (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(`<div class=\"${swiper.params.slideClass}\" data-swiper-slide-index=\"${index}\">${slide}</div>`);\n    if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);\n    if (params.cache) swiper.virtual.cache[index] = $slideEl;\n    return $slideEl;\n  }\n\n  function update(force) {\n    const {\n      slidesPerView,\n      slidesPerGroup,\n      centeredSlides\n    } = swiper.params;\n    const {\n      addSlidesBefore,\n      addSlidesAfter\n    } = swiper.params.virtual;\n    const {\n      from: previousFrom,\n      to: previousTo,\n      slides,\n      slidesGrid: previousSlidesGrid,\n      offset: previousOffset\n    } = swiper.virtual;\n\n    if (!swiper.params.cssMode) {\n      swiper.updateActiveIndex();\n    }\n\n    const activeIndex = swiper.activeIndex || 0;\n    let offsetProp;\n    if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top';\n    let slidesAfter;\n    let slidesBefore;\n\n    if (centeredSlides) {\n      slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;\n      slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;\n    } else {\n      slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;\n      slidesBefore = slidesPerGroup + addSlidesBefore;\n    }\n\n    const from = Math.max((activeIndex || 0) - slidesBefore, 0);\n    const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);\n    const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n    Object.assign(swiper.virtual, {\n      from,\n      to,\n      offset,\n      slidesGrid: swiper.slidesGrid\n    });\n\n    function onRendered() {\n      swiper.updateSlides();\n      swiper.updateProgress();\n      swiper.updateSlidesClasses();\n\n      if (swiper.lazy && swiper.params.lazy.enabled) {\n        swiper.lazy.load();\n      }\n\n      emit('virtualUpdate');\n    }\n\n    if (previousFrom === from && previousTo === to && !force) {\n      if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n        swiper.slides.css(offsetProp, `${offset}px`);\n      }\n\n      swiper.updateProgress();\n      emit('virtualUpdate');\n      return;\n    }\n\n    if (swiper.params.virtual.renderExternal) {\n      swiper.params.virtual.renderExternal.call(swiper, {\n        offset,\n        from,\n        to,\n        slides: function getSlides() {\n          const slidesToRender = [];\n\n          for (let i = from; i <= to; i += 1) {\n            slidesToRender.push(slides[i]);\n          }\n\n          return slidesToRender;\n        }()\n      });\n\n      if (swiper.params.virtual.renderExternalUpdate) {\n        onRendered();\n      } else {\n        emit('virtualUpdate');\n      }\n\n      return;\n    }\n\n    const prependIndexes = [];\n    const appendIndexes = [];\n\n    if (force) {\n      swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove();\n    } else {\n      for (let i = previousFrom; i <= previousTo; i += 1) {\n        if (i < from || i > to) {\n          swiper.$wrapperEl.find(`.${swiper.params.slideClass}[data-swiper-slide-index=\"${i}\"]`).remove();\n        }\n      }\n    }\n\n    for (let i = 0; i < slides.length; i += 1) {\n      if (i >= from && i <= to) {\n        if (typeof previousTo === 'undefined' || force) {\n          appendIndexes.push(i);\n        } else {\n          if (i > previousTo) appendIndexes.push(i);\n          if (i < previousFrom) prependIndexes.push(i);\n        }\n      }\n    }\n\n    appendIndexes.forEach(index => {\n      swiper.$wrapperEl.append(renderSlide(slides[index], index));\n    });\n    prependIndexes.sort((a, b) => b - a).forEach(index => {\n      swiper.$wrapperEl.prepend(renderSlide(slides[index], index));\n    });\n    swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`);\n    onRendered();\n  }\n\n  function appendSlide(slides) {\n    if (typeof slides === 'object' && 'length' in slides) {\n      for (let i = 0; i < slides.length; i += 1) {\n        if (slides[i]) swiper.virtual.slides.push(slides[i]);\n      }\n    } else {\n      swiper.virtual.slides.push(slides);\n    }\n\n    update(true);\n  }\n\n  function prependSlide(slides) {\n    const activeIndex = swiper.activeIndex;\n    let newActiveIndex = activeIndex + 1;\n    let numberOfNewSlides = 1;\n\n    if (Array.isArray(slides)) {\n      for (let i = 0; i < slides.length; i += 1) {\n        if (slides[i]) swiper.virtual.slides.unshift(slides[i]);\n      }\n\n      newActiveIndex = activeIndex + slides.length;\n      numberOfNewSlides = slides.length;\n    } else {\n      swiper.virtual.slides.unshift(slides);\n    }\n\n    if (swiper.params.virtual.cache) {\n      const cache = swiper.virtual.cache;\n      const newCache = {};\n      Object.keys(cache).forEach(cachedIndex => {\n        const $cachedEl = cache[cachedIndex];\n        const cachedElIndex = $cachedEl.attr('data-swiper-slide-index');\n\n        if (cachedElIndex) {\n          $cachedEl.attr('data-swiper-slide-index', parseInt(cachedElIndex, 10) + numberOfNewSlides);\n        }\n\n        newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;\n      });\n      swiper.virtual.cache = newCache;\n    }\n\n    update(true);\n    swiper.slideTo(newActiveIndex, 0);\n  }\n\n  function removeSlide(slidesIndexes) {\n    if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;\n    let activeIndex = swiper.activeIndex;\n\n    if (Array.isArray(slidesIndexes)) {\n      for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n        swiper.virtual.slides.splice(slidesIndexes[i], 1);\n\n        if (swiper.params.virtual.cache) {\n          delete swiper.virtual.cache[slidesIndexes[i]];\n        }\n\n        if (slidesIndexes[i] < activeIndex) activeIndex -= 1;\n        activeIndex = Math.max(activeIndex, 0);\n      }\n    } else {\n      swiper.virtual.slides.splice(slidesIndexes, 1);\n\n      if (swiper.params.virtual.cache) {\n        delete swiper.virtual.cache[slidesIndexes];\n      }\n\n      if (slidesIndexes < activeIndex) activeIndex -= 1;\n      activeIndex = Math.max(activeIndex, 0);\n    }\n\n    update(true);\n    swiper.slideTo(activeIndex, 0);\n  }\n\n  function removeAllSlides() {\n    swiper.virtual.slides = [];\n\n    if (swiper.params.virtual.cache) {\n      swiper.virtual.cache = {};\n    }\n\n    update(true);\n    swiper.slideTo(0, 0);\n  }\n\n  on('beforeInit', () => {\n    if (!swiper.params.virtual.enabled) return;\n    swiper.virtual.slides = swiper.params.virtual.slides;\n    swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);\n    swiper.params.watchSlidesProgress = true;\n    swiper.originalParams.watchSlidesProgress = true;\n\n    if (!swiper.params.initialSlide) {\n      update();\n    }\n  });\n  on('setTranslate', () => {\n    if (!swiper.params.virtual.enabled) return;\n\n    if (swiper.params.cssMode && !swiper._immediateVirtual) {\n      clearTimeout(cssModeTimeout);\n      cssModeTimeout = setTimeout(() => {\n        update();\n      }, 100);\n    } else {\n      update();\n    }\n  });\n  on('init update resize', () => {\n    if (!swiper.params.virtual.enabled) return;\n\n    if (swiper.params.cssMode) {\n      (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_1__.setCSSProperty)(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);\n    }\n  });\n  Object.assign(swiper.virtual, {\n    appendSlide,\n    prependSlide,\n    removeSlide,\n    removeAllSlides,\n    update\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/virtual/virtual.js?\n}");
2164
2165/***/ }),
2166
vendor: 22,249 bytes, lines 2167-2177
2167/***/ "./node_modules/swiper/modules/zoom/zoom.js":
2168/*!**************************************************!*\
2169  !*** ./node_modules/swiper/modules/zoom/zoom.js ***!
2170  \**************************************************/
2171/***/ (function(__unused_webpack___webpack_module__, __unused_webpack___webpack_exports__, __webpack_require__) {
2172
2173"use strict";
2174eval("{/* unused harmony export default */\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _shared_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/dom.js */ \"./node_modules/swiper/shared/dom.js\");\n/* harmony import */ var _shared_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/utils.js */ \"./node_modules/swiper/shared/utils.js\");\n\n\n\nfunction Zoom({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  extendParams({\n    zoom: {\n      enabled: false,\n      maxRatio: 3,\n      minRatio: 1,\n      toggle: true,\n      containerClass: 'swiper-zoom-container',\n      zoomedSlideClass: 'swiper-slide-zoomed'\n    }\n  });\n  swiper.zoom = {\n    enabled: false\n  };\n  let currentScale = 1;\n  let isScaling = false;\n  let gesturesEnabled;\n  let fakeGestureTouched;\n  let fakeGestureMoved;\n  const gesture = {\n    $slideEl: undefined,\n    slideWidth: undefined,\n    slideHeight: undefined,\n    $imageEl: undefined,\n    $imageWrapEl: undefined,\n    maxRatio: 3\n  };\n  const image = {\n    isTouched: undefined,\n    isMoved: undefined,\n    currentX: undefined,\n    currentY: undefined,\n    minX: undefined,\n    minY: undefined,\n    maxX: undefined,\n    maxY: undefined,\n    width: undefined,\n    height: undefined,\n    startX: undefined,\n    startY: undefined,\n    touchesStart: {},\n    touchesCurrent: {}\n  };\n  const velocity = {\n    x: undefined,\n    y: undefined,\n    prevPositionX: undefined,\n    prevPositionY: undefined,\n    prevTime: undefined\n  };\n  let scale = 1;\n  Object.defineProperty(swiper.zoom, 'scale', {\n    get() {\n      return scale;\n    },\n\n    set(value) {\n      if (scale !== value) {\n        const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined;\n        const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined;\n        emit('zoomChange', value, imageEl, slideEl);\n      }\n\n      scale = value;\n    }\n\n  });\n\n  function getDistanceBetweenTouches(e) {\n    if (e.targetTouches.length < 2) return 1;\n    const x1 = e.targetTouches[0].pageX;\n    const y1 = e.targetTouches[0].pageY;\n    const x2 = e.targetTouches[1].pageX;\n    const y2 = e.targetTouches[1].pageY;\n    const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n    return distance;\n  } // Events\n\n\n  function onGestureStart(e) {\n    const support = swiper.support;\n    const params = swiper.params.zoom;\n    fakeGestureTouched = false;\n    fakeGestureMoved = false;\n\n    if (!support.gestures) {\n      if (e.type !== 'touchstart' || e.type === 'touchstart' && e.targetTouches.length < 2) {\n        return;\n      }\n\n      fakeGestureTouched = true;\n      gesture.scaleStart = getDistanceBetweenTouches(e);\n    }\n\n    if (!gesture.$slideEl || !gesture.$slideEl.length) {\n      gesture.$slideEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(e.target).closest(`.${swiper.params.slideClass}`);\n      if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n      gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('picture, img, svg, canvas, .swiper-zoom-target').eq(0);\n      gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n      gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n\n      if (gesture.$imageWrapEl.length === 0) {\n        gesture.$imageEl = undefined;\n        return;\n      }\n    }\n\n    if (gesture.$imageEl) {\n      gesture.$imageEl.transition(0);\n    }\n\n    isScaling = true;\n  }\n\n  function onGestureChange(e) {\n    const support = swiper.support;\n    const params = swiper.params.zoom;\n    const zoom = swiper.zoom;\n\n    if (!support.gestures) {\n      if (e.type !== 'touchmove' || e.type === 'touchmove' && e.targetTouches.length < 2) {\n        return;\n      }\n\n      fakeGestureMoved = true;\n      gesture.scaleMove = getDistanceBetweenTouches(e);\n    }\n\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0) {\n      if (e.type === 'gesturechange') onGestureStart(e);\n      return;\n    }\n\n    if (support.gestures) {\n      zoom.scale = e.scale * currentScale;\n    } else {\n      zoom.scale = gesture.scaleMove / gesture.scaleStart * currentScale;\n    }\n\n    if (zoom.scale > gesture.maxRatio) {\n      zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;\n    }\n\n    if (zoom.scale < params.minRatio) {\n      zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;\n    }\n\n    gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n  }\n\n  function onGestureEnd(e) {\n    const device = swiper.device;\n    const support = swiper.support;\n    const params = swiper.params.zoom;\n    const zoom = swiper.zoom;\n\n    if (!support.gestures) {\n      if (!fakeGestureTouched || !fakeGestureMoved) {\n        return;\n      }\n\n      if (e.type !== 'touchend' || e.type === 'touchend' && e.changedTouches.length < 2 && !device.android) {\n        return;\n      }\n\n      fakeGestureTouched = false;\n      fakeGestureMoved = false;\n    }\n\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n    zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n    gesture.$imageEl.transition(swiper.params.speed).transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n    currentScale = zoom.scale;\n    isScaling = false;\n    if (zoom.scale === 1) gesture.$slideEl = undefined;\n  }\n\n  function onTouchStart(e) {\n    const device = swiper.device;\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n    if (image.isTouched) return;\n    if (device.android && e.cancelable) e.preventDefault();\n    image.isTouched = true;\n    image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n    image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n  }\n\n  function onTouchMove(e) {\n    const zoom = swiper.zoom;\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n    swiper.allowClick = false;\n    if (!image.isTouched || !gesture.$slideEl) return;\n\n    if (!image.isMoved) {\n      image.width = gesture.$imageEl[0].offsetWidth;\n      image.height = gesture.$imageEl[0].offsetHeight;\n      image.startX = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.getTranslate)(gesture.$imageWrapEl[0], 'x') || 0;\n      image.startY = (0,_shared_utils_js__WEBPACK_IMPORTED_MODULE_2__.getTranslate)(gesture.$imageWrapEl[0], 'y') || 0;\n      gesture.slideWidth = gesture.$slideEl[0].offsetWidth;\n      gesture.slideHeight = gesture.$slideEl[0].offsetHeight;\n      gesture.$imageWrapEl.transition(0);\n    } // Define if we need image drag\n\n\n    const scaledWidth = image.width * zoom.scale;\n    const scaledHeight = image.height * zoom.scale;\n    if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;\n    image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n    image.maxX = -image.minX;\n    image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n    image.maxY = -image.minY;\n    image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n    image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n\n    if (!image.isMoved && !isScaling) {\n      if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) {\n        image.isTouched = false;\n        return;\n      }\n\n      if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) {\n        image.isTouched = false;\n        return;\n      }\n    }\n\n    if (e.cancelable) {\n      e.preventDefault();\n    }\n\n    e.stopPropagation();\n    image.isMoved = true;\n    image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX;\n    image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY;\n\n    if (image.currentX < image.minX) {\n      image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;\n    }\n\n    if (image.currentX > image.maxX) {\n      image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;\n    }\n\n    if (image.currentY < image.minY) {\n      image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;\n    }\n\n    if (image.currentY > image.maxY) {\n      image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;\n    } // Velocity\n\n\n    if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;\n    if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;\n    if (!velocity.prevTime) velocity.prevTime = Date.now();\n    velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n    velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n    if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;\n    if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;\n    velocity.prevPositionX = image.touchesCurrent.x;\n    velocity.prevPositionY = image.touchesCurrent.y;\n    velocity.prevTime = Date.now();\n    gesture.$imageWrapEl.transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n  }\n\n  function onTouchEnd() {\n    const zoom = swiper.zoom;\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;\n\n    if (!image.isTouched || !image.isMoved) {\n      image.isTouched = false;\n      image.isMoved = false;\n      return;\n    }\n\n    image.isTouched = false;\n    image.isMoved = false;\n    let momentumDurationX = 300;\n    let momentumDurationY = 300;\n    const momentumDistanceX = velocity.x * momentumDurationX;\n    const newPositionX = image.currentX + momentumDistanceX;\n    const momentumDistanceY = velocity.y * momentumDurationY;\n    const newPositionY = image.currentY + momentumDistanceY; // Fix duration\n\n    if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);\n    if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);\n    const momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n    image.currentX = newPositionX;\n    image.currentY = newPositionY; // Define if we need image drag\n\n    const scaledWidth = image.width * zoom.scale;\n    const scaledHeight = image.height * zoom.scale;\n    image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n    image.maxX = -image.minX;\n    image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n    image.maxY = -image.minY;\n    image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n    image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n    gesture.$imageWrapEl.transition(momentumDuration).transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`);\n  }\n\n  function onTransitionEnd() {\n    const zoom = swiper.zoom;\n\n    if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {\n      if (gesture.$imageEl) {\n        gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');\n      }\n\n      if (gesture.$imageWrapEl) {\n        gesture.$imageWrapEl.transform('translate3d(0,0,0)');\n      }\n\n      zoom.scale = 1;\n      currentScale = 1;\n      gesture.$slideEl = undefined;\n      gesture.$imageEl = undefined;\n      gesture.$imageWrapEl = undefined;\n    }\n  }\n\n  function zoomIn(e) {\n    const zoom = swiper.zoom;\n    const params = swiper.params.zoom;\n\n    if (!gesture.$slideEl) {\n      if (e && e.target) {\n        gesture.$slideEl = (0,_shared_dom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(e.target).closest(`.${swiper.params.slideClass}`);\n      }\n\n      if (!gesture.$slideEl) {\n        if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n          gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n        } else {\n          gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n        }\n      }\n\n      gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('picture, img, svg, canvas, .swiper-zoom-target').eq(0);\n      gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n    }\n\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0 || !gesture.$imageWrapEl || gesture.$imageWrapEl.length === 0) return;\n\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style.overflow = 'hidden';\n      swiper.wrapperEl.style.touchAction = 'none';\n    }\n\n    gesture.$slideEl.addClass(`${params.zoomedSlideClass}`);\n    let touchX;\n    let touchY;\n    let offsetX;\n    let offsetY;\n    let diffX;\n    let diffY;\n    let translateX;\n    let translateY;\n    let imageWidth;\n    let imageHeight;\n    let scaledWidth;\n    let scaledHeight;\n    let translateMinX;\n    let translateMinY;\n    let translateMaxX;\n    let translateMaxY;\n    let slideWidth;\n    let slideHeight;\n\n    if (typeof image.touchesStart.x === 'undefined' && e) {\n      touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n      touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n    } else {\n      touchX = image.touchesStart.x;\n      touchY = image.touchesStart.y;\n    }\n\n    zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n    currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;\n\n    if (e) {\n      slideWidth = gesture.$slideEl[0].offsetWidth;\n      slideHeight = gesture.$slideEl[0].offsetHeight;\n      offsetX = gesture.$slideEl.offset().left + window.scrollX;\n      offsetY = gesture.$slideEl.offset().top + window.scrollY;\n      diffX = offsetX + slideWidth / 2 - touchX;\n      diffY = offsetY + slideHeight / 2 - touchY;\n      imageWidth = gesture.$imageEl[0].offsetWidth;\n      imageHeight = gesture.$imageEl[0].offsetHeight;\n      scaledWidth = imageWidth * zoom.scale;\n      scaledHeight = imageHeight * zoom.scale;\n      translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n      translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n      translateMaxX = -translateMinX;\n      translateMaxY = -translateMinY;\n      translateX = diffX * zoom.scale;\n      translateY = diffY * zoom.scale;\n\n      if (translateX < translateMinX) {\n        translateX = translateMinX;\n      }\n\n      if (translateX > translateMaxX) {\n        translateX = translateMaxX;\n      }\n\n      if (translateY < translateMinY) {\n        translateY = translateMinY;\n      }\n\n      if (translateY > translateMaxY) {\n        translateY = translateMaxY;\n      }\n    } else {\n      translateX = 0;\n      translateY = 0;\n    }\n\n    gesture.$imageWrapEl.transition(300).transform(`translate3d(${translateX}px, ${translateY}px,0)`);\n    gesture.$imageEl.transition(300).transform(`translate3d(0,0,0) scale(${zoom.scale})`);\n  }\n\n  function zoomOut() {\n    const zoom = swiper.zoom;\n    const params = swiper.params.zoom;\n\n    if (!gesture.$slideEl) {\n      if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n        gesture.$slideEl = swiper.$wrapperEl.children(`.${swiper.params.slideActiveClass}`);\n      } else {\n        gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);\n      }\n\n      gesture.$imageEl = gesture.$slideEl.find(`.${params.containerClass}`).eq(0).find('picture, img, svg, canvas, .swiper-zoom-target').eq(0);\n      gesture.$imageWrapEl = gesture.$imageEl.parent(`.${params.containerClass}`);\n    }\n\n    if (!gesture.$imageEl || gesture.$imageEl.length === 0 || !gesture.$imageWrapEl || gesture.$imageWrapEl.length === 0) return;\n\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style.overflow = '';\n      swiper.wrapperEl.style.touchAction = '';\n    }\n\n    zoom.scale = 1;\n    currentScale = 1;\n    gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');\n    gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');\n    gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`);\n    gesture.$slideEl = undefined;\n  } // Toggle Zoom\n\n\n  function zoomToggle(e) {\n    const zoom = swiper.zoom;\n\n    if (zoom.scale && zoom.scale !== 1) {\n      // Zoom Out\n      zoomOut();\n    } else {\n      // Zoom In\n      zoomIn(e);\n    }\n  }\n\n  function getListeners() {\n    const support = swiper.support;\n    const passiveListener = swiper.touchEvents.start === 'touchstart' && support.passiveListener && swiper.params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n    const activeListenerWithCapture = support.passiveListener ? {\n      passive: false,\n      capture: true\n    } : true;\n    return {\n      passiveListener,\n      activeListenerWithCapture\n    };\n  }\n\n  function getSlideSelector() {\n    return `.${swiper.params.slideClass}`;\n  }\n\n  function toggleGestures(method) {\n    const {\n      passiveListener\n    } = getListeners();\n    const slideSelector = getSlideSelector();\n    swiper.$wrapperEl[method]('gesturestart', slideSelector, onGestureStart, passiveListener);\n    swiper.$wrapperEl[method]('gesturechange', slideSelector, onGestureChange, passiveListener);\n    swiper.$wrapperEl[method]('gestureend', slideSelector, onGestureEnd, passiveListener);\n  }\n\n  function enableGestures() {\n    if (gesturesEnabled) return;\n    gesturesEnabled = true;\n    toggleGestures('on');\n  }\n\n  function disableGestures() {\n    if (!gesturesEnabled) return;\n    gesturesEnabled = false;\n    toggleGestures('off');\n  } // Attach/Detach Events\n\n\n  function enable() {\n    const zoom = swiper.zoom;\n    if (zoom.enabled) return;\n    zoom.enabled = true;\n    const support = swiper.support;\n    const {\n      passiveListener,\n      activeListenerWithCapture\n    } = getListeners();\n    const slideSelector = getSlideSelector(); // Scale image\n\n    if (support.gestures) {\n      swiper.$wrapperEl.on(swiper.touchEvents.start, enableGestures, passiveListener);\n      swiper.$wrapperEl.on(swiper.touchEvents.end, disableGestures, passiveListener);\n    } else if (swiper.touchEvents.start === 'touchstart') {\n      swiper.$wrapperEl.on(swiper.touchEvents.start, slideSelector, onGestureStart, passiveListener);\n      swiper.$wrapperEl.on(swiper.touchEvents.move, slideSelector, onGestureChange, activeListenerWithCapture);\n      swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n\n      if (swiper.touchEvents.cancel) {\n        swiper.$wrapperEl.on(swiper.touchEvents.cancel, slideSelector, onGestureEnd, passiveListener);\n      }\n    } // Move image\n\n\n    swiper.$wrapperEl.on(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, onTouchMove, activeListenerWithCapture);\n  }\n\n  function disable() {\n    const zoom = swiper.zoom;\n    if (!zoom.enabled) return;\n    const support = swiper.support;\n    zoom.enabled = false;\n    const {\n      passiveListener,\n      activeListenerWithCapture\n    } = getListeners();\n    const slideSelector = getSlideSelector(); // Scale image\n\n    if (support.gestures) {\n      swiper.$wrapperEl.off(swiper.touchEvents.start, enableGestures, passiveListener);\n      swiper.$wrapperEl.off(swiper.touchEvents.end, disableGestures, passiveListener);\n    } else if (swiper.touchEvents.start === 'touchstart') {\n      swiper.$wrapperEl.off(swiper.touchEvents.start, slideSelector, onGestureStart, passiveListener);\n      swiper.$wrapperEl.off(swiper.touchEvents.move, slideSelector, onGestureChange, activeListenerWithCapture);\n      swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, onGestureEnd, passiveListener);\n\n      if (swiper.touchEvents.cancel) {\n        swiper.$wrapperEl.off(swiper.touchEvents.cancel, slideSelector, onGestureEnd, passiveListener);\n      }\n    } // Move image\n\n\n    swiper.$wrapperEl.off(swiper.touchEvents.move, `.${swiper.params.zoom.containerClass}`, onTouchMove, activeListenerWithCapture);\n  }\n\n  on('init', () => {\n    if (swiper.params.zoom.enabled) {\n      enable();\n    }\n  });\n  on('destroy', () => {\n    disable();\n  });\n  on('touchStart', (_s, e) => {\n    if (!swiper.zoom.enabled) return;\n    onTouchStart(e);\n  });\n  on('touchEnd', (_s, e) => {\n    if (!swiper.zoom.enabled) return;\n    onTouchEnd(e);\n  });\n  on('doubleTap', (_s, e) => {\n    if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {\n      zoomToggle(e);\n    }\n  });\n  on('transitionEnd', () => {\n    if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n      onTransitionEnd();\n    }\n  });\n  on('slideChange', () => {\n    if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {\n      onTransitionEnd();\n    }\n  });\n  Object.assign(swiper.zoom, {\n    enable,\n    disable,\n    in: zoomIn,\n    out: zoomOut,\n    toggle: zoomToggle\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/modules/zoom/zoom.js?\n}");
2175
2176/***/ }),
2177
vendor: 832 bytes, lines 2178-2188
2178/***/ "./node_modules/swiper/shared/classes-to-selector.js":
2179/*!***********************************************************!*\
2180  !*** ./node_modules/swiper/shared/classes-to-selector.js ***!
2181  \***********************************************************/
2182/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2183
2184"use strict";
2185eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ classesToSelector; }\n/* harmony export */ });\nfunction classesToSelector(classes = '') {\n  return `.${classes.trim().replace(/([\\.:!\\/])/g, '\\\\$1') // eslint-disable-line\n  .replace(/ /g, '.')}`;\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/shared/classes-to-selector.js?\n}");
2186
2187/***/ }),
2188
vendor: 1,554 bytes, lines 2189-2199
2189/***/ "./node_modules/swiper/shared/create-element-if-not-defined.js":
2190/*!*********************************************************************!*\
2191  !*** ./node_modules/swiper/shared/create-element-if-not-defined.js ***!
2192  \*********************************************************************/
2193/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2194
2195"use strict";
2196eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ createElementIfNotDefined; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n\nfunction createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n\n  if (swiper.params.createElements) {\n    Object.keys(checkProps).forEach(key => {\n      if (!params[key] && params.auto === true) {\n        let element = swiper.$el.children(`.${checkProps[key]}`)[0];\n\n        if (!element) {\n          element = document.createElement('div');\n          element.className = checkProps[key];\n          swiper.$el.append(element);\n        }\n\n        params[key] = element;\n        originalParams[key] = element;\n      }\n    });\n  }\n\n  return params;\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/shared/create-element-if-not-defined.js?\n}");
2197
2198/***/ }),
2199
vendor: 1,306 bytes, lines 2200-2210
2200/***/ "./node_modules/swiper/shared/create-shadow.js":
2201/*!*****************************************************!*\
2202  !*** ./node_modules/swiper/shared/create-shadow.js ***!
2203  \*****************************************************/
2204/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2205
2206"use strict";
2207eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ createShadow; }\n/* harmony export */ });\n/* harmony import */ var _dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom.js */ \"./node_modules/swiper/shared/dom.js\");\n\nfunction createShadow(params, $slideEl, side) {\n  const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`;\n  const $shadowContainer = params.transformEl ? $slideEl.find(params.transformEl) : $slideEl;\n  let $shadowEl = $shadowContainer.children(`.${shadowClass}`);\n\n  if (!$shadowEl.length) {\n    $shadowEl = (0,_dom_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(`<div class=\"swiper-slide-shadow${side ? `-${side}` : ''}\"></div>`);\n    $shadowContainer.append($shadowEl);\n  }\n\n  return $shadowEl;\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/shared/create-shadow.js?\n}");
2208
2209/***/ }),
2210
vendor: 2,797 bytes, lines 2211-2221
2211/***/ "./node_modules/swiper/shared/dom.js":
2212/*!*******************************************!*\
2213  !*** ./node_modules/swiper/shared/dom.js ***!
2214  \*******************************************/
2215/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2216
2217"use strict";
2218eval("{/* harmony import */ var dom7__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dom7 */ \"./node_modules/dom7/dom7.esm.js\");\n\nconst Methods = {\n  addClass: dom7__WEBPACK_IMPORTED_MODULE_0__.addClass,\n  removeClass: dom7__WEBPACK_IMPORTED_MODULE_0__.removeClass,\n  hasClass: dom7__WEBPACK_IMPORTED_MODULE_0__.hasClass,\n  toggleClass: dom7__WEBPACK_IMPORTED_MODULE_0__.toggleClass,\n  attr: dom7__WEBPACK_IMPORTED_MODULE_0__.attr,\n  removeAttr: dom7__WEBPACK_IMPORTED_MODULE_0__.removeAttr,\n  transform: dom7__WEBPACK_IMPORTED_MODULE_0__.transform,\n  transition: dom7__WEBPACK_IMPORTED_MODULE_0__.transition,\n  on: dom7__WEBPACK_IMPORTED_MODULE_0__.on,\n  off: dom7__WEBPACK_IMPORTED_MODULE_0__.off,\n  trigger: dom7__WEBPACK_IMPORTED_MODULE_0__.trigger,\n  transitionEnd: dom7__WEBPACK_IMPORTED_MODULE_0__.transitionEnd,\n  outerWidth: dom7__WEBPACK_IMPORTED_MODULE_0__.outerWidth,\n  outerHeight: dom7__WEBPACK_IMPORTED_MODULE_0__.outerHeight,\n  styles: dom7__WEBPACK_IMPORTED_MODULE_0__.styles,\n  offset: dom7__WEBPACK_IMPORTED_MODULE_0__.offset,\n  css: dom7__WEBPACK_IMPORTED_MODULE_0__.css,\n  each: dom7__WEBPACK_IMPORTED_MODULE_0__.each,\n  html: dom7__WEBPACK_IMPORTED_MODULE_0__.html,\n  text: dom7__WEBPACK_IMPORTED_MODULE_0__.text,\n  is: dom7__WEBPACK_IMPORTED_MODULE_0__.is,\n  index: dom7__WEBPACK_IMPORTED_MODULE_0__.index,\n  eq: dom7__WEBPACK_IMPORTED_MODULE_0__.eq,\n  append: dom7__WEBPACK_IMPORTED_MODULE_0__.append,\n  prepend: dom7__WEBPACK_IMPORTED_MODULE_0__.prepend,\n  next: dom7__WEBPACK_IMPORTED_MODULE_0__.next,\n  nextAll: dom7__WEBPACK_IMPORTED_MODULE_0__.nextAll,\n  prev: dom7__WEBPACK_IMPORTED_MODULE_0__.prev,\n  prevAll: dom7__WEBPACK_IMPORTED_MODULE_0__.prevAll,\n  parent: dom7__WEBPACK_IMPORTED_MODULE_0__.parent,\n  parents: dom7__WEBPACK_IMPORTED_MODULE_0__.parents,\n  closest: dom7__WEBPACK_IMPORTED_MODULE_0__.closest,\n  find: dom7__WEBPACK_IMPORTED_MODULE_0__.find,\n  children: dom7__WEBPACK_IMPORTED_MODULE_0__.children,\n  filter: dom7__WEBPACK_IMPORTED_MODULE_0__.filter,\n  remove: dom7__WEBPACK_IMPORTED_MODULE_0__.remove\n};\nObject.keys(Methods).forEach(methodName => {\n  Object.defineProperty(dom7__WEBPACK_IMPORTED_MODULE_0__.$.fn, methodName, {\n    value: Methods[methodName],\n    writable: true\n  });\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (dom7__WEBPACK_IMPORTED_MODULE_0__.$);\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/shared/dom.js?\n}");
2219
2220/***/ }),
2221
vendor: 2,477 bytes, lines 2222-2232
2222/***/ "./node_modules/swiper/shared/effect-init.js":
2223/*!***************************************************!*\
2224  !*** ./node_modules/swiper/shared/effect-init.js ***!
2225  \***************************************************/
2226/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2227
2228"use strict";
2229eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ effectInit; }\n/* harmony export */ });\nfunction effectInit(params) {\n  const {\n    effect,\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    overwriteParams,\n    perspective,\n    recreateShadows,\n    getEffectParams\n  } = params;\n  on('beforeInit', () => {\n    if (swiper.params.effect !== effect) return;\n    swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);\n\n    if (perspective && perspective()) {\n      swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);\n    }\n\n    const overwriteParamsResult = overwriteParams ? overwriteParams() : {};\n    Object.assign(swiper.params, overwriteParamsResult);\n    Object.assign(swiper.originalParams, overwriteParamsResult);\n  });\n  on('setTranslate', () => {\n    if (swiper.params.effect !== effect) return;\n    setTranslate();\n  });\n  on('setTransition', (_s, duration) => {\n    if (swiper.params.effect !== effect) return;\n    setTransition(duration);\n  });\n  on('transitionEnd', () => {\n    if (swiper.params.effect !== effect) return;\n\n    if (recreateShadows) {\n      if (!getEffectParams || !getEffectParams().slideShadows) return; // remove shadows\n\n      swiper.slides.each(slideEl => {\n        const $slideEl = swiper.$(slideEl);\n        $slideEl.find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').remove();\n      }); // create new one\n\n      recreateShadows();\n    }\n  });\n  let requireUpdateOnVirtual;\n  on('virtualUpdate', () => {\n    if (swiper.params.effect !== effect) return;\n\n    if (!swiper.slides.length) {\n      requireUpdateOnVirtual = true;\n    }\n\n    requestAnimationFrame(() => {\n      if (requireUpdateOnVirtual && swiper.slides && swiper.slides.length) {\n        setTranslate();\n        requireUpdateOnVirtual = false;\n      }\n    });\n  });\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/shared/effect-init.js?\n}");
2230
2231/***/ }),
2232
vendor: 905 bytes, lines 2233-2243
2233/***/ "./node_modules/swiper/shared/effect-target.js":
2234/*!*****************************************************!*\
2235  !*** ./node_modules/swiper/shared/effect-target.js ***!
2236  \*****************************************************/
2237/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2238
2239"use strict";
2240eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ effectTarget; }\n/* harmony export */ });\nfunction effectTarget(effectParams, $slideEl) {\n  if (effectParams.transformEl) {\n    return $slideEl.find(effectParams.transformEl).css({\n      'backface-visibility': 'hidden',\n      '-webkit-backface-visibility': 'hidden'\n    });\n  }\n\n  return $slideEl;\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/shared/effect-target.js?\n}");
2241
2242/***/ }),
2243
vendor: 1,663 bytes, lines 2244-2254
2244/***/ "./node_modules/swiper/shared/effect-virtual-transition-end.js":
2245/*!*********************************************************************!*\
2246  !*** ./node_modules/swiper/shared/effect-virtual-transition-end.js ***!
2247  \*********************************************************************/
2248/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2249
2250"use strict";
2251eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": function() { return /* binding */ effectVirtualTransitionEnd; }\n/* harmony export */ });\nfunction effectVirtualTransitionEnd({\n  swiper,\n  duration,\n  transformEl,\n  allSlides\n}) {\n  const {\n    slides,\n    activeIndex,\n    $wrapperEl\n  } = swiper;\n\n  if (swiper.params.virtualTranslate && duration !== 0) {\n    let eventTriggered = false;\n    let $transitionEndTarget;\n\n    if (allSlides) {\n      $transitionEndTarget = transformEl ? slides.find(transformEl) : slides;\n    } else {\n      $transitionEndTarget = transformEl ? slides.eq(activeIndex).find(transformEl) : slides.eq(activeIndex);\n    }\n\n    $transitionEndTarget.transitionEnd(() => {\n      if (eventTriggered) return;\n      if (!swiper || swiper.destroyed) return;\n      eventTriggered = true;\n      swiper.animating = false;\n      const triggerEvents = ['webkitTransitionEnd', 'transitionend'];\n\n      for (let i = 0; i < triggerEvents.length; i += 1) {\n        $wrapperEl.trigger(triggerEvents[i]);\n      }\n    });\n  }\n}\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/shared/effect-virtual-transition-end.js?\n}");
2252
2253/***/ }),
2254
vendor: 1,340 bytes, lines 2255-2265
2255/***/ "./node_modules/swiper/shared/get-browser.js":
2256/*!***************************************************!*\
2257  !*** ./node_modules/swiper/shared/get-browser.js ***!
2258  \***************************************************/
2259/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2260
2261"use strict";
2262eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getBrowser: function() { return /* binding */ getBrowser; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n\nlet browser;\n\nfunction calcBrowser() {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n\n  function isSafari() {\n    const ua = window.navigator.userAgent.toLowerCase();\n    return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n  }\n\n  return {\n    isSafari: isSafari(),\n    isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent)\n  };\n}\n\nfunction getBrowser() {\n  if (!browser) {\n    browser = calcBrowser();\n  }\n\n  return browser;\n}\n\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/shared/get-browser.js?\n}");
2263
2264/***/ }),
2265
vendor: 2,558 bytes, lines 2266-2276
2266/***/ "./node_modules/swiper/shared/get-device.js":
2267/*!**************************************************!*\
2268  !*** ./node_modules/swiper/shared/get-device.js ***!
2269  \**************************************************/
2270/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2271
2272"use strict";
2273eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getDevice: function() { return /* binding */ getDevice; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n/* harmony import */ var _get_support_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./get-support.js */ \"./node_modules/swiper/shared/get-support.js\");\n\n\nlet deviceCached;\n\nfunction calcDevice({\n  userAgent\n} = {}) {\n  const support = (0,_get_support_js__WEBPACK_IMPORTED_MODULE_1__.getSupport)();\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  const platform = window.navigator.platform;\n  const ua = userAgent || window.navigator.userAgent;\n  const device = {\n    ios: false,\n    android: false\n  };\n  const screenWidth = window.screen.width;\n  const screenHeight = window.screen.height;\n  const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n\n  let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n  const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n  const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n  const windows = platform === 'Win32';\n  let macos = platform === 'MacIntel'; // iPadOs 13 fix\n\n  const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];\n\n  if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {\n    ipad = ua.match(/(Version)\\/([\\d.]+)/);\n    if (!ipad) ipad = [0, 1, '13_0_0'];\n    macos = false;\n  } // Android\n\n\n  if (android && !windows) {\n    device.os = 'android';\n    device.android = true;\n  }\n\n  if (ipad || iphone || ipod) {\n    device.os = 'ios';\n    device.ios = true;\n  } // Export object\n\n\n  return device;\n}\n\nfunction getDevice(overrides = {}) {\n  if (!deviceCached) {\n    deviceCached = calcDevice(overrides);\n  }\n\n  return deviceCached;\n}\n\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/shared/get-device.js?\n}");
2274
2275/***/ }),
2276
vendor: 1,856 bytes, lines 2277-2287
2277/***/ "./node_modules/swiper/shared/get-support.js":
2278/*!***************************************************!*\
2279  !*** ./node_modules/swiper/shared/get-support.js ***!
2280  \***************************************************/
2281/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2282
2283"use strict";
2284eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getSupport: function() { return /* binding */ getSupport; }\n/* harmony export */ });\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n\nlet support;\n\nfunction calcSupport() {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  const document = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getDocument)();\n  return {\n    smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style,\n    touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch),\n    passiveListener: function checkPassiveListener() {\n      let supportsPassive = false;\n\n      try {\n        const opts = Object.defineProperty({}, 'passive', {\n          // eslint-disable-next-line\n          get() {\n            supportsPassive = true;\n          }\n\n        });\n        window.addEventListener('testPassiveListener', null, opts);\n      } catch (e) {// No support\n      }\n\n      return supportsPassive;\n    }(),\n    gestures: function checkGestures() {\n      return 'ongesturestart' in window;\n    }()\n  };\n}\n\nfunction getSupport() {\n  if (!support) {\n    support = calcSupport();\n  }\n\n  return support;\n}\n\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/shared/get-support.js?\n}");
2285
2286/***/ }),
2287
vendor: 7,307 bytes, lines 2288-2298
2288/***/ "./node_modules/swiper/shared/utils.js":
2289/*!*********************************************!*\
2290  !*** ./node_modules/swiper/shared/utils.js ***!
2291  \*********************************************/
2292/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2293
2294"use strict";
2295eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   animateCSSModeScroll: function() { return /* binding */ animateCSSModeScroll; },\n/* harmony export */   deleteProps: function() { return /* binding */ deleteProps; },\n/* harmony export */   extend: function() { return /* binding */ extend; },\n/* harmony export */   getTranslate: function() { return /* binding */ getTranslate; },\n/* harmony export */   isObject: function() { return /* binding */ isObject; },\n/* harmony export */   nextTick: function() { return /* binding */ nextTick; },\n/* harmony export */   now: function() { return /* binding */ now; },\n/* harmony export */   setCSSProperty: function() { return /* binding */ setCSSProperty; }\n/* harmony export */ });\n/* unused harmony export getComputedStyle */\n/* harmony import */ var ssr_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ssr-window */ \"./node_modules/ssr-window/ssr-window.esm.js\");\n\n\nfunction deleteProps(obj) {\n  const object = obj;\n  Object.keys(object).forEach(key => {\n    try {\n      object[key] = null;\n    } catch (e) {// no getter for object\n    }\n\n    try {\n      delete object[key];\n    } catch (e) {// something got wrong\n    }\n  });\n}\n\nfunction nextTick(callback, delay = 0) {\n  return setTimeout(callback, delay);\n}\n\nfunction now() {\n  return Date.now();\n}\n\nfunction getComputedStyle(el) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  let style;\n\n  if (window.getComputedStyle) {\n    style = window.getComputedStyle(el, null);\n  }\n\n  if (!style && el.currentStyle) {\n    style = el.currentStyle;\n  }\n\n  if (!style) {\n    style = el.style;\n  }\n\n  return style;\n}\n\nfunction getTranslate(el, axis = 'x') {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  let matrix;\n  let curTransform;\n  let transformMatrix;\n  const curStyle = getComputedStyle(el, null);\n\n  if (window.WebKitCSSMatrix) {\n    curTransform = curStyle.transform || curStyle.webkitTransform;\n\n    if (curTransform.split(',').length > 6) {\n      curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');\n    } // Some old versions of Webkit choke when 'none' is passed; pass\n    // empty string instead in this case\n\n\n    transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n  } else {\n    transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n    matrix = transformMatrix.toString().split(',');\n  }\n\n  if (axis === 'x') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers\n    else curTransform = parseFloat(matrix[4]);\n  }\n\n  if (axis === 'y') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers\n    else curTransform = parseFloat(matrix[5]);\n  }\n\n  return curTransform || 0;\n}\n\nfunction isObject(o) {\n  return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';\n}\n\nfunction isNode(node) {\n  // eslint-disable-next-line\n  if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n    return node instanceof HTMLElement;\n  }\n\n  return node && (node.nodeType === 1 || node.nodeType === 11);\n}\n\nfunction extend(...args) {\n  const to = Object(args[0]);\n  const noExtend = ['__proto__', 'constructor', 'prototype'];\n\n  for (let i = 1; i < args.length; i += 1) {\n    const nextSource = args[i];\n\n    if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n      const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);\n\n      for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n        const nextKey = keysArray[nextIndex];\n        const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n\n        if (desc !== undefined && desc.enumerable) {\n          if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            to[nextKey] = {};\n\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else {\n            to[nextKey] = nextSource[nextKey];\n          }\n        }\n      }\n    }\n  }\n\n  return to;\n}\n\nfunction setCSSProperty(el, varName, varValue) {\n  el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll({\n  swiper,\n  targetPosition,\n  side\n}) {\n  const window = (0,ssr_window__WEBPACK_IMPORTED_MODULE_0__.getWindow)();\n  const startPosition = -swiper.translate;\n  let startTime = null;\n  let time;\n  const duration = swiper.params.speed;\n  swiper.wrapperEl.style.scrollSnapType = 'none';\n  window.cancelAnimationFrame(swiper.cssModeFrameID);\n  const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n  const isOutOfBound = (current, target) => {\n    return dir === 'next' && current >= target || dir === 'prev' && current <= target;\n  };\n\n  const animate = () => {\n    time = new Date().getTime();\n\n    if (startTime === null) {\n      startTime = time;\n    }\n\n    const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n    const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n    let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      currentPosition = targetPosition;\n    }\n\n    swiper.wrapperEl.scrollTo({\n      [side]: currentPosition\n    });\n\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      swiper.wrapperEl.style.overflow = 'hidden';\n      swiper.wrapperEl.style.scrollSnapType = '';\n      setTimeout(() => {\n        swiper.wrapperEl.style.overflow = '';\n        swiper.wrapperEl.scrollTo({\n          [side]: currentPosition\n        });\n      });\n      window.cancelAnimationFrame(swiper.cssModeFrameID);\n      return;\n    }\n\n    swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n  };\n\n  animate();\n}\n\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/shared/utils.js?\n}");
2296
2297/***/ }),
2298
vendor: 6,781 bytes, lines 2299-2308
2299/***/ "./node_modules/swiper/swiper.esm.js":
2300/*!*******************************************!*\
2301  !*** ./node_modules/swiper/swiper.esm.js ***!
2302  \*******************************************/
2303/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
2304
2305"use strict";
2306eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   EffectCoverflow: function() { return /* reexport safe */ _modules_effect_coverflow_effect_coverflow_js__WEBPACK_IMPORTED_MODULE_22__[\"default\"]; },\n/* harmony export */   Navigation: function() { return /* reexport safe */ _modules_navigation_navigation_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; },\n/* harmony export */   Pagination: function() { return /* reexport safe */ _modules_pagination_pagination_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; },\n/* harmony export */   Scrollbar: function() { return /* reexport safe */ _modules_scrollbar_scrollbar_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; },\n/* harmony export */   \"default\": function() { return /* reexport safe */ _core_core_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; }\n/* harmony export */ });\n/* harmony import */ var _core_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/core.js */ \"./node_modules/swiper/core/core.js\");\n/* harmony import */ var _modules_virtual_virtual_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/virtual/virtual.js */ \"./node_modules/swiper/modules/virtual/virtual.js\");\n/* harmony import */ var _modules_keyboard_keyboard_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/keyboard/keyboard.js */ \"./node_modules/swiper/modules/keyboard/keyboard.js\");\n/* harmony import */ var _modules_mousewheel_mousewheel_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/mousewheel/mousewheel.js */ \"./node_modules/swiper/modules/mousewheel/mousewheel.js\");\n/* harmony import */ var _modules_navigation_navigation_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/navigation/navigation.js */ \"./node_modules/swiper/modules/navigation/navigation.js\");\n/* harmony import */ var _modules_pagination_pagination_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/pagination/pagination.js */ \"./node_modules/swiper/modules/pagination/pagination.js\");\n/* harmony import */ var _modules_scrollbar_scrollbar_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/scrollbar/scrollbar.js */ \"./node_modules/swiper/modules/scrollbar/scrollbar.js\");\n/* harmony import */ var _modules_parallax_parallax_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modules/parallax/parallax.js */ \"./node_modules/swiper/modules/parallax/parallax.js\");\n/* harmony import */ var _modules_zoom_zoom_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./modules/zoom/zoom.js */ \"./node_modules/swiper/modules/zoom/zoom.js\");\n/* harmony import */ var _modules_lazy_lazy_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./modules/lazy/lazy.js */ \"./node_modules/swiper/modules/lazy/lazy.js\");\n/* harmony import */ var _modules_controller_controller_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./modules/controller/controller.js */ \"./node_modules/swiper/modules/controller/controller.js\");\n/* harmony import */ var _modules_a11y_a11y_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./modules/a11y/a11y.js */ \"./node_modules/swiper/modules/a11y/a11y.js\");\n/* harmony import */ var _modules_history_history_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modules/history/history.js */ \"./node_modules/swiper/modules/history/history.js\");\n/* harmony import */ var _modules_hash_navigation_hash_navigation_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./modules/hash-navigation/hash-navigation.js */ \"./node_modules/swiper/modules/hash-navigation/hash-navigation.js\");\n/* harmony import */ var _modules_autoplay_autoplay_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./modules/autoplay/autoplay.js */ \"./node_modules/swiper/modules/autoplay/autoplay.js\");\n/* harmony import */ var _modules_thumbs_thumbs_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./modules/thumbs/thumbs.js */ \"./node_modules/swiper/modules/thumbs/thumbs.js\");\n/* harmony import */ var _modules_free_mode_free_mode_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./modules/free-mode/free-mode.js */ \"./node_modules/swiper/modules/free-mode/free-mode.js\");\n/* harmony import */ var _modules_grid_grid_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./modules/grid/grid.js */ \"./node_modules/swiper/modules/grid/grid.js\");\n/* harmony import */ var _modules_manipulation_manipulation_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./modules/manipulation/manipulation.js */ \"./node_modules/swiper/modules/manipulation/manipulation.js\");\n/* harmony import */ var _modules_effect_fade_effect_fade_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./modules/effect-fade/effect-fade.js */ \"./node_modules/swiper/modules/effect-fade/effect-fade.js\");\n/* harmony import */ var _modules_effect_cube_effect_cube_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./modules/effect-cube/effect-cube.js */ \"./node_modules/swiper/modules/effect-cube/effect-cube.js\");\n/* harmony import */ var _modules_effect_flip_effect_flip_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./modules/effect-flip/effect-flip.js */ \"./node_modules/swiper/modules/effect-flip/effect-flip.js\");\n/* harmony import */ var _modules_effect_coverflow_effect_coverflow_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./modules/effect-coverflow/effect-coverflow.js */ \"./node_modules/swiper/modules/effect-coverflow/effect-coverflow.js\");\n/* harmony import */ var _modules_effect_creative_effect_creative_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./modules/effect-creative/effect-creative.js */ \"./node_modules/swiper/modules/effect-creative/effect-creative.js\");\n/* harmony import */ var _modules_effect_cards_effect_cards_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./modules/effect-cards/effect-cards.js */ \"./node_modules/swiper/modules/effect-cards/effect-cards.js\");\n/**\n * Swiper 8.4.7\n * Most modern mobile touch slider and framework with hardware accelerated transitions\n * https://swiperjs.com\n *\n * Copyright 2014-2023 Vladimir Kharlampidi\n *\n * Released under the MIT License\n *\n * Released on: January 30, 2023\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack://webpack-starter/./node_modules/swiper/swiper.esm.js?\n}");
2307
2308/***/ })
2308
2309
2310/******/ 	});
2311/************************************************************************/
2312/******/ 	// The module cache
2313/******/ 	var __webpack_module_cache__ = {};
2314/******/ 	
2315/******/ 	// The require function
2316/******/ 	function __webpack_require__(moduleId) {
2317/******/ 		// Check if module is in cache
2318/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
2319/******/ 		if (cachedModule !== undefined) {
2320/******/ 			return cachedModule.exports;
2321/******/ 		}
2322/******/ 		// Create a new module (and put it into the cache)
2323/******/ 		var module = __webpack_module_cache__[moduleId] = {
2324/******/ 			id: moduleId,
2325/******/ 			loaded: false,
2326/******/ 			exports: {}
2327/******/ 		};
2328/******/ 	
2329/******/ 		// Execute the module function
2330/******/ 		if (!(moduleId in __webpack_modules__)) {
2331/******/ 			delete __webpack_module_cache__[moduleId];
2332/******/ 			var e = new Error("Cannot find module '" + moduleId + "'");
2333/******/ 			e.code = 'MODULE_NOT_FOUND';
2334/******/ 			throw e;
2335/******/ 		}
2336/******/ 		__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
2337/******/ 	
2338/******/ 		// Flag the module as loaded
2339/******/ 		module.loaded = true;
2340/******/ 	
2341/******/ 		// Return the exports of the module
2342/******/ 		return module.exports;
2343/******/ 	}
2344/******/ 	
2345/************************************************************************/
2346/******/ 	/* webpack/runtime/compat get default export */
2347/******/ 	// getDefaultExport function for compatibility with non-harmony modules
2348/******/ 	__webpack_require__.n = function(module) {
2349/******/ 		var getter = module && module.__esModule ?
2350/******/ 			function() { return module['default']; } :
2351/******/ 			function() { return module; };
2352/******/ 		__webpack_require__.d(getter, { a: getter });
2353/******/ 		return getter;
2354/******/ 	};
2355/******/ 	
2356/******/ 	/* webpack/runtime/define property getters */
2357/******/ 	// define getter/value functions for harmony exports
2358/******/ 	__webpack_require__.d = function(exports, definition) {
2359/******/ 		for(var key in definition) {
2360/******/ 			if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
2361/******/ 				Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
2362/******/ 			}
2363/******/ 		}
2364/******/ 	};
2365/******/ 	
2366/******/ 	/* webpack/runtime/global */
2367/******/ 	__webpack_require__.g = (function() {
2368/******/ 		if (typeof globalThis === 'object') return globalThis;
2369/******/ 		try {
2370/******/ 			return this || new Function('return this')();
2371/******/ 		} catch (e) {
2372/******/ 			if (typeof window === 'object') return window;
2373/******/ 		}
2374/******/ 	})();
2375/******/ 	
2376/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
2377/******/ 	__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); };
2378/******/ 	
2379/******/ 	/* webpack/runtime/make namespace object */
2380/******/ 	// define __esModule on exports
2381/******/ 	__webpack_require__.r = function(exports) {
2382/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
2383/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2384/******/ 		}
2385/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
2386/******/ 	};
2387/******/ 	
2388/******/ 	/* webpack/runtime/node module decorator */
2389/******/ 	__webpack_require__.nmd = function(module) {
2390/******/ 		module.paths = [];
2391/******/ 		if (!module.children) module.children = [];
2392/******/ 		return module;
2393/******/ 	};
2394/******/ 	
2395/************************************************************************/
2396/******/ 	
2397/******/ 	// startup
2398/******/ 	// Load entry module and return exports
2399/******/ 	// This entry module can't be inlined because the eval devtool is used.
2400/******/ 	var __webpack_exports__ = __webpack_require__("./cartridges/app_paulaschoice/cartridge/js/app.js");
2401/******/ 	
2402/******/ })()
2403;

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.