{"version":3,"file":"bootstrap-vue.min.js","sources":["../src/bootstrap-vue.js"],"sourcesContent":["/* eslint-disable */\n/*!\n * BootstrapVue 2.16.0\n *\n * @link https://bootstrap-vue.org\n * @source https://github.com/bootstrap-vue/bootstrap-vue\n * @copyright (c) 2016-2020 BootstrapVue\n * @license MIT\n * https://github.com/bootstrap-vue/bootstrap-vue/blob/master/LICENSE\n */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./vue')) :\n typeof define === 'function' && define.amd ? define(['./vue'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrapVue = factory(global.Vue));\n }(this, (function (Vue) { 'use strict';\n \n Vue = Vue && Object.prototype.hasOwnProperty.call(Vue, 'default') ? Vue['default'] : Vue;\n \n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n \n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n \n return _typeof(obj);\n }\n \n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n \n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n \n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n \n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n \n return obj;\n }\n \n function ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n \n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n \n return keys;\n }\n \n function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n \n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n \n return target;\n }\n \n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n \n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n }\n \n function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n }\n \n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n \n return _setPrototypeOf(o, p);\n }\n \n function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n \n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n \n function _construct(Parent, args, Class) {\n if (_isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n \n return _construct.apply(null, arguments);\n }\n \n function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n }\n \n function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n \n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !_isNativeFunction(Class)) return Class;\n \n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n \n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n \n _cache.set(Class, Wrapper);\n }\n \n function Wrapper() {\n return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n }\n \n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return _setPrototypeOf(Wrapper, Class);\n };\n \n return _wrapNativeSuper(Class);\n }\n \n function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n \n return self;\n }\n \n function _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n }\n \n return _assertThisInitialized(self);\n }\n \n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n \n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n \n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n \n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n \n return _possibleConstructorReturn(this, result);\n };\n }\n \n function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = _getPrototypeOf(object);\n if (object === null) break;\n }\n \n return object;\n }\n \n function _get(target, property, receiver) {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get;\n } else {\n _get = function _get(target, property, receiver) {\n var base = _superPropBase(target, property);\n \n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n \n if (desc.get) {\n return desc.get.call(receiver);\n }\n \n return desc.value;\n };\n }\n \n return _get(target, property, receiver || target);\n }\n \n function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n }\n \n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n \n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n }\n \n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n \n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n }\n \n function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n \n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n \n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n \n return _arr;\n }\n \n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n \n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n \n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n \n return arr2;\n }\n \n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n \n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n \n // --- Static ---\n var from = function from() {\n return Array.from.apply(Array, arguments);\n };\n var isArray = function isArray(val) {\n return Array.isArray(val);\n }; // --- Instance ---\n \n var arrayIncludes = function arrayIncludes(array, value) {\n return array.indexOf(value) !== -1;\n };\n var concat = function concat() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n \n return Array.prototype.concat.apply([], args);\n };\n \n var assign = function assign() {\n return Object.assign.apply(Object, arguments);\n };\n var create = function create(proto, optionalProps) {\n return Object.create(proto, optionalProps);\n };\n var defineProperties = function defineProperties(obj, props) {\n return Object.defineProperties(obj, props);\n };\n var defineProperty = function defineProperty(obj, prop, descriptor) {\n return Object.defineProperty(obj, prop, descriptor);\n };\n var freeze = function freeze(obj) {\n return Object.freeze(obj);\n };\n var getOwnPropertyNames = function getOwnPropertyNames(obj) {\n return Object.getOwnPropertyNames(obj);\n };\n var keys = function keys(obj) {\n return Object.keys(obj);\n }; // --- \"Instance\" ---\n \n var hasOwnProperty = function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n var toString = function toString(obj) {\n return Object.prototype.toString.call(obj);\n }; // --- Utilities ---\n \n /**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n * Note object could be a complex type like array, date, etc.\n */\n \n var isObject = function isObject(obj) {\n return obj !== null && _typeof(obj) === 'object';\n };\n /**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n */\n \n var isPlainObject = function isPlainObject(obj) {\n return Object.prototype.toString.call(obj) === '[object Object]';\n };\n /**\n * Shallow copy an object. If the passed in object\n * is null or undefined, returns an empty object\n */\n \n var clone = function clone(obj) {\n return _objectSpread2({}, obj);\n };\n /**\n * Return a shallow copy of object with the specified properties only\n * @link https://gist.github.com/bisubus/2da8af7e801ffd813fab7ac221aa7afc\n */\n \n var pick = function pick(obj, props) {\n return keys(obj).filter(function (key) {\n return props.indexOf(key) !== -1;\n }).reduce(function (result, key) {\n return _objectSpread2(_objectSpread2({}, result), {}, _defineProperty({}, key, obj[key]));\n }, {});\n };\n /**\n * Return a shallow copy of object with the specified properties omitted\n * @link https://gist.github.com/bisubus/2da8af7e801ffd813fab7ac221aa7afc\n */\n \n var omit = function omit(obj, props) {\n return keys(obj).filter(function (key) {\n return props.indexOf(key) === -1;\n }).reduce(function (result, key) {\n return _objectSpread2(_objectSpread2({}, result), {}, _defineProperty({}, key, obj[key]));\n }, {});\n };\n /**\n * Convenience method to create a read-only descriptor\n */\n \n var readonlyDescriptor = function readonlyDescriptor() {\n return {\n enumerable: true,\n configurable: false,\n writable: false\n };\n };\n /**\n * Deep-freezes and object, making it immutable / read-only.\n * Returns the same object passed-in, but frozen.\n * Freezes inner object/array/values first.\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze\n * Note: this method will not work for property values using Symbol() as a key\n */\n \n var deepFreeze = function deepFreeze(obj) {\n // Retrieve the property names defined on object/array\n // Note: `keys` will ignore properties that are keyed by a `Symbol()`\n var props = keys(obj); // Iterate over each prop and recursively freeze it\n \n props.forEach(function (prop) {\n var value = obj[prop]; // If value is a plain object or array, we deepFreeze it\n \n obj[prop] = value && (isPlainObject(value) || isArray(value)) ? deepFreeze(value) : value;\n });\n return freeze(obj);\n };\n \n /**\n * Utilities to get information about the current environment\n */\n // --- Constants ---\n var hasWindowSupport = typeof window !== 'undefined';\n var hasDocumentSupport = typeof document !== 'undefined';\n var hasNavigatorSupport = typeof navigator !== 'undefined';\n var hasPromiseSupport = typeof Promise !== 'undefined';\n /* istanbul ignore next: JSDOM always returns false */\n \n var hasMutationObserverSupport = typeof MutationObserver !== 'undefined' || typeof WebKitMutationObserver !== 'undefined' || typeof MozMutationObserver !== 'undefined';\n var isBrowser = hasWindowSupport && hasDocumentSupport && hasNavigatorSupport; // Browser type sniffing\n \n var userAgent = isBrowser ? window.navigator.userAgent.toLowerCase() : '';\n var isJSDOM = userAgent.indexOf('jsdom') > 0;\n var isIE = /msie|trident/.test(userAgent); // Determine if the browser supports the option passive for events\n \n var hasPassiveEventSupport = function () {\n var passiveEventSupported = false;\n \n if (isBrowser) {\n try {\n var options = {\n get passive() {\n // This function will be called when the browser\n // attempts to access the passive property.\n \n /* istanbul ignore next: will never be called in JSDOM */\n passiveEventSupported = true;\n }\n \n };\n window.addEventListener('test', options, options);\n window.removeEventListener('test', options, options);\n } catch (err) {\n /* istanbul ignore next: will never be called in JSDOM */\n passiveEventSupported = false;\n }\n }\n \n return passiveEventSupported;\n }();\n var hasTouchSupport = isBrowser && ('ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0);\n var hasPointerEventSupport = isBrowser && Boolean(window.PointerEvent || window.MSPointerEvent);\n /* istanbul ignore next: JSDOM only checks for 'IntersectionObserver' */\n \n var hasIntersectionObserverSupport = isBrowser && 'IntersectionObserver' in window && 'IntersectionObserverEntry' in window && // Edge 15 and UC Browser lack support for `isIntersecting`\n // but we an use intersectionRatio > 0 instead\n // 'isIntersecting' in window.IntersectionObserverEntry.prototype &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype; // --- Getters ---\n \n var getEnv = function getEnv(key) {\n var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var env = typeof process !== 'undefined' && process ? process.env || {} : {};\n \n if (!key) {\n /* istanbul ignore next */\n return env;\n }\n \n return env[key] || fallback;\n };\n var getNoWarn = function getNoWarn() {\n return getEnv('BOOTSTRAP_VUE_NO_WARN');\n };\n \n var w = hasWindowSupport ? window : {};\n var Element$1 = hasWindowSupport ? w.Element : /*#__PURE__*/function (_Object) {\n _inherits(Element, _Object);\n \n var _super = _createSuper(Element);\n \n function Element() {\n _classCallCheck(this, Element);\n \n return _super.apply(this, arguments);\n }\n \n return Element;\n }( /*#__PURE__*/_wrapNativeSuper(Object));\n var HTMLElement = hasWindowSupport ? w.HTMLElement : /*#__PURE__*/function (_Element) {\n _inherits(HTMLElement, _Element);\n \n var _super2 = _createSuper(HTMLElement);\n \n function HTMLElement() {\n _classCallCheck(this, HTMLElement);\n \n return _super2.apply(this, arguments);\n }\n \n return HTMLElement;\n }(Element$1);\n var SVGElement = hasWindowSupport ? w.SVGElement : /*#__PURE__*/function (_Element2) {\n _inherits(SVGElement, _Element2);\n \n var _super3 = _createSuper(SVGElement);\n \n function SVGElement() {\n _classCallCheck(this, SVGElement);\n \n return _super3.apply(this, arguments);\n }\n \n return SVGElement;\n }(Element$1);\n var File = hasWindowSupport ? w.File : /*#__PURE__*/function (_Object2) {\n _inherits(File, _Object2);\n \n var _super4 = _createSuper(File);\n \n function File() {\n _classCallCheck(this, File);\n \n return _super4.apply(this, arguments);\n }\n \n return File;\n }( /*#__PURE__*/_wrapNativeSuper(Object));\n \n var toType = function toType(val) {\n return _typeof(val);\n };\n var toRawType = function toRawType(val) {\n return Object.prototype.toString.call(val).slice(8, -1);\n };\n var isUndefined = function isUndefined(val) {\n return val === undefined;\n };\n var isNull = function isNull(val) {\n return val === null;\n };\n var isUndefinedOrNull = function isUndefinedOrNull(val) {\n return isUndefined(val) || isNull(val);\n };\n var isFunction = function isFunction(val) {\n return toType(val) === 'function';\n };\n var isBoolean = function isBoolean(val) {\n return toType(val) === 'boolean';\n };\n var isString = function isString(val) {\n return toType(val) === 'string';\n };\n var isNumber = function isNumber(val) {\n return toType(val) === 'number';\n };\n var isDate = function isDate(val) {\n return val instanceof Date;\n };\n var isEvent = function isEvent(val) {\n return val instanceof Event;\n };\n var isFile = function isFile(val) {\n return val instanceof File;\n };\n var isRegExp = function isRegExp(val) {\n return toRawType(val) === 'RegExp';\n };\n var isPromise = function isPromise(val) {\n return !isUndefinedOrNull(val) && isFunction(val.then) && isFunction(val.catch);\n }; // Extra convenience named re-exports\n \n var cloneDeep = function cloneDeep(obj) {\n var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : obj;\n \n if (isArray(obj)) {\n return obj.reduce(function (result, val) {\n return [].concat(_toConsumableArray(result), [cloneDeep(val, val)]);\n }, []);\n }\n \n if (isPlainObject(obj)) {\n return keys(obj).reduce(function (result, key) {\n return _objectSpread2(_objectSpread2({}, result), {}, _defineProperty({}, key, cloneDeep(obj[key], obj[key])));\n }, {});\n }\n \n return defaultValue;\n };\n \n var identity = function identity(x) {\n return x;\n };\n \n var RX_ARRAY_NOTATION = /\\[(\\d+)]/g;\n /**\n * Get property defined by dot/array notation in string, returns undefined if not found\n *\n * @link https://gist.github.com/jeneg/9767afdcca45601ea44930ea03e0febf#gistcomment-1935901\n *\n * @param {Object} obj\n * @param {string|Array} path\n * @return {*}\n */\n \n var getRaw = function getRaw(obj, path) {\n var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;\n // Handle array of path values\n path = isArray(path) ? path.join('.') : path; // If no path or no object passed\n \n if (!path || !isObject(obj)) {\n return defaultValue;\n } // Handle edge case where user has dot(s) in top-level item field key\n // See https://github.com/bootstrap-vue/bootstrap-vue/issues/2762\n // Switched to `in` operator vs `hasOwnProperty` to handle obj.prototype getters\n // https://github.com/bootstrap-vue/bootstrap-vue/issues/3463\n \n \n if (path in obj) {\n return obj[path];\n } // Handle string array notation (numeric indices only)\n \n \n path = String(path).replace(RX_ARRAY_NOTATION, '.$1');\n var steps = path.split('.').filter(identity); // Handle case where someone passes a string of only dots\n \n if (steps.length === 0) {\n return defaultValue;\n } // Traverse path in object to find result\n // Switched to `in` operator vs `hasOwnProperty` to handle obj.prototype getters\n // https://github.com/bootstrap-vue/bootstrap-vue/issues/3463\n \n \n return steps.every(function (step) {\n return isObject(obj) && step in obj && !isUndefinedOrNull(obj = obj[step]);\n }) ? obj : isNull(obj) ? null : defaultValue;\n };\n /**\n * Get property defined by dot/array notation in string.\n *\n * @link https://gist.github.com/jeneg/9767afdcca45601ea44930ea03e0febf#gistcomment-1935901\n *\n * @param {Object} obj\n * @param {string|Array} path\n * @param {*} defaultValue (optional)\n * @return {*}\n */\n \n var get = function get(obj, path) {\n var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var val = getRaw(obj, path);\n return isUndefinedOrNull(val) ? defaultValue : val;\n };\n \n /**\n * Log a warning message to the console with BootstrapVue formatting\n * @param {string} message\n */\n \n var warn = function warn(message)\n /* istanbul ignore next */\n {\n var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n \n if (!getNoWarn()) {\n console.warn(\"[BootstrapVue warn]: \".concat(source ? \"\".concat(source, \" - \") : '').concat(message));\n }\n };\n /**\n * Warn when no Promise support is given\n * @param {string} source\n * @returns {boolean} warned\n */\n \n var warnNotClient = function warnNotClient(source) {\n /* istanbul ignore else */\n if (isBrowser) {\n return false;\n } else {\n warn(\"\".concat(source, \": Can not be called during SSR.\"));\n return true;\n }\n };\n /**\n * Warn when no Promise support is given\n * @param {string} source\n * @returns {boolean} warned\n */\n \n var warnNoPromiseSupport = function warnNoPromiseSupport(source) {\n /* istanbul ignore else */\n if (hasPromiseSupport) {\n return false;\n } else {\n warn(\"\".concat(source, \": Requires Promise support.\"));\n return true;\n }\n };\n /**\n * Warn when no MutationObserver support is given\n * @param {string} source\n * @returns {boolean} warned\n */\n \n var warnNoMutationObserverSupport = function warnNoMutationObserverSupport(source) {\n /* istanbul ignore else */\n if (hasMutationObserverSupport) {\n return false;\n } else {\n warn(\"\".concat(source, \": Requires MutationObserver support.\"));\n return true;\n }\n };\n \n // NOTES\n //\n // The global config SHALL NOT be used to set defaults for Boolean props, as the props\n // would loose their semantic meaning, and force people writing 3rd party components to\n // explicitly set a true or false value using the v-bind syntax on boolean props\n //\n // Supported config values (depending on the prop's supported type(s)):\n // `String`, `Array`, `Object`, `null` or `undefined`\n // BREAKPOINT DEFINITIONS\n //\n // Some components (`` and ``) generate props based on breakpoints,\n // and this occurs when the component is first loaded (evaluated), which may happen\n // before the config is created/modified\n //\n // To get around this we make these components' props async (lazy evaluation)\n // The component definition is only called/executed when the first access to the\n // component is used (and cached on subsequent uses)\n // PROP DEFAULTS\n //\n // For default values on props, we use the default value factory function approach so\n // that the default values are pulled in at each component instantiation\n //\n // props: {\n // variant: {\n // type: String,\n // default: () => getConfigComponent('BAlert', 'variant')\n // }\n // }\n //\n // We also provide a cached getter for breakpoints, which are \"frozen\" on first access\n // prettier-ignore\n \n var DEFAULTS = deepFreeze({\n // Breakpoints\n breakpoints: ['xs', 'sm', 'md', 'lg', 'xl'],\n // Form controls\n formControls: {\n size: undefined\n },\n // Component specific defaults are keyed by the component\n // name (PascalCase) and prop name (camelCase)\n BAlert: {\n dismissLabel: 'Close',\n variant: 'info'\n },\n BAvatar: {\n variant: 'secondary',\n badgeVariant: 'primary'\n },\n BBadge: {\n variant: 'secondary'\n },\n BButton: {\n size: undefined,\n variant: 'secondary'\n },\n BButtonClose: {\n content: '×',\n // `textVariant` is `null` to inherit the current text color\n textVariant: undefined,\n ariaLabel: 'Close'\n },\n BCalendar: {\n // BFormDate will choose these first if not provided in BFormDate section\n labelPrevDecade: 'Previous decade',\n labelPrevYear: 'Previous year',\n labelPrevMonth: 'Previous month',\n labelCurrentMonth: 'Current month',\n labelNextMonth: 'Next month',\n labelNextYear: 'Next year',\n labelNextDecade: 'Next decade',\n labelToday: 'Today',\n labelSelected: 'Selected date',\n labelNoDateSelected: 'No date selected',\n labelCalendar: 'Calendar',\n labelNav: 'Calendar navigation',\n labelHelp: 'Use cursor keys to navigate calendar dates'\n },\n BCardSubTitle: {\n // `` and `` also inherit this prop\n subTitleTextVariant: 'muted'\n },\n BCarousel: {\n labelPrev: 'Previous Slide',\n labelNext: 'Next Slide',\n labelGotoSlide: 'Goto Slide',\n labelIndicators: 'Select a slide to display'\n },\n BDropdown: {\n toggleText: 'Toggle Dropdown',\n size: undefined,\n variant: 'secondary',\n splitVariant: undefined\n },\n BFormDatepicker: {\n // BFormDatepicker will choose from BCalendar first if not provided here\n labelPrevDecade: undefined,\n labelPrevYear: undefined,\n labelPrevMonth: undefined,\n labelCurrentMonth: undefined,\n labelNextMonth: undefined,\n labelNextYear: undefined,\n labelNextDecade: undefined,\n labelToday: undefined,\n labelSelected: undefined,\n labelNoDateSelected: undefined,\n labelCalendar: undefined,\n labelNav: undefined,\n labelHelp: undefined,\n // These props are specific to BFormDatepicker\n labelTodayButton: 'Select today',\n labelResetButton: 'Reset',\n labelCloseButton: 'Close'\n },\n BFormFile: {\n browseText: 'Browse',\n // Chrome default file prompt\n placeholder: 'No file chosen',\n dropPlaceholder: 'Drop files here'\n },\n BFormRating: {\n variant: null,\n color: null\n },\n BFormTag: {\n removeLabel: 'Remove tag',\n variant: 'secondary'\n },\n BFormTags: {\n addButtonText: 'Add',\n addButtonVariant: 'outline-secondary',\n duplicateTagText: 'Duplicate tag(s)',\n invalidTagText: 'Invalid tag(s)',\n placeholder: 'Add tag...',\n tagRemoveLabel: 'Remove tag',\n tagRemovedLabel: 'Tag removed',\n tagVariant: 'secondary'\n },\n BFormText: {\n textVariant: 'muted'\n },\n BFormTimepicker: {\n // Fallback to BTime\n labelNoTimeSelected: undefined,\n labelSelected: undefined,\n labelHours: undefined,\n labelMinutes: undefined,\n labelSeconds: undefined,\n labelAmpm: undefined,\n labelAm: undefined,\n labelPm: undefined,\n // Fallback to BTime then BFormSpinbutton\n labelDecrement: undefined,\n labelIncrement: undefined,\n // These props are specific to BFormTimepicker\n labelNowButton: 'Select now',\n labelResetButton: 'Reset',\n labelCloseButton: 'Close'\n },\n BFormSpinbutton: {\n labelDecrement: 'Decrement',\n labelIncrement: 'Increment'\n },\n BImg: {\n blankColor: 'transparent'\n },\n BImgLazy: {\n blankColor: 'transparent'\n },\n BInputGroup: {\n size: undefined\n },\n BJumbotron: {\n bgVariant: undefined,\n borderVariant: undefined,\n textVariant: undefined\n },\n BLink: {\n routerComponentName: undefined\n },\n BListGroupItem: {\n variant: undefined\n },\n BModal: {\n titleTag: 'h5',\n size: 'md',\n headerBgVariant: undefined,\n headerBorderVariant: undefined,\n headerTextVariant: undefined,\n headerCloseVariant: undefined,\n bodyBgVariant: undefined,\n bodyTextVariant: undefined,\n footerBgVariant: undefined,\n footerBorderVariant: undefined,\n footerTextVariant: undefined,\n cancelTitle: 'Cancel',\n cancelVariant: 'secondary',\n okTitle: 'OK',\n okVariant: 'primary',\n headerCloseContent: '×',\n headerCloseLabel: 'Close'\n },\n BNavbar: {\n variant: null\n },\n BNavbarToggle: {\n label: 'Toggle navigation'\n },\n BPagination: {\n size: undefined\n },\n BPaginationNav: {\n size: undefined\n },\n BPopover: {\n boundary: 'scrollParent',\n boundaryPadding: 5,\n customClass: undefined,\n delay: 50,\n variant: undefined\n },\n BProgress: {\n variant: undefined\n },\n BProgressBar: {\n variant: undefined\n },\n BSpinner: {\n variant: undefined\n },\n BSidebar: {\n bgVariant: 'light',\n textVariant: 'dark',\n shadow: false,\n width: undefined,\n tag: 'div',\n backdropVariant: 'dark'\n },\n BTable: {\n selectedVariant: 'active',\n headVariant: undefined,\n footVariant: undefined\n },\n BTime: {\n labelNoTimeSelected: 'No time selected',\n labelSelected: 'Selected time',\n labelHours: 'Hours',\n labelMinutes: 'Minutes',\n labelSeconds: 'Seconds',\n labelAmpm: 'AM/PM',\n // It would be nice to be able to get these from Intl.DateTimeFormat somehow\n labelAm: 'AM',\n labelPm: 'PM',\n // The following inherit from BFormSpinbutton if not provided\n labelIncrement: undefined,\n labelDecrement: undefined\n },\n BToast: {\n toaster: 'b-toaster-top-right',\n autoHideDelay: 5000,\n variant: undefined,\n toastClass: undefined,\n headerClass: undefined,\n bodyClass: undefined\n },\n BToaster: {\n ariaLive: undefined,\n ariaAtomic: undefined,\n role: undefined\n },\n BTooltip: {\n boundary: 'scrollParent',\n boundaryPadding: 5,\n customClass: undefined,\n delay: 50,\n variant: undefined\n }\n });\n \n var NAME = 'BvConfig';\n var PROP_NAME = '$bvConfig'; // Config manager class\n \n var BvConfig = /*#__PURE__*/function () {\n function BvConfig() {\n _classCallCheck(this, BvConfig);\n \n // TODO: pre-populate with default config values (needs updated tests)\n // this.$_config = cloneDeep(DEFAULTS)\n this.$_config = {};\n this.$_cachedBreakpoints = null;\n }\n /* istanbul ignore next */\n \n \n _createClass(BvConfig, [{\n key: \"getDefaults\",\n // Returns the defaults\n \n /* istanbul ignore next */\n value: function getDefaults()\n /* istanbul ignore next */\n {\n return this.defaults;\n } // Method to merge in user config parameters\n \n }, {\n key: \"setConfig\",\n value: function setConfig() {\n var _this = this;\n \n var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n \n if (!isPlainObject(config)) {\n /* istanbul ignore next */\n return;\n }\n \n var configKeys = getOwnPropertyNames(config);\n configKeys.forEach(function (cmpName) {\n /* istanbul ignore next */\n if (!hasOwnProperty(DEFAULTS, cmpName)) {\n warn(\"Unknown config property \\\"\".concat(cmpName, \"\\\"\"), NAME);\n return;\n }\n \n var cmpConfig = config[cmpName];\n \n if (cmpName === 'breakpoints') {\n // Special case for breakpoints\n var breakpoints = config.breakpoints;\n /* istanbul ignore if */\n \n if (!isArray(breakpoints) || breakpoints.length < 2 || breakpoints.some(function (b) {\n return !isString(b) || b.length === 0;\n })) {\n warn('\"breakpoints\" must be an array of at least 2 breakpoint names', NAME);\n } else {\n _this.$_config.breakpoints = cloneDeep(breakpoints);\n }\n } else if (isPlainObject(cmpConfig)) {\n // Component prop defaults\n var props = getOwnPropertyNames(cmpConfig);\n props.forEach(function (prop) {\n /* istanbul ignore if */\n if (!hasOwnProperty(DEFAULTS[cmpName], prop)) {\n warn(\"Unknown config property \\\"\".concat(cmpName, \".\").concat(prop, \"\\\"\"), NAME);\n } else {\n // TODO: If we pre-populate the config with defaults, we can skip this line\n _this.$_config[cmpName] = _this.$_config[cmpName] || {};\n \n if (!isUndefined(cmpConfig[prop])) {\n _this.$_config[cmpName][prop] = cloneDeep(cmpConfig[prop]);\n }\n }\n });\n }\n });\n } // Clear the config. For testing purposes only\n \n }, {\n key: \"resetConfig\",\n value: function resetConfig() {\n this.$_config = {};\n } // Returns a deep copy of the user config\n \n }, {\n key: \"getConfig\",\n value: function getConfig() {\n return cloneDeep(this.$_config);\n }\n }, {\n key: \"getConfigValue\",\n value: function getConfigValue(key) {\n // First we try the user config, and if key not found we fall back to default value\n // NOTE: If we deep clone DEFAULTS into config, then we can skip the fallback for get\n return cloneDeep(getRaw(this.$_config, key, getRaw(DEFAULTS, key)));\n }\n }, {\n key: \"defaults\",\n \n /* istanbul ignore next */\n get: function get()\n /* istanbul ignore next */\n {\n return DEFAULTS;\n }\n }], [{\n key: \"Defaults\",\n get: function get()\n /* istanbul ignore next */\n {\n return DEFAULTS;\n }\n }]);\n \n return BvConfig;\n }(); // Method for applying a global config\n \n \n var setConfig = function setConfig() {\n var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var Vue$1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Vue;\n // Ensure we have a $bvConfig Object on the Vue prototype.\n // We set on Vue and OurVue just in case consumer has not set an alias of `vue`.\n Vue$1.prototype[PROP_NAME] = Vue.prototype[PROP_NAME] = Vue$1.prototype[PROP_NAME] || Vue.prototype[PROP_NAME] || new BvConfig(); // Apply the config values\n \n Vue$1.prototype[PROP_NAME].setConfig(config);\n }; // Method for resetting the user config. Exported for testing purposes only.\n \n /**\n * Checks if there are multiple instances of Vue, and warns (once) about possible issues.\n * @param {object} Vue\n */\n \n var checkMultipleVue = function () {\n var checkMultipleVueWarned = false;\n var MULTIPLE_VUE_WARNING = ['Multiple instances of Vue detected!', 'You may need to set up an alias for Vue in your bundler config.', 'See: https://bootstrap-vue.org/docs#using-module-bundlers'].join('\\n');\n return function (Vue$1) {\n /* istanbul ignore next */\n if (!checkMultipleVueWarned && Vue !== Vue$1 && !isJSDOM) {\n warn(MULTIPLE_VUE_WARNING);\n }\n \n checkMultipleVueWarned = true;\n };\n }();\n /**\n * Plugin install factory function.\n * @param {object} { components, directives }\n * @returns {function} plugin install function\n */\n \n var installFactory = function installFactory() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n components = _ref.components,\n directives = _ref.directives,\n plugins = _ref.plugins;\n \n var install = function install(Vue) {\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n \n if (install.installed) {\n /* istanbul ignore next */\n return;\n }\n \n install.installed = true;\n checkMultipleVue(Vue);\n setConfig(config, Vue);\n registerComponents(Vue, components);\n registerDirectives(Vue, directives);\n registerPlugins(Vue, plugins);\n };\n \n install.installed = false;\n return install;\n };\n /**\n * Plugin object factory function.\n * @param {object} { components, directives, plugins }\n * @returns {object} plugin install object\n */\n \n var pluginFactory = function pluginFactory() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var extend = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return _objectSpread2(_objectSpread2({}, extend), {}, {\n install: installFactory(options)\n });\n };\n /**\n * Load a group of plugins.\n * @param {object} Vue\n * @param {object} Plugin definitions\n */\n \n var registerPlugins = function registerPlugins(Vue) {\n var plugins = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n \n for (var plugin in plugins) {\n if (plugin && plugins[plugin]) {\n Vue.use(plugins[plugin]);\n }\n }\n };\n /**\n * Load a component.\n * @param {object} Vue\n * @param {string} Component name\n * @param {object} Component definition\n */\n \n var registerComponent = function registerComponent(Vue, name, def) {\n if (Vue && name && def) {\n Vue.component(name, def);\n }\n };\n /**\n * Load a group of components.\n * @param {object} Vue\n * @param {object} Object of component definitions\n */\n \n var registerComponents = function registerComponents(Vue) {\n var components = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n \n for (var component in components) {\n registerComponent(Vue, component, components[component]);\n }\n };\n /**\n * Load a directive.\n * @param {object} Vue\n * @param {string} Directive name\n * @param {object} Directive definition\n */\n \n var registerDirective = function registerDirective(Vue, name, def) {\n if (Vue && name && def) {\n // Ensure that any leading V is removed from the\n // name, as Vue adds it automatically\n Vue.directive(name.replace(/^VB/, 'B'), def);\n }\n };\n /**\n * Load a group of directives.\n * @param {object} Vue\n * @param {object} Object of directive definitions\n */\n \n var registerDirectives = function registerDirectives(Vue) {\n var directives = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n \n for (var directive in directives) {\n registerDirective(Vue, directive, directives[directive]);\n }\n };\n /**\n * Install plugin if window.Vue available\n * @param {object} Plugin definition\n */\n \n var vueUse = function vueUse(VuePlugin) {\n /* istanbul ignore next */\n if (hasWindowSupport && window.Vue) {\n window.Vue.use(VuePlugin);\n }\n /* istanbul ignore next */\n \n \n if (hasWindowSupport && VuePlugin.NAME) {\n window[VuePlugin.NAME] = VuePlugin;\n }\n };\n \n var memoize = function memoize(fn) {\n var cache = create(null);\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n \n var argsKey = JSON.stringify(args);\n return cache[argsKey] = cache[argsKey] || fn.apply(null, args);\n };\n };\n \n var PROP_NAME$1 = '$bvConfig';\n var VueProto = Vue.prototype; // --- Getter methods ---\n \n var getConfigValue = function getConfigValue(key) {\n return VueProto[PROP_NAME$1] ? VueProto[PROP_NAME$1].getConfigValue(key) : cloneDeep(getRaw(DEFAULTS, key));\n }; // Method to grab a config value for a particular component\n \n var getComponentConfig = function getComponentConfig(cmpName) {\n var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n // Return the particular config value for key for if specified,\n // otherwise we return the full config (or an empty object if not found)\n return key ? getConfigValue(\"\".concat(cmpName, \".\").concat(key)) : getConfigValue(cmpName) || {};\n }; // Convenience method for getting all breakpoint names\n \n var getBreakpoints = function getBreakpoints() {\n return getConfigValue('breakpoints');\n }; // Private function for caching / locking-in breakpoint names\n \n var _getBreakpointsCached = memoize(function () {\n return getBreakpoints();\n }); // Convenience method for getting all breakpoint names.\n // Caches the results after first access.\n \n \n var getBreakpointsCached = function getBreakpointsCached() {\n return cloneDeep(_getBreakpointsCached());\n }; // Convenience method for getting breakpoints with\n // the smallest breakpoint set as ''.\n // Useful for components that create breakpoint specific props.\n // Caches the results after first access.\n \n var getBreakpointsUpCached = memoize(function () {\n var breakpoints = getBreakpointsCached();\n breakpoints[0] = '';\n return breakpoints;\n }); // Convenience method for getting breakpoints with\n \n // Number utilities\n // Converts a value (string, number, etc) to an integer number\n // Assumes radix base 10\n var toInteger = function toInteger(value) {\n var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : NaN;\n var integer = parseInt(value, 10);\n return isNaN(integer) ? defaultValue : integer;\n }; // Converts a value (string, number, etc) to a number\n \n var toFloat = function toFloat(value) {\n var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : NaN;\n var float = parseFloat(value);\n return isNaN(float) ? defaultValue : float;\n }; // Converts a value (string, number, etc) to a string\n // representation with `precision` digits after the decimal\n // Returns the string 'NaN' if the value cannot be converted\n \n var toFixed = function toFixed(val, precision) {\n return toFloat(val).toFixed(toInteger(precision, 0));\n };\n \n // String utilities\n \n var RX_TRIM_LEFT = /^\\s+/;\n var RX_REGEXP_REPLACE = /[-/\\\\^$*+?.()|[\\]{}]/g;\n var RX_UN_KEBAB = /-(\\w)/g;\n var RX_HYPHENATE = /\\B([A-Z])/g; // --- Utilities ---\n // Converts PascalCase or camelCase to kebab-case\n \n var kebabCase = function kebabCase(str) {\n return str.replace(RX_HYPHENATE, '-$1').toLowerCase();\n }; // Converts a kebab-case or camelCase string to PascalCase\n \n var pascalCase = function pascalCase(str) {\n str = kebabCase(str).replace(RX_UN_KEBAB, function (_, c) {\n return c ? c.toUpperCase() : '';\n });\n return str.charAt(0).toUpperCase() + str.slice(1);\n }; // Lowercases the first letter of a string and returns a new string\n \n var lowerFirst = function lowerFirst(str) {\n str = isString(str) ? str.trim() : String(str);\n return str.charAt(0).toLowerCase() + str.slice(1);\n }; // Uppercases the first letter of a string and returns a new string\n \n var upperFirst = function upperFirst(str) {\n str = isString(str) ? str.trim() : String(str);\n return str.charAt(0).toUpperCase() + str.slice(1);\n }; // Escape characters to be used in building a regular expression\n \n var escapeRegExp = function escapeRegExp(str) {\n return str.replace(RX_REGEXP_REPLACE, '\\\\$&');\n }; // Convert a value to a string that can be rendered\n // `undefined`/`null` will be converted to `''`\n // Plain objects and arrays will be JSON stringified\n \n var toString$1 = function toString(val) {\n var spaces = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n return isUndefinedOrNull(val) ? '' : isArray(val) || isPlainObject(val) && val.toString === Object.prototype.toString ? JSON.stringify(val, null, spaces) : String(val);\n }; // Remove leading white space from a string\n \n var trimLeft = function trimLeft(str) {\n return toString$1(str).replace(RX_TRIM_LEFT, '');\n }; // Remove Trailing white space from a string\n \n var trim = function trim(str) {\n return toString$1(str).trim();\n }; // Lower case a string\n \n var lowerCase = function lowerCase(str) {\n return toString$1(str).toLowerCase();\n }; // Upper case a string\n \n var TABABLE_SELECTOR = ['button', '[href]:not(.disabled)', 'input', 'select', 'textarea', '[tabindex]', '[contenteditable]'].map(function (s) {\n return \"\".concat(s, \":not(:disabled):not([disabled])\");\n }).join(', ');\n var w$1 = hasWindowSupport ? window : {};\n var d = hasDocumentSupport ? document : {};\n var elProto = typeof Element !== 'undefined' ? Element.prototype : {}; // --- Normalization utils ---\n // See: https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill\n \n /* istanbul ignore next */\n \n var matchesEl = elProto.matches || elProto.msMatchesSelector || elProto.webkitMatchesSelector; // See: https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\n \n /* istanbul ignore next */\n \n var closestEl = elProto.closest || function (sel)\n /* istanbul ignore next */\n {\n var el = this;\n \n do {\n // Use our \"patched\" matches function\n if (matches(el, sel)) {\n return el;\n }\n \n el = el.parentElement || el.parentNode;\n } while (!isNull(el) && el.nodeType === Node.ELEMENT_NODE);\n \n return null;\n }; // `requestAnimationFrame()` convenience method\n \n /* istanbul ignore next: JSDOM always returns the first option */\n \n var requestAF = w$1.requestAnimationFrame || w$1.webkitRequestAnimationFrame || w$1.mozRequestAnimationFrame || w$1.msRequestAnimationFrame || w$1.oRequestAnimationFrame || // Fallback, but not a true polyfill\n // Only needed for Opera Mini\n \n /* istanbul ignore next */\n function (cb) {\n return setTimeout(cb, 16);\n };\n var MutationObs = w$1.MutationObserver || w$1.WebKitMutationObserver || w$1.MozMutationObserver || null; // --- Utils ---\n // Remove a node from DOM\n \n var removeNode = function removeNode(el) {\n return el && el.parentNode && el.parentNode.removeChild(el);\n }; // Determine if an element is an HTML element\n \n var isElement = function isElement(el) {\n return !!(el && el.nodeType === Node.ELEMENT_NODE);\n }; // Get the currently active HTML element\n \n var getActiveElement = function getActiveElement() {\n var excludes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var activeElement = d.activeElement;\n return activeElement && !excludes.some(function (el) {\n return el === activeElement;\n }) ? activeElement : null;\n }; // Returns `true` if a tag's name equals `name`\n \n var isTag = function isTag(tag, name) {\n return toString$1(tag).toLowerCase() === toString$1(name).toLowerCase();\n }; // Determine if an HTML element is the currently active element\n \n var isActiveElement = function isActiveElement(el) {\n return isElement(el) && el === getActiveElement();\n }; // Determine if an HTML element is visible - Faster than CSS check\n \n var isVisible = function isVisible(el) {\n if (!isElement(el) || !el.parentNode || !contains(d.body, el)) {\n // Note this can fail for shadow dom elements since they\n // are not a direct descendant of document.body\n return false;\n }\n \n if (el.style.display === 'none') {\n // We do this check to help with vue-test-utils when using v-show\n \n /* istanbul ignore next */\n return false;\n } // All browsers support getBoundingClientRect(), except JSDOM as it returns all 0's for values :(\n // So any tests that need isVisible will fail in JSDOM\n // Except when we override the getBCR prototype in some tests\n \n \n var bcr = getBCR(el);\n return !!(bcr && bcr.height > 0 && bcr.width > 0);\n }; // Determine if an element is disabled\n \n var isDisabled = function isDisabled(el) {\n return !isElement(el) || el.disabled || hasAttr(el, 'disabled') || hasClass(el, 'disabled');\n }; // Cause/wait-for an element to reflow its content (adjusting its height/width)\n \n var reflow = function reflow(el) {\n // Requesting an elements offsetHight will trigger a reflow of the element content\n \n /* istanbul ignore next: reflow doesn't happen in JSDOM */\n return isElement(el) && el.offsetHeight;\n }; // Select all elements matching selector. Returns `[]` if none found\n \n var selectAll = function selectAll(selector, root) {\n return from((isElement(root) ? root : d).querySelectorAll(selector));\n }; // Select a single element, returns `null` if not found\n \n var select = function select(selector, root) {\n return (isElement(root) ? root : d).querySelector(selector) || null;\n }; // Determine if an element matches a selector\n \n var matches = function matches(el, selector) {\n return isElement(el) ? matchesEl.call(el, selector) : false;\n }; // Finds closest element matching selector. Returns `null` if not found\n \n var closest = function closest(selector, root) {\n var includeRoot = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n \n if (!isElement(root)) {\n return null;\n }\n \n var el = closestEl.call(root, selector); // Native closest behaviour when `includeRoot` is truthy,\n // else emulate jQuery closest and return `null` if match is\n // the passed in root element when `includeRoot` is falsey\n \n return includeRoot ? el : el === root ? null : el;\n }; // Returns true if the parent element contains the child element\n \n var contains = function contains(parent, child) {\n return parent && isFunction(parent.contains) ? parent.contains(child) : false;\n }; // Get an element given an ID\n \n var getById = function getById(id) {\n return d.getElementById(/^#/.test(id) ? id.slice(1) : id) || null;\n }; // Add a class to an element\n \n var addClass = function addClass(el, className) {\n // We are checking for `el.classList` existence here since IE 11\n // returns `undefined` for some elements (e.g. SVG elements)\n // See https://github.com/bootstrap-vue/bootstrap-vue/issues/2713\n if (className && isElement(el) && el.classList) {\n el.classList.add(className);\n }\n }; // Remove a class from an element\n \n var removeClass = function removeClass(el, className) {\n // We are checking for `el.classList` existence here since IE 11\n // returns `undefined` for some elements (e.g. SVG elements)\n // See https://github.com/bootstrap-vue/bootstrap-vue/issues/2713\n if (className && isElement(el) && el.classList) {\n el.classList.remove(className);\n }\n }; // Test if an element has a class\n \n var hasClass = function hasClass(el, className) {\n // We are checking for `el.classList` existence here since IE 11\n // returns `undefined` for some elements (e.g. SVG elements)\n // See https://github.com/bootstrap-vue/bootstrap-vue/issues/2713\n if (className && isElement(el) && el.classList) {\n return el.classList.contains(className);\n }\n \n return false;\n }; // Set an attribute on an element\n \n var setAttr = function setAttr(el, attr, val) {\n if (attr && isElement(el)) {\n el.setAttribute(attr, val);\n }\n }; // Remove an attribute from an element\n \n var removeAttr = function removeAttr(el, attr) {\n if (attr && isElement(el)) {\n el.removeAttribute(attr);\n }\n }; // Get an attribute value from an element\n // Returns `null` if not found\n \n var getAttr = function getAttr(el, attr) {\n return attr && isElement(el) ? el.getAttribute(attr) : null;\n }; // Determine if an attribute exists on an element\n // Returns `true` or `false`, or `null` if element not found\n \n var hasAttr = function hasAttr(el, attr) {\n return attr && isElement(el) ? el.hasAttribute(attr) : null;\n }; // Return the Bounding Client Rect of an element\n // Returns `null` if not an element\n \n /* istanbul ignore next: getBoundingClientRect() doesn't work in JSDOM */\n \n var getBCR = function getBCR(el) {\n return isElement(el) ? el.getBoundingClientRect() : null;\n }; // Get computed style object for an element\n \n /* istanbul ignore next: getComputedStyle() doesn't work in JSDOM */\n \n var getCS = function getCS(el) {\n return hasWindowSupport && isElement(el) ? w$1.getComputedStyle(el) : {};\n }; // Returns a `Selection` object representing the range of text selected\n // Returns `null` if no window support is given\n \n /* istanbul ignore next: getSelection() doesn't work in JSDOM */\n \n var getSel = function getSel() {\n return hasWindowSupport && w$1.getSelection ? w$1.getSelection() : null;\n }; // Return an element's offset with respect to document element\n // https://j11y.io/jquery/#v=git&fn=jQuery.fn.offset\n \n var offset = function offset(el)\n /* istanbul ignore next: getBoundingClientRect(), getClientRects() doesn't work in JSDOM */\n {\n var _offset = {\n top: 0,\n left: 0\n };\n \n if (!isElement(el) || el.getClientRects().length === 0) {\n return _offset;\n }\n \n var bcr = getBCR(el);\n \n if (bcr) {\n var win = el.ownerDocument.defaultView;\n _offset.top = bcr.top + win.pageYOffset;\n _offset.left = bcr.left + win.pageXOffset;\n }\n \n return _offset;\n }; // Return an element's offset with respect to to its offsetParent\n // https://j11y.io/jquery/#v=git&fn=jQuery.fn.position\n \n var position = function position(el)\n /* istanbul ignore next: getBoundingClientRect() doesn't work in JSDOM */\n {\n var _offset = {\n top: 0,\n left: 0\n };\n \n if (!isElement(el)) {\n return _offset;\n }\n \n var parentOffset = {\n top: 0,\n left: 0\n };\n var elStyles = getCS(el);\n \n if (elStyles.position === 'fixed') {\n _offset = getBCR(el) || _offset;\n } else {\n _offset = offset(el);\n var doc = el.ownerDocument;\n var offsetParent = el.offsetParent || doc.documentElement;\n \n while (offsetParent && (offsetParent === doc.body || offsetParent === doc.documentElement) && getCS(offsetParent).position === 'static') {\n offsetParent = offsetParent.parentNode;\n }\n \n if (offsetParent && offsetParent !== el && offsetParent.nodeType === Node.ELEMENT_NODE) {\n parentOffset = offset(offsetParent);\n var offsetParentStyles = getCS(offsetParent);\n parentOffset.top += toFloat(offsetParentStyles.borderTopWidth, 0);\n parentOffset.left += toFloat(offsetParentStyles.borderLeftWidth, 0);\n }\n }\n \n return {\n top: _offset.top - parentOffset.top - toFloat(elStyles.marginTop, 0),\n left: _offset.left - parentOffset.left - toFloat(elStyles.marginLeft, 0)\n };\n }; // Find all tabable elements in the given element\n // Assumes users have not used `tabindex` > `0` on elements\n \n var getTabables = function getTabables() {\n var rootEl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;\n return selectAll(TABABLE_SELECTOR, rootEl).filter(isVisible).filter(function (el) {\n return el.tabIndex > -1 && !el.disabled;\n });\n }; // Attempt to focus an element, and return `true` if successful\n \n var attemptFocus = function attemptFocus(el) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n \n try {\n el.focus(options);\n } catch (_unused) {}\n \n return isActiveElement(el);\n }; // Attempt to blur an element, and return `true` if successful\n \n var attemptBlur = function attemptBlur(el) {\n try {\n el.blur();\n } catch (_unused2) {}\n \n return !isActiveElement(el);\n };\n \n var e=function(){return (e=Object.assign||function(e){for(var t,r=1,s=arguments.length;r 1 && arguments[1] !== undefined ? arguments[1] : {};\n var $slots = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n // Ensure names is an array\n names = concat(names).filter(identity); // Returns true if the either a $scopedSlot or $slot exists with the specified name\n \n return names.some(function (name) {\n return $scopedSlots[name] || $slots[name];\n });\n };\n /**\n * Returns VNodes for named slot either scoped or unscoped\n *\n * @param {String, Array} name or name[]\n * @param {String} scope\n * @param {Object} scopedSlots\n * @param {Object} slots\n * @returns {Array|undefined} VNodes\n */\n \n \n var normalizeSlot = function normalizeSlot(names) {\n var scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var $scopedSlots = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var $slots = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n // Ensure names is an array\n names = concat(names).filter(identity);\n var slot;\n \n for (var i = 0; i < names.length && !slot; i++) {\n var name = names[i];\n slot = $scopedSlots[name] || $slots[name];\n } // Note: in Vue 2.6.x, all named slots are also scoped slots\n \n \n return isFunction(slot) ? slot(scope) : slot;\n }; // Named exports\n \n var normalizeSlotMixin = {\n methods: {\n hasNormalizedSlot: function hasNormalizedSlot$1(names) {\n // Returns true if the either a $scopedSlot or $slot exists with the specified name\n // `names` can be a string name or an array of names\n return hasNormalizedSlot(names, this.$scopedSlots, this.$slots);\n },\n normalizeSlot: function normalizeSlot$1(names) {\n var scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n \n // Returns an array of rendered VNodes if slot found.\n // Returns undefined if not found.\n // `names` can be a string name or an array of names\n var vNodes = normalizeSlot(names, scope, this.$scopedSlots, this.$slots);\n \n return vNodes ? concat(vNodes) : vNodes;\n }\n }\n };\n \n var NAME$1 = 'BButtonClose';\n var props = {\n content: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$1, 'content');\n }\n },\n disabled: {\n type: Boolean,\n default: false\n },\n ariaLabel: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$1, 'ariaLabel');\n }\n },\n textVariant: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$1, 'textVariant');\n }\n }\n }; // @vue/component\n \n var BButtonClose = /*#__PURE__*/Vue.extend({\n name: NAME$1,\n functional: true,\n props: props,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n slots = _ref.slots,\n scopedSlots = _ref.scopedSlots;\n var $slots = slots();\n var $scopedSlots = scopedSlots || {};\n var componentData = {\n staticClass: 'close',\n class: _defineProperty({}, \"text-\".concat(props.textVariant), props.textVariant),\n attrs: {\n type: 'button',\n disabled: props.disabled,\n 'aria-label': props.ariaLabel ? String(props.ariaLabel) : null\n },\n on: {\n click: function click(evt) {\n // Ensure click on button HTML content is also disabled\n \n /* istanbul ignore if: bug in JSDOM still emits click on inner element */\n if (props.disabled && isEvent(evt)) {\n evt.stopPropagation();\n evt.preventDefault();\n }\n }\n }\n }; // Careful not to override the default slot with innerHTML\n \n if (!hasNormalizedSlot('default', $scopedSlots, $slots)) {\n componentData.domProps = {\n innerHTML: props.content\n };\n }\n \n return h('button', a(data, componentData), normalizeSlot('default', {}, $scopedSlots, $slots));\n }\n });\n \n var NAME$2 = 'BAlert'; // Convert `show` value to a number\n \n var parseCountDown = function parseCountDown(show) {\n if (show === '' || isBoolean(show)) {\n return 0;\n }\n \n show = toInteger(show, 0);\n return show > 0 ? show : 0;\n }; // Convert `show` value to a boolean\n \n \n var parseShow = function parseShow(show) {\n if (show === '' || show === true) {\n return true;\n }\n \n if (toInteger(show, 0) < 1) {\n // Boolean will always return false for the above comparison\n return false;\n }\n \n return !!show;\n }; // Is a value number like (i.e. a number or a number as string)\n \n \n var isNumericLike = function isNumericLike(value) {\n return !isNaN(toInteger(value));\n }; // @vue/component\n \n \n var BAlert = /*#__PURE__*/Vue.extend({\n name: NAME$2,\n mixins: [normalizeSlotMixin],\n model: {\n prop: 'show',\n event: 'input'\n },\n props: {\n variant: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$2, 'variant');\n }\n },\n dismissible: {\n type: Boolean,\n default: false\n },\n dismissLabel: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$2, 'dismissLabel');\n }\n },\n show: {\n type: [Boolean, Number, String],\n default: false\n },\n fade: {\n type: Boolean,\n default: false\n }\n },\n data: function data() {\n return {\n countDown: 0,\n countDownTimeout: null,\n // If initially shown, we need to set these for SSR\n localShow: parseShow(this.show)\n };\n },\n watch: {\n show: function show(newVal) {\n this.countDown = parseCountDown(newVal);\n this.localShow = parseShow(newVal);\n },\n countDown: function countDown(newVal) {\n var _this = this;\n \n this.clearCountDownInterval();\n \n if (isNumericLike(this.show)) {\n // Ignore if this.show transitions to a boolean value.\n this.$emit('dismiss-count-down', newVal);\n \n if (this.show !== newVal) {\n // Update the v-model if needed\n this.$emit('input', newVal);\n }\n \n if (newVal > 0) {\n this.localShow = true;\n this.countDownTimeout = setTimeout(function () {\n _this.countDown--;\n }, 1000);\n } else {\n // Slightly delay the hide to allow any UI updates\n this.$nextTick(function () {\n requestAF(function () {\n _this.localShow = false;\n });\n });\n }\n }\n },\n localShow: function localShow(newVal) {\n if (!newVal && (this.dismissible || isNumericLike(this.show))) {\n // Only emit dismissed events for dismissible or auto dismissing alerts\n this.$emit('dismissed');\n }\n \n if (!isNumericLike(this.show) && this.show !== newVal) {\n // Only emit booleans if we weren't passed a number via `this.show`\n this.$emit('input', newVal);\n }\n }\n },\n created: function created() {\n this.countDown = parseCountDown(this.show);\n this.localShow = parseShow(this.show);\n },\n mounted: function mounted() {\n this.countDown = parseCountDown(this.show);\n this.localShow = parseShow(this.show);\n },\n beforeDestroy: function beforeDestroy() {\n this.clearCountDownInterval();\n },\n methods: {\n dismiss: function dismiss() {\n this.clearCountDownInterval();\n this.countDown = 0;\n this.localShow = false;\n },\n clearCountDownInterval: function clearCountDownInterval() {\n if (this.countDownTimeout) {\n clearTimeout(this.countDownTimeout);\n this.countDownTimeout = null;\n }\n }\n },\n render: function render(h) {\n var $alert; // undefined\n \n if (this.localShow) {\n var $dismissBtn = h();\n \n if (this.dismissible) {\n // Add dismiss button\n $dismissBtn = h(BButtonClose, {\n attrs: {\n 'aria-label': this.dismissLabel\n },\n on: {\n click: this.dismiss\n }\n }, [this.normalizeSlot('dismiss')]);\n }\n \n $alert = h('div', {\n key: this._uid,\n staticClass: 'alert',\n class: _defineProperty({\n 'alert-dismissible': this.dismissible\n }, \"alert-\".concat(this.variant), this.variant),\n attrs: {\n role: 'alert',\n 'aria-live': 'polite',\n 'aria-atomic': true\n }\n }, [$dismissBtn, this.normalizeSlot('default')]);\n $alert = [$alert];\n }\n \n return h(BVTransition, {\n props: {\n noFade: !this.fade\n }\n }, $alert);\n }\n });\n \n var AlertPlugin = /*#__PURE__*/pluginFactory({\n components: {\n BAlert: BAlert\n }\n });\n \n // Math utilty functions\n var mathMin = Math.min;\n var mathMax = Math.max;\n var mathAbs = Math.abs;\n var mathCeil = Math.ceil;\n var mathFloor = Math.floor;\n var mathPow = Math.pow;\n var mathRound = Math.round;\n \n var NAME$3 = 'BAspect';\n var CLASS_NAME = 'b-aspect';\n var RX_ASPECT = /^\\d+(\\.\\d*)?[/:]\\d+(\\.\\d*)?$/;\n var RX_SEPARATOR = /[/:]/; // --- Main Component ---\n \n var BAspect = /*#__PURE__*/Vue.extend({\n name: NAME$3,\n mixins: [normalizeSlotMixin],\n props: {\n aspect: {\n // Accepts a number (i.e. `16 / 9`, `1`, `4 / 3`)\n // Or a string (i.e. '16/9', '16:9', '4:3' '1:1')\n type: [Number, String],\n default: '1:1'\n },\n tag: {\n type: String,\n default: 'div'\n }\n },\n computed: {\n padding: function padding() {\n var aspect = this.aspect;\n var ratio = 1;\n \n if (RX_ASPECT.test(aspect)) {\n // Width and/or Height can be a decimal value below `1`, so\n // we only fallback to `1` if the value is `0` or `NaN`\n var _aspect$split$map = aspect.split(RX_SEPARATOR).map(function (v) {\n return toFloat(v) || 1;\n }),\n _aspect$split$map2 = _slicedToArray(_aspect$split$map, 2),\n width = _aspect$split$map2[0],\n height = _aspect$split$map2[1];\n \n ratio = width / height;\n } else {\n ratio = toFloat(aspect) || 1;\n }\n \n return \"\".concat(100 / mathAbs(ratio), \"%\");\n }\n },\n render: function render(h) {\n var $sizer = h('div', {\n staticClass: \"\".concat(CLASS_NAME, \"-sizer flex-grow-1\"),\n style: {\n paddingBottom: this.padding,\n height: 0\n }\n });\n var $content = h('div', {\n staticClass: \"\".concat(CLASS_NAME, \"-content flex-grow-1 w-100 mw-100\"),\n style: {\n marginLeft: '-100%'\n }\n }, [this.normalizeSlot('default')]);\n return h(this.tag, {\n staticClass: \"\".concat(CLASS_NAME, \" d-flex\")\n }, [$sizer, $content]);\n }\n });\n \n var AspectPlugin = /*#__PURE__*/pluginFactory({\n components: {\n BAspect: BAspect\n }\n });\n \n var prefixPropName = function prefixPropName(prefix, value) {\n return prefix + upperFirst(value);\n }; // Remove a prefix from a property\n \n var unprefixPropName = function unprefixPropName(prefix, value) {\n return lowerFirst(value.replace(prefix, ''));\n }; // Suffix can be a falsey value so nothing is appended to string\n // (helps when looping over props & some shouldn't change)\n // Use data last parameters to allow for currying\n \n var suffixPropName = function suffixPropName(suffix, str) {\n return str + (suffix ? upperFirst(suffix) : '');\n }; // Copies props from one array/object to a new array/object\n // Prop values are also cloned as new references to prevent possible\n // mutation of original prop object values\n // Optionally accepts a function to transform the prop name\n \n var copyProps = function copyProps(props) {\n var transformFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : identity;\n \n if (isArray(props)) {\n return props.map(transformFn);\n }\n \n var copied = {};\n \n for (var prop in props) {\n /* istanbul ignore else */\n if (hasOwnProperty(props, prop)) {\n // If the prop value is an object, do a shallow clone\n // to prevent potential mutations to the original object\n copied[transformFn(prop)] = isObject(props[prop]) ? clone(props[prop]) : props[prop];\n }\n }\n \n return copied;\n }; // Given an array of properties or an object of property keys,\n // plucks all the values off the target object, returning a new object\n // that has props that reference the original prop values\n \n var pluckProps = function pluckProps(keysToPluck, objToPluck) {\n var transformFn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : identity;\n return (isArray(keysToPluck) ? keysToPluck.slice() : keys(keysToPluck)).reduce(function (memo, prop) {\n memo[transformFn(prop)] = objToPluck[prop];\n return memo;\n }, {});\n };\n \n var ANCHOR_TAG = 'a'; // Precompile RegExp\n \n var commaRE = /%2C/g;\n var encodeReserveRE = /[!'()*]/g;\n var plusRE = /\\+/g;\n var queryStartRE = /^(\\?|#|&)/; // Method to replace reserved chars\n \n var encodeReserveReplacer = function encodeReserveReplacer(c) {\n return '%' + c.charCodeAt(0).toString(16);\n }; // Fixed encodeURIComponent which is more conformant to RFC3986:\n // - escapes [!'()*]\n // - preserve commas\n \n \n var encode = function encode(str) {\n return encodeURIComponent(toString$1(str)).replace(encodeReserveRE, encodeReserveReplacer).replace(commaRE, ',');\n };\n \n var decode = decodeURIComponent; // Stringifies an object of query parameters\n // See: https://github.com/vuejs/vue-router/blob/dev/src/util/query.js\n \n var stringifyQueryObj = function stringifyQueryObj(obj) {\n if (!isPlainObject(obj)) {\n return '';\n }\n \n var query = keys(obj).map(function (key) {\n var val = obj[key];\n \n if (isUndefined(val)) {\n return '';\n } else if (isNull(val)) {\n return encode(key);\n } else if (isArray(val)) {\n return val.reduce(function (results, val2) {\n if (isNull(val2)) {\n results.push(encode(key));\n } else if (!isUndefined(val2)) {\n // Faster than string interpolation\n results.push(encode(key) + '=' + encode(val2));\n }\n \n return results;\n }, []).join('&');\n } // Faster than string interpolation\n \n \n return encode(key) + '=' + encode(val);\n })\n /* must check for length, as we only want to filter empty strings, not things that look falsey! */\n .filter(function (x) {\n return x.length > 0;\n }).join('&');\n return query ? \"?\".concat(query) : '';\n };\n var parseQuery = function parseQuery(query) {\n var parsed = {};\n query = toString$1(query).trim().replace(queryStartRE, '');\n \n if (!query) {\n return parsed;\n }\n \n query.split('&').forEach(function (param) {\n var parts = param.replace(plusRE, ' ').split('=');\n var key = decode(parts.shift());\n var val = parts.length > 0 ? decode(parts.join('=')) : null;\n \n if (isUndefined(parsed[key])) {\n parsed[key] = val;\n } else if (isArray(parsed[key])) {\n parsed[key].push(val);\n } else {\n parsed[key] = [parsed[key], val];\n }\n });\n return parsed;\n };\n var isLink = function isLink(props) {\n return !!(props.href || props.to);\n };\n var isRouterLink = function isRouterLink(tag) {\n return !isTag(tag, ANCHOR_TAG);\n };\n var computeTag = function computeTag() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n to = _ref.to,\n disabled = _ref.disabled,\n routerComponentName = _ref.routerComponentName;\n \n var thisOrParent = arguments.length > 1 ? arguments[1] : undefined;\n var hasRouter = thisOrParent.$router;\n \n if (!hasRouter || hasRouter && disabled || hasRouter && !to) {\n return ANCHOR_TAG;\n } // TODO:\n // Check registered components for existence of user supplied router link component name\n // We would need to check PascalCase, kebab-case, and camelCase versions of name:\n // const name = routerComponentName\n // const names = [name, PascalCase(name), KebabCase(name), CamelCase(name)]\n // exists = names.some(name => !!thisOrParent.$options.components[name])\n // And may want to cache the result for performance or we just let the render fail\n // if the component is not registered\n \n \n return routerComponentName || (thisOrParent.$nuxt ? 'nuxt-link' : 'router-link');\n };\n var computeRel = function computeRel() {\n var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n target = _ref2.target,\n rel = _ref2.rel;\n \n if (target === '_blank' && isNull(rel)) {\n return 'noopener';\n }\n \n return rel || null;\n };\n var computeHref = function computeHref() {\n var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n href = _ref3.href,\n to = _ref3.to;\n \n var tag = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ANCHOR_TAG;\n var fallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '#';\n var toFallback = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';\n \n // We've already checked the $router in computeTag(), so isRouterLink() indicates a live router.\n // When deferring to Vue Router's router-link, don't use the href attribute at all.\n // We return null, and then remove href from the attributes passed to router-link\n if (isRouterLink(tag)) {\n return null;\n } // Return `href` when explicitly provided\n \n \n if (href) {\n return href;\n } // Reconstruct `href` when `to` used, but no router\n \n \n if (to) {\n // Fallback to `to` prop (if `to` is a string)\n if (isString(to)) {\n return to || toFallback;\n } // Fallback to `to.path + to.query + to.hash` prop (if `to` is an object)\n \n \n if (isPlainObject(to) && (to.path || to.query || to.hash)) {\n var path = toString$1(to.path);\n var query = stringifyQueryObj(to.query);\n var hash = toString$1(to.hash);\n hash = !hash || hash.charAt(0) === '#' ? hash : \"#\".concat(hash);\n return \"\".concat(path).concat(query).concat(hash) || toFallback;\n }\n } // If nothing is provided return the fallback\n \n \n return fallback;\n };\n \n /*\n * Key Codes (events)\n */\n var KEY_CODES = freeze({\n SPACE: 32,\n ENTER: 13,\n ESC: 27,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n PAGEUP: 33,\n PAGEDOWN: 34,\n HOME: 36,\n END: 35,\n TAB: 9,\n SHIFT: 16,\n CTRL: 17,\n BACKSPACE: 8,\n ALT: 18,\n PAUSE: 19,\n BREAK: 19,\n INSERT: 45,\n INS: 45,\n DELETE: 46\n });\n \n var makePropWatcher = function makePropWatcher(propName) {\n return {\n handler: function handler(newVal, oldVal) {\n for (var key in oldVal) {\n if (!hasOwnProperty(newVal, key)) {\n this.$delete(this.$data[propName], key);\n }\n }\n \n for (var _key in newVal) {\n this.$set(this.$data[propName], _key, newVal[_key]);\n }\n }\n };\n };\n var makePropCacheMixin = function makePropCacheMixin(propName, proxyPropName) {\n return {\n data: function data() {\n return _defineProperty({}, proxyPropName, {});\n },\n watch: _defineProperty({}, propName, makePropWatcher(proxyPropName)),\n created: function created() {\n this[proxyPropName] = _objectSpread2({}, this[propName]);\n }\n };\n };\n \n var attrsMixin = makePropCacheMixin('$attrs', 'bvAttrs');\n \n var listenersMixin = makePropCacheMixin('$listeners', 'bvListeners');\n \n var NAME$4 = 'BLink'; // --- Props ---\n // specific props\n \n var routerLinkProps = {\n to: {\n type: [String, Object],\n default: null\n },\n append: {\n type: Boolean,\n default: false\n },\n replace: {\n type: Boolean,\n default: false\n },\n event: {\n type: [String, Array],\n default: 'click'\n },\n activeClass: {\n type: String // default: undefined\n \n },\n exact: {\n type: Boolean,\n default: false\n },\n exactActiveClass: {\n type: String // default: undefined\n \n },\n routerTag: {\n type: String,\n default: 'a'\n }\n }; // specific props\n \n var nuxtLinkProps = {\n prefetch: {\n type: Boolean,\n // Must be `null` to fall back to the value defined in the\n // `nuxt.config.js` configuration file for `router.prefetchLinks`\n // We convert `null` to `undefined`, so that Nuxt.js will use the\n // compiled default. Vue treats `undefined` as default of `false`\n // for Boolean props, so we must set it as `null` here to be a\n // true tri-state prop\n default: null\n },\n noPrefetch: {\n type: Boolean,\n default: false\n }\n };\n var props$1 = _objectSpread2(_objectSpread2(_objectSpread2({\n href: {\n type: String,\n default: null\n },\n rel: {\n type: String,\n // Must be `null` if no value provided\n default: null\n },\n target: {\n type: String,\n default: '_self'\n },\n active: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n }\n }, routerLinkProps), nuxtLinkProps), {}, {\n // To support 3rd party router links based on `` (i.e. `g-link` for Gridsome)\n // Default is to auto choose between `` and ``\n // Gridsome doesn't provide a mechanism to auto detect and has caveats\n // such as not supporting FQDN URLs or hash only URLs\n routerComponentName: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$4, 'routerComponentName');\n }\n }\n }); // --- Main component ---\n // @vue/component\n \n var BLink = /*#__PURE__*/Vue.extend({\n name: 'BLink',\n // Mixin order is important!\n mixins: [attrsMixin, listenersMixin, normalizeSlotMixin],\n inheritAttrs: false,\n props: props$1,\n computed: {\n computedTag: function computedTag() {\n // We don't pass `this` as the first arg as we need reactivity of the props\n var to = this.to,\n disabled = this.disabled,\n routerComponentName = this.routerComponentName;\n return computeTag({\n to: to,\n disabled: disabled,\n routerComponentName: routerComponentName\n }, this);\n },\n isRouterLink: function isRouterLink$1() {\n return isRouterLink(this.computedTag);\n },\n computedRel: function computedRel() {\n // We don't pass `this` as the first arg as we need reactivity of the props\n return computeRel({\n target: this.target,\n rel: this.rel\n });\n },\n computedHref: function computedHref() {\n // We don't pass `this` as the first arg as we need reactivity of the props\n return computeHref({\n to: this.to,\n href: this.href\n }, this.computedTag);\n },\n computedProps: function computedProps() {\n var prefetch = this.prefetch;\n return this.isRouterLink ? _objectSpread2(_objectSpread2({}, pluckProps(_objectSpread2(_objectSpread2({}, routerLinkProps), nuxtLinkProps), this)), {}, {\n // Coerce `prefetch` value `null` to be `undefined`\n prefetch: isBoolean(prefetch) ? prefetch : undefined,\n // Pass `router-tag` as `tag` prop\n tag: this.routerTag\n }) : {};\n },\n computedAttrs: function computedAttrs() {\n var bvAttrs = this.bvAttrs,\n href = this.computedHref,\n rel = this.computedRel,\n disabled = this.disabled,\n target = this.target,\n routerTag = this.routerTag,\n isRouterLink = this.isRouterLink;\n return _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, bvAttrs), href ? {\n href: href\n } : {}), isRouterLink && routerTag !== 'a' && routerTag !== 'area' ? {} : {\n rel: rel,\n target: target\n }), {}, {\n tabindex: disabled ? '-1' : isUndefined(bvAttrs.tabindex) ? null : bvAttrs.tabindex,\n 'aria-disabled': disabled ? 'true' : null\n });\n },\n computedListeners: function computedListeners() {\n return _objectSpread2(_objectSpread2({}, this.bvListeners), {}, {\n // We want to overwrite any click handler since our callback\n // will invoke the user supplied handler(s) if `!this.disabled`\n click: this.onClick\n });\n }\n },\n methods: {\n onClick: function onClick(evt) {\n var _arguments = arguments;\n var evtIsEvent = isEvent(evt);\n var isRouterLink = this.isRouterLink;\n var suppliedHandler = this.bvListeners.click;\n \n if (evtIsEvent && this.disabled) {\n // Stop event from bubbling up\n evt.stopPropagation(); // Kill the event loop attached to this specific `EventTarget`\n // Needed to prevent `vue-router` for doing its thing\n \n evt.stopImmediatePropagation();\n } else {\n /* istanbul ignore next: difficult to test, but we know it works */\n if (isRouterLink && evt.currentTarget.__vue__) {\n // Router links do not emit instance `click` events, so we\n // add in an `$emit('click', evt)` on its Vue instance\n evt.currentTarget.__vue__.$emit('click', evt);\n } // Call the suppliedHandler(s), if any provided\n \n \n concat(suppliedHandler).filter(function (h) {\n return isFunction(h);\n }).forEach(function (handler) {\n handler.apply(void 0, _toConsumableArray(_arguments));\n }); // Emit the global `$root` click event\n \n this.$root.$emit('clicked::link', evt);\n } // Stop scroll-to-top behavior or navigation on\n // regular links when href is just '#'\n \n \n if (evtIsEvent && (this.disabled || !isRouterLink && this.computedHref === '#')) {\n evt.preventDefault();\n }\n },\n focus: function focus() {\n attemptFocus(this.$el);\n },\n blur: function blur() {\n attemptBlur(this.$el);\n }\n },\n render: function render(h) {\n var active = this.active,\n disabled = this.disabled;\n return h(this.computedTag, _defineProperty({\n class: {\n active: active,\n disabled: disabled\n },\n attrs: this.computedAttrs,\n props: this.computedProps\n }, this.isRouterLink ? 'nativeOn' : 'on', this.computedListeners), this.normalizeSlot('default'));\n }\n });\n \n var NAME$5 = 'BButton'; // --- Props ---\n \n var linkProps = omit(props$1, ['event', 'routerTag']);\n delete linkProps.href.default;\n delete linkProps.to.default;\n var btnProps = {\n block: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n size: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$5, 'size');\n }\n },\n variant: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$5, 'variant');\n }\n },\n type: {\n type: String,\n default: 'button'\n },\n tag: {\n type: String,\n default: 'button'\n },\n pill: {\n type: Boolean,\n default: false\n },\n squared: {\n type: Boolean,\n default: false\n },\n pressed: {\n // Tri-state: `true`, `false` or `null`\n // => On, off, not a toggle\n type: Boolean,\n default: null\n }\n };\n var props$2 = _objectSpread2(_objectSpread2({}, btnProps), linkProps); // --- Helper methods ---\n // Focus handler for toggle buttons\n // Needs class of 'focus' when focused\n \n var handleFocus = function handleFocus(evt) {\n if (evt.type === 'focusin') {\n addClass(evt.target, 'focus');\n } else if (evt.type === 'focusout') {\n removeClass(evt.target, 'focus');\n }\n }; // Is the requested button a link?\n // If tag prop is set to `a`, we use a to get proper disabled handling\n \n \n var isLink$1 = function isLink$1(props) {\n return isLink(props) || isTag(props.tag, 'a');\n }; // Is the button to be a toggle button?\n \n \n var isToggle = function isToggle(props) {\n return isBoolean(props.pressed);\n }; // Is the button \"really\" a button?\n \n \n var isButton = function isButton(props) {\n return !(isLink$1(props) || props.tag && !isTag(props.tag, 'button'));\n }; // Is the requested tag not a button or link?\n \n \n var isNonStandardTag = function isNonStandardTag(props) {\n return !isLink$1(props) && !isButton(props);\n }; // Compute required classes (non static classes)\n \n \n var computeClass = function computeClass(props) {\n var _ref;\n \n return [\"btn-\".concat(props.variant || getComponentConfig(NAME$5, 'variant')), (_ref = {}, _defineProperty(_ref, \"btn-\".concat(props.size), props.size), _defineProperty(_ref, 'btn-block', props.block), _defineProperty(_ref, 'rounded-pill', props.pill), _defineProperty(_ref, 'rounded-0', props.squared && !props.pill), _defineProperty(_ref, \"disabled\", props.disabled), _defineProperty(_ref, \"active\", props.pressed), _ref)];\n }; // Compute the link props to pass to b-link (if required)\n \n \n var computeLinkProps = function computeLinkProps(props) {\n return isLink$1(props) ? pluckProps(linkProps, props) : {};\n }; // Compute the attributes for a button\n \n \n var computeAttrs = function computeAttrs(props, data) {\n var button = isButton(props);\n var link = isLink$1(props);\n var toggle = isToggle(props);\n var nonStandardTag = isNonStandardTag(props);\n var hashLink = link && props.href === '#';\n var role = data.attrs && data.attrs.role ? data.attrs.role : null;\n var tabindex = data.attrs ? data.attrs.tabindex : null;\n \n if (nonStandardTag || hashLink) {\n tabindex = '0';\n }\n \n return {\n // Type only used for \"real\" buttons\n type: button && !link ? props.type : null,\n // Disabled only set on \"real\" buttons\n disabled: button ? props.disabled : null,\n // We add a role of button when the tag is not a link or button for ARIA\n // Don't bork any role provided in `data.attrs` when `isLink` or `isButton`\n // Except when link has `href` of `#`\n role: nonStandardTag || hashLink ? 'button' : role,\n // We set the `aria-disabled` state for non-standard tags\n 'aria-disabled': nonStandardTag ? String(props.disabled) : null,\n // For toggles, we need to set the pressed state for ARIA\n 'aria-pressed': toggle ? String(props.pressed) : null,\n // `autocomplete=\"off\"` is needed in toggle mode to prevent some browsers\n // from remembering the previous setting when using the back button\n autocomplete: toggle ? 'off' : null,\n // `tabindex` is used when the component is not a button\n // Links are tabbable, but don't allow disabled, while non buttons or links\n // are not tabbable, so we mimic that functionality by disabling tabbing\n // when disabled, and adding a `tabindex=\"0\"` to non buttons or non links\n tabindex: props.disabled && !button ? '-1' : tabindex\n };\n }; // --- Main component ---\n // @vue/component\n \n \n var BButton = /*#__PURE__*/Vue.extend({\n name: NAME$5,\n functional: true,\n props: props$2,\n render: function render(h, _ref2) {\n var props = _ref2.props,\n data = _ref2.data,\n listeners = _ref2.listeners,\n children = _ref2.children;\n var toggle = isToggle(props);\n var link = isLink$1(props);\n var nonStandardTag = isNonStandardTag(props);\n var hashLink = link && props.href === '#';\n var on = {\n keydown: function keydown(evt) {\n // When the link is a `href=\"#\"` or a non-standard tag (has `role=\"button\"`),\n // we add a keydown handlers for SPACE/ENTER\n \n /* istanbul ignore next */\n if (props.disabled || !(nonStandardTag || hashLink)) {\n return;\n }\n \n var keyCode = evt.keyCode; // Add SPACE handler for `href=\"#\"` and ENTER handler for non-standard tags\n \n if (keyCode === KEY_CODES.SPACE || keyCode === KEY_CODES.ENTER && nonStandardTag) {\n var target = evt.currentTarget || evt.target;\n evt.preventDefault();\n target.click();\n }\n },\n click: function click(evt) {\n /* istanbul ignore if: blink/button disabled should handle this */\n if (props.disabled && isEvent(evt)) {\n evt.stopPropagation();\n evt.preventDefault();\n } else if (toggle && listeners && listeners['update:pressed']) {\n // Send `.sync` updates to any \"pressed\" prop (if `.sync` listeners)\n // `concat()` will normalize the value to an array without\n // double wrapping an array value in an array\n concat(listeners['update:pressed']).forEach(function (fn) {\n if (isFunction(fn)) {\n fn(!props.pressed);\n }\n });\n }\n }\n };\n \n if (toggle) {\n on.focusin = handleFocus;\n on.focusout = handleFocus;\n }\n \n var componentData = {\n staticClass: 'btn',\n class: computeClass(props),\n props: computeLinkProps(props),\n attrs: computeAttrs(props, data),\n on: on\n };\n return h(link ? BLink : props.tag, a(data, componentData), children);\n }\n });\n \n var commonIconProps = {\n variant: {\n type: String,\n default: null\n },\n fontScale: {\n type: [Number, String],\n default: 1\n },\n scale: {\n type: [Number, String],\n default: 1\n },\n rotate: {\n type: [Number, String],\n default: 0\n },\n flipH: {\n type: Boolean,\n default: false\n },\n flipV: {\n type: Boolean,\n default: false\n },\n shiftH: {\n type: [Number, String],\n default: 0\n },\n shiftV: {\n type: [Number, String],\n default: 0\n },\n animation: {\n type: String,\n default: null\n }\n }; // Base attributes needed on all icons\n \n var baseAttrs = {\n viewBox: '0 0 16 16',\n width: '1em',\n height: '1em',\n focusable: 'false',\n role: 'img',\n 'aria-label': 'icon'\n }; // Attributes that are nulled out when stacked\n \n var stackedAttrs = {\n width: null,\n height: null,\n focusable: null,\n role: null,\n 'aria-label': null\n }; // Shared private base component to reduce bundle/runtime size\n // @vue/component\n \n var BVIconBase = /*#__PURE__*/Vue.extend({\n name: 'BVIconBase',\n functional: true,\n props: _objectSpread2({\n content: {\n type: String\n },\n stacked: {\n type: Boolean,\n default: false\n }\n }, commonIconProps),\n render: function render(h, _ref) {\n var _class;\n \n var data = _ref.data,\n props = _ref.props,\n children = _ref.children;\n var fontScale = mathMax(toFloat(props.fontScale, 1), 0) || 1;\n var scale = mathMax(toFloat(props.scale, 1), 0) || 1;\n var rotate = toFloat(props.rotate, 0);\n var shiftH = toFloat(props.shiftH, 0);\n var shiftV = toFloat(props.shiftV, 0);\n var flipH = props.flipH;\n var flipV = props.flipV;\n var animation = props.animation; // Compute the transforms\n // Note that order is important as SVG transforms are applied in order from\n // left to right and we want flipping/scale to occur before rotation\n // Note shifting is applied separately\n // Assumes that the viewbox is `0 0 16 16` (`8 8` is the center)\n \n var hasScale = flipH || flipV || scale !== 1;\n var hasTransforms = hasScale || rotate;\n var hasShift = shiftH || shiftV;\n var transforms = [hasTransforms ? 'translate(8 8)' : null, hasScale ? \"scale(\".concat((flipH ? -1 : 1) * scale, \" \").concat((flipV ? -1 : 1) * scale, \")\") : null, rotate ? \"rotate(\".concat(rotate, \")\") : null, hasTransforms ? 'translate(-8 -8)' : null].filter(identity); // Handling stacked icons\n \n var isStacked = props.stacked;\n var hasContent = !isUndefinedOrNull(props.content); // We wrap the content in a `` for handling the transforms (except shift)\n \n var $inner = h('g', {\n attrs: {\n transform: transforms.join(' ') || null\n },\n domProps: hasContent ? {\n innerHTML: props.content || ''\n } : {}\n }, children); // If needed, we wrap in an additional `` in order to handle the shifting\n \n if (hasShift) {\n $inner = h('g', {\n attrs: {\n transform: \"translate(\".concat(16 * shiftH / 16, \" \").concat(-16 * shiftV / 16, \")\")\n }\n }, [$inner]);\n }\n \n if (isStacked) {\n // Wrap in an additional `` for proper\n // animation handling if stacked\n $inner = h('g', {}, [$inner]);\n }\n \n return h('svg', a({\n staticClass: 'b-icon bi',\n class: (_class = {}, _defineProperty(_class, \"text-\".concat(props.variant), !!props.variant), _defineProperty(_class, \"b-icon-animation-\".concat(animation), !!animation), _class),\n attrs: baseAttrs,\n style: isStacked ? {} : {\n fontSize: fontScale === 1 ? null : \"\".concat(fontScale * 100, \"%\")\n }\n }, // Merge in user supplied data\n data, // If icon is stacked, null out some attrs\n isStacked ? {\n attrs: stackedAttrs\n } : {}, // These cannot be overridden by users\n {\n attrs: {\n xmlns: isStacked ? null : 'http://www.w3.org/2000/svg',\n fill: 'currentColor'\n }\n }), [$inner]);\n }\n });\n \n /**\n * Icon component generator function\n *\n * @param {string} icon name (minus the leading `BIcon`)\n * @param {string} raw `innerHTML` for SVG\n * @return {VueComponent}\n */\n \n var makeIcon = function makeIcon(name, content) {\n // For performance reason we pre-compute some values, so that\n // they are not computed on each render of the icon component\n var kebabName = kebabCase(name);\n var iconName = \"BIcon\".concat(pascalCase(name));\n var iconNameClass = \"bi-\".concat(kebabName);\n var svgContent = trim(content || ''); // Return the icon component definition\n \n return /*#__PURE__*/Vue.extend({\n name: iconName,\n functional: true,\n props: _objectSpread2(_objectSpread2({}, commonIconProps), {}, {\n stacked: {\n type: Boolean,\n default: false\n }\n }),\n render: function render(h, _ref) {\n var data = _ref.data,\n props = _ref.props;\n return h(BVIconBase, a(data, {\n staticClass: iconNameClass,\n props: _objectSpread2(_objectSpread2({}, props), {}, {\n content: svgContent\n }),\n attrs: {\n 'aria-label': kebabName.replace(/-/g, ' ')\n }\n }));\n }\n });\n };\n \n // --- BEGIN AUTO-GENERATED FILE ---\n var BIconBlank=/*#__PURE__*/makeIcon('Blank','');// --- Bootstrap Icons ---\n var BIconCalendar=/*#__PURE__*/makeIcon('Calendar','');// eslint-disable-next-line\n var BIconCalendarFill=/*#__PURE__*/makeIcon('CalendarFill','');// eslint-disable-next-line\n var BIconChevronBarLeft=/*#__PURE__*/makeIcon('ChevronBarLeft','');// eslint-disable-next-line\n var BIconChevronDoubleLeft=/*#__PURE__*/makeIcon('ChevronDoubleLeft','');// eslint-disable-next-line\n var BIconChevronDown=/*#__PURE__*/makeIcon('ChevronDown','');// eslint-disable-next-line\n var BIconChevronLeft=/*#__PURE__*/makeIcon('ChevronLeft','');// eslint-disable-next-line\n var BIconChevronUp=/*#__PURE__*/makeIcon('ChevronUp','');// eslint-disable-next-line\n var BIconCircleFill=/*#__PURE__*/makeIcon('CircleFill','');// eslint-disable-next-line\n var BIconClock=/*#__PURE__*/makeIcon('Clock','');// eslint-disable-next-line\n var BIconClockFill=/*#__PURE__*/makeIcon('ClockFill','');// eslint-disable-next-line\n var BIconDash=/*#__PURE__*/makeIcon('Dash','');// eslint-disable-next-line\n var BIconPersonFill=/*#__PURE__*/makeIcon('PersonFill','');// eslint-disable-next-line\n var BIconPlus=/*#__PURE__*/makeIcon('Plus','');// eslint-disable-next-line\n var BIconStar=/*#__PURE__*/makeIcon('Star','');// eslint-disable-next-line\n var BIconStarFill=/*#__PURE__*/makeIcon('StarFill','');// eslint-disable-next-line\n var BIconStarHalf=/*#__PURE__*/makeIcon('StarHalf','');// eslint-disable-next-line\n var BIconX=/*#__PURE__*/makeIcon('X','');// eslint-disable-next-line\n // --- END AUTO-GENERATED FILE ---\n \n var RX_ICON_PREFIX = /^BIcon/; // Helper BIcon component\n // Requires the requested icon component to be installed\n \n var BIcon = /*#__PURE__*/Vue.extend({\n name: 'BIcon',\n functional: true,\n props: _objectSpread2(_objectSpread2({\n icon: {\n type: String,\n default: null\n }\n }, commonIconProps), {}, {\n stacked: {\n type: Boolean,\n default: false\n }\n }),\n render: function render(h, _ref) {\n var data = _ref.data,\n props = _ref.props,\n parent = _ref.parent;\n var icon = pascalCase(trim(props.icon || '')).replace(RX_ICON_PREFIX, '');\n var iconName = \"BIcon\".concat(icon); // If parent context exists, we check to see if the icon has been registered\n // Either locally in the parent component, or globally at the `$root` level\n // If not registered, we render a blank icon\n \n var components = ((parent || {}).$options || {}).components;\n var componentRefOrName = icon && components ? components[iconName] || BIconBlank : icon ? iconName : BIconBlank;\n return h(componentRefOrName, a(data, {\n props: _objectSpread2(_objectSpread2({}, props), {}, {\n icon: null\n })\n }));\n }\n });\n \n var NAME$6 = 'BAvatar';\n var CLASS_NAME$1 = 'b-avatar';\n var RX_NUMBER = /^[0-9]*\\.?[0-9]+$/;\n var FONT_SIZE_SCALE = 0.4;\n var BADGE_FONT_SIZE_SCALE = FONT_SIZE_SCALE * 0.7;\n var DEFAULT_SIZES = {\n sm: '1.5em',\n md: '2.5em',\n lg: '3.5em'\n }; // --- Props ---\n \n var linkProps$1 = omit(props$1, ['active', 'event', 'routerTag']);\n \n var props$3 = _objectSpread2(_objectSpread2({\n src: {\n type: String // default: null\n \n },\n text: {\n type: String // default: null\n \n },\n icon: {\n type: String // default: null\n \n },\n alt: {\n type: String,\n default: 'avatar'\n },\n variant: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$6, 'variant');\n }\n },\n size: {\n type: [Number, String],\n default: null\n },\n square: {\n type: Boolean,\n default: false\n },\n rounded: {\n type: [Boolean, String],\n default: false\n },\n button: {\n type: Boolean,\n default: false\n },\n buttonType: {\n type: String,\n default: 'button'\n },\n badge: {\n type: [Boolean, String],\n default: false\n },\n badgeVariant: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$6, 'badgeVariant');\n }\n },\n badgeTop: {\n type: Boolean,\n default: false\n },\n badgeLeft: {\n type: Boolean,\n default: false\n },\n badgeOffset: {\n type: String,\n default: '0px'\n }\n }, linkProps$1), {}, {\n ariaLabel: {\n type: String // default: null\n \n }\n }); // --- Utility methods ---\n \n \n var computeSize = function computeSize(value) {\n // Default to `md` size when `null`, or parse to\n // number when value is a float-like string\n value = isUndefinedOrNull(value) || value === '' ? 'md' : isString(value) && RX_NUMBER.test(value) ? toFloat(value, 0) : value; // Convert all numbers to pixel values\n // Handle default sizes when `sm`, `md` or `lg`\n // Or use value as is\n \n return isNumber(value) ? \"\".concat(value, \"px\") : DEFAULT_SIZES[value] || value;\n }; // --- Main component ---\n // @vue/component\n \n var BAvatar = /*#__PURE__*/Vue.extend({\n name: NAME$6,\n mixins: [normalizeSlotMixin],\n inject: {\n bvAvatarGroup: {\n default: null\n }\n },\n props: props$3,\n data: function data() {\n return {\n localSrc: this.src || null\n };\n },\n computed: {\n computedSize: function computedSize() {\n // Always use the avatar group size\n return computeSize(this.bvAvatarGroup ? this.bvAvatarGroup.size : this.size);\n },\n computedVariant: function computedVariant() {\n // Prefer avatar-group variant if provided\n var avatarGroup = this.bvAvatarGroup;\n return avatarGroup && avatarGroup.variant ? avatarGroup.variant : this.variant;\n },\n computedRounded: function computedRounded() {\n var avatarGroup = this.bvAvatarGroup;\n var square = avatarGroup && avatarGroup.square ? true : this.square;\n var rounded = avatarGroup && avatarGroup.rounded ? avatarGroup.rounded : this.rounded;\n return square ? '0' : rounded === '' ? true : rounded || 'circle';\n },\n fontStyle: function fontStyle() {\n var fontSize = this.computedSize;\n fontSize = fontSize ? \"calc(\".concat(fontSize, \" * \").concat(FONT_SIZE_SCALE, \")\") : null;\n return fontSize ? {\n fontSize: fontSize\n } : {};\n },\n marginStyle: function marginStyle() {\n var avatarGroup = this.bvAvatarGroup;\n var overlapScale = avatarGroup ? avatarGroup.overlapScale : 0;\n var size = this.computedSize;\n var value = size && overlapScale ? \"calc(\".concat(size, \" * -\").concat(overlapScale, \")\") : null;\n return value ? {\n marginLeft: value,\n marginRight: value\n } : {};\n },\n badgeStyle: function badgeStyle() {\n var size = this.computedSize,\n badgeTop = this.badgeTop,\n badgeLeft = this.badgeLeft,\n badgeOffset = this.badgeOffset;\n var offset = badgeOffset || '0px';\n return {\n fontSize: size ? \"calc(\".concat(size, \" * \").concat(BADGE_FONT_SIZE_SCALE, \" )\") : null,\n top: badgeTop ? offset : null,\n bottom: badgeTop ? null : offset,\n left: badgeLeft ? offset : null,\n right: badgeLeft ? null : offset\n };\n }\n },\n watch: {\n src: function src(newSrc, oldSrc) {\n if (newSrc !== oldSrc) {\n this.localSrc = newSrc || null;\n }\n }\n },\n methods: {\n onImgError: function onImgError(evt) {\n this.localSrc = null;\n this.$emit('img-error', evt);\n },\n onClick: function onClick(evt) {\n this.$emit('click', evt);\n }\n },\n render: function render(h) {\n var _class2;\n \n var variant = this.computedVariant,\n disabled = this.disabled,\n rounded = this.computedRounded,\n icon = this.icon,\n src = this.localSrc,\n text = this.text,\n fontStyle = this.fontStyle,\n marginStyle = this.marginStyle,\n size = this.computedSize,\n button = this.button,\n type = this.buttonType,\n badge = this.badge,\n badgeVariant = this.badgeVariant,\n badgeStyle = this.badgeStyle;\n var link = !button && isLink(this);\n var tag = button ? BButton : link ? BLink : 'span';\n var alt = this.alt;\n var ariaLabel = this.ariaLabel || null;\n var $content = null;\n \n if (this.hasNormalizedSlot('default')) {\n // Default slot overrides props\n $content = h('span', {\n staticClass: 'b-avatar-custom'\n }, [this.normalizeSlot('default')]);\n } else if (src) {\n $content = h('img', {\n style: variant ? {} : {\n width: '100%',\n height: '100%'\n },\n attrs: {\n src: src,\n alt: alt\n },\n on: {\n error: this.onImgError\n }\n });\n $content = h('span', {\n staticClass: 'b-avatar-img'\n }, [$content]);\n } else if (icon) {\n $content = h(BIcon, {\n props: {\n icon: icon\n },\n attrs: {\n 'aria-hidden': 'true',\n alt: alt\n }\n });\n } else if (text) {\n $content = h('span', {\n staticClass: 'b-avatar-text',\n style: fontStyle\n }, [h('span', text)]);\n } else {\n // Fallback default avatar content\n $content = h(BIconPersonFill, {\n attrs: {\n 'aria-hidden': 'true',\n alt: alt\n }\n });\n }\n \n var $badge = h();\n var hasBadgeSlot = this.hasNormalizedSlot('badge');\n \n if (badge || badge === '' || hasBadgeSlot) {\n var badgeText = badge === true ? '' : badge;\n $badge = h('span', {\n staticClass: 'b-avatar-badge',\n class: _defineProperty({}, \"badge-\".concat(badgeVariant), !!badgeVariant),\n style: badgeStyle\n }, [hasBadgeSlot ? this.normalizeSlot('badge') : badgeText]);\n }\n \n var componentData = {\n staticClass: CLASS_NAME$1,\n class: (_class2 = {}, _defineProperty(_class2, \"badge-\".concat(variant), !button && variant), _defineProperty(_class2, \"rounded\", rounded === true), _defineProperty(_class2, \"rounded-\".concat(rounded), rounded && rounded !== true), _defineProperty(_class2, \"disabled\", disabled), _class2),\n style: _objectSpread2({\n width: size,\n height: size\n }, marginStyle),\n attrs: {\n 'aria-label': ariaLabel || null\n },\n props: button ? {\n variant: variant,\n disabled: disabled,\n type: type\n } : link ? pluckProps(linkProps$1, this) : {},\n on: button || link ? {\n click: this.onClick\n } : {}\n };\n return h(tag, componentData, [$content, $badge]);\n }\n });\n \n var NAME$7 = 'BAvatarGroup'; // --- Main component ---\n // @vue/component\n \n var BAvatarGroup = /*#__PURE__*/Vue.extend({\n name: NAME$7,\n mixins: [normalizeSlotMixin],\n provide: function provide() {\n return {\n bvAvatarGroup: this\n };\n },\n props: {\n variant: {\n // Child avatars will prefer this variant over their own\n type: String,\n default: null\n },\n size: {\n // Child avatars will always use this over their own size\n type: String,\n default: null\n },\n overlap: {\n type: [Number, String],\n default: 0.3\n },\n square: {\n // Child avatars will prefer this prop (if set) over their own\n type: Boolean,\n default: false\n },\n rounded: {\n // Child avatars will prefer this prop (if set) over their own\n type: [Boolean, String],\n default: false\n },\n tag: {\n type: String,\n default: 'div'\n }\n },\n computed: {\n computedSize: function computedSize() {\n return computeSize(this.size);\n },\n overlapScale: function overlapScale() {\n return mathMin(mathMax(toFloat(this.overlap, 0), 0), 1) / 2;\n },\n paddingStyle: function paddingStyle() {\n var value = this.computedSize;\n value = value ? \"calc(\".concat(value, \" * \").concat(this.overlapScale, \")\") : null;\n return value ? {\n paddingLeft: value,\n paddingRight: value\n } : {};\n }\n },\n render: function render(h) {\n var $inner = h('div', {\n staticClass: 'b-avatar-group-inner',\n style: this.paddingStyle\n }, [this.normalizeSlot('default')]);\n return h(this.tag, {\n staticClass: 'b-avatar-group',\n attrs: {\n role: 'group'\n }\n }, [$inner]);\n }\n });\n \n var AvatarPlugin = /*#__PURE__*/pluginFactory({\n components: {\n BAvatar: BAvatar,\n BAvatarGroup: BAvatarGroup\n }\n });\n \n var NAME$8 = 'BBadge'; // --- Props ---\n \n var linkProps$2 = omit(props$1, ['event', 'routerTag']);\n delete linkProps$2.href.default;\n delete linkProps$2.to.default;\n var props$4 = _objectSpread2({\n tag: {\n type: String,\n default: 'span'\n },\n variant: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$8, 'variant');\n }\n },\n pill: {\n type: Boolean,\n default: false\n }\n }, linkProps$2); // --- Main component ---\n // @vue/component\n \n var BBadge = /*#__PURE__*/Vue.extend({\n name: NAME$8,\n functional: true,\n props: props$4,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n var link = isLink(props);\n var tag = link ? BLink : props.tag;\n var componentData = {\n staticClass: 'badge',\n class: [props.variant ? \"badge-\".concat(props.variant) : 'badge-secondary', {\n 'badge-pill': props.pill,\n active: props.active,\n disabled: props.disabled\n }],\n props: link ? pluckProps(linkProps$2, props) : {}\n };\n return h(tag, a(data, componentData), children);\n }\n });\n \n var BadgePlugin = /*#__PURE__*/pluginFactory({\n components: {\n BBadge: BBadge\n }\n });\n \n var RX_HTML_TAGS = /(<([^>]+)>)/gi; // Removes anything that looks like an HTML tag from the supplied string\n \n var stripTags = function stripTags() {\n var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return String(text).replace(RX_HTML_TAGS, '');\n }; // Generate a `domProps` object for either `innerHTML`, `textContent` or an empty object\n \n var htmlOrText = function htmlOrText(innerHTML, textContent) {\n return innerHTML ? {\n innerHTML: innerHTML\n } : textContent ? {\n textContent: textContent\n } : {};\n };\n \n var props$5 = _objectSpread2({\n text: {\n type: String,\n default: null\n },\n html: {\n type: String,\n default: null\n },\n ariaCurrent: {\n type: String,\n default: 'location'\n }\n }, omit(props$1, ['event', 'routerTag'])); // --- Main component ---\n // @vue/component\n \n var BBreadcrumbLink = /*#__PURE__*/Vue.extend({\n name: 'BBreadcrumbLink',\n functional: true,\n props: props$5,\n render: function render(h, _ref) {\n var suppliedProps = _ref.props,\n data = _ref.data,\n children = _ref.children;\n var active = suppliedProps.active;\n var tag = active ? 'span' : BLink;\n var componentData = {\n attrs: {\n 'aria-current': active ? suppliedProps.ariaCurrent : null\n },\n props: pluckProps(props$5, suppliedProps)\n };\n \n if (!children) {\n componentData.domProps = htmlOrText(suppliedProps.html, suppliedProps.text);\n }\n \n return h(tag, a(data, componentData), children);\n }\n });\n \n var BBreadcrumbItem = /*#__PURE__*/Vue.extend({\n name: 'BBreadcrumbItem',\n functional: true,\n props: props$5,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n return h('li', a(data, {\n staticClass: 'breadcrumb-item',\n class: {\n active: props.active\n }\n }), [h(BBreadcrumbLink, {\n props: props\n }, children)]);\n }\n });\n \n var props$6 = {\n items: {\n type: Array,\n default: null\n }\n }; // @vue/component\n \n var BBreadcrumb = /*#__PURE__*/Vue.extend({\n name: 'BBreadcrumb',\n functional: true,\n props: props$6,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n var childNodes = children; // Build child nodes from items if given.\n \n if (isArray(props.items)) {\n var activeDefined = false;\n childNodes = props.items.map(function (item, idx) {\n if (!isObject(item)) {\n item = {\n text: toString$1(item)\n };\n } // Copy the value here so we can normalize it.\n \n \n var active = item.active;\n \n if (active) {\n activeDefined = true;\n }\n \n if (!active && !activeDefined) {\n // Auto-detect active by position in list.\n active = idx + 1 === props.items.length;\n }\n \n return h(BBreadcrumbItem, {\n props: _objectSpread2(_objectSpread2({}, item), {}, {\n active: active\n })\n });\n });\n }\n \n return h('ol', a(data, {\n staticClass: 'breadcrumb'\n }), childNodes);\n }\n });\n \n var BreadcrumbPlugin = /*#__PURE__*/pluginFactory({\n components: {\n BBreadcrumb: BBreadcrumb,\n BBreadcrumbItem: BBreadcrumbItem,\n BBreadcrumbLink: BBreadcrumbLink\n }\n });\n \n var ButtonPlugin = /*#__PURE__*/pluginFactory({\n components: {\n BButton: BButton,\n BBtn: BButton,\n BButtonClose: BButtonClose,\n BBtnClose: BButtonClose\n }\n });\n \n var NAME$9 = 'BButtonGroup';\n var props$7 = {\n vertical: {\n type: Boolean,\n default: false\n },\n size: {\n type: String,\n default: function _default() {\n return getComponentConfig('BButton', 'size');\n }\n },\n tag: {\n type: String,\n default: 'div'\n },\n ariaRole: {\n type: String,\n default: 'group'\n }\n }; // @vue/component\n \n var BButtonGroup = /*#__PURE__*/Vue.extend({\n name: NAME$9,\n functional: true,\n props: props$7,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n return h(props.tag, a(data, {\n class: _defineProperty({\n 'btn-group': !props.vertical,\n 'btn-group-vertical': props.vertical\n }, \"btn-group-\".concat(props.size), props.size),\n attrs: {\n role: props.ariaRole\n }\n }), children);\n }\n });\n \n var ButtonGroupPlugin = /*#__PURE__*/pluginFactory({\n components: {\n BButtonGroup: BButtonGroup,\n BBtnGroup: BButtonGroup\n }\n });\n \n var ITEM_SELECTOR = ['.btn:not(.disabled):not([disabled]):not(.dropdown-item)', '.form-control:not(.disabled):not([disabled])', 'select:not(.disabled):not([disabled])', 'input[type=\"checkbox\"]:not(.disabled)', 'input[type=\"radio\"]:not(.disabled)'].join(','); // @vue/component\n \n var BButtonToolbar = /*#__PURE__*/Vue.extend({\n name: 'BButtonToolbar',\n mixins: [normalizeSlotMixin],\n props: {\n justify: {\n type: Boolean,\n default: false\n },\n keyNav: {\n type: Boolean,\n default: false\n }\n },\n mounted: function mounted() {\n if (this.keyNav) {\n // Pre-set the tabindexes if the markup does not include tabindex=\"-1\" on the toolbar items\n this.getItems();\n }\n },\n methods: {\n onFocusin: function onFocusin(evt) {\n if (evt.target === this.$el) {\n evt.preventDefault();\n evt.stopPropagation();\n this.focusFirst(evt);\n }\n },\n stop: function stop(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n },\n onKeydown: function onKeydown(evt) {\n if (!this.keyNav) {\n /* istanbul ignore next: should never happen */\n return;\n }\n \n var key = evt.keyCode;\n var shift = evt.shiftKey;\n \n if (key === KEY_CODES.UP || key === KEY_CODES.LEFT) {\n this.stop(evt);\n shift ? this.focusFirst(evt) : this.focusPrev(evt);\n } else if (key === KEY_CODES.DOWN || key === KEY_CODES.RIGHT) {\n this.stop(evt);\n shift ? this.focusLast(evt) : this.focusNext(evt);\n }\n },\n focusFirst: function focusFirst() {\n var items = this.getItems();\n attemptFocus(items[0]);\n },\n focusPrev: function focusPrev(evt) {\n var items = this.getItems();\n var index = items.indexOf(evt.target);\n \n if (index > -1) {\n items = items.slice(0, index).reverse();\n attemptFocus(items[0]);\n }\n },\n focusNext: function focusNext(evt) {\n var items = this.getItems();\n var index = items.indexOf(evt.target);\n \n if (index > -1) {\n items = items.slice(index + 1);\n attemptFocus(items[0]);\n }\n },\n focusLast: function focusLast() {\n var items = this.getItems().reverse();\n attemptFocus(items[0]);\n },\n getItems: function getItems() {\n var items = selectAll(ITEM_SELECTOR, this.$el);\n items.forEach(function (item) {\n // Ensure tabfocus is -1 on any new elements\n item.tabIndex = -1;\n });\n return items.filter(function (el) {\n return isVisible(el);\n });\n }\n },\n render: function render(h) {\n return h('div', {\n staticClass: 'btn-toolbar',\n class: {\n 'justify-content-between': this.justify\n },\n attrs: {\n role: 'toolbar',\n tabindex: this.keyNav ? '0' : null\n },\n on: this.keyNav ? {\n focusin: this.onFocusin,\n keydown: this.onKeydown\n } : {}\n }, [this.normalizeSlot('default')]);\n }\n });\n \n var ButtonToolbarPlugin = /*#__PURE__*/pluginFactory({\n components: {\n BButtonToolbar: BButtonToolbar,\n BBtnToolbar: BButtonToolbar\n }\n });\n \n // Handles when arrays are \"sparse\" (array.every(...) doesn't handle sparse)\n \n var compareArrays = function compareArrays(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n \n var equal = true;\n \n for (var i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n \n return equal;\n };\n /**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n * Returns boolean true or false\n */\n \n \n var looseEqual = function looseEqual(a, b) {\n if (a === b) {\n return true;\n }\n \n var aValidType = isDate(a);\n var bValidType = isDate(b);\n \n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n \n aValidType = isArray(a);\n bValidType = isArray(b);\n \n if (aValidType || bValidType) {\n return aValidType && bValidType ? compareArrays(a, b) : false;\n }\n \n aValidType = isObject(a);\n bValidType = isObject(b);\n \n if (aValidType || bValidType) {\n /* istanbul ignore if: this if will probably never be called */\n if (!aValidType || !bValidType) {\n return false;\n }\n \n var aKeysCount = keys(a).length;\n var bKeysCount = keys(b).length;\n \n if (aKeysCount !== bKeysCount) {\n return false;\n }\n \n for (var key in a) {\n var aHasKey = hasOwnProperty(a, key);\n var bHasKey = hasOwnProperty(b, key);\n \n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n \n return String(a) === String(b);\n };\n \n // Loose YYYY-MM-DD matching, ignores any appended time inforation\n // Matches '1999-12-20', '1999-1-1', '1999-01-20T22:51:49.118Z', '1999-01-02 13:00:00'\n \n var RX_DATE = /^\\d+-\\d\\d?-\\d\\d?(?:\\s|T|$)/; // Used to split off the date parts of the YYYY-MM-DD string\n \n var RX_DATE_SPLIT = /-|\\s|T/; // --- Date utility methods ---\n // Create or clone a date (`new Date(...)` shortcut)\n \n var createDate = function createDate() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n \n return _construct(Date, args);\n }; // Parse a date sting, or Date object, into a Date object (with no time information)\n \n var parseYMD = function parseYMD(date) {\n if (isString(date) && RX_DATE.test(date.trim())) {\n var _date$split$map = date.split(RX_DATE_SPLIT).map(function (v) {\n return toInteger(v, 1);\n }),\n _date$split$map2 = _slicedToArray(_date$split$map, 3),\n year = _date$split$map2[0],\n month = _date$split$map2[1],\n day = _date$split$map2[2];\n \n return createDate(year, month - 1, day);\n } else if (isDate(date)) {\n return createDate(date.getFullYear(), date.getMonth(), date.getDate());\n }\n \n return null;\n }; // Format a date object as `YYYY-MM-DD` format\n \n var formatYMD = function formatYMD(date) {\n date = parseYMD(date);\n \n if (!date) {\n return null;\n }\n \n var year = date.getFullYear();\n var month = \"0\".concat(date.getMonth() + 1).slice(-2);\n var day = \"0\".concat(date.getDate()).slice(-2);\n return \"\".concat(year, \"-\").concat(month, \"-\").concat(day);\n }; // Given a locale (or locales), resolve the browser available locale\n \n var resolveLocale = function resolveLocale(locales)\n /* istanbul ignore next */\n {\n var calendar = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'gregory';\n locales = concat(locales).filter(identity);\n var fmt = new Intl.DateTimeFormat(locales, {\n calendar: calendar\n });\n return fmt.resolvedOptions().locale;\n }; // Create a `Intl.DateTimeFormat` formatter function\n \n var createDateFormatter = function createDateFormatter(locale, options)\n /* istanbul ignore next */\n {\n var dtf = new Intl.DateTimeFormat(locale, options);\n return dtf.format;\n }; // Determine if two dates are the same date (ignoring time portion)\n \n var datesEqual = function datesEqual(date1, date2) {\n // Returns true of the date portion of two date objects are equal\n // We don't compare the time portion\n return formatYMD(date1) === formatYMD(date2);\n }; // --- Date \"math\" utility methods (for BCalendar component mainly) ---\n \n var firstDateOfMonth = function firstDateOfMonth(date) {\n date = createDate(date);\n date.setDate(1);\n return date;\n };\n var lastDateOfMonth = function lastDateOfMonth(date) {\n date = createDate(date);\n date.setMonth(date.getMonth() + 1);\n date.setDate(0);\n return date;\n };\n var addYears = function addYears(date, numberOfYears) {\n date = createDate(date);\n var month = date.getMonth();\n date.setFullYear(date.getFullYear() + numberOfYears); // Handle Feb 29th for leap years\n \n if (date.getMonth() !== month) {\n date.setDate(0);\n }\n \n return date;\n };\n var oneMonthAgo = function oneMonthAgo(date) {\n date = createDate(date);\n var month = date.getMonth();\n date.setMonth(month - 1); // Handle when days in month are different\n \n if (date.getMonth() === month) {\n date.setDate(0);\n }\n \n return date;\n };\n var oneMonthAhead = function oneMonthAhead(date) {\n date = createDate(date);\n var month = date.getMonth();\n date.setMonth(month + 1); // Handle when days in month are different\n \n if (date.getMonth() === (month + 2) % 12) {\n date.setDate(0);\n }\n \n return date;\n };\n var oneYearAgo = function oneYearAgo(date) {\n return addYears(date, -1);\n };\n var oneYearAhead = function oneYearAhead(date) {\n return addYears(date, 1);\n };\n var oneDecadeAgo = function oneDecadeAgo(date) {\n return addYears(date, -10);\n };\n var oneDecadeAhead = function oneDecadeAhead(date) {\n return addYears(date, 10);\n }; // Helper function to constrain a date between two values\n // Always returns a `Date` object or `null` if no date passed\n \n var constrainDate = function constrainDate(date) {\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n // Ensure values are `Date` objects (or `null`)\n date = parseYMD(date);\n min = parseYMD(min) || date;\n max = parseYMD(max) || date; // Return a new `Date` object (or `null`)\n \n return date ? date < min ? min : date > max ? max : date : null;\n };\n \n // Localization utilities\n \n var RTL_LANGS = ['ar', 'az', 'ckb', 'fa', 'he', 'ks', 'lrc', 'mzn', 'ps', 'sd', 'te', 'ug', 'ur', 'yi'].map(function (locale) {\n return locale.toLowerCase();\n }); // Precompile RegExpr\n \n var RX_STRIP_MODS = /-u-.+/; // Returns true if the locale is RTL\n \n var isLocaleRTL = function isLocaleRTL(locale) {\n // Determines if the locale is RTL (only single locale supported)\n var parts = toString$1(locale).toLowerCase().replace(RX_STRIP_MODS, '').split('-');\n var locale1 = parts.slice(0, 2).join('-');\n var locale2 = parts[0];\n return arrayIncludes(RTL_LANGS, locale1) || arrayIncludes(RTL_LANGS, locale2);\n };\n \n // SSR safe client-side ID attribute generation\n // ID's can only be generated client-side, after mount\n // `this._uid` is not synched between server and client\n // @vue/component\n var idMixin = {\n props: {\n id: {\n type: String // default: null\n \n }\n },\n data: function data() {\n return {\n localId_: null\n };\n },\n computed: {\n safeId: function safeId() {\n // Computed property that returns a dynamic function for creating the ID\n // Reacts to changes in both `.id` and `.localId_` and regenerates a new function\n var id = this.id || this.localId_; // We return a function that accepts an optional suffix string\n // So this computed prop looks and works like a method\n // but benefits from Vue's computed prop caching\n \n var fn = function fn(suffix) {\n if (!id) {\n return null;\n }\n \n suffix = String(suffix || '').replace(/\\s+/g, '_');\n return suffix ? id + '_' + suffix : id;\n };\n \n return fn;\n }\n },\n mounted: function mounted() {\n var _this = this;\n \n // `mounted()` only occurs client-side\n this.$nextTick(function () {\n // Update DOM with auto-generated ID after mount\n // to prevent SSR hydration errors\n _this.localId_ = \"__BVID__\".concat(_this._uid);\n });\n }\n };\n \n var NAME$a = 'BCalendar'; // Key Codes\n \n var UP = KEY_CODES.UP,\n DOWN = KEY_CODES.DOWN,\n LEFT = KEY_CODES.LEFT,\n RIGHT = KEY_CODES.RIGHT,\n PAGEUP = KEY_CODES.PAGEUP,\n PAGEDOWN = KEY_CODES.PAGEDOWN,\n HOME = KEY_CODES.HOME,\n END = KEY_CODES.END,\n ENTER = KEY_CODES.ENTER,\n SPACE = KEY_CODES.SPACE; // Common calendar option value strings\n \n var STR_GREGORY = 'gregory';\n var STR_NUMERIC = 'numeric';\n var STR_2_DIGIT = '2-digit';\n var STR_LONG = 'long';\n var STR_SHORT = 'short';\n var STR_NARROW = 'narrow'; // --- BCalendar component ---\n // @vue/component\n \n var BCalendar = Vue.extend({\n name: NAME$a,\n // Mixin order is important!\n mixins: [attrsMixin, idMixin, normalizeSlotMixin],\n model: {\n // Even though this is the default that Vue assumes, we need\n // to add it for the docs to reflect that this is the model\n // And also for some validation libraries to work\n prop: 'value',\n event: 'input'\n },\n props: {\n value: {\n type: [String, Date] // default: null\n \n },\n valueAsDate: {\n // Always return the `v-model` value as a date object\n type: Boolean,\n default: false\n },\n initialDate: {\n // This specifies the calendar year/month/day that will be shown when\n // first opening the datepicker if no v-model value is provided\n // Default is the current date (or `min`/`max`)\n type: [String, Date] // default: null\n \n },\n disabled: {\n type: Boolean,\n default: false\n },\n readonly: {\n type: Boolean,\n default: false\n },\n min: {\n type: [String, Date] // default: null\n \n },\n max: {\n type: [String, Date] // default: null\n \n },\n dateDisabledFn: {\n type: Function // default: null\n \n },\n startWeekday: {\n // `0` (Sunday), `1` (Monday), ... `6` (Saturday)\n // Day of week to start calendar on\n type: [Number, String],\n default: 0\n },\n locale: {\n // Locale(s) to use\n // Default is to use page/browser default setting\n type: [String, Array] // default: null\n \n },\n direction: {\n // 'ltr', 'rtl', or `null` (for auto detect)\n type: String // default: null\n \n },\n selectedVariant: {\n // Variant color to use for the selected date\n type: String,\n default: 'primary'\n },\n todayVariant: {\n // Variant color to use for today's date (defaults to `variant`)\n type: String // default: null\n \n },\n noHighlightToday: {\n // Disable highlighting today's date\n type: Boolean,\n default: false\n },\n dateInfoFn: {\n // Function to set a class of (classes) on the date cell\n // if passed a string or an array\n // TODO:\n // If the function returns an object, look for class prop for classes,\n // and other props for handling events/details/descriptions\n type: Function // default: null\n \n },\n width: {\n // Has no effect if prop `block` is set\n type: String,\n default: '270px'\n },\n block: {\n // Makes calendar the full width of its parent container\n type: Boolean,\n default: false\n },\n hideHeader: {\n // When true makes the selected date header `sr-only`\n type: Boolean,\n default: false\n },\n showDecadeNav: {\n // When `true` enables the decade navigation buttons\n type: Boolean,\n default: false\n },\n hidden: {\n // When `true`, renders a comment node, but keeps the component instance active\n // Mainly for , so that we can get the component's value and locale\n // But we might just use separate date formatters, using the resolved locale\n // (adjusted for the gregorian calendar)\n type: Boolean,\n default: false\n },\n ariaControls: {\n type: String // default: null\n \n },\n roleDescription: {\n type: String // default: null\n \n },\n // Labels for buttons and keyboard shortcuts\n labelPrevDecade: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelPrevDecade');\n }\n },\n labelPrevYear: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelPrevYear');\n }\n },\n labelPrevMonth: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelPrevMonth');\n }\n },\n labelCurrentMonth: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelCurrentMonth');\n }\n },\n labelNextMonth: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelNextMonth');\n }\n },\n labelNextYear: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelNextYear');\n }\n },\n labelNextDecade: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelNextDecade');\n }\n },\n labelToday: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelToday');\n }\n },\n labelSelected: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelSelected');\n }\n },\n labelNoDateSelected: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelNoDateSelected');\n }\n },\n labelCalendar: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelCalendar');\n }\n },\n labelNav: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelNav');\n }\n },\n labelHelp: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$a, 'labelHelp');\n }\n },\n dateFormatOptions: {\n // `Intl.DateTimeFormat` object\n // Note: This value is *not* to be placed in the global config\n type: Object,\n default: function _default() {\n return {\n year: STR_NUMERIC,\n month: STR_LONG,\n day: STR_NUMERIC,\n weekday: STR_LONG\n };\n }\n },\n weekdayHeaderFormat: {\n // Format of the weekday names at the top of the calendar\n // Note: This value is *not* to be placed in the global config\n type: String,\n // `short` is typically a 3 letter abbreviation,\n // `narrow` is typically a single letter\n // `long` is the full week day name\n // Although some locales may override this (i.e `ar`, etc)\n default: STR_SHORT,\n validator: function validator(value) {\n return arrayIncludes([STR_LONG, STR_SHORT, STR_NARROW], value);\n }\n }\n },\n data: function data() {\n var selected = formatYMD(this.value) || '';\n return {\n // Selected date\n selectedYMD: selected,\n // Date in calendar grid that has `tabindex` of `0`\n activeYMD: selected || formatYMD(constrainDate(this.initialDate || this.getToday()), this.min, this.max),\n // Will be true if the calendar grid has/contains focus\n gridHasFocus: false,\n // Flag to enable the `aria-live` region(s) after mount\n // to prevent screen reader \"outbursts\" when mounting\n isLive: false\n };\n },\n computed: {\n valueId: function valueId() {\n return this.safeId();\n },\n widgetId: function widgetId() {\n return this.safeId('_calendar-wrapper_');\n },\n navId: function navId() {\n return this.safeId('_calendar-nav_');\n },\n gridId: function gridId() {\n return this.safeId('_calendar-grid_');\n },\n gridCaptionId: function gridCaptionId() {\n return this.safeId('_calendar-grid-caption_');\n },\n gridHelpId: function gridHelpId() {\n return this.safeId('_calendar-grid-help_');\n },\n activeId: function activeId() {\n return this.activeYMD ? this.safeId(\"_cell-\".concat(this.activeYMD, \"_\")) : null;\n },\n // TODO: Use computed props to convert `YYYY-MM-DD` to `Date` object\n selectedDate: function selectedDate() {\n // Selected as a `Date` object\n return parseYMD(this.selectedYMD);\n },\n activeDate: function activeDate() {\n // Active as a `Date` object\n return parseYMD(this.activeYMD);\n },\n computedMin: function computedMin() {\n return parseYMD(this.min);\n },\n computedMax: function computedMax() {\n return parseYMD(this.max);\n },\n computedWeekStarts: function computedWeekStarts() {\n // `startWeekday` is a prop (constrained to `0` through `6`)\n return mathMax(toInteger(this.startWeekday, 0), 0) % 7;\n },\n computedLocale: function computedLocale() {\n // Returns the resolved locale used by the calendar\n return resolveLocale(concat(this.locale).filter(identity), STR_GREGORY);\n },\n calendarLocale: function calendarLocale() {\n // This locale enforces the gregorian calendar (for use in formatter functions)\n // Needed because IE 11 resolves `ar-IR` as islamic-civil calendar\n // and IE 11 (and some other browsers) do not support the `calendar` option\n // And we currently only support the gregorian calendar\n var fmt = new Intl.DateTimeFormat(this.computedLocale, {\n calendar: STR_GREGORY\n });\n var calendar = fmt.resolvedOptions().calendar;\n var locale = fmt.resolvedOptions().locale;\n /* istanbul ignore if: mainly for IE 11 and a few other browsers, hard to test in JSDOM */\n \n if (calendar !== STR_GREGORY) {\n // Ensure the locale requests the gregorian calendar\n // Mainly for IE 11, and currently we can't handle non-gregorian calendars\n // TODO: Should we always return this value?\n locale = locale.replace(/-u-.+$/i, '').concat('-u-ca-gregory');\n }\n \n return locale;\n },\n calendarYear: function calendarYear() {\n return this.activeDate.getFullYear();\n },\n calendarMonth: function calendarMonth() {\n return this.activeDate.getMonth();\n },\n calendarFirstDay: function calendarFirstDay() {\n return createDate(this.calendarYear, this.calendarMonth, 1);\n },\n calendarDaysInMonth: function calendarDaysInMonth() {\n // We create a new date as to not mutate the original\n var date = createDate(this.calendarFirstDay);\n date.setMonth(date.getMonth() + 1, 0);\n return date.getDate();\n },\n computedVariant: function computedVariant() {\n return \"btn-\".concat(this.selectedVariant || 'primary');\n },\n computedTodayVariant: function computedTodayVariant() {\n return \"btn-outline-\".concat(this.todayVariant || this.selectedVariant || 'primary');\n },\n isRTL: function isRTL() {\n // `true` if the language requested is RTL\n var dir = toString$1(this.direction).toLowerCase();\n \n if (dir === 'rtl') {\n /* istanbul ignore next */\n return true;\n } else if (dir === 'ltr') {\n /* istanbul ignore next */\n return false;\n }\n \n return isLocaleRTL(this.computedLocale);\n },\n context: function context() {\n var selectedYMD = this.selectedYMD;\n var selectedDate = parseYMD(selectedYMD);\n var activeYMD = this.activeYMD;\n var activeDate = parseYMD(activeYMD);\n return {\n // The current value of the `v-model`\n selectedYMD: selectedYMD,\n selectedDate: selectedDate,\n selectedFormatted: selectedDate ? this.formatDateString(selectedDate) : this.labelNoDateSelected,\n // Which date cell is considered active due to navigation\n activeYMD: activeYMD,\n activeDate: activeDate,\n activeFormatted: activeDate ? this.formatDateString(activeDate) : '',\n // `true` if the date is disabled (when using keyboard navigation)\n disabled: this.dateDisabled(activeDate),\n // Locales used in formatting dates\n locale: this.computedLocale,\n calendarLocale: this.calendarLocale,\n rtl: this.isRTL\n };\n },\n // Computed props that return a function reference\n dateOutOfRange: function dateOutOfRange() {\n // Check whether a date is within the min/max range\n // returns a new function ref if the pops change\n // We do this as we need to trigger the calendar computed prop\n // to update when these props update\n var min = this.computedMin;\n var max = this.computedMax;\n return function (date) {\n // Handle both `YYYY-MM-DD` and `Date` objects\n date = parseYMD(date);\n return min && date < min || max && date > max;\n };\n },\n dateDisabled: function dateDisabled() {\n // Returns a function for validating if a date is within range\n // We grab this variables first to ensure a new function ref\n // is generated when the props value changes\n // We do this as we need to trigger the calendar computed prop\n // to update when these props update\n var rangeFn = this.dateOutOfRange;\n var disabledFn = isFunction(this.dateDisabledFn) ? this.dateDisabledFn : function () {\n return false;\n }; // Return the function ref\n \n return function (date) {\n // Handle both `YYYY-MM-DD` and `Date` objects\n date = parseYMD(date);\n var ymd = formatYMD(date);\n return !!(rangeFn(date) || disabledFn(ymd, date));\n };\n },\n // Computed props that return date formatter functions\n formatDateString: function formatDateString() {\n // Returns a date formatter function\n return createDateFormatter(this.calendarLocale, _objectSpread2(_objectSpread2({\n // Ensure we have year, month, day shown for screen readers/ARIA\n // If users really want to leave one of these out, they can\n // pass `undefined` for the property value\n year: STR_NUMERIC,\n month: STR_2_DIGIT,\n day: STR_2_DIGIT\n }, this.dateFormatOptions), {}, {\n // Ensure hours/minutes/seconds are not shown\n // As we do not support the time portion (yet)\n hour: undefined,\n minute: undefined,\n second: undefined,\n // Ensure calendar is gregorian\n calendar: STR_GREGORY\n }));\n },\n formatYearMonth: function formatYearMonth() {\n // Returns a date formatter function\n return createDateFormatter(this.calendarLocale, {\n year: STR_NUMERIC,\n month: STR_LONG,\n calendar: STR_GREGORY\n });\n },\n formatWeekdayName: function formatWeekdayName() {\n // Long weekday name for weekday header aria-label\n return createDateFormatter(this.calendarLocale, {\n weekday: STR_LONG,\n calendar: STR_GREGORY\n });\n },\n formatWeekdayNameShort: function formatWeekdayNameShort() {\n // Weekday header cell format\n // defaults to 'short' 3 letter days, where possible\n return createDateFormatter(this.calendarLocale, {\n weekday: this.weekdayHeaderFormat || STR_SHORT,\n calendar: STR_GREGORY\n });\n },\n formatDay: function formatDay() {\n // Calendar grid day number formatter\n // We don't use DateTimeFormatter here as it can place extra\n // character(s) after the number (i.e the `zh` locale)\n var nf = new Intl.NumberFormat([this.computedLocale], {\n style: 'decimal',\n minimumIntegerDigits: 1,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n notation: 'standard'\n }); // Return a formatter function instance\n \n return function (date) {\n return nf.format(date.getDate());\n };\n },\n // Disabled states for the nav buttons\n prevDecadeDisabled: function prevDecadeDisabled() {\n var min = this.computedMin;\n return this.disabled || min && lastDateOfMonth(oneDecadeAgo(this.activeDate)) < min;\n },\n prevYearDisabled: function prevYearDisabled() {\n var min = this.computedMin;\n return this.disabled || min && lastDateOfMonth(oneYearAgo(this.activeDate)) < min;\n },\n prevMonthDisabled: function prevMonthDisabled() {\n var min = this.computedMin;\n return this.disabled || min && lastDateOfMonth(oneMonthAgo(this.activeDate)) < min;\n },\n thisMonthDisabled: function thisMonthDisabled() {\n // TODO: We could/should check if today is out of range\n return this.disabled;\n },\n nextMonthDisabled: function nextMonthDisabled() {\n var max = this.computedMax;\n return this.disabled || max && firstDateOfMonth(oneMonthAhead(this.activeDate)) > max;\n },\n nextYearDisabled: function nextYearDisabled() {\n var max = this.computedMax;\n return this.disabled || max && firstDateOfMonth(oneYearAhead(this.activeDate)) > max;\n },\n nextDecadeDisabled: function nextDecadeDisabled() {\n var max = this.computedMax;\n return this.disabled || max && firstDateOfMonth(oneDecadeAhead(this.activeDate)) > max;\n },\n // Calendar dates generation\n calendar: function calendar() {\n var matrix = [];\n var firstDay = this.calendarFirstDay;\n var calendarYear = firstDay.getFullYear();\n var calendarMonth = firstDay.getMonth();\n var daysInMonth = this.calendarDaysInMonth;\n var startIndex = firstDay.getDay(); // `0`..`6`\n \n var weekOffset = (this.computedWeekStarts > startIndex ? 7 : 0) - this.computedWeekStarts; // TODO: Change `dateInfoFn` to handle events and notes as well as classes\n \n var dateInfoFn = isFunction(this.dateInfoFn) ? this.dateInfoFn : function () {\n return {};\n }; // Build the calendar matrix\n \n var currentDay = 0 - weekOffset - startIndex;\n \n for (var week = 0; week < 6 && currentDay < daysInMonth; week++) {\n // For each week\n matrix[week] = []; // The following could be a map function\n \n for (var j = 0; j < 7; j++) {\n // For each day in week\n currentDay++;\n var date = createDate(calendarYear, calendarMonth, currentDay);\n var month = date.getMonth();\n var dayYMD = formatYMD(date);\n var dayDisabled = this.dateDisabled(date); // TODO: This could be a normalizer method\n \n var dateInfo = dateInfoFn(dayYMD, parseYMD(dayYMD));\n dateInfo = isString(dateInfo) || isArray(dateInfo) ?\n /* istanbul ignore next */\n {\n class: dateInfo\n } : isPlainObject(dateInfo) ? _objectSpread2({\n class: ''\n }, dateInfo) :\n /* istanbul ignore next */\n {\n class: ''\n };\n matrix[week].push({\n ymd: dayYMD,\n // Cell content\n day: this.formatDay(date),\n label: this.formatDateString(date),\n // Flags for styling\n isThisMonth: month === calendarMonth,\n isDisabled: dayDisabled,\n // TODO: Handle other dateInfo properties such as notes/events\n info: dateInfo\n });\n }\n }\n \n return matrix;\n },\n calendarHeadings: function calendarHeadings() {\n var _this = this;\n \n return this.calendar[0].map(function (d) {\n return {\n text: _this.formatWeekdayNameShort(parseYMD(d.ymd)),\n label: _this.formatWeekdayName(parseYMD(d.ymd))\n };\n });\n }\n },\n watch: {\n value: function value(newVal, oldVal) {\n var selected = formatYMD(newVal) || '';\n var old = formatYMD(oldVal) || '';\n \n if (!datesEqual(selected, old)) {\n this.activeYMD = selected || this.activeYMD;\n this.selectedYMD = selected;\n }\n },\n selectedYMD: function selectedYMD(newYMD, oldYMD) {\n // TODO:\n // Should we compare to `formatYMD(this.value)` and emit\n // only if they are different?\n if (newYMD !== oldYMD) {\n this.$emit('input', this.valueAsDate ? parseYMD(newYMD) || null : newYMD || '');\n }\n },\n context: function context(newVal, oldVal) {\n if (!looseEqual(newVal, oldVal)) {\n this.$emit('context', newVal);\n }\n },\n hidden: function hidden(newVal) {\n // Reset the active focused day when hidden\n this.activeYMD = this.selectedYMD || formatYMD(this.value || this.constrainDate(this.initialDate || this.getToday())); // Enable/disable the live regions\n \n this.setLive(!newVal);\n }\n },\n created: function created() {\n var _this2 = this;\n \n this.$nextTick(function () {\n _this2.$emit('context', _this2.context);\n });\n },\n mounted: function mounted() {\n this.setLive(true);\n },\n \n /* istanbul ignore next */\n activated: function activated()\n /* istanbul ignore next */\n {\n this.setLive(true);\n },\n \n /* istanbul ignore next */\n deactivated: function deactivated()\n /* istanbul ignore next */\n {\n this.setLive(false);\n },\n beforeDestroy: function beforeDestroy() {\n this.setLive(false);\n },\n methods: {\n // Public method(s)\n focus: function focus() {\n if (!this.disabled) {\n attemptFocus(this.$refs.grid);\n }\n },\n blur: function blur() {\n if (!this.disabled) {\n attemptBlur(this.$refs.grid);\n }\n },\n // Private methods\n setLive: function setLive(on) {\n var _this3 = this;\n \n if (on) {\n this.$nextTick(function () {\n requestAF(function () {\n _this3.isLive = true;\n });\n });\n } else {\n this.isLive = false;\n }\n },\n getToday: function getToday() {\n return parseYMD(createDate());\n },\n constrainDate: function constrainDate$1(date) {\n // Constrains a date between min and max\n // returns a new `Date` object instance\n return constrainDate(date, this.computedMin, this.computedMax);\n },\n emitSelected: function emitSelected(date) {\n var _this4 = this;\n \n // Performed in a `$nextTick()` to (probably) ensure\n // the input event has emitted first\n this.$nextTick(function () {\n _this4.$emit('selected', formatYMD(date) || '', parseYMD(date) || null);\n });\n },\n // Event handlers\n setGridFocusFlag: function setGridFocusFlag(evt) {\n // Sets the gridHasFocus flag to make date \"button\" look focused\n this.gridHasFocus = !this.disabled && evt.type === 'focus';\n },\n onKeydownWrapper: function onKeydownWrapper(evt) {\n // Calendar keyboard navigation\n // Handles PAGEUP/PAGEDOWN/END/HOME/LEFT/UP/RIGHT/DOWN\n // Focuses grid after updating\n var altKey = evt.altKey,\n ctrlKey = evt.ctrlKey,\n keyCode = evt.keyCode;\n \n if (!arrayIncludes([PAGEUP, PAGEDOWN, END, HOME, LEFT, UP, RIGHT, DOWN], keyCode)) {\n /* istanbul ignore next */\n return;\n }\n \n evt.preventDefault();\n evt.stopPropagation();\n var activeDate = createDate(this.activeDate);\n var checkDate = createDate(this.activeDate);\n var day = activeDate.getDate();\n var constrainedToday = this.constrainDate(this.getToday());\n var isRTL = this.isRTL;\n \n if (keyCode === PAGEUP) {\n // PAGEUP - Previous month/year\n activeDate = (altKey ? ctrlKey ? oneDecadeAgo : oneYearAgo : oneMonthAgo)(activeDate); // We check the first day of month to be in rage\n \n checkDate = createDate(activeDate);\n checkDate.setDate(1);\n } else if (keyCode === PAGEDOWN) {\n // PAGEDOWN - Next month/year\n activeDate = (altKey ? ctrlKey ? oneDecadeAhead : oneYearAhead : oneMonthAhead)(activeDate); // We check the last day of month to be in rage\n \n checkDate = createDate(activeDate);\n checkDate.setMonth(checkDate.getMonth() + 1);\n checkDate.setDate(0);\n } else if (keyCode === LEFT) {\n // LEFT - Previous day (or next day for RTL)\n activeDate.setDate(day + (isRTL ? 1 : -1));\n activeDate = this.constrainDate(activeDate);\n checkDate = activeDate;\n } else if (keyCode === RIGHT) {\n // RIGHT - Next day (or previous day for RTL)\n activeDate.setDate(day + (isRTL ? -1 : 1));\n activeDate = this.constrainDate(activeDate);\n checkDate = activeDate;\n } else if (keyCode === UP) {\n // UP - Previous week\n activeDate.setDate(day - 7);\n activeDate = this.constrainDate(activeDate);\n checkDate = activeDate;\n } else if (keyCode === DOWN) {\n // DOWN - Next week\n activeDate.setDate(day + 7);\n activeDate = this.constrainDate(activeDate);\n checkDate = activeDate;\n } else if (keyCode === HOME) {\n // HOME - Today\n activeDate = constrainedToday;\n checkDate = activeDate;\n } else if (keyCode === END) {\n // END - Selected date, or today if no selected date\n activeDate = parseYMD(this.selectedDate) || constrainedToday;\n checkDate = activeDate;\n }\n \n if (!this.dateOutOfRange(checkDate) && !datesEqual(activeDate, this.activeDate)) {\n // We only jump to date if within min/max\n // We don't check for individual disabled dates though (via user function)\n this.activeYMD = formatYMD(activeDate);\n } // Ensure grid is focused\n \n \n this.focus();\n },\n onKeydownGrid: function onKeydownGrid(evt) {\n // Pressing enter/space on grid to select active date\n var keyCode = evt.keyCode;\n var activeDate = this.activeDate;\n \n if (keyCode === ENTER || keyCode === SPACE) {\n evt.preventDefault();\n evt.stopPropagation();\n \n if (!this.disabled && !this.readonly && !this.dateDisabled(activeDate)) {\n this.selectedYMD = formatYMD(activeDate);\n this.emitSelected(activeDate);\n } // Ensure grid is focused\n \n \n this.focus();\n }\n },\n onClickDay: function onClickDay(day) {\n // Clicking on a date \"button\" to select it\n var selectedDate = this.selectedDate;\n var activeDate = this.activeDate;\n var clickedDate = parseYMD(day.ymd);\n \n if (!this.disabled && !day.isDisabled && !this.dateDisabled(clickedDate)) {\n if (!this.readonly) {\n // If readonly mode, we don't set the selected date, just the active date\n // If the clicked date is equal to the already selected date, we don't update the model\n this.selectedYMD = formatYMD(datesEqual(clickedDate, selectedDate) ? selectedDate : clickedDate);\n this.emitSelected(clickedDate);\n }\n \n this.activeYMD = formatYMD(datesEqual(clickedDate, activeDate) ? activeDate : createDate(clickedDate)); // Ensure grid is focused\n \n this.focus();\n }\n },\n gotoPrevDecade: function gotoPrevDecade() {\n this.activeYMD = formatYMD(this.constrainDate(oneDecadeAgo(this.activeDate)));\n },\n gotoPrevYear: function gotoPrevYear() {\n this.activeYMD = formatYMD(this.constrainDate(oneYearAgo(this.activeDate)));\n },\n gotoPrevMonth: function gotoPrevMonth() {\n this.activeYMD = formatYMD(this.constrainDate(oneMonthAgo(this.activeDate)));\n },\n gotoCurrentMonth: function gotoCurrentMonth() {\n // TODO: Maybe this goto date should be configurable?\n this.activeYMD = formatYMD(this.constrainDate(this.getToday()));\n },\n gotoNextMonth: function gotoNextMonth() {\n this.activeYMD = formatYMD(this.constrainDate(oneMonthAhead(this.activeDate)));\n },\n gotoNextYear: function gotoNextYear() {\n this.activeYMD = formatYMD(this.constrainDate(oneYearAhead(this.activeDate)));\n },\n gotoNextDecade: function gotoNextDecade() {\n this.activeYMD = formatYMD(this.constrainDate(oneDecadeAhead(this.activeDate)));\n },\n onHeaderClick: function onHeaderClick() {\n if (!this.disabled) {\n this.activeYMD = this.selectedYMD || formatYMD(this.getToday());\n this.focus();\n }\n }\n },\n render: function render(h) {\n var _this5 = this;\n \n // If `hidden` prop is set, render just a placeholder node\n if (this.hidden) {\n return h();\n }\n \n var valueId = this.valueId,\n widgetId = this.widgetId,\n navId = this.navId,\n gridId = this.gridId,\n gridCaptionId = this.gridCaptionId,\n gridHelpId = this.gridHelpId,\n activeId = this.activeId,\n isLive = this.isLive,\n isRTL = this.isRTL,\n activeYMD = this.activeYMD,\n selectedYMD = this.selectedYMD,\n safeId = this.safeId;\n var hideDecadeNav = !this.showDecadeNav;\n var todayYMD = formatYMD(this.getToday());\n var highlightToday = !this.noHighlightToday; // Header showing current selected date\n \n var $header = h('output', {\n staticClass: 'form-control form-control-sm text-center',\n class: {\n 'text-muted': this.disabled,\n readonly: this.readonly || this.disabled\n },\n attrs: {\n id: valueId,\n for: gridId,\n role: 'status',\n tabindex: this.disabled ? null : '-1',\n // Mainly for testing purposes, as we do not know\n // the exact format `Intl` will format the date string\n 'data-selected': toString$1(selectedYMD),\n // We wait until after mount to enable `aria-live`\n // to prevent initial announcement on page render\n 'aria-live': isLive ? 'polite' : 'off',\n 'aria-atomic': isLive ? 'true' : null\n },\n on: {\n // Transfer focus/click to focus grid\n // and focus active date (or today if no selection)\n click: this.onHeaderClick,\n focus: this.onHeaderClick\n }\n }, this.selectedDate ? [// We use `bdi` elements here in case the label doesn't match the locale\n // Although IE 11 does not deal with at all (equivalent to a span)\n h('bdi', {\n staticClass: 'sr-only'\n }, \" (\".concat(toString$1(this.labelSelected), \") \")), h('bdi', this.formatDateString(this.selectedDate))] : this.labelNoDateSelected || \"\\xA0\" // ' '\n );\n $header = h('header', {\n staticClass: 'b-calendar-header',\n class: {\n 'sr-only': this.hideHeader\n },\n attrs: {\n title: this.selectedDate ? this.labelSelectedDate || null : null\n }\n }, [$header]); // Content for the date navigation buttons\n \n var navScope = {\n isRTL: isRTL\n };\n var navProps = {\n shiftV: 0.5\n };\n \n var navPrevProps = _objectSpread2(_objectSpread2({}, navProps), {}, {\n flipH: isRTL\n });\n \n var navNextProps = _objectSpread2(_objectSpread2({}, navProps), {}, {\n flipH: !isRTL\n });\n \n var $prevDecadeIcon = this.normalizeSlot('nav-prev-decade', navScope) || h(BIconChevronBarLeft, {\n props: navPrevProps\n });\n var $prevYearIcon = this.normalizeSlot('nav-prev-year', navScope) || h(BIconChevronDoubleLeft, {\n props: navPrevProps\n });\n var $prevMonthIcon = this.normalizeSlot('nav-prev-month', navScope) || h(BIconChevronLeft, {\n props: navPrevProps\n });\n var $thisMonthIcon = this.normalizeSlot('nav-this-month', navScope) || h(BIconCircleFill, {\n props: navProps\n });\n var $nextMonthIcon = this.normalizeSlot('nav-next-month', navScope) || h(BIconChevronLeft, {\n props: navNextProps\n });\n var $nextYearIcon = this.normalizeSlot('nav-next-year', navScope) || h(BIconChevronDoubleLeft, {\n props: navNextProps\n });\n var $nextDecadeIcon = this.normalizeSlot('nav-next-decade', navScope) || h(BIconChevronBarLeft, {\n props: navNextProps\n }); // Utility to create the date navigation buttons\n \n var makeNavBtn = function makeNavBtn(content, label, handler, btnDisabled, shortcut) {\n return h('button', {\n staticClass: 'btn btn-sm btn-outline-secondary border-0 flex-fill',\n class: {\n disabled: btnDisabled\n },\n attrs: {\n title: label || null,\n type: 'button',\n 'aria-label': label || null,\n 'aria-disabled': btnDisabled ? 'true' : null,\n 'aria-keyshortcuts': shortcut || null\n },\n on: btnDisabled ? {} : {\n click: handler\n }\n }, [h('div', {\n attrs: {\n 'aria-hidden': 'true'\n }\n }, [content])]);\n }; // Generate the date navigation buttons\n \n \n var $nav = h('div', {\n staticClass: 'b-calendar-nav d-flex',\n attrs: {\n id: navId,\n role: 'group',\n 'aria-hidden': this.disabled ? 'true' : null,\n 'aria-label': this.labelNav || null,\n 'aria-controls': gridId\n }\n }, [hideDecadeNav ? h() : makeNavBtn($prevDecadeIcon, this.labelPrevDecade, this.gotoPrevDecade, this.prevDecadeDisabled, 'Ctrl+Alt+PageDown'), makeNavBtn($prevYearIcon, this.labelPrevYear, this.gotoPrevYear, this.prevYearDisabled, 'Alt+PageDown'), makeNavBtn($prevMonthIcon, this.labelPrevMonth, this.gotoPrevMonth, this.prevMonthDisabled, 'PageDown'), makeNavBtn($thisMonthIcon, this.labelCurrentMonth, this.gotoCurrentMonth, this.thisMonthDisabled, 'Home'), makeNavBtn($nextMonthIcon, this.labelNextMonth, this.gotoNextMonth, this.nextMonthDisabled, 'PageUp'), makeNavBtn($nextYearIcon, this.labelNextYear, this.gotoNextYear, this.nextYearDisabled, 'Alt+PageUp'), hideDecadeNav ? h() : makeNavBtn($nextDecadeIcon, this.labelNextDecade, this.gotoNextDecade, this.nextDecadeDisabled, 'Ctrl+Alt+PageUp')]); // Caption for calendar grid\n \n var $gridCaption = h('header', {\n key: 'grid-caption',\n staticClass: 'b-calendar-grid-caption text-center font-weight-bold',\n class: {\n 'text-muted': this.disabled\n },\n attrs: {\n id: gridCaptionId,\n 'aria-live': isLive ? 'polite' : null,\n 'aria-atomic': isLive ? 'true' : null\n }\n }, this.formatYearMonth(this.calendarFirstDay)); // Calendar weekday headings\n \n var $gridWeekDays = h('div', {\n staticClass: 'b-calendar-grid-weekdays row no-gutters border-bottom',\n attrs: {\n 'aria-hidden': 'true'\n }\n }, this.calendarHeadings.map(function (d, idx) {\n return h('small', {\n key: idx,\n staticClass: 'col text-truncate',\n class: {\n 'text-muted': _this5.disabled\n },\n attrs: {\n title: d.label === d.text ? null : d.label,\n 'aria-label': d.label\n }\n }, d.text);\n })); // Calendar day grid\n \n var $gridBody = this.calendar.map(function (week) {\n var $cells = week.map(function (day, dIndex) {\n var _class;\n \n var isSelected = day.ymd === selectedYMD;\n var isActive = day.ymd === activeYMD;\n var isToday = day.ymd === todayYMD;\n var idCell = safeId(\"_cell-\".concat(day.ymd, \"_\")); // \"fake\" button\n \n var $btn = h('span', {\n staticClass: 'btn border-0 rounded-circle text-nowrap',\n // Should we add some classes to signify if today/selected/etc?\n class: (_class = {\n // Give the fake button a focus ring\n focus: isActive && _this5.gridHasFocus,\n // Styling\n disabled: day.isDisabled || _this5.disabled,\n active: isSelected\n }, _defineProperty(_class, _this5.computedVariant, isSelected), _defineProperty(_class, _this5.computedTodayVariant, isToday && highlightToday && !isSelected && day.isThisMonth), _defineProperty(_class, 'btn-outline-light', !(isToday && highlightToday) && !isSelected && !isActive), _defineProperty(_class, 'btn-light', !(isToday && highlightToday) && !isSelected && isActive), _defineProperty(_class, 'text-muted', !day.isThisMonth && !isSelected), _defineProperty(_class, 'text-dark', !(isToday && highlightToday) && !isSelected && !isActive && day.isThisMonth), _defineProperty(_class, 'font-weight-bold', (isSelected || day.isThisMonth) && !day.isDisabled), _class),\n on: {\n click: function click() {\n return _this5.onClickDay(day);\n }\n }\n }, day.day);\n return h('div', // Cell with button\n {\n key: dIndex,\n staticClass: 'col p-0',\n class: day.isDisabled ? 'bg-light' : day.info.class || '',\n attrs: {\n id: idCell,\n role: 'button',\n 'data-date': day.ymd,\n // Primarily for testing purposes\n // Only days in the month are presented as buttons to screen readers\n 'aria-hidden': day.isThisMonth ? null : 'true',\n 'aria-disabled': day.isDisabled || _this5.disabled ? 'true' : null,\n 'aria-label': [day.label, isSelected ? \"(\".concat(_this5.labelSelected, \")\") : null, isToday ? \"(\".concat(_this5.labelToday, \")\") : null].filter(identity).join(' '),\n // NVDA doesn't convey `aria-selected`, but does `aria-current`,\n // ChromeVox doesn't convey `aria-current`, but does `aria-selected`,\n // so we set both attributes for robustness\n 'aria-selected': isSelected ? 'true' : null,\n 'aria-current': isSelected ? 'date' : null\n }\n }, [$btn]);\n }); // Return the week \"row\"\n // We use the first day of the weeks YMD value as a\n // key for efficient DOM patching / element re-use\n \n return h('div', {\n key: week[0].ymd,\n staticClass: 'row no-gutters'\n }, $cells);\n });\n $gridBody = h('div', {\n // A key is only required on the body if we add in transition support\n // key: this.activeYMD.slice(0, -3),\n staticClass: 'b-calendar-grid-body',\n style: this.disabled ? {\n pointerEvents: 'none'\n } : {}\n }, $gridBody);\n var $gridHelp = h('footer', {\n staticClass: 'b-calendar-grid-help border-top small text-muted text-center bg-light',\n attrs: {\n id: gridHelpId\n }\n }, [h('div', {\n staticClass: 'small'\n }, this.labelHelp)]);\n var $grid = h('div', {\n ref: 'grid',\n staticClass: 'b-calendar-grid form-control h-auto text-center',\n attrs: {\n id: gridId,\n role: 'application',\n tabindex: this.disabled ? null : '0',\n 'data-month': activeYMD.slice(0, -3),\n // `YYYY-MM`, mainly for testing\n 'aria-roledescription': this.labelCalendar || null,\n 'aria-labelledby': gridCaptionId,\n 'aria-describedby': gridHelpId,\n // `aria-readonly` is not considered valid on `role=\"application\"`\n // https://www.w3.org/TR/wai-aria-1.1/#aria-readonly\n // 'aria-readonly': this.readonly && !this.disabled ? 'true' : null,\n 'aria-disabled': this.disabled ? 'true' : null,\n 'aria-activedescendant': activeId\n },\n on: {\n keydown: this.onKeydownGrid,\n focus: this.setGridFocusFlag,\n blur: this.setGridFocusFlag\n }\n }, [$gridCaption, $gridWeekDays, $gridBody, $gridHelp]); // Optional bottom slot\n \n var $slot = this.normalizeSlot('default');\n $slot = $slot ? h('footer', {\n staticClass: 'b-calendar-footer'\n }, $slot) : h();\n var $widget = h('div', {\n staticClass: 'b-calendar-inner',\n style: this.block ? {} : {\n width: this.width\n },\n attrs: {\n id: widgetId,\n dir: isRTL ? 'rtl' : 'ltr',\n lang: this.computedLocale || null,\n role: 'group',\n 'aria-disabled': this.disabled ? 'true' : null,\n // If datepicker controls an input, this will specify the ID of the input\n 'aria-controls': this.ariaControls || null,\n // This should be a prop (so it can be changed to Date picker, etc, localized\n 'aria-roledescription': this.roleDescription || null,\n 'aria-describedby': [// Should the attr (if present) go last?\n // Or should this attr be a prop?\n this.bvAttrs['aria-describedby'], valueId, gridHelpId].filter(identity).join(' ')\n },\n on: {\n keydown: this.onKeydownWrapper\n }\n }, [$header, $nav, $grid, $slot]); // Wrap in an outer div that can be styled\n \n return h('div', {\n staticClass: 'b-calendar',\n class: {\n 'd-block': this.block\n }\n }, [$widget]);\n }\n });\n \n var CalendarPlugin = /*#__PURE__*/pluginFactory({\n components: {\n BCalendar: BCalendar\n }\n });\n \n // @vue/component\n var cardMixin = {\n props: {\n tag: {\n type: String,\n default: 'div'\n },\n bgVariant: {\n type: String // default: null\n \n },\n borderVariant: {\n type: String // default: null\n \n },\n textVariant: {\n type: String // default: null\n \n }\n }\n };\n \n var props$8 = {\n title: {\n type: String // default: null\n \n },\n titleTag: {\n type: String,\n default: 'h4'\n }\n }; // @vue/component\n \n var BCardTitle = /*#__PURE__*/Vue.extend({\n name: 'BCardTitle',\n functional: true,\n props: props$8,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n return h(props.titleTag, a(data, {\n staticClass: 'card-title'\n }), children || toString$1(props.title));\n }\n });\n \n var NAME$b = 'BCardSubTitle';\n var props$9 = {\n subTitle: {\n type: String // default: null\n \n },\n subTitleTag: {\n type: String,\n default: 'h6'\n },\n subTitleTextVariant: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$b, 'subTitleTextVariant');\n }\n }\n }; // @vue/component\n \n var BCardSubTitle = /*#__PURE__*/Vue.extend({\n name: NAME$b,\n functional: true,\n props: props$9,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n return h(props.subTitleTag, a(data, {\n staticClass: 'card-subtitle',\n class: [props.subTitleTextVariant ? \"text-\".concat(props.subTitleTextVariant) : null]\n }), children || toString$1(props.subTitle));\n }\n });\n \n var props$a = _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, copyProps(cardMixin.props, prefixPropName.bind(null, 'body'))), {}, {\n bodyClass: {\n type: [String, Object, Array] // default: null\n \n }\n }, props$8), props$9), {}, {\n overlay: {\n type: Boolean,\n default: false\n }\n }); // @vue/component\n \n var BCardBody = /*#__PURE__*/Vue.extend({\n name: 'BCardBody',\n functional: true,\n props: props$a,\n render: function render(h, _ref) {\n var _ref2;\n \n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n var cardTitle = h();\n var cardSubTitle = h();\n var cardContent = children || [h()];\n \n if (props.title) {\n cardTitle = h(BCardTitle, {\n props: pluckProps(props$8, props)\n });\n }\n \n if (props.subTitle) {\n cardSubTitle = h(BCardSubTitle, {\n props: pluckProps(props$9, props),\n class: ['mb-2']\n });\n }\n \n return h(props.bodyTag, a(data, {\n staticClass: 'card-body',\n class: [(_ref2 = {\n 'card-img-overlay': props.overlay\n }, _defineProperty(_ref2, \"bg-\".concat(props.bodyBgVariant), props.bodyBgVariant), _defineProperty(_ref2, \"border-\".concat(props.bodyBorderVariant), props.bodyBorderVariant), _defineProperty(_ref2, \"text-\".concat(props.bodyTextVariant), props.bodyTextVariant), _ref2), props.bodyClass || {}]\n }), [cardTitle, cardSubTitle].concat(_toConsumableArray(cardContent)));\n }\n });\n \n var props$b = _objectSpread2(_objectSpread2({}, copyProps(cardMixin.props, prefixPropName.bind(null, 'header'))), {}, {\n header: {\n type: String // default: null\n \n },\n headerHtml: {\n type: String // default: null\n \n },\n headerClass: {\n type: [String, Object, Array] // default: null\n \n }\n }); // --- Main component ---\n // @vue/component\n \n var BCardHeader = /*#__PURE__*/Vue.extend({\n name: 'BCardHeader',\n functional: true,\n props: props$b,\n render: function render(h, _ref) {\n var _ref2;\n \n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n var headerBgVariant = props.headerBgVariant,\n headerBorderVariant = props.headerBorderVariant,\n headerTextVariant = props.headerTextVariant;\n return h(props.headerTag, a(data, {\n staticClass: 'card-header',\n class: [props.headerClass, (_ref2 = {}, _defineProperty(_ref2, \"bg-\".concat(headerBgVariant), headerBgVariant), _defineProperty(_ref2, \"border-\".concat(headerBorderVariant), headerBorderVariant), _defineProperty(_ref2, \"text-\".concat(headerTextVariant), headerTextVariant), _ref2)],\n domProps: children ? {} : htmlOrText(props.headerHtml, props.header)\n }), children);\n }\n });\n \n var props$c = _objectSpread2(_objectSpread2({}, copyProps(cardMixin.props, prefixPropName.bind(null, 'footer'))), {}, {\n footer: {\n type: String // default: null\n \n },\n footerHtml: {\n type: String // default: null\n \n },\n footerClass: {\n type: [String, Object, Array] // default: null\n \n }\n }); // --- Main component ---\n // @vue/component\n \n var BCardFooter = /*#__PURE__*/Vue.extend({\n name: 'BCardFooter',\n functional: true,\n props: props$c,\n render: function render(h, _ref) {\n var _ref2;\n \n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n var footerBgVariant = props.footerBgVariant,\n footerBorderVariant = props.footerBorderVariant,\n footerTextVariant = props.footerTextVariant;\n return h(props.footerTag, a(data, {\n staticClass: 'card-footer',\n class: [props.footerClass, (_ref2 = {}, _defineProperty(_ref2, \"bg-\".concat(footerBgVariant), footerBgVariant), _defineProperty(_ref2, \"border-\".concat(footerBorderVariant), footerBorderVariant), _defineProperty(_ref2, \"text-\".concat(footerTextVariant), footerTextVariant), _ref2)],\n domProps: children ? {} : htmlOrText(props.footerHtml, props.footer)\n }), children);\n }\n });\n \n var props$d = {\n src: {\n type: String,\n required: true\n },\n alt: {\n type: String,\n default: null\n },\n top: {\n type: Boolean,\n default: false\n },\n bottom: {\n type: Boolean,\n default: false\n },\n start: {\n type: Boolean,\n default: false\n },\n left: {\n // alias of 'start'\n type: Boolean,\n default: false\n },\n end: {\n type: Boolean,\n default: false\n },\n right: {\n // alias of 'end'\n type: Boolean,\n default: false\n },\n height: {\n type: [Number, String] // default: null\n \n },\n width: {\n type: [Number, String] // default: null\n \n }\n }; // @vue/component\n \n var BCardImg = /*#__PURE__*/Vue.extend({\n name: 'BCardImg',\n functional: true,\n props: props$d,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data;\n var baseClass = 'card-img';\n \n if (props.top) {\n baseClass += '-top';\n } else if (props.right || props.end) {\n baseClass += '-right';\n } else if (props.bottom) {\n baseClass += '-bottom';\n } else if (props.left || props.start) {\n baseClass += '-left';\n }\n \n return h('img', a(data, {\n class: [baseClass],\n attrs: {\n src: props.src || null,\n alt: props.alt,\n height: props.height || null,\n width: props.width || null\n }\n }));\n }\n });\n \n var cardImgProps = copyProps(props$d, prefixPropName.bind(null, 'img'));\n cardImgProps.imgSrc.required = false;\n var props$e = _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, props$a), props$b), props$c), cardImgProps), copyProps(cardMixin.props)), {}, {\n align: {\n type: String // default: null\n \n },\n noBody: {\n type: Boolean,\n default: false\n }\n }); // @vue/component\n \n var BCard = /*#__PURE__*/Vue.extend({\n name: 'BCard',\n functional: true,\n props: props$e,\n render: function render(h, _ref) {\n var _class;\n \n var props = _ref.props,\n data = _ref.data,\n slots = _ref.slots,\n scopedSlots = _ref.scopedSlots;\n var imgLeft = props.imgLeft,\n imgRight = props.imgRight,\n imgStart = props.imgStart,\n imgEnd = props.imgEnd,\n header = props.header,\n headerHtml = props.headerHtml,\n footer = props.footer,\n footerHtml = props.footerHtml,\n align = props.align,\n textVariant = props.textVariant,\n bgVariant = props.bgVariant,\n borderVariant = props.borderVariant;\n var $scopedSlots = scopedSlots || {};\n var $slots = slots();\n var slotScope = {};\n var $imgFirst = h();\n var $imgLast = h();\n \n if (props.imgSrc) {\n var $img = h(BCardImg, {\n props: pluckProps(cardImgProps, props, unprefixPropName.bind(null, 'img'))\n });\n \n if (props.imgBottom) {\n $imgLast = $img;\n } else {\n $imgFirst = $img;\n }\n }\n \n var $header = h();\n var hasHeaderSlot = hasNormalizedSlot('header', $scopedSlots, $slots);\n \n if (hasHeaderSlot || header || headerHtml) {\n $header = h(BCardHeader, {\n props: pluckProps(props$b, props),\n domProps: hasHeaderSlot ? {} : htmlOrText(headerHtml, header)\n }, normalizeSlot('header', slotScope, $scopedSlots, $slots));\n }\n \n var $content = normalizeSlot('default', slotScope, $scopedSlots, $slots); // Wrap content in when `noBody` prop set\n \n if (!props.noBody) {\n $content = h(BCardBody, {\n props: pluckProps(props$a, props)\n }, $content);\n }\n \n var $footer = h();\n var hasFooterSlot = hasNormalizedSlot('footer', $scopedSlots, $slots);\n \n if (hasFooterSlot || footer || footerHtml) {\n $footer = h(BCardFooter, {\n props: pluckProps(props$c, props),\n domProps: hasHeaderSlot ? {} : htmlOrText(footerHtml, footer)\n }, normalizeSlot('footer', slotScope, $scopedSlots, $slots));\n }\n \n return h(props.tag, a(data, {\n staticClass: 'card',\n class: (_class = {\n 'flex-row': imgLeft || imgStart,\n 'flex-row-reverse': (imgRight || imgEnd) && !(imgLeft || imgStart)\n }, _defineProperty(_class, \"text-\".concat(align), align), _defineProperty(_class, \"bg-\".concat(bgVariant), bgVariant), _defineProperty(_class, \"border-\".concat(borderVariant), borderVariant), _defineProperty(_class, \"text-\".concat(textVariant), textVariant), _class)\n }), [$imgFirst, $header, $content, $footer, $imgLast]);\n }\n });\n \n var OBSERVER_PROP_NAME = '__bv__visibility_observer';\n var RX_ONLY_DIGITS = /^\\d+$/;\n \n var VisibilityObserver = /*#__PURE__*/function () {\n function VisibilityObserver(el, options, vnode) {\n _classCallCheck(this, VisibilityObserver);\n \n this.el = el;\n this.callback = options.callback;\n this.margin = options.margin || 0;\n this.once = options.once || false;\n this.observer = null;\n this.visible = undefined;\n this.doneOnce = false; // Create the observer instance (if possible)\n \n this.createObserver(vnode);\n }\n \n _createClass(VisibilityObserver, [{\n key: \"createObserver\",\n value: function createObserver(vnode) {\n var _this = this;\n \n // Remove any previous observer\n if (this.observer) {\n /* istanbul ignore next */\n this.stop();\n } // Should only be called once and `callback` prop should be a function\n \n \n if (this.doneOnce || !isFunction(this.callback)) {\n /* istanbul ignore next */\n return;\n } // Create the observer instance\n \n \n try {\n // Future: Possibly add in other modifiers for left/right/top/bottom\n // offsets, root element reference, and thresholds\n this.observer = new IntersectionObserver(this.handler.bind(this), {\n // `null` = 'viewport'\n root: null,\n // Pixels away from view port to consider \"visible\"\n rootMargin: this.margin,\n // Intersection ratio of el and root (as a value from 0 to 1)\n threshold: 0\n });\n } catch (_unused) {\n // No IntersectionObserver support, so just stop trying to observe\n this.doneOnce = true;\n this.observer = undefined;\n this.callback(null);\n return;\n } // Start observing in a `$nextTick()` (to allow DOM to complete rendering)\n \n /* istanbul ignore next: IntersectionObserver not supported in JSDOM */\n \n \n vnode.context.$nextTick(function () {\n requestAF(function () {\n // Placed in an `if` just in case we were destroyed before\n // this `requestAnimationFrame` runs\n if (_this.observer) {\n _this.observer.observe(_this.el);\n }\n });\n });\n }\n /* istanbul ignore next */\n \n }, {\n key: \"handler\",\n value: function handler(entries)\n /* istanbul ignore next: IntersectionObserver not supported in JSDOM */\n {\n var entry = entries ? entries[0] : {};\n var isIntersecting = Boolean(entry.isIntersecting || entry.intersectionRatio > 0.0);\n \n if (isIntersecting !== this.visible) {\n this.visible = isIntersecting;\n this.callback(isIntersecting);\n \n if (this.once && this.visible) {\n this.doneOnce = true;\n this.stop();\n }\n }\n }\n }, {\n key: \"stop\",\n value: function stop() {\n /* istanbul ignore next */\n this.observer && this.observer.disconnect();\n this.observer = null;\n }\n }]);\n \n return VisibilityObserver;\n }();\n \n var destroy = function destroy(el) {\n var observer = el[OBSERVER_PROP_NAME];\n \n if (observer && observer.stop) {\n observer.stop();\n }\n \n delete el[OBSERVER_PROP_NAME];\n };\n \n var bind = function bind(el, _ref, vnode) {\n var value = _ref.value,\n modifiers = _ref.modifiers;\n // `value` is the callback function\n var options = {\n margin: '0px',\n once: false,\n callback: value\n }; // Parse modifiers\n \n keys(modifiers).forEach(function (mod) {\n /* istanbul ignore else: Until is switched to use this directive */\n if (RX_ONLY_DIGITS.test(mod)) {\n options.margin = \"\".concat(mod, \"px\");\n } else if (mod.toLowerCase() === 'once') {\n options.once = true;\n }\n }); // Destroy any previous observer\n \n destroy(el); // Create new observer\n \n el[OBSERVER_PROP_NAME] = new VisibilityObserver(el, options, vnode); // Store the current modifiers on the object (cloned)\n \n el[OBSERVER_PROP_NAME]._prevModifiers = clone(modifiers);\n }; // When the directive options may have been updated (or element)\n \n \n var componentUpdated = function componentUpdated(el, _ref2, vnode) {\n var value = _ref2.value,\n oldValue = _ref2.oldValue,\n modifiers = _ref2.modifiers;\n // Compare value/oldValue and modifiers to see if anything has changed\n // and if so, destroy old observer and create new observer\n \n /* istanbul ignore next */\n modifiers = clone(modifiers);\n /* istanbul ignore next */\n \n if (el && (value !== oldValue || !el[OBSERVER_PROP_NAME] || !looseEqual(modifiers, el[OBSERVER_PROP_NAME]._prevModifiers))) {\n // Re-bind on element\n bind(el, {\n value: value,\n modifiers: modifiers\n }, vnode);\n }\n }; // When directive un-binds from element\n \n \n var unbind = function unbind(el) {\n // Remove the observer\n destroy(el);\n }; // Export the directive\n \n \n var VBVisible = {\n bind: bind,\n componentUpdated: componentUpdated,\n unbind: unbind\n };\n \n var NAME$c = 'BImg'; // Blank image with fill template\n \n var BLANK_TEMPLATE = '' + '' + '';\n var props$f = {\n src: {\n type: String // default: null\n \n },\n srcset: {\n type: [String, Array] // default: null\n \n },\n sizes: {\n type: [String, Array] // default: null\n \n },\n alt: {\n type: String,\n default: null\n },\n width: {\n type: [Number, String] // default: null\n \n },\n height: {\n type: [Number, String] // default: null\n \n },\n block: {\n type: Boolean,\n default: false\n },\n fluid: {\n type: Boolean,\n default: false\n },\n fluidGrow: {\n // Gives fluid images class `w-100` to make them grow to fit container\n type: Boolean,\n default: false\n },\n rounded: {\n // rounded can be:\n // false: no rounding of corners\n // true: slightly rounded corners\n // 'top': top corners rounded\n // 'right': right corners rounded\n // 'bottom': bottom corners rounded\n // 'left': left corners rounded\n // 'circle': circle/oval\n // '0': force rounding off\n type: [Boolean, String],\n default: false\n },\n thumbnail: {\n type: Boolean,\n default: false\n },\n left: {\n type: Boolean,\n default: false\n },\n right: {\n type: Boolean,\n default: false\n },\n center: {\n type: Boolean,\n default: false\n },\n blank: {\n type: Boolean,\n default: false\n },\n blankColor: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$c, 'blankColor');\n }\n }\n }; // --- Helper methods ---\n \n var makeBlankImgSrc = function makeBlankImgSrc(width, height, color) {\n var src = encodeURIComponent(BLANK_TEMPLATE.replace('%{w}', toString$1(width)).replace('%{h}', toString$1(height)).replace('%{f}', color));\n return \"data:image/svg+xml;charset=UTF-8,\".concat(src);\n }; // @vue/component\n \n \n var BImg = /*#__PURE__*/Vue.extend({\n name: NAME$c,\n functional: true,\n props: props$f,\n render: function render(h, _ref) {\n var _class;\n \n var props = _ref.props,\n data = _ref.data;\n var src = props.src;\n var width = toInteger(props.width) || null;\n var height = toInteger(props.height) || null;\n var align = null;\n var block = props.block;\n var srcset = concat(props.srcset).filter(identity).join(',');\n var sizes = concat(props.sizes).filter(identity).join(',');\n \n if (props.blank) {\n if (!height && width) {\n height = width;\n } else if (!width && height) {\n width = height;\n }\n \n if (!width && !height) {\n width = 1;\n height = 1;\n } // Make a blank SVG image\n \n \n src = makeBlankImgSrc(width, height, props.blankColor || 'transparent'); // Disable srcset and sizes\n \n srcset = null;\n sizes = null;\n }\n \n if (props.left) {\n align = 'float-left';\n } else if (props.right) {\n align = 'float-right';\n } else if (props.center) {\n align = 'mx-auto';\n block = true;\n }\n \n return h('img', a(data, {\n attrs: {\n src: src,\n alt: props.alt,\n width: width ? toString$1(width) : null,\n height: height ? toString$1(height) : null,\n srcset: srcset || null,\n sizes: sizes || null\n },\n class: (_class = {\n 'img-thumbnail': props.thumbnail,\n 'img-fluid': props.fluid || props.fluidGrow,\n 'w-100': props.fluidGrow,\n rounded: props.rounded === '' || props.rounded === true\n }, _defineProperty(_class, \"rounded-\".concat(props.rounded), isString(props.rounded) && props.rounded !== ''), _defineProperty(_class, align, align), _defineProperty(_class, 'd-block', block), _class)\n }));\n }\n });\n \n var NAME$d = 'BImgLazy';\n var props$g = {\n src: {\n type: String,\n required: true\n },\n srcset: {\n type: [String, Array] // default: null\n \n },\n sizes: {\n type: [String, Array] // default: null\n \n },\n alt: {\n type: String // default: null\n \n },\n width: {\n type: [Number, String] // default: null\n \n },\n height: {\n type: [Number, String] // default: null\n \n },\n blankSrc: {\n // If null, a blank image is generated\n type: String,\n default: null\n },\n blankColor: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$d, 'blankColor');\n }\n },\n blankWidth: {\n type: [Number, String] // default: null\n \n },\n blankHeight: {\n type: [Number, String] // default: null\n \n },\n show: {\n type: Boolean,\n default: false\n },\n fluid: {\n type: Boolean,\n default: false\n },\n fluidGrow: {\n type: Boolean,\n default: false\n },\n block: {\n type: Boolean,\n default: false\n },\n thumbnail: {\n type: Boolean,\n default: false\n },\n rounded: {\n type: [Boolean, String],\n default: false\n },\n left: {\n type: Boolean,\n default: false\n },\n right: {\n type: Boolean,\n default: false\n },\n center: {\n type: Boolean,\n default: false\n },\n offset: {\n // Distance away from viewport (in pixels) before being\n // considered \"visible\"\n type: [Number, String],\n default: 360\n }\n }; // @vue/component\n \n var BImgLazy = /*#__PURE__*/Vue.extend({\n name: NAME$d,\n directives: {\n bVisible: VBVisible\n },\n props: props$g,\n data: function data() {\n return {\n isShown: this.show\n };\n },\n computed: {\n computedSrc: function computedSrc() {\n return !this.blankSrc || this.isShown ? this.src : this.blankSrc;\n },\n computedBlank: function computedBlank() {\n return !(this.isShown || this.blankSrc);\n },\n computedWidth: function computedWidth() {\n return this.isShown ? this.width : this.blankWidth || this.width;\n },\n computedHeight: function computedHeight() {\n return this.isShown ? this.height : this.blankHeight || this.height;\n },\n computedSrcset: function computedSrcset() {\n var srcset = concat(this.srcset).filter(identity).join(',');\n return !this.blankSrc || this.isShown ? srcset : null;\n },\n computedSizes: function computedSizes() {\n var sizes = concat(this.sizes).filter(identity).join(',');\n return !this.blankSrc || this.isShown ? sizes : null;\n }\n },\n watch: {\n show: function show(newVal, oldVal) {\n if (newVal !== oldVal) {\n // If IntersectionObserver support is not available, image is always shown\n var visible = hasIntersectionObserverSupport ? newVal : true;\n this.isShown = visible;\n \n if (visible !== newVal) {\n // Ensure the show prop is synced (when no IntersectionObserver)\n this.$nextTick(this.updateShowProp);\n }\n }\n },\n isShown: function isShown(newVal, oldVal) {\n if (newVal !== oldVal) {\n // Update synched show prop\n this.updateShowProp();\n }\n }\n },\n mounted: function mounted() {\n // If IntersectionObserver is not available, image is always shown\n this.isShown = hasIntersectionObserverSupport ? this.show : true;\n },\n methods: {\n updateShowProp: function updateShowProp() {\n this.$emit('update:show', this.isShown);\n },\n doShow: function doShow(visible) {\n // If IntersectionObserver is not supported, the callback\n // will be called with `null` rather than `true` or `false`\n if ((visible || visible === null) && !this.isShown) {\n this.isShown = true;\n }\n }\n },\n render: function render(h) {\n var directives = [];\n \n if (!this.isShown) {\n var _modifiers;\n \n // We only add the visible directive if we are not shown\n directives.push({\n // Visible directive will silently do nothing if\n // IntersectionObserver is not supported\n name: 'b-visible',\n // Value expects a callback (passed one arg of `visible` = `true` or `false`)\n value: this.doShow,\n modifiers: (_modifiers = {}, _defineProperty(_modifiers, \"\".concat(toInteger(this.offset, 0)), true), _defineProperty(_modifiers, \"once\", true), _modifiers)\n });\n }\n \n return h(BImg, {\n directives: directives,\n props: {\n // Computed value props\n src: this.computedSrc,\n blank: this.computedBlank,\n width: this.computedWidth,\n height: this.computedHeight,\n srcset: this.computedSrcset || null,\n sizes: this.computedSizes || null,\n // Passthrough props\n alt: this.alt,\n blankColor: this.blankColor,\n fluid: this.fluid,\n fluidGrow: this.fluidGrow,\n block: this.block,\n thumbnail: this.thumbnail,\n rounded: this.rounded,\n left: this.left,\n right: this.right,\n center: this.center\n }\n });\n }\n });\n \n // The `omit()` util creates a new object, so we can just pass the original props\n \n var lazyProps = omit(props$g, ['left', 'right', 'center', 'block', 'rounded', 'thumbnail', 'fluid', 'fluidGrow']);\n var props$h = _objectSpread2(_objectSpread2({}, lazyProps), {}, {\n top: {\n type: Boolean,\n default: false\n },\n bottom: {\n type: Boolean,\n default: false\n },\n start: {\n type: Boolean,\n default: false\n },\n left: {\n // alias of 'start'\n type: Boolean,\n default: false\n },\n end: {\n type: Boolean,\n default: false\n },\n right: {\n // alias of 'end'\n type: Boolean,\n default: false\n }\n }); // @vue/component\n \n var BCardImgLazy = /*#__PURE__*/Vue.extend({\n name: 'BCardImgLazy',\n functional: true,\n props: props$h,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data;\n var baseClass = 'card-img';\n \n if (props.top) {\n baseClass += '-top';\n } else if (props.right || props.end) {\n baseClass += '-right';\n } else if (props.bottom) {\n baseClass += '-bottom';\n } else if (props.left || props.start) {\n baseClass += '-left';\n } // False out the left/center/right props before passing to b-img-lazy\n \n \n var lazyProps = _objectSpread2(_objectSpread2({}, props), {}, {\n left: false,\n right: false,\n center: false\n });\n \n return h(BImgLazy, a(data, {\n class: [baseClass],\n props: lazyProps\n }));\n }\n });\n \n var props$i = {\n textTag: {\n type: String,\n default: 'p'\n }\n }; // @vue/component\n \n var BCardText = /*#__PURE__*/Vue.extend({\n name: 'BCardText',\n functional: true,\n props: props$i,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n return h(props.textTag, a(data, {\n staticClass: 'card-text'\n }), children);\n }\n });\n \n var props$j = {\n tag: {\n type: String,\n default: 'div'\n },\n deck: {\n type: Boolean,\n default: false\n },\n columns: {\n type: Boolean,\n default: false\n }\n }; // @vue/component\n \n var BCardGroup = /*#__PURE__*/Vue.extend({\n name: 'BCardGroup',\n functional: true,\n props: props$j,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n return h(props.tag, a(data, {\n class: props.deck ? 'card-deck' : props.columns ? 'card-columns' : 'card-group'\n }), children);\n }\n });\n \n var CardPlugin = /*#__PURE__*/pluginFactory({\n components: {\n BCard: BCard,\n BCardHeader: BCardHeader,\n BCardBody: BCardBody,\n BCardTitle: BCardTitle,\n BCardSubTitle: BCardSubTitle,\n BCardFooter: BCardFooter,\n BCardImg: BCardImg,\n BCardImgLazy: BCardImgLazy,\n BCardText: BCardText,\n BCardGroup: BCardGroup\n }\n });\n \n var noop = function noop() {};\n \n /**\n * Observe a DOM element changes, falls back to eventListener mode\n * @param {Element} el The DOM element to observe\n * @param {Function} callback callback to be called on change\n * @param {object} [options={childList: true, subtree: true}] observe options\n * @see https://stackoverflow.com/questions/3219758\n */\n \n var observeDom = function observeDom(el, callback, options)\n /* istanbul ignore next: difficult to test in JSDOM */\n {\n // Handle cases where we might be passed a Vue instance\n el = el ? el.$el || el : null; // Early exit when we have no element\n \n /* istanbul ignore next: difficult to test in JSDOM */\n \n if (!isElement(el)) {\n return null;\n } // Exit and throw a warning when `MutationObserver` isn't available\n \n \n if (warnNoMutationObserverSupport('observeDom')) {\n return null;\n } // Define a new observer\n \n \n var obs = new MutationObs(function (mutations) {\n var changed = false; // A mutation can contain several change records, so we loop\n // through them to see what has changed\n // We break out of the loop early if any \"significant\" change\n // has been detected\n \n for (var i = 0; i < mutations.length && !changed; i++) {\n // The mutation record\n var mutation = mutations[i]; // Mutation type\n \n var type = mutation.type; // DOM node (could be any DOM node type - HTMLElement, Text, comment, etc.)\n \n var target = mutation.target; // Detect whether a change happened based on type and target\n \n if (type === 'characterData' && target.nodeType === Node.TEXT_NODE) {\n // We ignore nodes that are not TEXT (i.e. comments, etc)\n // as they don't change layout\n changed = true;\n } else if (type === 'attributes') {\n changed = true;\n } else if (type === 'childList' && (mutation.addedNodes.length > 0 || mutation.removedNodes.length > 0)) {\n // This includes HTMLElement and text nodes being\n // added/removed/re-arranged\n changed = true;\n }\n } // We only call the callback if a change that could affect\n // layout/size truly happened\n \n \n if (changed) {\n callback();\n }\n }); // Have the observer observe foo for changes in children, etc\n \n obs.observe(el, _objectSpread2({\n childList: true,\n subtree: true\n }, options)); // We return a reference to the observer so that `obs.disconnect()`\n // can be called if necessary\n // To reduce overhead when the root element is hidden\n \n return obs;\n };\n \n var EVENT_OPTIONS_PASSIVE = {\n passive: true\n };\n var EVENT_OPTIONS_NO_CAPTURE = {\n passive: true,\n capture: false\n }; // --- Utils ---\n // Normalize event options based on support of passive option\n // Exported only for testing purposes\n \n var parseEventOptions = function parseEventOptions(options) {\n /* istanbul ignore else: can't test in JSDOM, as it supports passive */\n if (hasPassiveEventSupport) {\n return isObject(options) ? options : {\n capture: !!options || false\n };\n } else {\n // Need to translate to actual Boolean value\n return !!(isObject(options) ? options.capture : options);\n }\n }; // Attach an event listener to an element\n \n var eventOn = function eventOn(el, evtName, handler, options) {\n if (el && el.addEventListener) {\n el.addEventListener(evtName, handler, parseEventOptions(options));\n }\n }; // Remove an event listener from an element\n \n var eventOff = function eventOff(el, evtName, handler, options) {\n if (el && el.removeEventListener) {\n el.removeEventListener(evtName, handler, parseEventOptions(options));\n }\n }; // Utility method to add/remove a event listener based on first argument (boolean)\n // It passes all other arguments to the `eventOn()` or `eventOff` method\n \n var eventOnOff = function eventOnOff(on) {\n var method = on ? eventOn : eventOff;\n \n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n \n method.apply(void 0, args);\n };\n \n var NAME$e = 'BCarousel'; // Slide directional classes\n \n var DIRECTION = {\n next: {\n dirClass: 'carousel-item-left',\n overlayClass: 'carousel-item-next'\n },\n prev: {\n dirClass: 'carousel-item-right',\n overlayClass: 'carousel-item-prev'\n }\n }; // Fallback Transition duration (with a little buffer) in ms\n \n var TRANS_DURATION = 600 + 50; // Time for mouse compat events to fire after touch\n \n var TOUCH_EVENT_COMPAT_WAIT = 500; // Number of pixels to consider touch move a swipe\n \n var SWIPE_THRESHOLD = 40; // PointerEvent pointer types\n \n var PointerType = {\n TOUCH: 'touch',\n PEN: 'pen'\n }; // Transition Event names\n \n var TransitionEndEvents = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'otransitionend oTransitionEnd',\n transition: 'transitionend'\n }; // Return the browser specific transitionEnd event name\n \n var getTransitionEndEvent = function getTransitionEndEvent(el) {\n for (var name in TransitionEndEvents) {\n if (!isUndefined(el.style[name])) {\n return TransitionEndEvents[name];\n }\n } // Fallback\n \n /* istanbul ignore next */\n \n \n return null;\n }; // @vue/component\n \n \n var BCarousel = /*#__PURE__*/Vue.extend({\n name: NAME$e,\n mixins: [idMixin, normalizeSlotMixin],\n provide: function provide() {\n return {\n bvCarousel: this\n };\n },\n model: {\n prop: 'value',\n event: 'input'\n },\n props: {\n labelPrev: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$e, 'labelPrev');\n }\n },\n labelNext: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$e, 'labelNext');\n }\n },\n labelGotoSlide: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$e, 'labelGotoSlide');\n }\n },\n labelIndicators: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$e, 'labelIndicators');\n }\n },\n interval: {\n type: Number,\n default: 5000\n },\n indicators: {\n type: Boolean,\n default: false\n },\n controls: {\n type: Boolean,\n default: false\n },\n noAnimation: {\n // Disable slide/fade animation\n type: Boolean,\n default: false\n },\n fade: {\n // Enable cross-fade animation instead of slide animation\n type: Boolean,\n default: false\n },\n noWrap: {\n // Disable wrapping/looping when start/end is reached\n type: Boolean,\n default: false\n },\n noTouch: {\n // Sniffed by carousel-slide\n type: Boolean,\n default: false\n },\n noHoverPause: {\n // Disable pause on hover\n type: Boolean,\n default: false\n },\n imgWidth: {\n // Sniffed by carousel-slide\n type: [Number, String] // default: undefined\n \n },\n imgHeight: {\n // Sniffed by carousel-slide\n type: [Number, String] // default: undefined\n \n },\n background: {\n type: String // default: undefined\n \n },\n value: {\n type: Number,\n default: 0\n }\n },\n data: function data() {\n return {\n index: this.value || 0,\n isSliding: false,\n transitionEndEvent: null,\n slides: [],\n direction: null,\n isPaused: !(toInteger(this.interval, 0) > 0),\n // Touch event handling values\n touchStartX: 0,\n touchDeltaX: 0\n };\n },\n computed: {\n numSlides: function numSlides() {\n return this.slides.length;\n }\n },\n watch: {\n value: function value(newVal, oldVal) {\n if (newVal !== oldVal) {\n this.setSlide(toInteger(newVal, 0));\n }\n },\n interval: function interval(newVal, oldVal) {\n if (newVal === oldVal) {\n /* istanbul ignore next */\n return;\n }\n \n if (!newVal) {\n // Pausing slide show\n this.pause(false);\n } else {\n // Restarting or Changing interval\n this.pause(true);\n this.start(false);\n }\n },\n isPaused: function isPaused(newVal, oldVal) {\n if (newVal !== oldVal) {\n this.$emit(newVal ? 'paused' : 'unpaused');\n }\n },\n index: function index(to, from) {\n if (to === from || this.isSliding) {\n /* istanbul ignore next */\n return;\n }\n \n this.doSlide(to, from);\n }\n },\n created: function created() {\n // Create private non-reactive props\n this.$_interval = null;\n this.$_animationTimeout = null;\n this.$_touchTimeout = null;\n this.$_observer = null; // Set initial paused state\n \n this.isPaused = !(toInteger(this.interval, 0) > 0);\n },\n mounted: function mounted() {\n // Cache current browser transitionend event name\n this.transitionEndEvent = getTransitionEndEvent(this.$el) || null; // Get all slides\n \n this.updateSlides(); // Observe child changes so we can update slide list\n \n this.setObserver(true);\n },\n beforeDestroy: function beforeDestroy() {\n this.clearInterval();\n this.clearAnimationTimeout();\n this.clearTouchTimeout();\n this.setObserver(false);\n },\n methods: {\n clearInterval: function (_clearInterval) {\n function clearInterval() {\n return _clearInterval.apply(this, arguments);\n }\n \n clearInterval.toString = function () {\n return _clearInterval.toString();\n };\n \n return clearInterval;\n }(function () {\n clearInterval(this.$_interval);\n this.$_interval = null;\n }),\n clearAnimationTimeout: function clearAnimationTimeout() {\n clearTimeout(this.$_animationTimeout);\n this.$_animationTimeout = null;\n },\n clearTouchTimeout: function clearTouchTimeout() {\n clearTimeout(this.$_touchTimeout);\n this.$_touchTimeout = null;\n },\n setObserver: function setObserver() {\n var on = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n this.$_observer && this.$_observer.disconnect();\n this.$_observer = null;\n \n if (on) {\n this.$_observer = observeDom(this.$refs.inner, this.updateSlides.bind(this), {\n subtree: false,\n childList: true,\n attributes: true,\n attributeFilter: ['id']\n });\n }\n },\n // Set slide\n setSlide: function setSlide(slide) {\n var _this = this;\n \n var direction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n \n // Don't animate when page is not visible\n \n /* istanbul ignore if: difficult to test */\n if (isBrowser && document.visibilityState && document.hidden) {\n return;\n }\n \n var noWrap = this.noWrap;\n var numSlides = this.numSlides; // Make sure we have an integer (you never know!)\n \n slide = mathFloor(slide); // Don't do anything if nothing to slide to\n \n if (numSlides === 0) {\n return;\n } // Don't change slide while transitioning, wait until transition is done\n \n \n if (this.isSliding) {\n // Schedule slide after sliding complete\n this.$once('sliding-end', function () {\n return _this.setSlide(slide, direction);\n });\n return;\n }\n \n this.direction = direction; // Set new slide index\n // Wrap around if necessary (if no-wrap not enabled)\n \n this.index = slide >= numSlides ? noWrap ? numSlides - 1 : 0 : slide < 0 ? noWrap ? 0 : numSlides - 1 : slide; // Ensure the v-model is synched up if no-wrap is enabled\n // and user tried to slide pass either ends\n \n if (noWrap && this.index !== slide && this.index !== this.value) {\n this.$emit('input', this.index);\n }\n },\n // Previous slide\n prev: function prev() {\n this.setSlide(this.index - 1, 'prev');\n },\n // Next slide\n next: function next() {\n this.setSlide(this.index + 1, 'next');\n },\n // Pause auto rotation\n pause: function pause(evt) {\n if (!evt) {\n this.isPaused = true;\n }\n \n this.clearInterval();\n },\n // Start auto rotate slides\n start: function start(evt) {\n if (!evt) {\n this.isPaused = false;\n }\n /* istanbul ignore next: most likely will never happen, but just in case */\n \n \n this.clearInterval(); // Don't start if no interval, or less than 2 slides\n \n if (this.interval && this.numSlides > 1) {\n this.$_interval = setInterval(this.next, mathMax(1000, this.interval));\n }\n },\n // Restart auto rotate slides when focus/hover leaves the carousel\n \n /* istanbul ignore next */\n restart: function restart()\n /* istanbul ignore next: difficult to test */\n {\n if (!this.$el.contains(getActiveElement())) {\n this.start();\n }\n },\n doSlide: function doSlide(to, from) {\n var _this2 = this;\n \n var isCycling = Boolean(this.interval); // Determine sliding direction\n \n var direction = this.calcDirection(this.direction, from, to);\n var overlayClass = direction.overlayClass;\n var dirClass = direction.dirClass; // Determine current and next slides\n \n var currentSlide = this.slides[from];\n var nextSlide = this.slides[to]; // Don't do anything if there aren't any slides to slide to\n \n if (!currentSlide || !nextSlide) {\n /* istanbul ignore next */\n return;\n } // Start animating\n \n \n this.isSliding = true;\n \n if (isCycling) {\n this.pause(false);\n }\n \n this.$emit('sliding-start', to); // Update v-model\n \n this.$emit('input', this.index);\n \n if (this.noAnimation) {\n addClass(nextSlide, 'active');\n removeClass(currentSlide, 'active');\n this.isSliding = false; // Notify ourselves that we're done sliding (slid)\n \n this.$nextTick(function () {\n return _this2.$emit('sliding-end', to);\n });\n } else {\n addClass(nextSlide, overlayClass); // Trigger a reflow of next slide\n \n reflow(nextSlide);\n addClass(currentSlide, dirClass);\n addClass(nextSlide, dirClass); // Transition End handler\n \n var called = false;\n /* istanbul ignore next: difficult to test */\n \n var onceTransEnd = function onceTransEnd() {\n if (called) {\n return;\n }\n \n called = true;\n /* istanbul ignore if: transition events cant be tested in JSDOM */\n \n if (_this2.transitionEndEvent) {\n var events = _this2.transitionEndEvent.split(/\\s+/);\n \n events.forEach(function (evt) {\n return eventOff(nextSlide, evt, onceTransEnd, EVENT_OPTIONS_NO_CAPTURE);\n });\n }\n \n _this2.clearAnimationTimeout();\n \n removeClass(nextSlide, dirClass);\n removeClass(nextSlide, overlayClass);\n addClass(nextSlide, 'active');\n removeClass(currentSlide, 'active');\n removeClass(currentSlide, dirClass);\n removeClass(currentSlide, overlayClass);\n setAttr(currentSlide, 'aria-current', 'false');\n setAttr(nextSlide, 'aria-current', 'true');\n setAttr(currentSlide, 'aria-hidden', 'true');\n setAttr(nextSlide, 'aria-hidden', 'false');\n _this2.isSliding = false;\n _this2.direction = null; // Notify ourselves that we're done sliding (slid)\n \n _this2.$nextTick(function () {\n return _this2.$emit('sliding-end', to);\n });\n }; // Set up transitionend handler\n \n /* istanbul ignore if: transition events cant be tested in JSDOM */\n \n \n if (this.transitionEndEvent) {\n var events = this.transitionEndEvent.split(/\\s+/);\n events.forEach(function (event) {\n return eventOn(nextSlide, event, onceTransEnd, EVENT_OPTIONS_NO_CAPTURE);\n });\n } // Fallback to setTimeout()\n \n \n this.$_animationTimeout = setTimeout(onceTransEnd, TRANS_DURATION);\n }\n \n if (isCycling) {\n this.start(false);\n }\n },\n // Update slide list\n updateSlides: function updateSlides() {\n this.pause(true); // Get all slides as DOM elements\n \n this.slides = selectAll('.carousel-item', this.$refs.inner);\n var numSlides = this.slides.length; // Keep slide number in range\n \n var index = mathMax(0, mathMin(mathFloor(this.index), numSlides - 1));\n this.slides.forEach(function (slide, idx) {\n var n = idx + 1;\n \n if (idx === index) {\n addClass(slide, 'active');\n setAttr(slide, 'aria-current', 'true');\n } else {\n removeClass(slide, 'active');\n setAttr(slide, 'aria-current', 'false');\n }\n \n setAttr(slide, 'aria-posinset', String(n));\n setAttr(slide, 'aria-setsize', String(numSlides));\n }); // Set slide as active\n \n this.setSlide(index);\n this.start(this.isPaused);\n },\n calcDirection: function calcDirection() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var curIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var nextIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n \n if (!direction) {\n return nextIndex > curIndex ? DIRECTION.next : DIRECTION.prev;\n }\n \n return DIRECTION[direction];\n },\n handleClick: function handleClick(evt, fn) {\n var keyCode = evt.keyCode;\n \n if (evt.type === 'click' || keyCode === KEY_CODES.SPACE || keyCode === KEY_CODES.ENTER) {\n evt.preventDefault();\n evt.stopPropagation();\n fn();\n }\n },\n \n /* istanbul ignore next */\n handleSwipe: function handleSwipe()\n /* istanbul ignore next: JSDOM doesn't support touch events */\n {\n var absDeltaX = mathAbs(this.touchDeltaX);\n \n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n \n var direction = absDeltaX / this.touchDeltaX; // Reset touch delta X\n // https://github.com/twbs/bootstrap/pull/28558\n \n this.touchDeltaX = 0;\n \n if (direction > 0) {\n // Swipe left\n this.prev();\n } else if (direction < 0) {\n // Swipe right\n this.next();\n }\n },\n \n /* istanbul ignore next */\n touchStart: function touchStart(evt)\n /* istanbul ignore next: JSDOM doesn't support touch events */\n {\n if (hasPointerEventSupport && PointerType[evt.pointerType.toUpperCase()]) {\n this.touchStartX = evt.clientX;\n } else if (!hasPointerEventSupport) {\n this.touchStartX = evt.touches[0].clientX;\n }\n },\n \n /* istanbul ignore next */\n touchMove: function touchMove(evt)\n /* istanbul ignore next: JSDOM doesn't support touch events */\n {\n // Ensure swiping with one touch and not pinching\n if (evt.touches && evt.touches.length > 1) {\n this.touchDeltaX = 0;\n } else {\n this.touchDeltaX = evt.touches[0].clientX - this.touchStartX;\n }\n },\n \n /* istanbul ignore next */\n touchEnd: function touchEnd(evt)\n /* istanbul ignore next: JSDOM doesn't support touch events */\n {\n if (hasPointerEventSupport && PointerType[evt.pointerType.toUpperCase()]) {\n this.touchDeltaX = evt.clientX - this.touchStartX;\n }\n \n this.handleSwipe(); // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n \n this.pause(false);\n this.clearTouchTimeout();\n this.$_touchTimeout = setTimeout(this.start, TOUCH_EVENT_COMPAT_WAIT + mathMax(1000, this.interval));\n }\n },\n render: function render(h) {\n var _this3 = this;\n \n // Wrapper for slides\n var inner = h('div', {\n ref: 'inner',\n class: ['carousel-inner'],\n attrs: {\n id: this.safeId('__BV_inner_'),\n role: 'list'\n }\n }, [this.normalizeSlot('default')]); // Prev and next controls\n \n var controls = h();\n \n if (this.controls) {\n var prevHandler = function prevHandler(evt) {\n /* istanbul ignore next */\n if (!_this3.isSliding) {\n _this3.handleClick(evt, _this3.prev);\n } else {\n evt.preventDefault();\n }\n };\n \n var nextHandler = function nextHandler(evt) {\n /* istanbul ignore next */\n if (!_this3.isSliding) {\n _this3.handleClick(evt, _this3.next);\n } else {\n evt.preventDefault();\n }\n };\n \n controls = [h('a', {\n class: ['carousel-control-prev'],\n attrs: {\n href: '#',\n role: 'button',\n 'aria-controls': this.safeId('__BV_inner_'),\n 'aria-disabled': this.isSliding ? 'true' : null\n },\n on: {\n click: prevHandler,\n keydown: prevHandler\n }\n }, [h('span', {\n class: ['carousel-control-prev-icon'],\n attrs: {\n 'aria-hidden': 'true'\n }\n }), h('span', {\n class: ['sr-only']\n }, [this.labelPrev])]), h('a', {\n class: ['carousel-control-next'],\n attrs: {\n href: '#',\n role: 'button',\n 'aria-controls': this.safeId('__BV_inner_'),\n 'aria-disabled': this.isSliding ? 'true' : null\n },\n on: {\n click: nextHandler,\n keydown: nextHandler\n }\n }, [h('span', {\n class: ['carousel-control-next-icon'],\n attrs: {\n 'aria-hidden': 'true'\n }\n }), h('span', {\n class: ['sr-only']\n }, [this.labelNext])])];\n } // Indicators\n \n \n var indicators = h('ol', {\n class: ['carousel-indicators'],\n directives: [{\n name: 'show',\n rawName: 'v-show',\n value: this.indicators,\n expression: 'indicators'\n }],\n attrs: {\n id: this.safeId('__BV_indicators_'),\n 'aria-hidden': this.indicators ? 'false' : 'true',\n 'aria-label': this.labelIndicators,\n 'aria-owns': this.safeId('__BV_inner_')\n }\n }, this.slides.map(function (slide, n) {\n return h('li', {\n key: \"slide_\".concat(n),\n class: {\n active: n === _this3.index\n },\n attrs: {\n role: 'button',\n id: _this3.safeId(\"__BV_indicator_\".concat(n + 1, \"_\")),\n tabindex: _this3.indicators ? '0' : '-1',\n 'aria-current': n === _this3.index ? 'true' : 'false',\n 'aria-label': \"\".concat(_this3.labelGotoSlide, \" \").concat(n + 1),\n 'aria-describedby': _this3.slides[n].id || null,\n 'aria-controls': _this3.safeId('__BV_inner_')\n },\n on: {\n click: function click(evt) {\n _this3.handleClick(evt, function () {\n _this3.setSlide(n);\n });\n },\n keydown: function keydown(evt) {\n _this3.handleClick(evt, function () {\n _this3.setSlide(n);\n });\n }\n }\n });\n }));\n var on = {\n mouseenter: this.noHoverPause ? noop : this.pause,\n mouseleave: this.noHoverPause ? noop : this.restart,\n focusin: this.pause,\n focusout: this.restart,\n keydown: function keydown(evt) {\n if (/input|textarea/i.test(evt.target.tagName)) {\n /* istanbul ignore next */\n return;\n }\n \n var keyCode = evt.keyCode;\n \n if (keyCode === KEY_CODES.LEFT || keyCode === KEY_CODES.RIGHT) {\n evt.preventDefault();\n evt.stopPropagation();\n \n _this3[keyCode === KEY_CODES.LEFT ? 'prev' : 'next']();\n }\n }\n }; // Touch support event handlers for environment\n \n if (!this.noTouch && hasTouchSupport) {\n // Attach appropriate listeners (prepend event name with '&' for passive mode)\n \n /* istanbul ignore next: JSDOM doesn't support touch events */\n if (hasPointerEventSupport) {\n on['&pointerdown'] = this.touchStart;\n on['&pointerup'] = this.touchEnd;\n } else {\n on['&touchstart'] = this.touchStart;\n on['&touchmove'] = this.touchMove;\n on['&touchend'] = this.touchEnd;\n }\n } // Return the carousel\n \n \n return h('div', {\n staticClass: 'carousel',\n class: {\n slide: !this.noAnimation,\n 'carousel-fade': !this.noAnimation && this.fade,\n 'pointer-event': !this.noTouch && hasTouchSupport && hasPointerEventSupport\n },\n style: {\n background: this.background\n },\n attrs: {\n role: 'region',\n id: this.safeId(),\n 'aria-busy': this.isSliding ? 'true' : 'false'\n },\n on: on\n }, [inner, controls, indicators]);\n }\n });\n \n var imgProps = {\n imgSrc: {\n type: String // default: undefined\n \n },\n imgAlt: {\n type: String // default: undefined\n \n },\n imgWidth: {\n type: [Number, String] // default: undefined\n \n },\n imgHeight: {\n type: [Number, String] // default: undefined\n \n },\n imgBlank: {\n type: Boolean,\n default: false\n },\n imgBlankColor: {\n type: String,\n default: 'transparent'\n }\n };\n var props$k = _objectSpread2(_objectSpread2({}, imgProps), {}, {\n contentVisibleUp: {\n type: String\n },\n contentTag: {\n type: String,\n default: 'div'\n },\n caption: {\n type: String\n },\n captionHtml: {\n type: String\n },\n captionTag: {\n type: String,\n default: 'h3'\n },\n text: {\n type: String\n },\n textHtml: {\n type: String\n },\n textTag: {\n type: String,\n default: 'p'\n },\n background: {\n type: String\n }\n }); // --- Main component ---\n // @vue/component\n \n var BCarouselSlide = /*#__PURE__*/Vue.extend({\n name: 'BCarouselSlide',\n mixins: [idMixin, normalizeSlotMixin],\n inject: {\n bvCarousel: {\n default: function _default() {\n return {\n // Explicitly disable touch if not a child of carousel\n noTouch: true\n };\n }\n }\n },\n props: props$k,\n computed: {\n contentClasses: function contentClasses() {\n return [this.contentVisibleUp ? 'd-none' : '', this.contentVisibleUp ? \"d-\".concat(this.contentVisibleUp, \"-block\") : ''];\n },\n computedWidth: function computedWidth() {\n // Use local width, or try parent width\n return this.imgWidth || this.bvCarousel.imgWidth || null;\n },\n computedHeight: function computedHeight() {\n // Use local height, or try parent height\n return this.imgHeight || this.bvCarousel.imgHeight || null;\n }\n },\n render: function render(h) {\n var $img = this.normalizeSlot('img');\n \n if (!$img && (this.imgSrc || this.imgBlank)) {\n var on = {}; // Touch support event handler\n \n /* istanbul ignore if: difficult to test in JSDOM */\n \n if (!this.bvCarousel.noTouch && hasTouchSupport) {\n on.dragstart = function (evt) {\n evt.preventDefault();\n };\n }\n \n $img = h(BImg, {\n props: _objectSpread2(_objectSpread2({}, pluckProps(imgProps, this.$props, unprefixPropName.bind(null, 'img'))), {}, {\n width: this.computedWidth,\n height: this.computedHeight,\n fluidGrow: true,\n block: true\n }),\n on: on\n });\n }\n \n var $contentChildren = [// Caption\n this.caption || this.captionHtml ? h(this.captionTag, {\n domProps: htmlOrText(this.captionHtml, this.caption)\n }) : false, // Text\n this.text || this.textHtml ? h(this.textTag, {\n domProps: htmlOrText(this.textHtml, this.text)\n }) : false, // Children\n this.normalizeSlot('default') || false];\n var $content = h();\n \n if ($contentChildren.some(Boolean)) {\n $content = h(this.contentTag, {\n staticClass: 'carousel-caption',\n class: this.contentClasses\n }, $contentChildren.map(function ($child) {\n return $child || h();\n }));\n }\n \n return h('div', {\n staticClass: 'carousel-item',\n style: {\n background: this.background || this.bvCarousel.background || null\n },\n attrs: {\n id: this.safeId(),\n role: 'listitem'\n }\n }, [$img, $content]);\n }\n });\n \n var CarouselPlugin =\n /*#__PURE*/\n pluginFactory({\n components: {\n BCarousel: BCarousel,\n BCarouselSlide: BCarouselSlide\n }\n });\n \n // Generic collapse transion helper component\n \n var onEnter = function onEnter(el) {\n el.style.height = 0; // Animaton frame delay needed for `appear` to work\n \n requestAF(function () {\n reflow(el);\n el.style.height = \"\".concat(el.scrollHeight, \"px\");\n });\n };\n \n var onAfterEnter = function onAfterEnter(el) {\n el.style.height = null;\n };\n \n var onLeave = function onLeave(el) {\n el.style.height = 'auto';\n el.style.display = 'block';\n el.style.height = \"\".concat(getBCR(el).height, \"px\");\n reflow(el);\n el.style.height = 0;\n };\n \n var onAfterLeave = function onAfterLeave(el) {\n el.style.height = null;\n }; // Default transition props\n // `appear` will use the enter classes\n \n \n var TRANSITION_PROPS = {\n css: true,\n enterClass: '',\n enterActiveClass: 'collapsing',\n enterToClass: 'collapse show',\n leaveClass: 'collapse show',\n leaveActiveClass: 'collapsing',\n leaveToClass: 'collapse'\n }; // Default transition handlers\n // `appear` will use the enter handlers\n \n var TRANSITION_HANDLERS = {\n enter: onEnter,\n afterEnter: onAfterEnter,\n leave: onLeave,\n afterLeave: onAfterLeave\n }; // @vue/component\n \n var BVCollapse = /*#__PURE__*/Vue.extend({\n name: 'BVCollapse',\n functional: true,\n props: {\n appear: {\n // If `true` (and `visible` is `true` on mount), animate initially visible\n type: Boolean,\n default: false\n }\n },\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n return h('transition', // We merge in the `appear` prop last\n a(data, {\n props: TRANSITION_PROPS,\n on: TRANSITION_HANDLERS\n }, {\n props: props\n }), // Note: `` supports a single root element only\n children);\n }\n });\n \n // @vue/component\n var listenOnRootMixin = {\n methods: {\n /**\n * Safely register event listeners on the root Vue node\n * While Vue automatically removes listeners for individual components,\n * when a component registers a listener on root and is destroyed,\n * this orphans a callback because the node is gone,\n * but the root does not clear the callback\n *\n * When registering a `$root` listener, it also registers a listener on\n * the component's `beforeDestroy()` hook to automatically remove the\n * event listener from the `$root` instance\n *\n * @param {string} event\n * @param {function} callback\n */\n listenOnRoot: function listenOnRoot(event, callback) {\n var _this = this;\n \n this.$root.$on(event, callback);\n this.$on('hook:beforeDestroy', function () {\n _this.$root.$off(event, callback);\n });\n },\n \n /**\n * Safely register a `$once()` event listener on the root Vue node\n * While Vue automatically removes listeners for individual components,\n * when a component registers a listener on root and is destroyed,\n * this orphans a callback because the node is gone,\n * but the root does not clear the callback\n *\n * When registering a $root listener, it also registers a listener on\n * the component's `beforeDestroy` hook to automatically remove the\n * event listener from the $root instance.\n *\n * @param {string} event\n * @param {function} callback\n */\n listenOnRootOnce: function listenOnRootOnce(event, callback) {\n var _this2 = this;\n \n this.$root.$once(event, callback);\n this.$on('hook:beforeDestroy', function () {\n _this2.$root.$off(event, callback);\n });\n },\n \n /**\n * Convenience method for calling `vm.$emit()` on `vm.$root`\n *\n * @param {string} event\n * @param {*} args\n */\n emitOnRoot: function emitOnRoot(event) {\n var _this$$root;\n \n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n \n (_this$$root = this.$root).$emit.apply(_this$$root, [event].concat(args));\n }\n }\n };\n \n var ENTER$1 = KEY_CODES.ENTER,\n SPACE$1 = KEY_CODES.SPACE; // Classes to apply to trigger element\n \n var CLASS_BV_TOGGLE_COLLAPSED = 'collapsed';\n var CLASS_BV_TOGGLE_NOT_COLLAPSED = 'not-collapsed'; // Property key for handler storage\n \n var BV_BASE = '__BV_toggle'; // Root event listener property (Function)\n \n var BV_TOGGLE_ROOT_HANDLER = \"\".concat(BV_BASE, \"_HANDLER__\"); // Trigger element click handler property (Function)\n \n var BV_TOGGLE_CLICK_HANDLER = \"\".concat(BV_BASE, \"_CLICK__\"); // Target visibility state property (Boolean)\n \n var BV_TOGGLE_STATE = \"\".concat(BV_BASE, \"_STATE__\"); // Target ID list property (Array)\n \n var BV_TOGGLE_TARGETS = \"\".concat(BV_BASE, \"_TARGETS__\"); // Commonly used strings\n \n var STRING_FALSE = 'false';\n var STRING_TRUE = 'true'; // Commonly used attribute names\n \n var ATTR_ARIA_CONTROLS = 'aria-controls';\n var ATTR_ARIA_EXPANDED = 'aria-expanded';\n var ATTR_ROLE = 'role';\n var ATTR_TABINDEX = 'tabindex'; // Emitted control event for collapse (emitted to collapse)\n \n var EVENT_TOGGLE = 'bv::toggle::collapse'; // Listen to event for toggle state update (emitted by collapse)\n \n var EVENT_STATE = 'bv::collapse::state'; // Private event emitted on `$root` to ensure the toggle state is always synced\n // Gets emitted even if the state of b-collapse has not changed\n // This event is NOT to be documented as people should not be using it\n \n var EVENT_STATE_SYNC = 'bv::collapse::sync::state'; // Private event we send to collapse to request state update sync event\n \n var EVENT_STATE_REQUEST = 'bv::request::collapse::state';\n var KEYDOWN_KEY_CODES = [ENTER$1, SPACE$1];\n var RX_HASH = /^#/;\n var RX_HASH_ID = /^#[A-Za-z]+[\\w\\-:.]*$/;\n var RX_SPLIT_SEPARATOR = /\\s+/; // --- Helper methods ---\n \n var isNonStandardTag$1 = function isNonStandardTag(el) {\n return !arrayIncludes(['button', 'a'], el.tagName.toLowerCase());\n };\n \n var getTargets = function getTargets(_ref, el) {\n var modifiers = _ref.modifiers,\n arg = _ref.arg,\n value = _ref.value;\n // Any modifiers are considered target IDs\n var targets = keys(modifiers || {}); // If value is a string, split out individual targets (if space delimited)\n \n value = isString(value) ? value.split(RX_SPLIT_SEPARATOR) : value; // Support target ID as link href (`href=\"#id\"`)\n \n if (isTag(el.tagName, 'a')) {\n var href = getAttr(el, 'href') || '';\n \n if (RX_HASH_ID.test(href)) {\n targets.push(href.replace(RX_HASH, ''));\n }\n } // Add ID from `arg` (if provided), and support value\n // as a single string ID or an array of string IDs\n // If `value` is not an array or string, then it gets filtered out\n \n \n concat(arg, value).forEach(function (t) {\n return isString(t) && targets.push(t);\n }); // Return only unique and truthy target IDs\n \n return targets.filter(function (t, index, arr) {\n return t && arr.indexOf(t) === index;\n });\n };\n \n var removeClickListener = function removeClickListener(el) {\n var handler = el[BV_TOGGLE_CLICK_HANDLER];\n \n if (handler) {\n eventOff(el, 'click', handler);\n eventOff(el, 'keydown', handler);\n }\n \n el[BV_TOGGLE_CLICK_HANDLER] = null;\n };\n \n var addClickListener = function addClickListener(el, vnode) {\n removeClickListener(el);\n \n if (vnode.context) {\n var handler = function handler(evt) {\n if (!(evt.type === 'keydown' && !arrayIncludes(KEYDOWN_KEY_CODES, evt.keyCode)) && !isDisabled(el)) {\n var targets = el[BV_TOGGLE_TARGETS] || [];\n targets.forEach(function (target) {\n vnode.context.$root.$emit(EVENT_TOGGLE, target);\n });\n }\n };\n \n el[BV_TOGGLE_CLICK_HANDLER] = handler;\n eventOn(el, 'click', handler);\n \n if (isNonStandardTag$1(el)) {\n eventOn(el, 'keydown', handler);\n }\n }\n };\n \n var removeRootListeners = function removeRootListeners(el, vnode) {\n if (el[BV_TOGGLE_ROOT_HANDLER] && vnode.context) {\n vnode.context.$root.$off([EVENT_STATE, EVENT_STATE_SYNC], el[BV_TOGGLE_ROOT_HANDLER]);\n }\n \n el[BV_TOGGLE_ROOT_HANDLER] = null;\n };\n \n var addRootListeners = function addRootListeners(el, vnode) {\n removeRootListeners(el, vnode);\n \n if (vnode.context) {\n var handler = function handler(id, state) {\n // `state` will be `true` if target is expanded\n if (arrayIncludes(el[BV_TOGGLE_TARGETS] || [], id)) {\n // Set/Clear 'collapsed' visibility class state\n el[BV_TOGGLE_STATE] = state; // Set `aria-expanded` and class state on trigger element\n \n setToggleState(el, state);\n }\n };\n \n el[BV_TOGGLE_ROOT_HANDLER] = handler; // Listen for toggle state changes (public) and sync (private)\n \n vnode.context.$root.$on([EVENT_STATE, EVENT_STATE_SYNC], handler);\n }\n };\n \n var setToggleState = function setToggleState(el, state) {\n // State refers to the visibility of the collapse/sidebar\n if (state) {\n removeClass(el, CLASS_BV_TOGGLE_COLLAPSED);\n addClass(el, CLASS_BV_TOGGLE_NOT_COLLAPSED);\n setAttr(el, ATTR_ARIA_EXPANDED, STRING_TRUE);\n } else {\n removeClass(el, CLASS_BV_TOGGLE_NOT_COLLAPSED);\n addClass(el, CLASS_BV_TOGGLE_COLLAPSED);\n setAttr(el, ATTR_ARIA_EXPANDED, STRING_FALSE);\n }\n }; // Reset and remove a property from the provided element\n \n \n var resetProp = function resetProp(el, prop) {\n el[prop] = null;\n delete el[prop];\n }; // Handle directive updates\n \n \n var handleUpdate = function handleUpdate(el, binding, vnode) {\n /* istanbul ignore next: should never happen */\n if (!isBrowser || !vnode.context) {\n return;\n } // If element is not a button or link, we add `role=\"button\"`\n // and `tabindex=\"0\"` for accessibility reasons\n \n \n if (isNonStandardTag$1(el)) {\n if (!hasAttr(el, ATTR_ROLE)) {\n setAttr(el, ATTR_ROLE, 'button');\n }\n \n if (!hasAttr(el, ATTR_TABINDEX)) {\n setAttr(el, ATTR_TABINDEX, '0');\n }\n } // Ensure the collapse class and `aria-*` attributes persist\n // after element is updated (either by parent re-rendering\n // or changes to this element or its contents)\n \n \n setToggleState(el, el[BV_TOGGLE_STATE]); // Parse list of target IDs\n \n var targets = getTargets(binding, el);\n /* istanbul ignore else */\n // Ensure the `aria-controls` hasn't been overwritten\n // or removed when vnode updates\n \n if (targets.length) {\n setAttr(el, ATTR_ARIA_CONTROLS, targets.join(' '));\n } else {\n removeAttr(el, ATTR_ARIA_CONTROLS);\n } // Add/Update our click listener(s)\n \n \n addClickListener(el, vnode); // If targets array has changed, update\n \n if (!looseEqual(targets, el[BV_TOGGLE_TARGETS])) {\n // Update targets array to element storage\n el[BV_TOGGLE_TARGETS] = targets; // Ensure `aria-controls` is up to date\n // Request a state update from targets so that we can\n // ensure expanded state is correct (in most cases)\n \n targets.forEach(function (target) {\n vnode.context.$root.$emit(EVENT_STATE_REQUEST, target);\n });\n }\n };\n /*\n * Export our directive\n */\n \n \n var VBToggle = {\n bind: function bind(el, binding, vnode) {\n // State is initially collapsed until we receive a state event\n el[BV_TOGGLE_STATE] = false; // Assume no targets initially\n \n el[BV_TOGGLE_TARGETS] = []; // Add our root listeners\n \n addRootListeners(el, vnode); // Initial update of trigger\n \n handleUpdate(el, binding, vnode);\n },\n componentUpdated: handleUpdate,\n updated: handleUpdate,\n unbind: function unbind(el, binding, vnode) {\n removeClickListener(el); // Remove our $root listener\n \n removeRootListeners(el, vnode); // Reset custom props\n \n resetProp(el, BV_TOGGLE_ROOT_HANDLER);\n resetProp(el, BV_TOGGLE_CLICK_HANDLER);\n resetProp(el, BV_TOGGLE_STATE);\n resetProp(el, BV_TOGGLE_TARGETS); // Reset classes/attrs\n \n removeClass(el, CLASS_BV_TOGGLE_COLLAPSED);\n removeClass(el, CLASS_BV_TOGGLE_NOT_COLLAPSED);\n removeAttr(el, ATTR_ARIA_EXPANDED);\n removeAttr(el, ATTR_ARIA_CONTROLS);\n removeAttr(el, ATTR_ROLE);\n }\n };\n \n // Accordion event name we emit on `$root`\n \n var EVENT_ACCORDION = 'bv::collapse::accordion'; // --- Main component ---\n // @vue/component\n \n var BCollapse = /*#__PURE__*/Vue.extend({\n name: 'BCollapse',\n mixins: [idMixin, listenOnRootMixin, normalizeSlotMixin],\n model: {\n prop: 'visible',\n event: 'input'\n },\n props: {\n isNav: {\n type: Boolean,\n default: false\n },\n accordion: {\n type: String // default: null\n \n },\n visible: {\n type: Boolean,\n default: false\n },\n tag: {\n type: String,\n default: 'div'\n },\n appear: {\n // If `true` (and `visible` is `true` on mount), animate initially visible\n type: Boolean,\n default: false\n }\n },\n data: function data() {\n return {\n show: this.visible,\n transitioning: false\n };\n },\n computed: {\n classObject: function classObject() {\n return {\n 'navbar-collapse': this.isNav,\n collapse: !this.transitioning,\n show: this.show && !this.transitioning\n };\n }\n },\n watch: {\n visible: function visible(newVal) {\n if (newVal !== this.show) {\n this.show = newVal;\n }\n },\n show: function show(newVal, oldVal) {\n if (newVal !== oldVal) {\n this.emitState();\n }\n }\n },\n created: function created() {\n this.show = this.visible;\n },\n mounted: function mounted() {\n var _this = this;\n \n this.show = this.visible; // Listen for toggle events to open/close us\n \n this.listenOnRoot(EVENT_TOGGLE, this.handleToggleEvt); // Listen to other collapses for accordion events\n \n this.listenOnRoot(EVENT_ACCORDION, this.handleAccordionEvt);\n \n if (this.isNav) {\n // Set up handlers\n this.setWindowEvents(true);\n this.handleResize();\n }\n \n this.$nextTick(function () {\n _this.emitState();\n }); // Listen for \"Sync state\" requests from `v-b-toggle`\n \n this.listenOnRoot(EVENT_STATE_REQUEST, function (id) {\n if (id === _this.safeId()) {\n _this.$nextTick(_this.emitSync);\n }\n });\n },\n updated: function updated() {\n // Emit a private event every time this component updates to ensure\n // the toggle button is in sync with the collapse's state\n // It is emitted regardless if the visible state changes\n this.emitSync();\n },\n \n /* istanbul ignore next */\n deactivated: function deactivated()\n /* istanbul ignore next */\n {\n if (this.isNav) {\n this.setWindowEvents(false);\n }\n },\n \n /* istanbul ignore next */\n activated: function activated()\n /* istanbul ignore next */\n {\n if (this.isNav) {\n this.setWindowEvents(true);\n }\n \n this.emitSync();\n },\n beforeDestroy: function beforeDestroy() {\n // Trigger state emit if needed\n this.show = false;\n \n if (this.isNav && isBrowser) {\n this.setWindowEvents(false);\n }\n },\n methods: {\n setWindowEvents: function setWindowEvents(on) {\n eventOnOff(on, window, 'resize', this.handleResize, EVENT_OPTIONS_NO_CAPTURE);\n eventOnOff(on, window, 'orientationchange', this.handleResize, EVENT_OPTIONS_NO_CAPTURE);\n },\n toggle: function toggle() {\n this.show = !this.show;\n },\n onEnter: function onEnter() {\n this.transitioning = true; // This should be moved out so we can add cancellable events\n \n this.$emit('show');\n },\n onAfterEnter: function onAfterEnter() {\n this.transitioning = false;\n this.$emit('shown');\n },\n onLeave: function onLeave() {\n this.transitioning = true; // This should be moved out so we can add cancellable events\n \n this.$emit('hide');\n },\n onAfterLeave: function onAfterLeave() {\n this.transitioning = false;\n this.$emit('hidden');\n },\n emitState: function emitState() {\n this.$emit('input', this.show); // Let `v-b-toggle` know the state of this collapse\n \n this.emitOnRoot(EVENT_STATE, this.safeId(), this.show);\n \n if (this.accordion && this.show) {\n // Tell the other collapses in this accordion to close\n this.emitOnRoot(EVENT_ACCORDION, this.safeId(), this.accordion);\n }\n },\n emitSync: function emitSync() {\n // Emit a private event every time this component updates to ensure\n // the toggle button is in sync with the collapse's state\n // It is emitted regardless if the visible state changes\n this.emitOnRoot(EVENT_STATE_SYNC, this.safeId(), this.show);\n },\n checkDisplayBlock: function checkDisplayBlock() {\n // Check to see if the collapse has `display: block !important` set\n // We can't set `display: none` directly on `this.$el`, as it would\n // trigger a new transition to start (or cancel a current one)\n var restore = hasClass(this.$el, 'show');\n removeClass(this.$el, 'show');\n var isBlock = getCS(this.$el).display === 'block';\n \n if (restore) {\n addClass(this.$el, 'show');\n }\n \n return isBlock;\n },\n clickHandler: function clickHandler(evt) {\n // If we are in a nav/navbar, close the collapse when non-disabled link clicked\n var el = evt.target;\n \n if (!this.isNav || !el || getCS(this.$el).display !== 'block') {\n /* istanbul ignore next: can't test getComputedStyle in JSDOM */\n return;\n }\n \n if (matches(el, '.nav-link,.dropdown-item') || closest('.nav-link,.dropdown-item', el)) {\n if (!this.checkDisplayBlock()) {\n // Only close the collapse if it is not forced to be `display: block !important`\n this.show = false;\n }\n }\n },\n handleToggleEvt: function handleToggleEvt(target) {\n if (target !== this.safeId()) {\n return;\n }\n \n this.toggle();\n },\n handleAccordionEvt: function handleAccordionEvt(openedId, accordion) {\n if (!this.accordion || accordion !== this.accordion) {\n return;\n }\n \n if (openedId === this.safeId()) {\n // Open this collapse if not shown\n if (!this.show) {\n this.toggle();\n }\n } else {\n // Close this collapse if shown\n if (this.show) {\n this.toggle();\n }\n }\n },\n handleResize: function handleResize() {\n // Handler for orientation/resize to set collapsed state in nav/navbar\n this.show = getCS(this.$el).display === 'block';\n }\n },\n render: function render(h) {\n var _this2 = this;\n \n var scope = {\n visible: this.show,\n close: function close() {\n return _this2.show = false;\n }\n };\n var content = h(this.tag, {\n class: this.classObject,\n directives: [{\n name: 'show',\n value: this.show\n }],\n attrs: {\n id: this.safeId()\n },\n on: {\n click: this.clickHandler\n }\n }, [this.normalizeSlot('default', scope)]);\n return h(BVCollapse, {\n props: {\n appear: this.appear\n },\n on: {\n enter: this.onEnter,\n afterEnter: this.onAfterEnter,\n leave: this.onLeave,\n afterLeave: this.onAfterLeave\n }\n }, [content]);\n }\n });\n \n var VBTogglePlugin = /*#__PURE__*/pluginFactory({\n directives: {\n VBToggle: VBToggle\n }\n });\n \n var CollapsePlugin = /*#__PURE__*/pluginFactory({\n components: {\n BCollapse: BCollapse\n },\n plugins: {\n VBTogglePlugin: VBTogglePlugin\n }\n });\n \n /**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.16.1\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n var isBrowser$1 = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n \n var timeoutDuration = function () {\n var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser$1 && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n return 1;\n }\n }\n return 0;\n }();\n \n function microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n }\n \n function taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n }\n \n var supportsMicroTasks = isBrowser$1 && window.Promise;\n \n /**\n * Create a debounced version of a method, that's asynchronously deferred\n * but called in the minimum time possible.\n *\n * @method\n * @memberof Popper.Utils\n * @argument {Function} fn\n * @returns {Function}\n */\n var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n \n /**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\n function isFunction$1(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n }\n \n /**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\n function getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var window = element.ownerDocument.defaultView;\n var css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n }\n \n /**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\n function getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n }\n \n /**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\n function getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n \n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n \n // Firefox want us to check `-x` and `-y` variations as well\n \n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n \n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n \n return getScrollParent(getParentNode(element));\n }\n \n /**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\n function getReferenceNode(reference) {\n return reference && reference.referenceNode ? reference.referenceNode : reference;\n }\n \n var isIE11 = isBrowser$1 && !!(window.MSInputMethodContext && document.documentMode);\n var isIE10 = isBrowser$1 && /MSIE 10/.test(navigator.userAgent);\n \n /**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\n function isIE$1(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n }\n \n /**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\n function getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n \n var noOffsetParent = isIE$1(10) ? document.body : null;\n \n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent || null;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n \n var nodeName = offsetParent && offsetParent.nodeName;\n \n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n \n // .offsetParent will return the closest TH, TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n \n return offsetParent;\n }\n \n function isOffsetContainer(element) {\n var nodeName = element.nodeName;\n \n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n }\n \n /**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\n function getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n \n return node;\n }\n \n /**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\n function findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n \n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n \n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n \n // Both nodes are inside #document\n \n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n \n return getOffsetParent(commonAncestorContainer);\n }\n \n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n }\n \n /**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\n function getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n \n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n \n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n \n return element[upperSide];\n }\n \n /*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\n function includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n \n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n }\n \n /*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n \n function getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n \n return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']);\n }\n \n function getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE$1(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n }\n \n function getWindowSizes(document) {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE$1(10) && getComputedStyle(html);\n \n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n }\n \n var classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n };\n \n var createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n \n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n }();\n \n \n \n \n \n var defineProperty$1 = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n \n return obj;\n };\n \n var _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n \n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n \n return target;\n };\n \n /**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\n function getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n }\n \n /**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\n function getBoundingClientRect(element) {\n var rect = {};\n \n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE$1(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n \n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n \n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n var width = sizes.width || element.clientWidth || result.width;\n var height = sizes.height || element.clientHeight || result.height;\n \n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n \n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n \n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n \n return getClientRect(result);\n }\n \n function getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n \n var isIE10 = isIE$1(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n \n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth);\n \n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && isHTML) {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n \n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop);\n var marginLeft = parseFloat(styles.marginLeft);\n \n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n \n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n \n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n \n return offsets;\n }\n \n function getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n \n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n \n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n \n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n \n return getClientRect(offset);\n }\n \n /**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\n function isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n var parentNode = getParentNode(element);\n if (!parentNode) {\n return false;\n }\n return isFixed(parentNode);\n }\n \n /**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n \n function getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE$1()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n }\n \n /**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\n function getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n \n // NOTE: 1 DOM access here\n \n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n \n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n \n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n \n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n \n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n \n // Add paddings\n padding = padding || 0;\n var isPaddingNumber = typeof padding === 'number';\n boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n \n return boundaries;\n }\n \n function getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n \n return width * height;\n }\n \n /**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n \n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n \n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n \n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n \n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n \n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n \n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n \n var variation = placement.split('-')[1];\n \n return computedPlacement + (variation ? '-' + variation : '');\n }\n \n /**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\n function getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n \n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n }\n \n /**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\n function getOuterSizes(element) {\n var window = element.ownerDocument.defaultView;\n var styles = window.getComputedStyle(element);\n var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n }\n \n /**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\n function getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n }\n \n /**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\n function getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n \n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n \n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n \n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n \n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n \n return popperOffsets;\n }\n \n /**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\n function find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n \n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n }\n \n /**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\n function findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n \n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n }\n \n /**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\n function runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n \n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction$1(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n \n data = fn(data, modifier);\n }\n });\n \n return data;\n }\n \n /**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.
\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\n function update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n \n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n \n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n \n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n \n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n \n data.positionFixed = this.options.positionFixed;\n \n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n \n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n \n // run the modifiers\n data = runModifiers(this.modifiers, data);\n \n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n }\n \n /**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\n function isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n }\n \n /**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\n function getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n \n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n }\n \n /**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\n function destroy$1() {\n this.state.isDestroyed = true;\n \n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n \n this.disableEventListeners();\n \n // remove the popper if user explicitly asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n }\n \n /**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\n function getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n }\n \n function attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n \n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n }\n \n /**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\n function setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n \n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n \n return state;\n }\n \n /**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\n function enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n }\n \n /**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\n function removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n \n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n \n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n }\n \n /**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\n function disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n }\n \n /**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\n function isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n }\n \n /**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\n function setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n }\n \n /**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\n function setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n }\n \n /**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\n function applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n \n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n \n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n \n return data;\n }\n \n /**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\n function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n \n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n \n popper.setAttribute('x-placement', placement);\n \n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n \n return options;\n }\n \n /**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\n function getRoundedOffsets(data, shouldRound) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n var round = Math.round,\n floor = Math.floor;\n \n var noRound = function noRound(v) {\n return v;\n };\n \n var referenceWidth = round(reference.width);\n var popperWidth = round(popper.width);\n \n var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n var isVariation = data.placement.indexOf('-') !== -1;\n var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n \n var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n var verticalToInteger = !shouldRound ? noRound : round;\n \n return {\n left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n top: verticalToInteger(popper.top),\n bottom: verticalToInteger(popper.bottom),\n right: horizontalToInteger(popper.right)\n };\n }\n \n var isFirefox = isBrowser$1 && /Firefox/i.test(navigator.userAgent);\n \n /**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n function computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n \n // Remove this legacy support in Popper.js v2\n \n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n \n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n \n // Styles\n var styles = {\n position: popper.position\n };\n \n var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n \n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n \n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n \n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n // when offsetParent is the positioning is relative to the bottom of the screen (excluding the scrollbar)\n // and not the bottom of the html element\n if (offsetParent.nodeName === 'HTML') {\n top = -offsetParent.clientHeight + offsets.bottom;\n } else {\n top = -offsetParentRect.height + offsets.bottom;\n }\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n if (offsetParent.nodeName === 'HTML') {\n left = -offsetParent.clientWidth + offsets.right;\n } else {\n left = -offsetParentRect.width + offsets.right;\n }\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n \n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n \n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n \n return data;\n }\n \n /**\n * Helper used to know if the given modifier depends from another one.
\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\n function isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n \n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n \n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n }\n \n /**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n function arrow(data, options) {\n var _data$offsets$arrow;\n \n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n \n var arrowElement = options.element;\n \n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n \n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n \n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n \n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n \n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n \n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjunction\n //\n \n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n \n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n \n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized]);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n \n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n \n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty$1(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty$1(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n \n return data;\n }\n \n /**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\n function getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n }\n \n /**\n * List of accepted placements to use as values of the `placement` option.
\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.
\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\n var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n \n // Get rid of `auto` `auto-start` and `auto-end`\n var validPlacements = placements.slice(3);\n \n /**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\n function clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n \n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n }\n \n var BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n };\n \n /**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n function flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n \n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n \n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n \n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n \n var flipOrder = [];\n \n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n \n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n \n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n \n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n \n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n \n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n \n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n \n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n \n // flips variation if reference element overflows boundaries\n var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n \n // flips variation if popper content overflows boundaries\n var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n \n var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n \n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n \n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n \n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n \n data.placement = placement + (variation ? '-' + variation : '');\n \n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n \n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n }\n \n /**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n function keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n \n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n \n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n \n return data;\n }\n \n /**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\n function toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n \n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n \n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n \n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n }\n \n /**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\n function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n \n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n \n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n \n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n \n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n \n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n \n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n \n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n }\n \n /**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\n function offset$1(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n \n var basePlacement = placement.split('-')[0];\n \n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n \n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n \n data.popper = popper;\n return data;\n }\n \n /**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n function preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n \n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n \n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n \n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n \n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n \n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n \n options.boundaries = boundaries;\n \n var order = options.priority;\n var popper = data.offsets.popper;\n \n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty$1({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty$1({}, mainSide, value);\n }\n };\n \n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n \n data.offsets.popper = popper;\n \n return data;\n }\n \n /**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n function shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n \n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n \n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n \n var shiftOffsets = {\n start: defineProperty$1({}, side, reference[side]),\n end: defineProperty$1({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n \n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n \n return data;\n }\n \n /**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n function hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n \n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n \n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n \n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n \n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n \n return data;\n }\n \n /**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\n function inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n \n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n \n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n \n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n \n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n \n return data;\n }\n \n /**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.
\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n \n /**\n * Modifiers are plugins used to alter the behavior of your poppers.
\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\n var modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.
\n * It will read the variation of the `placement` property.
\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n \n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unit-less, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.
\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the `height`.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.
\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.
\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset$1,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n \n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * A scenario exists where the reference itself is not within the boundaries.
\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".
\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper. This makes sure the popper always has a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n \n /**\n * Modifier used to make sure the reference and its popper stay near each other\n * without leaving any gap between the two. Especially useful when the arrow is\n * enabled and you want to ensure that it points to its reference element.\n * It cares only about the first axis. You can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n \n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjunction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n \n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations)\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position.\n * The popper will never be placed outside of the defined boundaries\n * (except if `keepTogether` is enabled)\n */\n boundariesElement: 'viewport',\n /**\n * @prop {Boolean} flipVariations=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the reference element overlaps its boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariations: false,\n /**\n * @prop {Boolean} flipVariationsByContent=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the popper element overlaps its reference boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariationsByContent: false\n },\n \n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n \n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n \n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n \n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define your own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: undefined\n }\n };\n \n /**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n \n /**\n * Default options provided to Popper.js constructor.
\n * These can be overridden using the `options` argument of Popper.js.
\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\n var Defaults = {\n /**\n * Popper's placement.\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n \n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n \n /**\n * Whether events (resize, scroll) are initially enabled.\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n \n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n \n /**\n * Callback called when the popper is created.
\n * By default, it is set to no-op.
\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n \n /**\n * Callback called when the popper is updated. This callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.
\n * By default, it is set to no-op.
\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n \n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js.\n * @prop {modifiers}\n */\n modifiers: modifiers\n };\n \n /**\n * @callback onCreate\n * @param {dataObject} data\n */\n \n /**\n * @callback onUpdate\n * @param {dataObject} data\n */\n \n // Utils\n // Methods\n var Popper = function () {\n /**\n * Creates a new Popper.js instance.\n * @class Popper\n * @param {Element|referenceObject} reference - The reference element used to position the popper\n * @param {Element} popper - The HTML / XML element used as the popper\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n \n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n \n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n \n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n \n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n \n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n \n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n \n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n \n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n \n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction$1(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n \n // fire the first update to position the popper in the right place\n this.update();\n \n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n \n this.state.eventsEnabled = eventsEnabled;\n }\n \n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n \n \n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy$1.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n \n /**\n * Schedules an update. It will run on the next UI update available.\n * @method scheduleUpdate\n * @memberof Popper\n */\n \n \n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n \n }]);\n return Popper;\n }();\n \n /**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.
\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n \n \n Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\n Popper.placements = placements;\n Popper.Defaults = Defaults;\n \n var BvEvent = /*#__PURE__*/function () {\n function BvEvent(type) {\n var eventInit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n \n _classCallCheck(this, BvEvent);\n \n // Start by emulating native Event constructor\n if (!type) {\n /* istanbul ignore next */\n throw new TypeError(\"Failed to construct '\".concat(this.constructor.name, \"'. 1 argument required, \").concat(arguments.length, \" given.\"));\n } // Merge defaults first, the eventInit, and the type last\n // so it can't be overwritten\n \n \n assign(this, BvEvent.Defaults, this.constructor.Defaults, eventInit, {\n type: type\n }); // Freeze some props as readonly, but leave them enumerable\n \n defineProperties(this, {\n type: readonlyDescriptor(),\n cancelable: readonlyDescriptor(),\n nativeEvent: readonlyDescriptor(),\n target: readonlyDescriptor(),\n relatedTarget: readonlyDescriptor(),\n vueTarget: readonlyDescriptor(),\n componentId: readonlyDescriptor()\n }); // Create a private variable using closure scoping\n \n var defaultPrevented = false; // Recreate preventDefault method. One way setter\n \n this.preventDefault = function preventDefault() {\n if (this.cancelable) {\n defaultPrevented = true;\n }\n }; // Create `defaultPrevented` publicly accessible prop that\n // can only be altered by the preventDefault method\n \n \n defineProperty(this, 'defaultPrevented', {\n enumerable: true,\n get: function get() {\n return defaultPrevented;\n }\n });\n }\n \n _createClass(BvEvent, null, [{\n key: \"Defaults\",\n get: function get() {\n return {\n type: '',\n cancelable: true,\n nativeEvent: null,\n target: null,\n relatedTarget: null,\n vueTarget: null,\n componentId: null\n };\n }\n }]);\n \n return BvEvent;\n }(); // Named Exports\n \n var clickOutMixin = {\n data: function data() {\n return {\n listenForClickOut: false\n };\n },\n watch: {\n listenForClickOut: function listenForClickOut(newValue, oldValue) {\n if (newValue !== oldValue) {\n eventOff(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, EVENT_OPTIONS_NO_CAPTURE);\n \n if (newValue) {\n eventOn(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, EVENT_OPTIONS_NO_CAPTURE);\n }\n }\n }\n },\n beforeCreate: function beforeCreate() {\n // Declare non-reactive properties\n this.clickOutElement = null;\n this.clickOutEventName = null;\n },\n mounted: function mounted() {\n if (!this.clickOutElement) {\n this.clickOutElement = document;\n }\n \n if (!this.clickOutEventName) {\n this.clickOutEventName = 'click';\n }\n \n if (this.listenForClickOut) {\n eventOn(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, EVENT_OPTIONS_NO_CAPTURE);\n }\n },\n beforeDestroy: function beforeDestroy()\n /* istanbul ignore next */\n {\n eventOff(this.clickOutElement, this.clickOutEventName, this._clickOutHandler, EVENT_OPTIONS_NO_CAPTURE);\n },\n methods: {\n isClickOut: function isClickOut(evt) {\n return !contains(this.$el, evt.target);\n },\n _clickOutHandler: function _clickOutHandler(evt) {\n if (this.clickOutHandler && this.isClickOut(evt)) {\n this.clickOutHandler(evt);\n }\n }\n }\n };\n \n var focusInMixin = {\n data: function data() {\n return {\n listenForFocusIn: false\n };\n },\n watch: {\n listenForFocusIn: function listenForFocusIn(newValue, oldValue) {\n if (newValue !== oldValue) {\n eventOff(this.focusInElement, 'focusin', this._focusInHandler, EVENT_OPTIONS_NO_CAPTURE);\n \n if (newValue) {\n eventOn(this.focusInElement, 'focusin', this._focusInHandler, EVENT_OPTIONS_NO_CAPTURE);\n }\n }\n }\n },\n beforeCreate: function beforeCreate() {\n // Declare non-reactive properties\n this.focusInElement = null;\n },\n mounted: function mounted() {\n if (!this.focusInElement) {\n this.focusInElement = document;\n }\n \n if (this.listenForFocusIn) {\n eventOn(this.focusInElement, 'focusin', this._focusInHandler, EVENT_OPTIONS_NO_CAPTURE);\n }\n },\n beforeDestroy: function beforeDestroy()\n /* istanbul ignore next */\n {\n eventOff(this.focusInElement, 'focusin', this._focusInHandler, EVENT_OPTIONS_NO_CAPTURE);\n },\n methods: {\n _focusInHandler: function _focusInHandler(evt) {\n if (this.focusInHandler) {\n this.focusInHandler(evt);\n }\n }\n }\n };\n \n var filterVisibles = function filterVisibles(els) {\n return (els || []).filter(isVisible);\n }; // Root dropdown event names\n \n \n var ROOT_DROPDOWN_PREFIX = 'bv::dropdown::';\n var ROOT_DROPDOWN_SHOWN = \"\".concat(ROOT_DROPDOWN_PREFIX, \"shown\");\n var ROOT_DROPDOWN_HIDDEN = \"\".concat(ROOT_DROPDOWN_PREFIX, \"hidden\"); // Dropdown item CSS selectors\n \n var Selector = {\n FORM_CHILD: '.dropdown form',\n ITEM_SELECTOR: ['.dropdown-item', '.b-dropdown-form'].map(function (selector) {\n return \"\".concat(selector, \":not(.disabled):not([disabled])\");\n }).join(', ')\n }; // Popper attachment positions\n \n var AttachmentMap = {\n // Dropup left align\n TOP: 'top-start',\n // Dropup right align\n TOPEND: 'top-end',\n // Dropdown left align\n BOTTOM: 'bottom-start',\n // Dropdown right align\n BOTTOMEND: 'bottom-end',\n // Dropright left align\n RIGHT: 'right-start',\n // Dropright right align\n RIGHTEND: 'right-end',\n // Dropleft left align\n LEFT: 'left-start',\n // Dropleft right align\n LEFTEND: 'left-end'\n };\n var commonProps = {\n dropup: {\n // place on top if possible\n type: Boolean,\n default: false\n },\n dropright: {\n // place right if possible\n type: Boolean,\n default: false\n },\n dropleft: {\n // place left if possible\n type: Boolean,\n default: false\n },\n right: {\n // Right align menu (default is left align)\n type: Boolean,\n default: false\n },\n offset: {\n // Number of pixels to offset menu, or a CSS unit value (i.e. 1px, 1rem, etc)\n type: [Number, String],\n default: 0\n },\n noFlip: {\n // Disable auto-flipping of menu from bottom<=>top\n type: Boolean,\n default: false\n },\n popperOpts: {\n // type: Object,\n default: function _default() {}\n },\n boundary: {\n // String: `scrollParent`, `window` or `viewport`\n // HTMLElement: HTML Element reference\n type: [String, HTMLElement],\n default: 'scrollParent'\n }\n }; // @vue/component\n \n var dropdownMixin = {\n mixins: [idMixin, clickOutMixin, focusInMixin],\n provide: function provide() {\n return {\n bvDropdown: this\n };\n },\n inject: {\n bvNavbar: {\n default: null\n }\n },\n props: _objectSpread2({\n disabled: {\n type: Boolean,\n default: false\n }\n }, commonProps),\n data: function data() {\n return {\n visible: false,\n visibleChangePrevented: false\n };\n },\n computed: {\n inNavbar: function inNavbar() {\n return !isNull(this.bvNavbar);\n },\n toggler: function toggler() {\n var toggle = this.$refs.toggle;\n return toggle ? toggle.$el || toggle : null;\n },\n directionClass: function directionClass() {\n if (this.dropup) {\n return 'dropup';\n } else if (this.dropright) {\n return 'dropright';\n } else if (this.dropleft) {\n return 'dropleft';\n }\n \n return '';\n }\n },\n watch: {\n visible: function visible(newValue, oldValue) {\n if (this.visibleChangePrevented) {\n this.visibleChangePrevented = false;\n return;\n }\n \n if (newValue !== oldValue) {\n var evtName = newValue ? 'show' : 'hide';\n var bvEvt = new BvEvent(evtName, {\n cancelable: true,\n vueTarget: this,\n target: this.$refs.menu,\n relatedTarget: null,\n componentId: this.safeId ? this.safeId() : this.id || null\n });\n this.emitEvent(bvEvt);\n \n if (bvEvt.defaultPrevented) {\n // Reset value and exit if canceled\n this.visibleChangePrevented = true;\n this.visible = oldValue; // Just in case a child element triggered `this.hide(true)`\n \n this.$off('hidden', this.focusToggler);\n return;\n }\n \n if (evtName === 'show') {\n this.showMenu();\n } else {\n this.hideMenu();\n }\n }\n },\n disabled: function disabled(newValue, oldValue) {\n if (newValue !== oldValue && newValue && this.visible) {\n // Hide dropdown if disabled changes to true\n this.visible = false;\n }\n }\n },\n created: function created() {\n // Create private non-reactive props\n this.$_popper = null;\n },\n \n /* istanbul ignore next */\n deactivated: function deactivated()\n /* istanbul ignore next: not easy to test */\n {\n // In case we are inside a ``\n this.visible = false;\n this.whileOpenListen(false);\n this.destroyPopper();\n },\n beforeDestroy: function beforeDestroy() {\n this.visible = false;\n this.whileOpenListen(false);\n this.destroyPopper();\n },\n methods: {\n // Event emitter\n emitEvent: function emitEvent(bvEvt) {\n var type = bvEvt.type;\n this.$emit(type, bvEvt);\n this.$root.$emit(\"\".concat(ROOT_DROPDOWN_PREFIX).concat(type), bvEvt);\n },\n showMenu: function showMenu() {\n var _this = this;\n \n if (this.disabled) {\n /* istanbul ignore next */\n return;\n } // Only instantiate Popper.js when dropdown is not in ``\n \n \n if (!this.inNavbar) {\n if (typeof Popper === 'undefined') {\n /* istanbul ignore next */\n warn('Popper.js not found. Falling back to CSS positioning', 'BDropdown');\n } else {\n // For dropup with alignment we use the parent element as popper container\n var el = this.dropup && this.right || this.split ? this.$el : this.$refs.toggle; // Make sure we have a reference to an element, not a component!\n \n el = el.$el || el; // Instantiate Popper.js\n \n this.createPopper(el);\n }\n } // Ensure other menus are closed\n \n \n this.$root.$emit(ROOT_DROPDOWN_SHOWN, this); // Enable listeners\n \n this.whileOpenListen(true); // Wrap in `$nextTick()` to ensure menu is fully rendered/shown\n \n this.$nextTick(function () {\n // Focus on the menu container on show\n _this.focusMenu(); // Emit the shown event\n \n \n _this.$emit('shown');\n });\n },\n hideMenu: function hideMenu() {\n this.whileOpenListen(false);\n this.$root.$emit(ROOT_DROPDOWN_HIDDEN, this);\n this.$emit('hidden');\n this.destroyPopper();\n },\n createPopper: function createPopper(element) {\n this.destroyPopper();\n this.$_popper = new Popper(element, this.$refs.menu, this.getPopperConfig());\n },\n // Ensure popper event listeners are removed cleanly\n destroyPopper: function destroyPopper() {\n this.$_popper && this.$_popper.destroy();\n this.$_popper = null;\n },\n // Instructs popper to re-computes the dropdown position\n // useful if the content changes size\n updatePopper: function updatePopper()\n /* istanbul ignore next: not easy to test */\n {\n try {\n this.$_popper.scheduleUpdate();\n } catch (_unused) {}\n },\n getPopperConfig: function getPopperConfig() {\n var placement = AttachmentMap.BOTTOM;\n \n if (this.dropup) {\n placement = this.right ? AttachmentMap.TOPEND : AttachmentMap.TOP;\n } else if (this.dropright) {\n placement = AttachmentMap.RIGHT;\n } else if (this.dropleft) {\n placement = AttachmentMap.LEFT;\n } else if (this.right) {\n placement = AttachmentMap.BOTTOMEND;\n }\n \n var popperConfig = {\n placement: placement,\n modifiers: {\n offset: {\n offset: this.offset || 0\n },\n flip: {\n enabled: !this.noFlip\n }\n }\n };\n \n if (this.boundary) {\n popperConfig.modifiers.preventOverflow = {\n boundariesElement: this.boundary\n };\n }\n \n return _objectSpread2(_objectSpread2({}, popperConfig), this.popperOpts || {});\n },\n // Turn listeners on/off while open\n whileOpenListen: function whileOpenListen(isOpen) {\n // Hide the dropdown when clicked outside\n this.listenForClickOut = isOpen; // Hide the dropdown when it loses focus\n \n this.listenForFocusIn = isOpen; // Hide the dropdown when another dropdown is opened\n \n var method = isOpen ? '$on' : '$off';\n this.$root[method](ROOT_DROPDOWN_SHOWN, this.rootCloseListener);\n },\n rootCloseListener: function rootCloseListener(vm) {\n if (vm !== this) {\n this.visible = false;\n }\n },\n show: function show() {\n var _this2 = this;\n \n // Public method to show dropdown\n if (this.disabled) {\n return;\n } // Wrap in a `requestAF()` to allow any previous\n // click handling to occur first\n \n \n requestAF(function () {\n _this2.visible = true;\n });\n },\n hide: function hide() {\n var refocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n \n // Public method to hide dropdown\n if (this.disabled) {\n /* istanbul ignore next */\n return;\n }\n \n this.visible = false;\n \n if (refocus) {\n // Child element is closing the dropdown on click\n this.$once('hidden', this.focusToggler);\n }\n },\n // Called only by a button that toggles the menu\n toggle: function toggle(evt) {\n evt = evt || {}; // Early exit when not a click event or ENTER, SPACE or DOWN were pressed\n \n var _evt = evt,\n type = _evt.type,\n keyCode = _evt.keyCode;\n \n if (type !== 'click' && !(type === 'keydown' && [KEY_CODES.ENTER, KEY_CODES.SPACE, KEY_CODES.DOWN].indexOf(keyCode) !== -1)) {\n /* istanbul ignore next */\n return;\n }\n /* istanbul ignore next */\n \n \n if (this.disabled) {\n this.visible = false;\n return;\n }\n \n this.$emit('toggle', evt);\n evt.preventDefault();\n evt.stopPropagation(); // Toggle visibility\n \n if (this.visible) {\n this.hide(true);\n } else {\n this.show();\n }\n },\n // Mousedown handler for the toggle\n \n /* istanbul ignore next */\n onMousedown: function onMousedown(evt)\n /* istanbul ignore next */\n {\n // We prevent the 'mousedown' event for the toggle to stop the\n // 'focusin' event from being fired\n // The event would otherwise be picked up by the global 'focusin'\n // listener and there is no cross-browser solution to detect it\n // relates to the toggle click\n // The 'click' event will still be fired and we handle closing\n // other dropdowns there too\n // See https://github.com/bootstrap-vue/bootstrap-vue/issues/4328\n evt.preventDefault();\n },\n // Called from dropdown menu context\n onKeydown: function onKeydown(evt) {\n var keyCode = evt.keyCode;\n \n if (keyCode === KEY_CODES.ESC) {\n // Close on ESC\n this.onEsc(evt);\n } else if (keyCode === KEY_CODES.DOWN) {\n // Down Arrow\n this.focusNext(evt, false);\n } else if (keyCode === KEY_CODES.UP) {\n // Up Arrow\n this.focusNext(evt, true);\n }\n },\n // If user presses ESC, close the menu\n onEsc: function onEsc(evt) {\n if (this.visible) {\n this.visible = false;\n evt.preventDefault();\n evt.stopPropagation(); // Return focus to original trigger button\n \n this.$once('hidden', this.focusToggler);\n }\n },\n // Called only in split button mode, for the split button\n onSplitClick: function onSplitClick(evt) {\n /* istanbul ignore next */\n if (this.disabled) {\n this.visible = false;\n return;\n }\n \n this.$emit('click', evt);\n },\n // Shared hide handler between click-out and focus-in events\n hideHandler: function hideHandler(evt) {\n var target = evt.target;\n \n if (this.visible && !contains(this.$refs.menu, target) && !contains(this.toggler, target)) {\n this.hide();\n }\n },\n // Document click-out listener\n clickOutHandler: function clickOutHandler(evt) {\n this.hideHandler(evt);\n },\n // Document focus-in listener\n focusInHandler: function focusInHandler(evt) {\n this.hideHandler(evt);\n },\n // Keyboard nav\n focusNext: function focusNext(evt, up) {\n var _this3 = this;\n \n // Ignore key up/down on form elements\n var target = evt.target;\n \n if (!this.visible || evt && closest(Selector.FORM_CHILD, target)) {\n /* istanbul ignore next: should never happen */\n return;\n }\n \n evt.preventDefault();\n evt.stopPropagation();\n this.$nextTick(function () {\n var items = _this3.getItems();\n \n if (items.length < 1) {\n /* istanbul ignore next: should never happen */\n return;\n }\n \n var index = items.indexOf(target);\n \n if (up && index > 0) {\n index--;\n } else if (!up && index < items.length - 1) {\n index++;\n }\n \n if (index < 0) {\n /* istanbul ignore next: should never happen */\n index = 0;\n }\n \n _this3.focusItem(index, items);\n });\n },\n focusItem: function focusItem(index, items) {\n var el = items.find(function (el, i) {\n return i === index;\n });\n attemptFocus(el);\n },\n getItems: function getItems() {\n // Get all items\n return filterVisibles(selectAll(Selector.ITEM_SELECTOR, this.$refs.menu));\n },\n focusMenu: function focusMenu() {\n attemptFocus(this.$refs.menu);\n },\n focusToggler: function focusToggler() {\n var _this4 = this;\n \n this.$nextTick(function () {\n attemptFocus(_this4.toggler);\n });\n }\n }\n };\n \n var NAME$f = 'BDropdown'; // --- Props ---\n \n var props$l = {\n text: {\n // Button label\n type: String,\n default: ''\n },\n html: {\n // Button label\n type: String // default: undefined\n \n },\n variant: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$f, 'variant');\n }\n },\n size: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$f, 'size');\n }\n },\n block: {\n type: Boolean,\n default: false\n },\n menuClass: {\n type: [String, Array, Object] // default: null\n \n },\n toggleTag: {\n type: String,\n default: 'button'\n },\n toggleText: {\n // This really should be toggleLabel\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$f, 'toggleText');\n }\n },\n toggleClass: {\n type: [String, Array, Object] // default: null\n \n },\n noCaret: {\n type: Boolean,\n default: false\n },\n split: {\n type: Boolean,\n default: false\n },\n splitHref: {\n type: String // default: undefined\n \n },\n splitTo: {\n type: [String, Object] // default: undefined\n \n },\n splitVariant: {\n type: String,\n default: function _default() {\n return getComponentConfig(NAME$f, 'splitVariant');\n }\n },\n splitClass: {\n type: [String, Array, Object] // default: null\n \n },\n splitButtonType: {\n type: String,\n default: 'button',\n validator: function validator(value) {\n return arrayIncludes(['button', 'submit', 'reset'], value);\n }\n },\n lazy: {\n // If true, only render menu contents when open\n type: Boolean,\n default: false\n },\n role: {\n type: String,\n default: 'menu'\n }\n }; // --- Main component ---\n // @vue/component\n \n var BDropdown = /*#__PURE__*/Vue.extend({\n name: NAME$f,\n mixins: [idMixin, dropdownMixin, normalizeSlotMixin],\n props: props$l,\n computed: {\n dropdownClasses: function dropdownClasses() {\n var block = this.block,\n split = this.split,\n boundary = this.boundary;\n return [this.directionClass, {\n show: this.visible,\n // The 'btn-group' class is required in `split` mode for button alignment\n // It needs also to be applied when `block` is disabled to allow multiple\n // dropdowns to be aligned one line\n 'btn-group': split || !block,\n // When `block` is enabled and we are in `split` mode the 'd-flex' class\n // needs to be applied to allow the buttons to stretch to full width\n 'd-flex': block && split,\n // Position `static` is needed to allow menu to \"breakout\" of the `scrollParent`\n // boundaries when boundary is anything other than `scrollParent`\n // See: https://github.com/twbs/bootstrap/issues/24251#issuecomment-341413786\n 'position-static': boundary !== 'scrollParent' || !boundary\n }];\n },\n menuClasses: function menuClasses() {\n return [this.menuClass, {\n 'dropdown-menu-right': this.right,\n show: this.visible\n }];\n },\n toggleClasses: function toggleClasses() {\n var split = this.split;\n return [this.toggleClass, {\n 'dropdown-toggle-split': split,\n 'dropdown-toggle-no-caret': this.noCaret && !split\n }];\n }\n },\n render: function render(h) {\n var variant = this.variant,\n size = this.size,\n block = this.block,\n disabled = this.disabled,\n split = this.split,\n role = this.role;\n var commonProps = {\n variant: variant,\n size: size,\n block: block,\n disabled: disabled\n };\n var $buttonContent = this.normalizeSlot('button-content');\n var buttonContentProps = this.hasNormalizedSlot('button-content') ? {} : htmlOrText(this.html, this.text);\n var $split = h();\n \n if (split) {\n var splitTo = this.splitTo,\n splitHref = this.splitHref,\n splitButtonType = this.splitButtonType;\n \n var btnProps = _objectSpread2(_objectSpread2({}, commonProps), {}, {\n variant: this.splitVariant || this.variant\n }); // We add these as needed due to issues with\n // defined property with `undefined`/`null` values\n \n \n if (splitTo) {\n btnProps.to = splitTo;\n } else if (splitHref) {\n btnProps.href = splitHref;\n } else if (splitButtonType) {\n btnProps.type = splitButtonType;\n }\n \n $split = h(BButton, {\n class: this.splitClass,\n attrs: {\n id: this.safeId('_BV_button_')\n },\n props: btnProps,\n domProps: buttonContentProps,\n on: {\n click: this.onSplitClick\n },\n ref: 'button'\n }, [$buttonContent]);\n }\n \n var $toggle = h(BButton, {\n staticClass: 'dropdown-toggle',\n class: this.toggleClasses,\n attrs: {\n id: this.safeId('_BV_toggle_'),\n 'aria-haspopup': 'true',\n 'aria-expanded': this.visible ? 'true' : 'false'\n },\n props: _objectSpread2(_objectSpread2({}, commonProps), {}, {\n tag: this.toggleTag,\n block: block && !split\n }),\n domProps: split ? {} : buttonContentProps,\n on: {\n mousedown: this.onMousedown,\n click: this.toggle,\n keydown: this.toggle // Handle ENTER, SPACE and DOWN\n \n },\n ref: 'toggle'\n }, [split ? h('span', {\n class: ['sr-only']\n }, [this.toggleText]) : $buttonContent]);\n var $menu = h('ul', {\n staticClass: 'dropdown-menu',\n class: this.menuClasses,\n attrs: {\n role: role,\n tabindex: '-1',\n 'aria-labelledby': this.safeId(split ? '_BV_button_' : '_BV_toggle_')\n },\n on: {\n keydown: this.onKeydown // Handle UP, DOWN and ESC\n \n },\n ref: 'menu'\n }, !this.lazy || this.visible ? this.normalizeSlot('default', {\n hide: this.hide\n }) : [h()]);\n return h('div', {\n staticClass: 'dropdown b-dropdown',\n class: this.dropdownClasses,\n attrs: {\n id: this.safeId()\n }\n }, [$split, $toggle, $menu]);\n }\n });\n \n var props$m = omit(props$1, ['event', 'routerTag']); // @vue/component\n \n var BDropdownItem = /*#__PURE__*/Vue.extend({\n name: 'BDropdownItem',\n mixins: [attrsMixin, normalizeSlotMixin],\n inheritAttrs: false,\n inject: {\n bvDropdown: {\n default: null\n }\n },\n props: _objectSpread2(_objectSpread2({}, props$m), {}, {\n linkClass: {\n type: [String, Array, Object],\n default: null\n },\n variant: {\n type: String,\n default: null\n }\n }),\n computed: {\n computedAttrs: function computedAttrs() {\n return _objectSpread2(_objectSpread2({}, this.bvAttrs), {}, {\n role: 'menuitem'\n });\n }\n },\n methods: {\n closeDropdown: function closeDropdown() {\n var _this = this;\n \n // Close on next animation frame to allow time to process\n requestAF(function () {\n if (_this.bvDropdown) {\n _this.bvDropdown.hide(true);\n }\n });\n },\n onClick: function onClick(evt) {\n this.$emit('click', evt);\n this.closeDropdown();\n }\n },\n render: function render(h) {\n return h('li', {\n attrs: {\n role: 'presentation'\n }\n }, [h(BLink, {\n props: this.$props,\n staticClass: 'dropdown-item',\n class: [this.linkClass, _defineProperty({}, \"text-\".concat(this.variant), this.variant && !(this.active || this.disabled))],\n attrs: this.computedAttrs,\n on: {\n click: this.onClick\n },\n ref: 'item'\n }, this.normalizeSlot('default'))]);\n }\n });\n \n var props$n = {\n active: {\n type: Boolean,\n default: false\n },\n activeClass: {\n type: String,\n default: 'active'\n },\n buttonClass: {\n type: [String, Array, Object] // default: null\n \n },\n disabled: {\n type: Boolean,\n default: false\n },\n variant: {\n type: String // default: null\n \n }\n }; // @vue/component\n \n var BDropdownItemButton = /*#__PURE__*/Vue.extend({\n name: 'BDropdownItemButton',\n mixins: [attrsMixin, normalizeSlotMixin],\n inheritAttrs: false,\n inject: {\n bvDropdown: {\n default: null\n }\n },\n props: props$n,\n computed: {\n computedAttrs: function computedAttrs() {\n return _objectSpread2(_objectSpread2({}, this.bvAttrs), {}, {\n role: 'menuitem',\n type: 'button',\n disabled: this.disabled\n });\n }\n },\n methods: {\n closeDropdown: function closeDropdown() {\n if (this.bvDropdown) {\n this.bvDropdown.hide(true);\n }\n },\n onClick: function onClick(evt) {\n this.$emit('click', evt);\n this.closeDropdown();\n }\n },\n render: function render(h) {\n var _ref;\n \n return h('li', {\n attrs: {\n role: 'presentation'\n }\n }, [h('button', {\n staticClass: 'dropdown-item',\n class: [this.buttonClass, (_ref = {}, _defineProperty(_ref, this.activeClass, this.active), _defineProperty(_ref, \"text-\".concat(this.variant), this.variant && !(this.active || this.disabled)), _ref)],\n attrs: this.computedAttrs,\n on: {\n click: this.onClick\n },\n ref: 'button'\n }, this.normalizeSlot('default'))]);\n }\n });\n \n var props$o = {\n id: {\n type: String // default: null\n \n },\n tag: {\n type: String,\n default: 'header'\n },\n variant: {\n type: String // default: null\n \n }\n }; // @vue/component\n \n var BDropdownHeader = /*#__PURE__*/Vue.extend({\n name: 'BDropdownHeader',\n functional: true,\n props: props$o,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n var $attrs = data.attrs || {};\n data.attrs = {};\n return h('li', a(data, {\n attrs: {\n role: 'presentation'\n }\n }), [h(props.tag, {\n staticClass: 'dropdown-header',\n class: _defineProperty({}, \"text-\".concat(props.variant), props.variant),\n attrs: _objectSpread2(_objectSpread2({}, $attrs), {}, {\n id: props.id || null,\n role: 'heading'\n }),\n ref: 'header'\n }, children)]);\n }\n });\n \n var props$p = {\n tag: {\n type: String,\n default: 'hr'\n }\n }; // @vue/component\n \n var BDropdownDivider = /*#__PURE__*/Vue.extend({\n name: 'BDropdownDivider',\n functional: true,\n props: props$p,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data;\n var $attrs = data.attrs || {};\n data.attrs = {};\n return h('li', a(data, {\n attrs: {\n role: 'presentation'\n }\n }), [h(props.tag, {\n staticClass: 'dropdown-divider',\n attrs: _objectSpread2(_objectSpread2({}, $attrs), {}, {\n role: 'separator',\n 'aria-orientation': 'horizontal'\n }),\n ref: 'divider'\n })]);\n }\n });\n \n var props$q = {\n id: {\n type: String // default: null\n \n },\n inline: {\n type: Boolean,\n default: false\n },\n novalidate: {\n type: Boolean,\n default: false\n },\n validated: {\n type: Boolean,\n default: false\n }\n }; // @vue/component\n \n var BForm = /*#__PURE__*/Vue.extend({\n name: 'BForm',\n functional: true,\n props: props$q,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n return h('form', a(data, {\n class: {\n 'form-inline': props.inline,\n 'was-validated': props.validated\n },\n attrs: {\n id: props.id,\n novalidate: props.novalidate\n }\n }), children);\n }\n });\n \n var BDropdownForm = /*#__PURE__*/Vue.extend({\n name: 'BDropdownForm',\n functional: true,\n props: _objectSpread2(_objectSpread2({}, props$q), {}, {\n disabled: {\n type: Boolean,\n default: false\n },\n formClass: {\n type: [String, Object, Array] // default: null\n \n }\n }),\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n var $attrs = data.attrs || {};\n var $listeners = data.on || {};\n data.attrs = {};\n data.on = {};\n return h('li', a(data, {\n attrs: {\n role: 'presentation'\n }\n }), [h(BForm, {\n ref: 'form',\n staticClass: 'b-dropdown-form',\n class: [props.formClass, {\n disabled: props.disabled\n }],\n props: props,\n attrs: _objectSpread2(_objectSpread2({}, $attrs), {}, {\n disabled: props.disabled,\n // Tab index of -1 for keyboard navigation\n tabindex: props.disabled ? null : '-1'\n }),\n on: $listeners\n }, children)]);\n }\n });\n \n var BDropdownText = /*#__PURE__*/Vue.extend({\n name: 'BDropdownText',\n functional: true,\n props: {\n tag: {\n type: String,\n default: 'p'\n },\n variant: {\n type: String // default: null\n \n }\n },\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n var $attrs = data.attrs || {};\n data.attrs = {};\n return h('li', a(data, {\n attrs: {\n role: 'presentation'\n }\n }), [h(props.tag, {\n staticClass: 'b-dropdown-text',\n class: _defineProperty({}, \"text-\".concat(props.variant), props.variant),\n props: props,\n attrs: $attrs,\n ref: 'text'\n }, children)]);\n }\n });\n \n var props$r = {\n id: {\n type: String // default: null\n \n },\n header: {\n type: String // default: null\n \n },\n headerTag: {\n type: String,\n default: 'header'\n },\n headerVariant: {\n type: String // default: null\n \n },\n headerClasses: {\n type: [String, Array, Object] // default: null\n \n },\n ariaDescribedby: {\n type: String // default: null\n \n }\n }; // @vue/component\n \n var BDropdownGroup = /*#__PURE__*/Vue.extend({\n name: 'BDropdownGroup',\n functional: true,\n props: props$r,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n slots = _ref.slots,\n scopedSlots = _ref.scopedSlots;\n var $slots = slots();\n var $scopedSlots = scopedSlots || {};\n var $attrs = data.attrs || {};\n data.attrs = {};\n var header;\n var headerId = null;\n \n if (hasNormalizedSlot('header', $scopedSlots, $slots) || props.header) {\n headerId = props.id ? \"_bv_\".concat(props.id, \"_group_dd_header\") : null;\n header = h(props.headerTag, {\n staticClass: 'dropdown-header',\n class: [props.headerClasses, _defineProperty({}, \"text-\".concat(props.variant), props.variant)],\n attrs: {\n id: headerId,\n role: 'heading'\n }\n }, normalizeSlot('header', {}, $scopedSlots, $slots) || props.header);\n }\n \n var adb = [headerId, props.ariaDescribedBy].filter(identity).join(' ').trim();\n return h('li', a(data, {\n attrs: {\n role: 'presentation'\n }\n }), [header || h(), h('ul', {\n staticClass: 'list-unstyled',\n attrs: _objectSpread2(_objectSpread2({}, $attrs), {}, {\n id: props.id || null,\n role: 'group',\n 'aria-describedby': adb || null\n })\n }, normalizeSlot('default', {}, $scopedSlots, $slots))]);\n }\n });\n \n var DropdownPlugin = /*#__PURE__*/pluginFactory({\n components: {\n BDropdown: BDropdown,\n BDd: BDropdown,\n BDropdownItem: BDropdownItem,\n BDdItem: BDropdownItem,\n BDropdownItemButton: BDropdownItemButton,\n BDropdownItemBtn: BDropdownItemButton,\n BDdItemButton: BDropdownItemButton,\n BDdItemBtn: BDropdownItemButton,\n BDropdownHeader: BDropdownHeader,\n BDdHeader: BDropdownHeader,\n BDropdownDivider: BDropdownDivider,\n BDdDivider: BDropdownDivider,\n BDropdownForm: BDropdownForm,\n BDdForm: BDropdownForm,\n BDropdownText: BDropdownText,\n BDdText: BDropdownText,\n BDropdownGroup: BDropdownGroup,\n BDdGroup: BDropdownGroup\n }\n });\n \n var props$s = {\n type: {\n type: String,\n default: 'iframe',\n validator: function validator(str) {\n return arrayIncludes(['iframe', 'embed', 'video', 'object', 'img', 'b-img', 'b-img-lazy'], str);\n }\n },\n tag: {\n type: String,\n default: 'div'\n },\n aspect: {\n type: String,\n default: '16by9'\n }\n }; // @vue/component\n \n var BEmbed = /*#__PURE__*/Vue.extend({\n name: 'BEmbed',\n functional: true,\n props: props$s,\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n children = _ref.children;\n return h(props.tag, {\n ref: data.ref,\n staticClass: 'embed-responsive',\n class: _defineProperty({}, \"embed-responsive-\".concat(props.aspect), props.aspect)\n }, [h(props.type, a(data, {\n ref: '',\n staticClass: 'embed-responsive-item'\n }), children)]);\n }\n });\n \n var EmbedPlugin = /*#__PURE__*/pluginFactory({\n components: {\n BEmbed: BEmbed\n }\n });\n \n var OPTIONS_OBJECT_DEPRECATED_MSG = 'Setting prop \"options\" to an object is deprecated. Use the array format instead.'; // @vue/component\n \n var formOptionsMixin = {\n props: {\n options: {\n type: [Array, Object],\n default: function _default() {\n return [];\n }\n },\n valueField: {\n type: String,\n default: 'value'\n },\n textField: {\n type: String,\n default: 'text'\n },\n htmlField: {\n type: String,\n default: 'html'\n },\n disabledField: {\n type: String,\n default: 'disabled'\n }\n },\n computed: {\n formOptions: function formOptions() {\n return this.normalizeOptions(this.options);\n }\n },\n methods: {\n normalizeOption: function normalizeOption(option) {\n var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n \n // When the option is an object, normalize it\n if (isPlainObject(option)) {\n var value = get(option, this.valueField);\n var text = get(option, this.textField);\n return {\n value: isUndefined(value) ? key || text : value,\n text: stripTags(String(isUndefined(text) ? key : text)),\n html: get(option, this.htmlField),\n disabled: Boolean(get(option, this.disabledField))\n };\n } // Otherwise create an `